Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
projects:steppermotor [2013/01/06 11:14] elger created |
projects:steppermotor [2013/01/06 12:44] elger |
||
---|---|---|---|
Line 7: | Line 7: | ||
The Wiki page on [[http://en.wikipedia.org/wiki/Stepper_motor|stepper motors]] does an excellent job at documenting the motor. | The Wiki page on [[http://en.wikipedia.org/wiki/Stepper_motor|stepper motors]] does an excellent job at documenting the motor. | ||
+ | ====== The components ====== | ||
+ | This first test setup has three components, an Arduino (clone), A stepper driver and a stepper motor. | ||
+ | |||
+ | {{ :projects:steppermotor:stepper-motor_overview_text.jpg?600 |}} | ||
+ | |||
+ | The Arduino clone is just like a regular Arduino but this one has a serial port and the labeling of the ports is more like the real Atmega328 pin mapping. | ||
+ | {{ :projects:steppermotor:arduino-clone.jpg?200 |}} | ||
+ | The controller board was a bit of a chalange because I tried to design it myself with the two chips that were designed specifically for this: the [[http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00000063.pdf|L297 STEPPER MOTOR CONTROLLERS]] and the [[http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00000240.pdf|L298 Dual Full Bridge Driver]]. This is no simple task if you need to do it on a single layer PCB. So in the end I just bought the simpler L298 driver board of [[http://www.ebay.nl/itm/L298N-Based-Stepper-DC-Motor-Driver-Controller-Board-Dual-H-Bridge-For-Arduino-/160898410591?pt=LH_DefaultDomain_0&hash=item25764ae85f|e-bay]] so I could get started. | ||
+ | {{ :projects:steppermotor:l298n_based_dual_h-bridge_controller_board.jpg?200 |}} | ||
+ | |||
+ | The steppermotor I chose also came from e-bay, it works on 12V and it is unipolar. In the end the problem with this motor is that the wire coloring is different from any data-sheet I could find. So after a lot of searching and testing I came up with the right sequence. | ||
+ | {{ :projects:steppermotor:stepper-motor.jpg?200 |}} | ||
+ | Coil A : Blue | Coil B : Yellow | Coil C : Green | Coil D : Red | ||
+ | |||
+ | The label on the motor reads: Huisitong MOTOR 42BYGH202AA 1.8 1A 0: 20110717000KU | ||
+ | |||
+ | |||
+ | ====== The demo ====== | ||
+ | <html> | ||
+ | <iframe width="853" height="480" src="http://www.youtube.com/embed/-20p3q9VnIA" frameborder="0" allowfullscreen></iframe> | ||
+ | </html> | ||
+ | |||
+ | ====== The code ====== | ||
+ | <code cpp L298N_driver_test.ino> | ||
+ | // test script | ||
+ | // Drive a Motor controller L298N | ||
+ | |||
+ | |||
+ | //IN1 IN2 : TTL Compatible Inputs of the Bridge A | ||
+ | //In3 In4 :TTL Compatible Inputs of the Bridge B. | ||
+ | //ENA ENB:TTL Compatible Enable Input: the L state disables the | ||
+ | //bridge A(enable A) and/or the bridge B (enable B). | ||
+ | |||
+ | #define ENA 8 | ||
+ | #define IN1 9 | ||
+ | #define IN2 10 | ||
+ | #define IN3 11 | ||
+ | #define IN4 12 | ||
+ | #define ENB 13 | ||
+ | |||
+ | void setup() { | ||
+ | // put your setup code here, to run once: | ||
+ | pinMode(ENA, OUTPUT); | ||
+ | pinMode(IN1, OUTPUT); | ||
+ | pinMode(IN2, OUTPUT); | ||
+ | pinMode(IN3, OUTPUT); | ||
+ | pinMode(IN4, OUTPUT); | ||
+ | pinMode(ENB, OUTPUT); | ||
+ | |||
+ | digitalWrite(ENA, HIGH); | ||
+ | digitalWrite(IN1, LOW); | ||
+ | digitalWrite(IN2, LOW); | ||
+ | digitalWrite(IN3, LOW); | ||
+ | digitalWrite(IN4, LOW); | ||
+ | digitalWrite(ENB, HIGH); | ||
+ | |||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // put your main code here, to run repeatedly: | ||
+ | engage(); | ||
+ | for (int i = 0 ; i < 50; i++ ) { | ||
+ | //waveDriveOneFaseOn(); | ||
+ | //waveDriveTwoFaseOn(); | ||
+ | halfStep(); | ||
+ | } | ||
+ | delay(10); | ||
+ | disengage(); | ||
+ | delay(2000); | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | void engage() { | ||
+ | digitalWrite(ENA, HIGH); | ||
+ | digitalWrite(ENB, HIGH); | ||
+ | } | ||
+ | |||
+ | void disengage() { | ||
+ | digitalWrite(ENA, LOW); | ||
+ | digitalWrite(ENB, LOW); | ||
+ | } | ||
+ | |||
+ | void waveDriveTwoFaseOn() { | ||
+ | //State sequence and output waveforms for the two phase on sequence | ||
+ | // only four steps for one turn | ||
+ | // 0101 | ||
+ | digitalWrite(IN1, LOW); | ||
+ | digitalWrite(IN2, HIGH); | ||
+ | digitalWrite(IN3, LOW); | ||
+ | digitalWrite(IN4, HIGH); | ||
+ | delayMicroseconds(1000); | ||
+ | |||
+ | //1001 | ||
+ | digitalWrite(IN1, HIGH); | ||
+ | digitalWrite(IN2, LOW); | ||
+ | digitalWrite(IN3, LOW); | ||
+ | digitalWrite(IN4, HIGH); | ||
+ | delayMicroseconds(1000); | ||
+ | |||
+ | //1010 | ||
+ | digitalWrite(IN1, HIGH); | ||
+ | digitalWrite(IN2, LOW); | ||
+ | digitalWrite(IN3, HIGH); | ||
+ | digitalWrite(IN4, LOW); | ||
+ | delayMicroseconds(1000); | ||
+ | |||
+ | //0110 | ||
+ | digitalWrite(IN1, LOW); | ||
+ | digitalWrite(IN2, HIGH); | ||
+ | digitalWrite(IN3, HIGH); | ||
+ | digitalWrite(IN4, LOW); | ||
+ | delayMicroseconds(1000); | ||
+ | } | ||
+ | |||
+ | void halfStep() { | ||
+ | |||
+ | //101011 | ||
+ | digitalWrite(ENA, HIGH); | ||
+ | digitalWrite(IN1, LOW); | ||
+ | digitalWrite(IN2, HIGH); | ||
+ | digitalWrite(IN3, LOW); | ||
+ | digitalWrite(IN4, HIGH); | ||
+ | digitalWrite(ENB, HIGH); | ||
+ | delayMicroseconds(1000); | ||
+ | |||
+ | //000011 | ||
+ | digitalWrite(ENA, LOW); | ||
+ | digitalWrite(IN1, LOW); | ||
+ | digitalWrite(IN2, LOW); | ||
+ | digitalWrite(IN3, LOW); | ||
+ | digitalWrite(IN4, HIGH); | ||
+ | digitalWrite(ENB, HIGH); | ||
+ | | ||
+ | |||
+ | //110011 | ||
+ | digitalWrite(ENA, HIGH); | ||
+ | digitalWrite(IN1, HIGH); | ||
+ | digitalWrite(IN2, LOW); | ||
+ | digitalWrite(IN3, LOW); | ||
+ | digitalWrite(IN4, HIGH); | ||
+ | digitalWrite(ENB, HIGH); | ||
+ | delayMicroseconds(1000); | ||
+ | |||
+ | //110000 | ||
+ | digitalWrite(ENA, HIGH); | ||
+ | digitalWrite(IN1, HIGH); | ||
+ | digitalWrite(IN2, LOW); | ||
+ | digitalWrite(IN3, LOW); | ||
+ | digitalWrite(IN4, LOW); | ||
+ | digitalWrite(ENB, LOW); | ||
+ | delayMicroseconds(1000); | ||
+ | |||
+ | //110101 | ||
+ | digitalWrite(ENA, HIGH); | ||
+ | digitalWrite(IN1, HIGH); | ||
+ | digitalWrite(IN2, LOW); | ||
+ | digitalWrite(IN3, HIGH); | ||
+ | digitalWrite(IN4, LOW); | ||
+ | digitalWrite(ENB, HIGH); | ||
+ | delayMicroseconds(1000); | ||
+ | |||
+ | |||
+ | //000101 | ||
+ | digitalWrite(ENA, LOW); | ||
+ | digitalWrite(IN1, LOW); | ||
+ | digitalWrite(IN2, LOW); | ||
+ | digitalWrite(IN3, HIGH); | ||
+ | digitalWrite(IN4, LOW); | ||
+ | digitalWrite(ENB, HIGH); | ||
+ | delayMicroseconds(1000); | ||
+ | |||
+ | |||
+ | //101101 | ||
+ | digitalWrite(ENA, HIGH); | ||
+ | digitalWrite(IN1, LOW); | ||
+ | digitalWrite(IN2, HIGH); | ||
+ | digitalWrite(IN3, HIGH); | ||
+ | digitalWrite(IN4, LOW); | ||
+ | digitalWrite(ENB, HIGH); | ||
+ | delayMicroseconds(1000); | ||
+ | |||
+ | //101000 | ||
+ | digitalWrite(ENA, HIGH); | ||
+ | digitalWrite(IN1, LOW); | ||
+ | digitalWrite(IN2, HIGH); | ||
+ | digitalWrite(IN3, LOW); | ||
+ | digitalWrite(IN4, LOW); | ||
+ | digitalWrite(ENB, LOW); | ||
+ | delayMicroseconds(1000); | ||
+ | } | ||
+ | |||
+ | void waveDriveOneFaseOn() { | ||
+ | |||
+ | //000011 | ||
+ | digitalWrite(ENA, LOW); | ||
+ | digitalWrite(IN1, LOW); | ||
+ | digitalWrite(IN2, LOW); | ||
+ | digitalWrite(IN3, LOW); | ||
+ | digitalWrite(IN4, HIGH); | ||
+ | digitalWrite(ENB, HIGH); | ||
+ | delayMicroseconds(1000); | ||
+ | |||
+ | //110000 | ||
+ | digitalWrite(ENA, HIGH); | ||
+ | digitalWrite(IN1, HIGH); | ||
+ | digitalWrite(IN2, LOW); | ||
+ | digitalWrite(IN3, LOW); | ||
+ | digitalWrite(IN4, LOW); | ||
+ | digitalWrite(ENB, LOW); | ||
+ | delayMicroseconds(1000); | ||
+ | |||
+ | //000101 | ||
+ | digitalWrite(ENA, LOW); | ||
+ | digitalWrite(IN1, LOW); | ||
+ | digitalWrite(IN2, LOW); | ||
+ | digitalWrite(IN3, HIGH); | ||
+ | digitalWrite(IN4, LOW); | ||
+ | digitalWrite(ENB, HIGH); | ||
+ | delayMicroseconds(1000); | ||
+ | |||
+ | //101000 | ||
+ | digitalWrite(ENA, HIGH); | ||
+ | digitalWrite(IN1, LOW); | ||
+ | digitalWrite(IN2, HIGH); | ||
+ | digitalWrite(IN3, LOW); | ||
+ | digitalWrite(IN4, LOW); | ||
+ | digitalWrite(ENB, LOW); | ||
+ | delayMicroseconds(1000); | ||
+ | } | ||
+ | </code> |