본문 바로가기

아두이노우노 R4

스테퍼 모터와 아두이노 - 완벽한 가이드, 점자 구현 참고

반응형

 

이 튜토리얼에서는 아두이노를 사용하여 스테퍼 모터를 제어하는 데 필요한 모든 것을 알아봅니다. A4988, DRV8825, TMC2208 스테퍼 드라이버를 사용하여 NEMA17 스테퍼 모터를 제어하는 방법을 다룹니다. 

 

 

 

아두이노 서보모터 제어 글

 

목차 

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

Arduino와 A4988 스테퍼 드라이버를 사용하여 NEMA17 스테퍼 모터를 제어하는 방법

A4988과 아두이노 연결

A4988 전류 제한

스테퍼 모터와 아두이노 - 예제 코드

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

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

예제 코드 - 가속 및 감속을 통한 두 개의 스테퍼 모터 제어

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

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

DRV8825 대 A4988

TMC2208 스테퍼 드라이버

결론 

 

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

 

저는 이미 다음과 같은 여러 Arduino 프로젝트에서 이를 직접 사용해 보았습니다. 

 

 

스테퍼 모터의 작동 원리, 아두이노에 스테퍼 모터를 연결하는 방법, 드라이버의 전류 제한을 설정하는 방법, 그리고 아두이노 라이브러리를 사용하거나 사용하지 않고 스테퍼 모터를 프로그래밍하는 방법을 자세히 설명하겠습니다. 또한, 아두이노 CNC 쉴드를 사용하여 모든 유형의 아두이노 프로젝트에서 여러 스테퍼 모터를 쉽게 제어하는 방법도 보여드리겠습니다.

 

이 튜토리얼에는 다룰 내용이 꽤 많습니다. 다음 영상을 시청하거나 아래의 튜토리얼을 읽어보세요. 튜토리얼에는 모든 예제 코드와 배선도가 포함되어 있습니다. 

 

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

 

이 튜토리얼의 다른 내용을 더 잘 이해하는 데 도움이 되도록 스테퍼 모터가 무엇이고 어떻게 작동하는지 간략하게 설명하겠습니다.

 

 

 

 

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

 

스테퍼 모터의 작동 원리는 자기장에 기반합니다. 스테퍼 모터는 고정자와 회전자, 두 가지 주요 구성 요소로 구성됩니다. 회전자는 일반적으로 영구 자석이며, 고정자에는 코일이 감겨 있습니다.

 

 

코일에 전류를 흐르게 하거나 전원을 공급하면 고정자에서 특정 자기장이 생성되어 회전자를 끌어당기거나 밀어냅니다. 코일을 특정 순서대로 단계적으로 하나씩 활성화하면 회전자의 지속적인 운동을 유도할 수 있을 뿐만 아니라, 원하는 위치에서 정지시킬 수도 있습니다.

 

 

 

그래서 이런 모터를 스테퍼 모터라고 부르는 거예요. 이 모터는 개별적인 단계로 움직이거든요.

 

로터의 자극 수를 늘리면 가능한 정지 위치의 수가 늘어나 모터의 분해능 또는 정밀도가 향상됩니다. 이는 기본적인 설명일 뿐이며, 더 자세한 내용은 스테퍼 모터 작동 원리 튜토리얼에서 확인하실 수 있습니다.

 

일반적인 스테퍼 모터(예: NEMA17)는 회전자에 50개의 정지점 또는 스텝을 갖습니다. 반면, 고정자에는 2개의 위상으로 구성된 여러 개의 코일이 있어 네 가지 자기장 방향 또는 위치를 제공할 수 있습니다.

 

따라서 로터의 50단계에 4개의 서로 다른 자기장 방향을 곱하면, 한 바퀴를 완전히 도는 데 필요한 총 200단계가 됩니다. 360도를 200단계로 나누면, 각 단계마다 1.8도씩 분해능이 향상됩니다.

 

 

스테이터 코일이 두 상으로 구성되어 있다고 말씀드렸는데, 스테퍼 모터의 전선 개수를 살펴보면 이를 알 수 있습니다. 스테퍼 모터는 각 상으로 두 개씩, 총 네 개의 전선으로 구성되어 있습니다. 전류를 양방향으로 흐르게 할 수 있으므로 네 가지 자기장 방향이 가능합니다.

 

 

 

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과 아두이노 연결

 

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

 

 

아래 링크에서 이 Arduino 튜토리얼에 필요한 구성 요소를 얻을 수 있습니다. 저작자의 판매 링크까지 몽땅.

 

 

공개: 이는 제휴 링크입니다. 저는 아마존 어소시에이트로서 적격 구매를 통해 수익을 얻습니다.

 

드라이버 오른쪽 상단에는 VMOT 핀과 GND 핀이 있으며, 여기에 8V에서 36V까지 모터 전원을 연결합니다. 또한, 전압 스파이크로부터 보드를 보호하기 위해 이 두 핀 사이에 디커플링 커패시터를 사용하는 것이 좋습니다. 최소 47uF 용량의 대용량 전해 커패시터를 사용해야 합니다.

 

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

 

때로는 모터의 어떤 두 전선이 하나의 상을 이루는지 구분하기가 다소 어려울 수 있지만, 이를 구분하는 방법은 여러 가지가 있습니다. 가장 간단한 방법은 스테퍼 모터의 샤프트를 손으로 돌린 후 두 전선을 서로 연결하는 것입니다. 만약 하나의 상을 이루는 두 전선을 연결하면 샤프트의 회전이 조금 더 어려워질 것입니다.

 

 

또 다른 방법은 멀티미터를 사용하여 두 전선 사이의 도통 여부를 확인하는 것입니다. 두 전선이 같은 위상을 이루면 단락이 발생하고 멀티미터에서 경고음이 울립니다.

 

 

 

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

 

다음으로, IC 또는 로직 전원 공급 핀인 VDD와 GND가 있으며, 3V에서 5V까지 사용할 수 있습니다. 반대편에는 Step 핀과 Direction 핀이 있으며, 이 핀들은 아두이노 보드의 어느 핀에나 연결할 수 있습니다. Direction 핀으로 모터의 회전 방향을 선택하고, Step 핀으로 모터의 스텝을 제어합니다. Step 핀에 펄스를 전송할 때마다 모터는 선택한 방향으로 한 스텝씩 이동합니다.

 

이 핀 바로 위에는 Sleep 핀과 Reset 핀이 있는데, 이름에서 알 수 있듯이 드라이버를 절전 모드로 전환하거나 재설정하는 데 사용됩니다. 두 핀 모두 액티브 로우(active low) 상태입니다. Sleep 핀은 기본적으로 HIGH 상태이지만, RST 핀은 플로팅 상태입니다. 즉, 드라이버를 활성화하는 가장 쉬운 방법은 이 두 핀을 서로 연결하는 것입니다. 단, 이 두 핀의 기능을 사용하지 않을 경우를 가정합니다.

 

Enable 핀도 액티브 로우(active low) 상태이므로, 이 핀을 HIGH로 끌어올리지 않으면 드라이버가 활성화됩니다.

 

다음 세 핀, MS1, MS2, MS3은 모터의 스텝 분해능을 선택하는 데 사용됩니다. 스텝 분해능은 모터 구조에 따라 달라지며, 일반적으로 NEMA 17 스테퍼 모터의 경우 회전당 200스텝입니다. 그러나 모든 스테퍼 드라이버는 마이크로스테핑이라는 기능을 갖추고 있어 모터를 더 높은 분해능으로 구동할 수 있습니다. 이는 코일에 중간 전류를 공급하여 중간 스텝 위치를 생성함으로써 구현됩니다.

 

 

 

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

 

A4988 드라이버는 최대 16마이크로스텝의 분해능을 가지고 있으며, 이는 200스텝 NEMA17 모터가 회전당 3200스텝, 즉 스텝당 0.1125도의 정밀도를 가진다는 것을 의미합니다. 이는 매우 인상적인 정밀도이며, 이러한 유형의 스테퍼 모터와 드라이버가 다양한 애플리케이션에 사용되는 이유입니다. 실제로 최대 256마이크로스텝, 즉 회전당 51200스텝, 즉 스텝당 0.007도의 정밀도를 가진 스테퍼 드라이버도 있습니다.

 

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

 

A4988 전류 제한

 

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

 

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

 

 

 

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로 조정해야 합니다.

 

전류 제한을 설정하는 두 번째 방법은 코일에 흐르는 전류를 직접 측정하는 것입니다. 이를 위해 앞서 설명한 대로 스테퍼 모터와 드라이버를 연결해야 합니다. 컨트롤러 연결은 생략하고, Direction 핀과 Step 핀에 5V를 연결하여 모터가 활성 상태를 유지하고 한 위치를 유지하도록 할 수 있습니다. 드라이버가 풀스텝 모드로 작동하도록 MS 핀은 연결 해제된 상태로 두어야 합니다. 그런 다음 모터에서 한 라인 또는 코일을 분리하고 전류계와 직렬로 연결합니다. 이렇게 하면 드라이버에 논리 전압인 5V와 모터 전원(제 경우 12V)을 모두 공급하여 코일에 흐르는 전류량을 확인할 수 있습니다.

 

 

 

단, 드라이버가 풀스텝 모드로 작동할 때 코일 전류는 실제 전류 한계의 70%까지만 도달할 수 있다는 점에 유의해야 합니다. 따라서 드라이버를 다른 마이크로스텝 모드로 사용할 경우, 드라이버의 실제 전류 한계 값을 얻으려면 전류계 측정값에 1.3을 곱해야 합니다.

 

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

 

스테퍼 모터와 아두이노 - 예제 코드

 

그럼에도 불구하고, 이제 아두이노 프로그래밍으로 넘어가거나 아두이노 보드로 스테퍼 모터를 제어하는 몇 가지 예제 코드를 살펴볼 수 있습니다.

 

 

 

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

 

예제 코드 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);
}

 

코드 설명:

 

여기서 해야 할 일은 STEP 핀과 DIR 핀이 연결된 핀 번호를 정의하고 출력으로 정의하는 것입니다. 루프에서 먼저 Direction 핀을 HIGH로 설정하여 모터의 회전 방향을 설정합니다. 그런 다음 "for" 루프를 사용하여 STEP 핀에 200개의 펄스를 보냅니다. 이 펄스는 모터가 풀스텝 모드로 작동한다고 가정할 때 모터가 한 사이클 회전하도록 합니다. 펄스는 STEP 핀의 상태를 HIGH에서 LOW로 토글하는 간단한 방식으로 생성되며, 두 상태 사이에 약간의 시간 지연이 있습니다. 이 시간 지연은 실제로 회전 속도를 정의합니다. 시간 지연을 낮추면 스텝이 더 빨리 발생하여 회전 속도가 증가하고, 반대로 낮추면 스텝이 더 빨리 발생하여 회전 속도가 증가합니다.

 

그런 다음 회전 방향을 변경하고, 또 다른 "for" 루프를 사용하여 모터가 두 사이클 회전하도록 400개의 펄스를 보냅니다. 그러나 드라이버의 마이크로스테핑 모드를 1/4 스텝으로 변경하면 모터의 스텝 수는 800이 됩니다. 첫 번째 루프는 모터를 90도만 회전시키고, 두 번째 루프는 반 회전만 시킵니다.

 

예제 코드 2

 

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

 

 

그러한 목적을 위해서는 전위차계를 아두이노에 연결하고 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
}

 

코드 설명:

 

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

 

전반적으로 이 방법으로 스테퍼 모터를 제어하는 것은 쉽고 효과적이지만, 필요한 제어가 예제에서처럼 간단할 때만 가능합니다. 더 복잡한 제어가 필요한 경우, 아두이노 라이브러리를 사용하는 것이 가장 좋습니다.

 

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

 

아두이노로 스테퍼 모터를 제어하는 데 가장 널리 사용되는 라이브러리는 Mike McCauley가 개발한 AccelStepper 라이브러리 입니다 . 이 라이브러리는 속도, 가속 및 감속 제어, 목표 위치 설정, 여러 스테퍼 모터 동시 제어 등 매우 다재다능한 기능을 제공합니다.

 

이 라이브러리에는 각 함수의 작동 방식을 설명하는 훌륭한 설명서가 있습니다. 저는 이미 이 라이브러리를 여러 Arduino 프로젝트에 사용해 봤는데, DIY 카메라 슬라이더 , 3D 와이어 벤딩 머신 , SCARA 로봇 팔 등의 동작을 제어하는 데 사용했습니다. 혹시 관심이 있으시다면 웹사이트에서 각 프로젝트에 대한 자세한 내용과 코드 설명을 확인하실 수 있습니다.

 

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

 

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

 

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

 

/*   
 *   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();
}

 

코드 설명:

 

먼저 AccelStepper 라이브러리를 포함해야 합니다. 물론, 그 전에 라이브러리를 설치해야 하는데, Arduino IDE 라이브러리 관리자에서 설치할 수 있습니다. "AccelStepper"를 검색하면 라이브러리가 표시되므로 설치할 수 있습니다.

 

그런 다음 모터에 사용할 AccelStepper 클래스의 인스턴스를 생성해야 합니다. 첫 번째 매개변수는 드라이버 유형입니다. 이 경우 제어 핀이 두 개인 드라이버의 경우 이 값은 1이고, 나머지 두 매개변수는 드라이버가 아두이노에 연결되는 핀 번호입니다. 스테퍼 모터가 여러 개 있는 경우 각 모터를 다음과 같이 정의해야 하며, 원하는 대로 이름을 지정할 수 있습니다. 이 경우에는 모터 이름을 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();
    //
    //
  }
}

 

코드 설명:

 

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

 

루프 섹션에서는 moveTo() 함수로 시작하여 모터가 어떤 위치로 이동해야 하는지, 또는 몇 스텝을 이동해야 하는지 알려줍니다. 1/4 스텝 해상도의 경우 800 스텝은 한 바퀴 회전하는 것을 의미합니다. 그런 다음 runToPosition() 함수는 가속과 감속을 구현하면서 모터를 해당 위치로 이동합니다. 하지만 이 함수는 블로킹 함수이므로 스테퍼 모터가 해당 위치에 도달할 때까지 코드 실행이 중단됩니다.

 

같은 방법으로 두 번째 모터를 1600단계 또는 1/4단계 분해능으로 2회전 시킵니다.

 

모터가 목표 위치에 도달할 때까지 코드가 멈추는 것을 원치 않으면 runToPosition() 함수 대신 run() 함수를 사용해야 합니다. run() 함수 역시 목표 위치에 도달하기 위한 가속 및 감속을 구현하지만, 호출당 한 단계만 실행합니다. 따라서 가능한 한 자주 호출해야 합니다. 이러한 이유로 두 모터의 run() 함수를 while 루프에 넣어 두 스테퍼 모터가 모두 위치 0에 도달할 때까지 실행합니다. 앞서 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);
}

 

코드 설명:

 

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

 

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

 

그럼에도 불구하고, 더 많은 것을 배우고 싶다면, 더 진보된 예제를 통해, 제가 이미 언급한 Arduino 프로젝트를 확인해보세요. 모든 세부 사항과 코드는 웹사이트에 있습니다.

 

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

 

여전히 여러 개의 스테퍼 모터를 제어하는 것에 대해 이야기하고 있지만, Arduino CNC 쉴드를 언급하고 살펴보는 것이 가치가 있습니다.

 

 

Arduino CNC 실드의 주요 목적은 2축 또는 3축 CNC 기계를 제어하는 것이지만, 여러 개의 스테퍼 모터를 제어해야 하는 모든 유형의 프로젝트를 제어하는 데 실제로는 훌륭한 옵션입니다. 왜냐하면 크기가 작고 드라이버와 모터를 쉽게 연결할 수 있기 때문입니다.

 

이 쉴드는 아두이노 우노 보드 위에 장착하여 최대 4개의 스테퍼 모터를 개별적으로 제어할 수 있으며, 나머지 아두이노 핀은 모두 사용 가능합니다. 저는 아두이노 우노 보드와 CNC 쉴드를 조합하여 4축 스카라 로봇 팔을 제어했습니다 .

 

곧 Arduino와 함께 CNC 실드를 사용하는 방법에 대한 기사의 이 부분을 더 자세한 내용으로 업데이트하겠습니다.

 

DRV8825 대 A4988

 

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

 

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

 

DRV8825 대 A4988

 

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

 

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

 

 

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

 

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에서, 다른 프로브는 Enable 핀 바로 옆에 있는 전체에서 기준 전압을 측정해야 합니다.

 

 

 

전류 한도를 계산하는 공식은 다음과 같습니다.

 

전류 제한 = Vref x 0.71

 

TMC2208 드라이버는 A4988 드라이버와 직접 교체할 수 있지만 핀 배치가 약간 다릅니다. 여기서는 마이크로스텝 분해능을 선택하는 핀이 두 개뿐이며, 드라이버를 활성화하려면 Enable 핀을 GND에 연결해야 합니다.

 

 

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

 

TMC2208 드라이버는 다른 두 드라이버보다 몇 가지 더 고급 기능을 제공합니다. 예를 들어, 사용하기 쉬운 UART 인터페이스를 통해 Step 핀과 Dir 핀 두 개 대신 단 하나의 라인으로 드라이버를 제어할 수 있습니다. 이 외에도 더 많은 튜닝 및 제어 옵션을 제공합니다.

 

전반적으로 TMC2208은 A4988과 DRV8825보다 더 나은 드라이버이지만, 가격이 더 비싸기 때문에 당연한 결과입니다. 하지만 이러한 추가 기능이 필요하지 않고 소음 수준이 문제가 되지 않는다면 다른 두 드라이버도 훌륭한 선택입니다.

 

결론

 

아두이노로 스테퍼 모터를 제어하는 데 필요한 거의 모든 것을 다루었습니다. NEMA17과 세 개의 드라이버, A4988, DRV8825, TMC2208은 매우 다재다능하며 위치 제어가 필요한 다양한 애플리케이션에 사용할 수 있습니다. 제 아두이노 프로젝트들을 살펴보면 더 많은 것을 배울 수 있습니다 .

 

NEMA23이나 NEMA34와 같은 대형 스테퍼 모터를 제어하는 방법을 배우는 데 관심이 있다면 그에 대한 전용 튜토리얼도 있습니다.

 

이 튜토리얼이 도움이 되셨기를 바라며 새로운 것을 배우셨기를 바랍니다. 구독하는 것을 잊지 마세요. 궁금한 점이 있으시면 아래 댓글란에 남겨주세요.  

 

 

참고 문서 링크 - 스테퍼 모터와 아두이노 완전 가이드

 

Stepper Motors and Arduino - The Ultimate Guide

In this tutorial we will learn everything we need to know about controlling stepper motors with Arduino and the A4988, DRV8825 and TMC2208.

howtomechatronics.com

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^