2014年12月12日 星期五

Arduino範例1:用Arduino玩 28BYJ-48+ULN2003驅動步進馬達

Arduino範例1:用Arduino玩 28BYJ-48+ULN2003驅動步進馬達

  1. 準備材料:
    圖(1). Arduino UNO(控制板) x1
    (2). 28BYJ-48(步進馬達) x1
    (3). ULN2003(步進馬達驅動器) x1

    圖(1). Arduino UNO(控制板) x1


    圖(2). 28BYJ-48(步進馬達) x1


    圖(3). ULN2003(步進馬達驅動器) x1
  2. 連接1:步進馬達+步進馬達驅動器(會有防呆裝置)
  3. 連接2:控制板+步進馬達驅動器+電腦
  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));
    }
  5. 參考網址:
    http://4tronix.co.uk/arduino/Stepper-Motors.php
  6. 3D創意動力機械教室-(機器人教室) 開跑囉!