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