====== Steppermotor controlled by Arduino ====== This is a short how-to on controlling a bipolar stepper motor by an Arduino and a L298N based dual H-bridge controller board. For a long time I thought about playing around with a stepper motor. The goal for this page is not to explain what a stepper motor is, but to document for myself What I did so I can reproduce the results at a later time. 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 ====== ====== The code ====== // 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); }