Arduino control stepper motor driver ULN2003A

   โค๊ดตัวอย่าง Arduino ควบคุมสเตปเปอร์มอเตอร์ผ่าน ULN2003A

    ตัวอย่างนี้ เป็นการควบคุม Bipolar Stepper motor ผ่านไอซีัขับกระแสขวดลวดของมอเตอร์ stepper ด้วยไอซี ULN2003A ถึงแม้ว่าตัวมอเตอร์ที่ยกตัวอย่างมาให้เห็นจะมีแรงบิดไม่มากนัก อาจจะเหมาะกับของเด็กเล่นซะมากกว่า แต่ก็พอได้ไอเดียในการขับ Stepper Motor 

การต่อวงจรบอร์ดขับมอเตอร์กับบอร์ด Arduino

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

    เจ้า Bipolar stepper motor จะมีอยู่ด้วยกันสี่เส้น ลำดับการขับขดลวด จะมีลำดับดังนี้ 

หน้าที่ของเราก็คือ สั่งให้สัญญาณพัลส์ไปขับขดลวดทั้งสี่ ให้ได้ตามลำดับ นอกจากนั้นจะต้องควบคุมระยะเวลาในการควบคุมของพัลส์ด้วย ไม่เช่นนั้น Stepper motor จะเกิดอาการกระตุก เนื่องจาก Timing ไม่ได้ตามสเปกของมัน โค๊ดตัวอย่างที่ยกมาให้ดูนี้ ค่า delayMicroseconds(motorSpeed); ถูกตั้งมาให้เหมาะสมกับ Stepper motor รุ่น 28BYJ48 เพราะฉะนั้นถ้าจะนำไปประยุกต์กับมอเตอร์ตัวอื่น ต้องปรับให้เหมาะสมด้วย

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));

}

ที่มา : http://www.4tronix.co.uk/arduino/Stepper-Motors.php

         http://www.geeetech.com/wiki/index.php/Stepper_Motor_5V_4-Phase_5-Wire_%26_ULN2003_Driver_Board_for_Arduino