산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino로 스테퍼 모터 마스터하기:종합 가이드

이 튜토리얼에서는 Arduino를 사용하여 스테퍼 모터를 제어하는 방법에 대해 알아야 할 모든 것을 배웁니다. A4988, DRV8825 및 TMC2208 스테퍼 드라이버와 함께 NEMA17 스테퍼 모터를 제어하는 방법을 다룰 것입니다.

스테퍼 모터와 드라이버의 이러한 조합은 3D 프린터, CNC 기계, 로봇 공학, 자동화 기계 등과 같이 위치 제어가 필요한 수많은 응용 분야에 사용됩니다.

저는 이미 다음과 같은 많은 Arduino 프로젝트에서 이 기능을 사용해 왔습니다.

작동 방식, 스테퍼 모터를 Arduino와 연결하는 방법, 드라이버의 전류 제한을 설정하는 방법, Arduino 라이브러리 유무에 관계없이 프로그래밍하는 방법을 자세히 설명하겠습니다. 또한 모든 유형의 Arduino 프로젝트에 Arduino CNC 쉴드를 사용하여 여러 스테퍼 모터를 쉽게 제어할 수 있는 방법을 보여 드리겠습니다. 

따라서 이 튜토리얼에서는 다룰 내용이 꽤 많습니다. 다음 비디오를 시청하거나 모든 예제 코드와 배선 다이어그램이 포함된 아래의 서면 튜토리얼을 읽어보세요.

스테퍼 모터란 무엇이며 어떻게 작동하나요?

스테퍼 모터가 무엇이고 어떻게 작동하는지 간단히 설명하는 것부터 시작하겠습니다. 이 튜토리얼의 다른 모든 것을 더 잘 이해하는 데 도움이 될 것입니다. 

스테퍼 모터는 피드백 없이도 위치를 정밀하게 제어할 수 있는 독특한 유형의 브러시리스 DC 모터입니다.

스테퍼 모터의 작동 원리는 자기장을 기반으로 합니다. 고정자와 회전자의 두 가지 주요 구성 요소가 있습니다. 회전자는 일반적으로 영구 자석이며 고정자의 일부 코일로 둘러싸여 있습니다.

코일에 전류를 흐르게 하거나 전류를 흐르게 하면 회전자를 끌어당기거나 밀어내는 특정 자기장이 고정자에 생성됩니다. 코일을 특정 순서로 단계별로 활성화함으로써 로터의 지속적인 움직임을 달성할 수 있을 뿐만 아니라 어떤 위치에서든 멈추게 할 수도 있습니다.

그래서 이러한 모터를 스테퍼 모터라고 부르며 개별 단계로 움직입니다. 

회전자의 자극 수를 늘리면 가능한 정지 위치 수를 늘릴 수 있으므로 모터의 분해능이나 정밀도가 높아집니다. 이것은 단지 기본적인 설명일 뿐이며 스테퍼 모터 작동 방법 튜토리얼에서 자세한 내용을 확인할 수 있습니다. 

예를 들어 NEMA17과 같은 일반적인 스테퍼 모터에는 회전자에 50개의 정지 지점 또는 단계가 있습니다. 반면에 고정자는 4개의 서로 다른 자기장 방향이나 위치를 제공하는 2개의 위상으로 구성된 여러 개의 코일을 가질 수 있습니다.

따라서 회전자의 50단계에 4가지 서로 다른 자기장의 방향을 곱하면 전체 회전을 완료하는 데 총 200단계가 됩니다. 또는 360도를 200단계로 나누면 단계당 1.8도의 해상도가 됩니다.

고정자 코일이 두 단계로 구성되어 있다고 언급했는데, 스테퍼 모터의 와이어 수를 보면 알 수 있습니다. 각 위상마다 2개씩 4개의 4선이 있습니다. 전류가 위상을 통해 양방향으로 흐르도록 할 수 있으므로 네 가지 서로 다른 자기장 방향이 가능합니다.

5개, 6개, 심지어 8개의 와이어가 있는 스테퍼 모터도 있지만 여전히 2단계로 작동하거나 4개의 터미널만으로 제어합니다.

중요한 점은 4개의 제어 단자에 와이어를 연결하는 방법에 따라 더 많은 토크나 더 많은 속도와 같은 다양한 성능 특성을 제공할 수 있다는 것입니다.

그럼에도 불구하고, 이 간략한 설명을 통해 이제 우리는 스테퍼 모터를 구동하기 위해 아무 일도 일어나지 않으므로 전원을 연결할 수 없다는 것을 이해합니다. 대신, 두 모터 위상을 양방향으로 활성화하고 적시에 특정 순서로 펄스를 활성화하거나 보내야 합니다. 이것이 바로 스테퍼 모터를 제어하기 위한 드라이버가 필요한 이유입니다. 

스테퍼 모터의 다양한 유형과 크기에 따라 드라이버의 유형과 크기도 다양합니다. 그러나 이들 모두의 기본 작동 원리는 양방향으로 모터 위상에 전원을 공급할 수 있는 두 개의 H-브리지가 있다는 것입니다.

물론 마이크로 스테핑, 전류 제한 등과 같은 다른 많은 기능도 있어 스테퍼 모터를 쉽게 제어할 수 있습니다. 이것이 바로 스테퍼 모터의 목적입니다.

Arduino 및 A4988 스테퍼 드라이버로 NEMA17 스테퍼 모터를 제어하는 방법

좋습니다. 이제 이 튜토리얼의 첫 번째 예인 A4988 스테퍼 드라이버로 NEMA 17 스테퍼 모터를 제어하는 방법을 살펴보겠습니다. 

좋습니다. 이제 이 튜토리얼의 첫 번째 예인 A4988 스테퍼 드라이브로 NEMA 17 스테퍼 모터를 제어하는 방법을 살펴보겠습니다.

NEMA17은 뛰어난 성능을 제공하는 동시에 가격도 저렴하기 때문에 제조사들 사이에서 가장 인기 있는 스테퍼 모터입니다. 거의 모든 데스크탑 3D 프린터 및 레이저 조각기에서도 찾을 수 있습니다. 

일반적으로 NEMA17 스테퍼 모터는 200단계, 즉 단계당 1.8도의 분해능을 갖지만 400단계와 단계당 0.9도의 분해능을 가진 모델도 있습니다. 여기서 NEMA17이라는 명칭은 실제로 전면판 크기 측면에서 모터의 크기를 나타냅니다.

숫자는 10으로 나눈 면판의 크기(인치)를 나타내며, 이 경우 17을 10으로 나눈 값은 1.7인치 면판, NEMA23의 경우 2.3인치 면판과 같습니다.

따라서 전면판 크기는 고정되어 있지만 NEMA17 스테퍼의 길이는 20mm에서 60mm까지 다양할 수 있으며 그에 따라 모터의 전력 요구 사항도 달라집니다. 전력 요구사항은 일반적으로 모터가 소비할 수 있는 전류량에 따라 정의되며 이러한 NEMA17 스테퍼 모터의 범위는 0.3A에서 최대 2.5A입니다.

이제 스테퍼 모터의 전류 정격에 따라 해당 전류량을 처리할 수 있는 적합한 드라이버를 선택해야 합니다. NEMA17 스테퍼 모터를 제어하는 가장 널리 사용되는 드라이버는 A4988 스테퍼 모터 드라이버입니다.

A4988의 최대 정격 전류는 코일당 2A이지만 실제로는 최대 정격입니다. 전류를 1A 내외로 유지하는 것이 권장되지만, IC에 제공되는 좋은 냉각 기능을 위해 최대 2A까지 올라가는 것도 가능합니다. 

A4988 스테퍼 드라이버가 실제로 다른 모든 드라이브에 가지고 있는 뛰어난 기능은 전류 제한입니다. 이를 통해 모터 정격에 관계없이 모터가 소비하는 전류량을 쉽게 설정할 수 있습니다. 예를 들어 2.5A 정격 스테퍼 모터도 연결할 수 있지만 드라이버 전류를 1.5A로 제한합니다. 따라서 모터가 최대 용량으로 작동하지 않더라도 계속 사용할 수 있습니다.

반면, 모터 정격이 드라이버에 설정된 전류 제한보다 낮으면 모터가 과열됩니다. 물론 모터의 전류 정격과 드라이버의 전류 정격을 맞추는 것이 항상 권장됩니다.

A4988 및 Arduino 연결

좋습니다. 이제 A4988 드라이버를 스테퍼 모터 및 Arduino 컨트롤러와 연결하는 방법을 살펴보겠습니다.

아래 링크에서 이 Arduino 튜토리얼에 필요한 구성요소를 얻을 수 있습니다.

공개:제휴 링크입니다. Amazon Associate로서 저는 적격 구매를 통해 수입을 얻습니다.

드라이버의 오른쪽 상단에는 VMOT 및 GND 핀이 있으며 여기에 8~36V 범위의 모터용 전원 공급 장치를 연결합니다. 여기서는 전압 스파이크로부터 보드를 보호하기 위해 이 두 핀에 디커플링 커패시터를 사용하는 것이 좋습니다. 최소 47uF 용량의 대형 전해 콘덴서를 사용해야 합니다. 

다음은 스테퍼 모터를 연결하는 4개의 핀입니다. 모터의 한 위상은 1A 및 1B 핀에 연결되고 다른 위상은 2A 및 2B 핀에 연결됩니다. 

때로는 모터의 어느 두 와이어가 위상을 이루는지 인식하는 것이 다소 어려울 수 있지만 이를 식별하는 몇 가지 방법이 있습니다. 가장 간단한 방법은 스테퍼 모터의 샤프트를 손으로 회전시킨 다음 두 개의 와이어를 서로 연결하는 것입니다. 위상을 이루는 두 개의 전선을 연결하면 샤프트의 회전이 좀 더 어려워질 것입니다.

또 다른 방법은 멀티미터를 사용하여 두 전선 사이의 연속성을 확인하는 것입니다. 위상을 이루는 두 개의 전선을 연결하면 단락이 발생하고 멀티미터에서 신호음이 울리기 시작합니다.

위상을 찾으면 이를 드라이버의 두 위치 중 원하는 위치에 연결할 수 있으며 순서는 중요하지 않습니다. 

다음으로 IC 또는 논리 전원 공급 장치 핀인 VDD 및 GND가 있으며 이는 3V에서 5V까지 가능합니다. 반대편에는 Arduino 보드의 모든 핀에 연결할 수 있는 단계 및 방향 핀이 있습니다. 방향 핀을 사용하여 모터의 회전 방향을 선택하고, 스텝 핀을 사용하여 모터의 단계를 제어합니다. Step 핀으로 보내는 각 펄스에 대해 모터는 선택한 방향으로 한 단계 전진합니다. 

이 핀 바로 위에는 이름에서 알 수 있듯이 드라이버를 절전 모드로 설정하거나 재설정하는 데 사용되는 절전 및 재설정 핀이 있습니다. 이 두 핀 모두 액티브 로우(Active Low)라는 점에 유의해야 합니다. 기본적으로 Sleep 핀은 HIGH 상태이지만 RST 핀은 플로팅 상태입니다. 즉, 드라이버를 활성화하려면 이 핀 기능을 사용하지 않는다는 가정 하에 이 두 핀을 서로 연결하는 것이 가장 쉬운 방법입니다. 

활성화 핀도 활성화되어 있으므로 HIGH로 당기지 않으면 드라이버가 활성화됩니다. 

다음 세 핀인 MS1, MS2, MS3은 모터의 단계 분해능을 선택하는 데 사용됩니다. 우리는 이미 단계 분해능이 NEMA 17 스테퍼 모터의 경우 일반적으로 회전당 200단계인 모터 구성에 따라 다르다고 말했습니다. 그러나 모든 스테퍼 드라이버에는 더 높은 해상도에서 모터를 구동할 수 있는 마이크로스테핑이라는 기능이 있습니다. 이는 중간 단계 위치를 생성하는 중간 전류 수준에서 코일에 전원을 공급함으로써 달성됩니다.

예를 들어, 1/4단계 분해능을 선택하면 모터의 200단계는 200에 4를 곱한 것이 회전당 800마이크로스텝이 됩니다. 드라이버는 이를 달성하기 위해 코일에 4가지 서로 다른 전류 레벨을 사용합니다. 

A4988 드라이버는 16마이크로스텝의 최대 분해능을 갖고 있어 200스텝 NEMA17 모터는 회전당 3200스텝, 즉 스텝당 0.1125도가 됩니다. 이는 정말 인상적인 정밀도이며 이러한 유형의 스테퍼 모터 및 드라이버가 수많은 응용 분야에 사용되는 이유입니다. 실제로 최대 256개의 마이크로스텝, 즉 회전당 무려 51200스텝, 즉 스텝당 0.007도를 갖는 스테퍼 드라이버가 있습니다.

그럼에도 불구하고, 이 세 핀에는 풀다운 저항이 있으므로 연결을 끊은 채로 두면 드라이버는 풀스텝 모드에서 작동합니다. 다른 마이크로스테핑 해상도를 선택하려면 이 표에 따라 적절한 핀에 5V를 연결해야 합니다. 

A4988 전류 제한

좋습니다. 이제 스테퍼 모터와 드라이버를 Arduino 보드에 연결하는 방법을 알았으므로 스테퍼 제어를 위해 Arduino를 프로그래밍하거나 코딩하는 방법을 설명하겠습니다. 하지만 그 전에, 즉 모터에 전원을 공급하기 전에 해야 할 매우 중요한 작업이 하나 더 있는데, 바로 드라이버의 전류 제한을 조정하는 것입니다.

이미 설명했듯이 드라이버의 전류 제한을 모터의 전류 정격보다 낮게 조정해야 합니다. 그렇지 않으면 모터가 과열됩니다.

A4988 드라이버에는 전류 제한을 조정할 수 있는 작은 트리머 전위차계가 있습니다. 전위차계를 시계 방향으로 돌리면 전류 제한이 올라가고 그 반대도 마찬가지입니다. 전류 제한의 실제 값을 결정하는 데 사용할 수 있는 두 가지 방법이 있습니다. 

첫 번째 방법은 전위차계 자체와 GND에서 기준 전압을 측정하는 것입니다. 멀티미터를 사용하여 기준 전압을 측정하고 다음 공식에서 해당 값을 사용하여 드라이버의 전류 제한을 계산할 수 있습니다.

현재 제한 =Vref / (8 x Rcs)

Rcs는 전류 감지 저항 또는 칩 바로 옆에 있는 전류 감지 저항의 값입니다. 제조업체에 따라 이 값은 일반적으로 0.05, 0.1 또는 0.2Ω입니다. 따라서 이 방법으로 전류 제한을 정확하게 계산하려면 이러한 저항기의 값을 자세히 살펴볼 필요가 있습니다. 제 경우에는 이 저항에 R100이라는 라벨이 붙어 있었는데 이는 0.1Ω을 의미합니다.

예를 들어, 0.7V의 기준 전압을 측정하고 0.1Ω 저항이 있는 경우 전류 제한은 0.875A가 됩니다. 또는 전류를 1A로 제한하려면 기준 전압을 0.8V로 조정해야 합니다. 

전류 제한을 설정하는 두 번째 방법은 코일을 통해 전류를 직접 측정하는 것입니다. 이를 위해서는 앞서 설명한 대로 스테퍼 모터와 드라이버를 연결해야 합니다. 컨트롤러 연결을 건너뛸 수 있지만 대신 방향 및 단계 핀에 5V를 연결하여 모터가 활성 상태를 유지하고 한 위치를 유지하도록 합니다. 드라이버가 풀스텝 모드에서 작동하려면 MS 핀을 연결 해제된 상태로 두어야 합니다. 그런 다음 모터에서 하나의 라인이나 코일을 분리하고 전류계와 직렬로 연결할 수 있습니다. 이런 식으로 논리 전압인 5V와 제 경우에는 모터의 전원 12V를 모두 사용하여 드라이버에 전원을 공급하면 코일을 통해 흐르는 전류의 양을 읽을 수 있습니다.

그러나 드라이버가 풀 스텝 모드에서 작동할 때 코일의 전류는 실제 전류 제한의 70%에만 도달할 수 있다는 점에 유의해야 합니다. 따라서 다른 마이크로스테핑 모드에서 드라이버를 사용할 때 드라이버 전류 제한의 실제 값을 얻으려면 전류계 판독값에 1.3을 곱해야 합니다. 

드라이버의 전류 제한을 설정하기 위해 두 가지 방법을 모두 시도했지만 거의 동일한 결과를 얻었습니다.

스테퍼 모터 및 Arduino – 예제 코드

그럼에도 불구하고 이제 Arduino 프로그래밍을 계속 진행하거나 Arduino 보드로 스테퍼 모터를 제어하기 위한 몇 가지 예제 코드를 살펴볼 수 있습니다.

라이브러리를 사용하지 않고 스테퍼 모터를 제어하는 방법에 대한 매우 기본적인 예제 코드부터 시작해 보겠습니다.

예제 코드 1

/* 
 * Basic example code for controlling a stepper without library
 * 
 * by Dejan, https://howtomechatronics.com
 */
// defines pins
#define stepPin 2
#define dirPin 5 
 
void setup() {
 // Sets the two pins as Outputs
 pinMode(stepPin,OUTPUT); 
 pinMode(dirPin,OUTPUT);
}
void loop() {
 digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction
 // Makes 200 pulses for making one full cycle rotation
 for(int x = 0; x < 800; x++) {
 digitalWrite(stepPin,HIGH); 
 delayMicroseconds(700); // by changing this time delay between the steps we can change the rotation speed
 digitalWrite(stepPin,LOW); 
 delayMicroseconds(700); 
 }
 delay(1000); // One second delay
 
 digitalWrite(dirPin,LOW); //Changes the rotations direction
 // Makes 400 pulses for making two full cycle rotation
 for(int x = 0; x < 1600; x++) {
 digitalWrite(stepPin,HIGH);
 delayMicroseconds(500);
 digitalWrite(stepPin,LOW);
 delayMicroseconds(500);
 }
 delay(1000);
}Code language: PHP (php)

코드 설명:

여기서 우리가 해야 할 일은 STEP 및 DIR 핀이 어떤 핀 번호에 연결되어 있는지 정의하고 이를 출력으로 정의하는 것입니다. 루프에서는 먼저 방향 핀 상태를 HIGH로 만들어 모터의 회전 방향을 설정합니다. 그런 다음 "for" 루프를 사용하여 STEP 핀에 200개의 펄스를 보내 모터가 전체 단계 모드에서 작동한다는 점을 고려하여 전체 사이클을 회전하게 합니다. 펄스는 STEP 핀의 상태를 HIGH에서 LOW로 전환하고 그 사이에 약간의 시간 지연을 두는 것만으로도 생성됩니다. 이 시간 지연은 실제로 회전 속도를 정의합니다. 이를 낮추면 단계가 더 빠르게 진행됨에 따라 회전 속도가 증가하고 그 반대의 경우도 마찬가지입니다. 

그런 다음 회전 방향을 변경하고 또 다른 "for" 루프를 사용하여 모터가 두 번의 전체 사이클을 회전하게 만드는 400개의 펄스를 보냅니다. 그러나 드라이버의 마이크로스테핑 모드를 1/4단계로 변경하면 이제 모터는 800단계가 되며 첫 번째 루프에서는 모터가 90도만 회전하고 두 번째 루프에서는 절반만 회전하게 됩니다.

예제 코드 2

전위차계를 사용하여 스테퍼 모터 속도를 제어하는 또 다른 간단한 예는 다음과 같습니다.

이를 위해서는 전위차계를 Arduino에 연결하고 AnalogRead() 함수를 사용하여 값을 읽으면 됩니다.

/*
 Basic example code for controlling a stepper without library
 by Dejan, https://howtomechatronics.com
*/
// defines pins
#define stepPin 2
#define dirPin 5
int customDelay, customDelayMapped;
void setup() {
 // Sets the two pins as Outputs
 pinMode(stepPin, OUTPUT);
 pinMode(dirPin, OUTPUT);
}
void loop() {
 speedControl();
 // Makes pules with custom delay, depending on the Potentiometer, from which the speed of the motor depends
 digitalWrite(stepPin, HIGH);
 delayMicroseconds(customDelayMapped);
 digitalWrite(stepPin, LOW);
 delayMicroseconds(customDelayMapped);
}
// Custom function for reading the potentiometer and mapping its value from 300 to 3000, suitable for the custom delay value in microseconds
void speedControl() {
 customDelay = analogRead(A0); // Read the potentiometer value
 customDelayMapped = map(customDelay, 0, 1023, 300, 3000); // Convert the analog input from 0 to 1024, to 300 to 3000
}Code language: PHP (php)

코드 설명:

그런 다음 0에서 1023까지의 전위차계 값을 스텝 펄스의 지연 시간(마이크로초)에 적합한 값으로 매핑하거나 변환할 수 있습니다. 단계 간 지연의 최소값은 약 300마이크로초인 것으로 나타났습니다. 그보다 더 낮아지면 스테퍼 모터가 단계를 건너뛰기 시작했습니다. 

전반적으로 이 방법을 사용하여 스테퍼 모터를 제어하는 것은 쉽고 작동하지만 예제에 표시된 것처럼 필요한 제어가 간단한 경우에만 가능합니다. 더 복잡한 제어가 필요한 경우 가장 좋은 방법은 Arduino 라이브러리를 사용하는 것입니다.

Arduino 및 AccelStepper 라이브러리를 사용하여 스테퍼 모터 제어 - 예

Arduino로 스테퍼 모터를 제어하는 데 가장 널리 사용되는 라이브러리는 Mike McCauley의 AccelStepper 라이브러리입니다. 속도, 가속 및 감속 제어, 목표 위치 설정, 여러 스테퍼 모터 동시 제어 등을 갖춘 매우 다양한 기능을 갖춘 라이브러리입니다.

라이브러리에는 각 기능의 작동 방식을 설명하는 훌륭한 문서가 있습니다. 저는 이미 DIY 카메라 슬라이더, 3D 와이어 벤딩 머신, SCARA 로봇 팔 및 기타 몇 가지 동작을 제어하기 위해 여러 Arduino 프로젝트에 이 라이브러리를 사용했습니다. 관심이 있으신 경우 웹사이트에서 각 프로젝트에 대한 세부정보와 코드 설명을 확인하실 수 있습니다. 

이제 이 라이브러리를 사용하는 몇 가지 예제 코드를 살펴보겠습니다.

예제 코드 – 전위차계를 사용한 스테퍼 모터 속도 제어

첫 번째 예는 전위차계를 사용하여 모터 속도를 제어하는 것입니다.

/* 
 * Basic example code for controlling a stepper with the AccelStepper library
 * 
 * by Dejan, https://howtomechatronics.com
 */
#include <AccelStepper.h>
// Define the stepper motor and the pins that is connected to
AccelStepper stepper1(1, 2, 5); // (Type of driver: with 2 pins, STEP, DIR)
void setup() {
 // Set maximum speed value for the stepper
 stepper1.setMaxSpeed(1000);
}
void loop() {
 stepper1.setSpeed((analogRead(A0));
 // Step the motor with a constant speed previously set by setSpeed();
 stepper1.runSpeed();
}Code language: PHP (php)

코드 설명:

따라서 먼저 AccelStepper 라이브러리를 포함해야 합니다. 물론, 그렇게 하기 전에 라이브러리를 설치해야 하며 Arduino IDE 라이브러리 관리자에서 이를 수행할 수 있습니다. "AccelStepper"를 검색하면 라이브러리가 표시되고 설치할 수 있습니다. 

그런 다음 모터에 대한 AccelStepper 클래스의 인스턴스를 만들어야 합니다. 여기서 첫 번째 매개변수는 드라이버 유형입니다. 이 경우 두 개의 제어 핀이 있는 드라이버의 경우 이 값은 1이고 다른 두 매개변수는 드라이버가 Arduino에 연결되는 핀 번호입니다. 스테퍼 모터가 여러 개인 경우 각 모터를 다음과 같이 정의해야 하며 원하는 대로 이름을 지정할 수 있습니다. 이 경우 모터 이름을 stepper1로 지정했습니다. 

설정 섹션에서는 초당 단계로 정의되는 모터의 최대 속도를 설정하기만 하면 됩니다. 이 값은 최대 4000까지 올라갈 수 있지만 라이브러리 문서에는 초당 1000걸음 이상의 속도 값은 신뢰할 수 없다고 명시되어 있습니다. 

루프 섹션에서는 setSpeed() 함수를 사용하여 모터의 현재 속도를 설정하며, 이 경우 전위차계의 아날로그 입력은 0에서 1023까지입니다.

모터가 움직이고 일정한 속도를 구현하려면 매 간격마다 runSpeed() 함수를 호출해야 합니다. 여기에 음수 값을 입력하거나 단순히 값 앞에 마이너스 기호를 추가하면 스테퍼 모터가 반대 방향으로 회전하게 됩니다.

예제 코드 – 가속 및 감속으로 두 개의 스테퍼 모터 제어

AccelStepper 라이브러리를 사용하여 가속 및 감속을 구현하여 두 개의 스테퍼 모터를 제어하는 또 다른 예는 다음과 같습니다.

/*
 Controlling two stepper with the AccelStepper library
 by Dejan, https://howtomechatronics.com
*/
#include <AccelStepper.h>
// Define the stepper motor and the pins that is connected to
AccelStepper stepper1(1, 2, 5); // (Typeof driver: with 2 pins, STEP, DIR)
AccelStepper stepper2(1, 3, 6);
void setup() {
 stepper1.setMaxSpeed(1000); // Set maximum speed value for the stepper
 stepper1.setAcceleration(500); // Set acceleration value for the stepper
 stepper1.setCurrentPosition(0); // Set the current position to 0 steps
 stepper2.setMaxSpeed(1000);
 stepper2.setAcceleration(500);
 stepper2.setCurrentPosition(0);
}
void loop() {
 stepper1.moveTo(800); // Set desired move: 800 steps (in quater-step resolution that's one rotation)
 stepper1.runToPosition(); // Moves the motor to target position w/ acceleration/ deceleration and it blocks until is in position
 stepper2.moveTo(1600);
 stepper2.runToPosition();
 // Move back to position 0, using run() which is non-blocking - both motors will move at the same time
 stepper1.moveTo(0);
 stepper2.moveTo(0);
 while (stepper1.currentPosition() != 0 || stepper2.currentPosition() != 0) {
 stepper1.run(); // Move or step the motor implementing accelerations and decelerations to achieve the target position. Non-blocking function
 stepper2.run();
 //
 //
 }
}Code language: PHP (php)

코드 설명:

따라서 두 개의 스테퍼 모터를 정의해야 하며 설정에서 setAcceleration() 함수를 사용하여 모터의 가속도 값을 설정해야 합니다. setCurrentPosition() 함수를 사용하여 모터의 위치를 ​​0단계로 설정합니다. 

루프 섹션에서는 모터에 이동할 위치나 이동해야 하는 단계 수를 알려주는 moveTo() 함수로 시작합니다. 1/4단계 분해능의 경우 800단계는 1회전을 의미합니다. 그런 다음 runToPosition() 함수는 가속 및 감속을 구현하면서 모터를 해당 위치로 이동시킵니다. 그러나 이는 차단 기능이므로 스테퍼 모터가 해당 위치에 도달할 때까지 코드 실행이 그대로 유지됩니다. 

동일한 방법으로 두 번째 모터를 1600단계 또는 1/4단계 분해능으로 2회전 이동합니다. 

모터가 목표 위치에 도달할 때까지 코드가 차단되는 것을 원하지 않으면 runToPosition() 함수를 사용하는 대신 run() 함수를 사용해야 합니다. run()도 목표 위치에 도달하기 위해 가속 및 감속을 구현하지만 호출당 한 단계만 수행합니다. 따라서 가능한 한 자주 호출해야 합니다. 이러한 이유로 여기에서는 두 스테퍼가 위치 0에 도달할 때까지 실행되는 while 루프에 두 모터에 대한 run() 함수를 넣습니다. 이전에 moveTo() 함수를 사용하여 두 모터가 위치 0으로 이동하도록 설정했습니다. 

또한 "while" 루프에 더 많은 코드를 추가하고 모터 실행과 함께 다른 작업을 수행할 수도 있습니다. 실제로 모터를 작동하고 다른 작업을 수행하는 방법에는 여러 가지가 있습니다. 각 기능이 어떻게 작동하는지 이해하고 필요에 따라 구현할 수 있도록 잘 설명된 라이브러리 문서를 살펴보는 것이 좋습니다.

예제 코드 – AccelStepper 라이브러리로 여러 스테퍼 모터 제어

AccelStepper 라이브러리를 사용하여 여러 스테퍼 모터를 조정된 방식으로 제어하는 예제를 하나 더 보여드리고 싶습니다. 즉, 각 스테퍼의 목표 위치를 설정할 수 있으며 이동 거리에 관계없이 동시에 해당 위치에 도달할 수 있습니다.

AccelStepper 라이브러리와 함께 제공되는 MultiStepper 클래스를 사용하면 쉽게 수행할 수 있습니다.

/*
 Controlling multiple steppers with the AccelStepper and MultiStepper library
 by Dejan, https://howtomechatronics.com
*/
#include <AccelStepper.h>
#include <MultiStepper.h>
// Define the stepper motor and the pins that is connected to
AccelStepper stepper1(1, 2, 5); // (Typeof driver: with 2 pins, STEP, DIR)
AccelStepper stepper2(1, 3, 6);
AccelStepper stepper3(1, 4, 7);
MultiStepper steppersControl; // Create instance of MultiStepper
long gotoposition[3]; // An array to store the target positions for each stepper motor
void setup() {
 stepper1.setMaxSpeed(1000); // Set maximum speed value for the stepper
 stepper2.setMaxSpeed(1000);
 stepper3.setMaxSpeed(1000);
 // Adding the 3 steppers to the steppersControl instance for multi stepper control
 steppersControl.addStepper(stepper1);
 steppersControl.addStepper(stepper2);
 steppersControl.addStepper(stepper3);
}
void loop() {
 // Store the target positions in the "gotopostion" array
 gotoposition[0] = 800; // 800 steps - full rotation with quater-step resolution
 gotoposition[1] = 1600;
 gotoposition[2] = 3200;
 steppersControl.moveTo(gotoposition); // Calculates the required speed for all motors
 steppersControl.runSpeedToPosition(); // Blocks until all steppers are in position
 delay(1000);
 gotoposition[0] = 0;
 gotoposition[1] = 0;
 gotoposition[2] = 0;
 steppersControl.moveTo(gotoposition);
 steppersControl.runSpeedToPosition();
 delay(1000);
}Code language: PHP (php)

코드 설명:

여기에는 MultiStepper 클래스도 포함하고 해당 클래스의 인스턴스를 생성해야 합니다. 그런 다음 모터의 대상 위치를 저장하는 데 사용되는 "long" 유형의 배열을 정의해야 합니다. 설정 섹션에서는 스테퍼의 최대 속도 값을 정의하고 이전에 생성된 MultiStepper 인스턴스에 스테퍼를 추가해야 합니다. 제 경우에는 이름을 "steppersControl"로 지정했습니다. 

루프 섹션에서는 이전에 생성한 배열에 대상 위치 값을 저장하는 것부터 시작합니다. 첫 번째 스테퍼는 1회전, 두 번째는 2회전, 세 번째는 3회전하도록 설정했습니다. 그런 다음 이 배열을 모든 모터가 해당 위치에 동시에 도달하는 데 필요한 속도를 계산하는 moveTo() 함수에 할당할 수 있습니다. 그런 다음 모터를 해당 위치로 이동시키는 runSpeedToPosition() 함수를 호출하기만 하면 됩니다. 하지만 이 함수는 스테퍼가 목표 위치에 도달할 때까지 코드를 차단한다는 점에 유의해야 합니다. 코드를 차단하고 싶지 않다면 대신 run() 함수를 사용할 수 있습니다. 또한 MultiStepper 클래스는 가속 및 감속을 지원하지 않습니다. 

그럼에도 불구하고 고급 예제를 통해 더 자세히 알아보고 싶다면 제가 이미 언급한 Arduino 프로젝트를 확인하세요. 모든 세부 정보와 코드는 웹사이트에 있습니다.

모든 Arduino 프로젝트에 대해 여러 스테퍼 모터를 제어하기 위한 CNC 실드

여러 스테퍼 모터를 제어하는 방법에 대해서는 여전히 Arduino CNC 실드를 언급하고 살펴보는 것이 좋습니다.

Arduino CNC 쉴드의 주요 목적은 2축 또는 3축 CNC 기계를 제어하는 것입니다. 그러나 실제로는 콤팩트하고 드라이버와 모터에 대한 쉬운 연결을 제공하므로 여러 스테퍼 모터를 제어해야 하는 모든 유형의 프로젝트를 제어하는 데 훌륭한 옵션입니다. 

이 실드는 Arduino UNO 보드 위에 장착되며 최대 4개의 개별 스테퍼 모터를 제어할 수 있고 나머지 모든 Arduino 핀을 사용할 수 있습니다. 저는 4축 SCARA 로봇 팔을 제어하기 위해 Arduino UNO 보드와 CNC 실드의 조합을 사용했습니다.

Arduino에서 CNC 쉴드를 사용하는 방법에 대한 자세한 내용은 기사의 이 섹션을 곧 업데이트하겠습니다.

DRV8825 대 A4988

좋습니다. 이제 처음에 언급한 다른 드라이버인 DRV8825를 사용하여 스테퍼 모터를 제어하는 방법을 살펴보겠습니다.

실제로 지금까지 A4988 스테퍼 드라이버로 스테퍼 모터를 제어하는 방법에 대해 설명한 모든 내용은 DRV8825에도 적용됩니다. 작동 원리, 연결 및 코딩은 두 드라이버 모두 거의 동일합니다. 이들의 차이점은 기술적 특성에 있으며, 이제 살펴보고 비교해보겠습니다.

DRV8825는 연결이 동일하므로 Allegro A4988 드라이버를 직접 대체하여 사용할 수 있는 Texas Instruments의 스테퍼 드라이버입니다. 세 가지 주요 차이점은 DR8825가 추가 냉각 없이 A4988보다 더 많은 전류를 공급할 수 있고(1.5A 대 1A), 더 높은 최대 공급 전압(45V 대 35V), 더 높은 마이크로스테핑 분해능(32 대 16 마이크로스텝)을 제공한다는 점입니다. 

물론 다른 사소한 차이점도 있습니다. 예를 들어 전류 제한 전위차계의 위치가 다르며 전류 제한 설정과 기준 핀 전압 간의 관계가 다릅니다. DRV8825에는 로직 전원 공급 장치가 필요하지 않으며 해당 핀 위치는 FAULT 출력으로 사용됩니다.

그러나 FAULT 핀을 5V에 직접 연결하는 것이 안전하므로 A4988 드라이버용으로 설계된 시스템에서 DRV8825를 직접 교체하여 사용할 수 있습니다. 

하지만 A4988 드라이버를 DRV8825로 교체할 때 드라이버 방향이 올바른지 확인하는 것이 매우 중요하다는 점은 주목할 가치가 있습니다. 이미 언급했듯이 전위차계는 서로 다른 위치에 있습니다. A4988에서는 칩 아래에 있고 DRV8825에서는 칩 위에 있으므로 때로는 혼란을 야기할 수 있으며 드라이버가 쉽게 잘못된 쪽에 배치될 수 있습니다. 

전류 제한을 설정하기 위해 하나의 프로브는 GND에, 다른 하나는 전위차계 자체에 있는 기준 전압을 측정할 수 있습니다.

DRV8825 스테퍼 드라이브의 계산 공식은 다음과 같습니다.

현재 제한 =Vref x 2

마이크로스테핑 해상도를 선택하는 경우 다음 표를 사용할 수 있습니다.

전반적으로 DRV8825는 더 높은 전류 및 전압 정격과 더 높은 마이크로스테핑 분해능을 제공하여 스테퍼 모터가 더 부드럽고 조용하게 작동하므로 A4988보다 더 나은 스테퍼 드라이버입니다.

TMC2208 스테퍼 드라이버

더 부드럽고 조용한 작동에 대해 이야기하자면, TMC2208 스테퍼 드라이버를 살펴보겠습니다. TMC2208 칩은 모션 제어 전자 장치 전문 독일 회사인 Trinamic에서 제조되었습니다. TMC2208은 A4988 또는 DRV8825 드라이버용으로 설계된 시스템에서 직접 교체로도 사용할 수 있는 자동 스테퍼 모터 드라이버입니다. 데스크탑 3D 프린터, 레이저 조각기, 스캐너 등에 널리 사용됩니다.

이 드라이버를 다른 두 드라이버와 차별화하는 점은 256개의 세분화 또는 마이크로스텝을 제공하는 통합 보간 장치입니다. 이를 통해 칩 내부에서 생성되는 완벽한 사인파 제어가 가능합니다. 이는 두 개의 MS 핀(2, 4, 8 또는 16 마이크로스텝)을 통해 선택한 마이크로스텝 분해능에 관계없이 드라이버가 스테퍼 모터에 256 마이크로스텝을 출력한다는 의미입니다. 이는 보다 원활한 작동을 제공하고 마이크로컨트롤러의 부담을 크게 줄여줍니다.

드라이버의 이 기능은 무소음 전류 제어 StealthChop2 기술과 결합되어 스테퍼 모터의 매우 조용한 제어를 제공합니다. 다음은 세 드라이버 간의 소음 수준을 비교한 것입니다.

스테퍼 드라이버 소음 수준: A4988은 약 65dB, DRV8825는 약 67dB, TMC2208은 약 41dB입니다.

TMC2208은 스테퍼 모터를 완전히 조용하게 구동하는데, 이는 정말 인상적입니다.

TMC2208의 전류 정격은 A4988 드라이버보다 약간 높거나 2A 피크 전류에서 1.2A입니다. 드라이버의 전류 제한을 설정하기 위해 다시 다른 드라이버에 대해 설명한 것과 동일한 방법을 사용할 수 있습니다. GND의 프로브 하나와 활성화 핀 바로 옆 전체의 다른 프로브를 사용하여 기준 전압을 측정해야 합니다.

전류 제한 계산 공식은 다음과 같습니다.

현재 제한 =Vref x 0.71

직접 교체로 사용할 수 있지만 TMC2208 드라이버는 A4988 드라이버에 비해 핀아웃이 약간 다릅니다. 여기에는 마이크로스텝 해상도를 선택하고 드라이버를 활성화하기 위한 핀이 두 개만 있으며 활성화 핀을 GND에 연결해야 합니다.

코딩 측면에서는 다른 두 드라이버와 동일합니다. 

TMC2208 드라이버는 또한 두 개의 Step 및 Dir 핀 대신 단일 라인으로 드라이버를 제어할 수 있는 사용하기 쉬운 UART 인터페이스와 같이 다른 두 드라이버에 비해 몇 가지 더 고급 기능을 갖추고 있습니다. 그 외에도 더 많은 튜닝 및 제어 옵션을 제공합니다. 

전반적으로 TMC2208은 A4988 및 DRV8825보다 더 나은 드라이버이지만 가격이 더 높기 때문에 이는 정상입니다. 하지만 이러한 추가 기능이 필요하지 않고 소음 수준이 걱정되지 않는다면 다른 두 드라이버를 선택하는 것이 좋습니다.

결론

지금까지 Arduino를 사용하여 스테퍼 모터를 제어하는 방법에 대해 알아야 할 거의 모든 내용을 다루었습니다. NEMA17과 세 가지 드라이버인 A4988, DRV8825 및 TMC2208은 놀라울 정도로 다재다능하며 위치 제어가 필요한 수많은 애플리케이션에 사용할 수 있습니다. 내 Arduino 프로젝트를 탐색하면 언제든지 더 많은 것을 배울 수 있습니다.

NEMA23 또는 NEMA34와 같은 더 큰 스테퍼 모터를 제어하는 방법을 배우고 싶다면 이에 대한 전용 튜토리얼도 준비하겠습니다. 

이 튜토리얼을 즐기고 새로운 것을 배웠기를 바랍니다. 구독하는 것을 잊지 마시고 아래 댓글 섹션에 질문을 남겨주세요.


제조공정

  1. 업셋 맞대기 용접에 대한 간략한 설명
  2. 다양한 유형의 선반 기계 및 분류
  3. MKR1000이 포함된 다중 모드 환경 센서 데크
  4. 저수조 레벨 모니터
  5. 애완동물 사료
  6. Arduino 및 RDA8057M을 사용하는 FM 라디오
  7. Walabot 터치패드
  8. NC와 CNC 기계의 차이점
  9. 제지 공장 및 펄프 생산을 위한 지속 가능한 물 관리 솔루션
  10. Arduino에 중앙 난방 연결