테스트용 스텝모터 Stepper motor (5V Stepper Motor with ULN2003 Drive)
원문 : http://www.4tronix.co.uk/arduino/Stepper-Motors.php
1. 5V Stepper Motor with ULN2003 Drive
스텝모터 테스트용 세트입니다. 이베이에서 왼쪽 그림과 같은 세트가 3$ 정도입니다. 드라이버가 포함이라 비싼 모터쉴드나 모듈이 필요치 않고 큰 힘이 필요하지만 않다면 유용해 보입니다만… 인터넷을 뒤져보니 정말 테스용으로만 쓰라는 평이 있네요. 정방향 역방향으로 전환하다보면 드라이버가 버티질 못하고(녹아내릴수 있다고 함), 어떤 드라이버는 역방향 구동 자체가 안된다고 합니다. 테스트, 프로토 타이핑 용으로만 이용하고 실제 결과물을 만들때는 A3967 EasyDriver를 사용할 것을 권장합니다. 링크참조
뭐 어쨌든… 모터는 28BYJ48 이며, 5핀 커넥터로 드라이버와 연결되어 있습니다.
드라이버 보드는 ULN2003 칩셋과 4 LED를 장착하고 있습니다.
2. 연결방법
위 그림은 모터에서 나오는 5개 라인의 배선입니다. 모터에서 나온 커넥터를 드라이버 보드와 연결하세요.
- 5V+ connect to +5V
- 5V- connect to 0V (Ground)
- IN1: to Arduino digital input pin 8
- IN2: to Arduino digital input pin 9
- IN3: to Arduino digital input pin 10
- IN4: to Arduino digital input pin 11
3. 동작 방법
그림과 같이 8개의 상에 맞게 핀들을 순차적으로 enable 시켜주면 시계방향으로 회전합니다.
- Drive IN4 only
- Drive IN4 and IN3
- Drive IN3 only
- Drive IN3 and IN2
- etc.
반시계방향 구동을 위해서는 반대 순서로 동작시키세요.
4. 연결 확인, 소스 업로드
Example Code (드라이버 직접 구동)
// This Arduino example demonstrates bidirectional operation of a // 28BYJ-48, using a ULN2003 interface board to drive the stepper. // The 28BYJ-48 motor is a 4-phase, 8-beat motor, geared down by // a factor of 68. One bipolar winding is on motor pins 1 & 3 and // the other on motor pins 2 & 4. The step angle is 5.625/64 and the // operating Frequency is 100pps. Current draw is 92mA. //////////////////////////////////////////////// //declare variables for the motor pins int motorPin1 = 8; // Blue - 28BYJ48 pin 1 int motorPin2 = 9; // Pink - 28BYJ48 pin 2 int motorPin3 = 10; // Yellow - 28BYJ48 pin 3 int motorPin4 = 11; // Orange - 28BYJ48 pin 4 // Red - 28BYJ48 pin 5 (VCC) int motorSpeed = 1200; //variable to set stepper speed int count = 0; // count of steps made int countsperrev = 512; // number of steps per full revolution int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001}; ////////////////////////////////////////////////////////////////////////////// void setup() { //declare the motor pins as outputs pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); Serial.begin(9600); } ////////////////////////////////////////////////////////////////////////////// void loop(){ if(count < countsperrev ) clockwise(); else if (count == countsperrev * 2) count = 0; else anticlockwise(); count++; } ////////////////////////////////////////////////////////////////////////////// //set pins to ULN2003 high in sequence from 1 to 4 //delay "motorSpeed" between each pin setting (to determine speed) void anticlockwise() { for(int i = 0; i < 8; i++) { setOutput(i); delayMicroseconds(motorSpeed); } } void clockwise() { for(int i = 7; i >= 0; i--) { setOutput(i); delayMicroseconds(motorSpeed); } } void setOutput(int out) { digitalWrite(motorPin1, bitRead(lookup[out], 0)); digitalWrite(motorPin2, bitRead(lookup[out], 1)); digitalWrite(motorPin3, bitRead(lookup[out], 2)); digitalWrite(motorPin4, bitRead(lookup[out], 3)); }
Example Code (Stepper 라이브러리 사용)
#include const int stepsPerRevolution = 200; // 모터의 1회전당 스텝 수에 맞게 조정 // initialize the stepper library on pins 8 through 11: // IN1, IN2, IN3, IN4 가 아두이노 D8, D9, D10, D11에 순서대로 연결되어 있다면 Stepper myStepper(stepsPerRevolution, 11,9,10,8); // Note 8 & 11 swapped void setup() { // set the speed at 60 rpm: myStepper.setSpeed(120); // initialize the serial port: Serial.begin(9600); } void loop() { // step one revolution in one direction: Serial.println("clockwise"); //************************** for (int x=1;x<12;x++) { myStepper.step(stepsPerRevolution); Serial.println(x); } //************************** delay(500); // step one revolution in the other direction: Serial.println("counterclockwise"); //************************** for (int x =1;x<12;x++) { myStepper.step(-stepsPerRevolution); Serial.println(x); } //************************** delay(500); }