Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
projects:steppermotor [2013/01/06 12:23] elger |
projects:steppermotor [2016/11/16 13:06] (current) |
||
---|---|---|---|
Line 14: | Line 14: | ||
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. | 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|}} | + | {{ :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 L297 STEPPER MOTOR CONTROLLERS[[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 so I could get started. | + | 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|}} | + | {{ :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. | 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|}} | + | {{ :projects:steppermotor:stepper-motor.jpg?200 |}} |
- | Coil A : Blue | + | Coil A : Blue | Coil B : Yellow | Coil C : Green | Coil D : Red |
- | Coil B : Yellow | + | |
- | Coil C : Green | + | The label on the motor reads: Huisitong MOTOR 42BYGH202AA 1.8 1A 0: 20110717000KU |
- | Coil D : Red | + | |
+ | |||
+ | ====== 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> |