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 stepper motors does an excellent job at documenting the motor.
This first test setup has three components, an Arduino (clone), A stepper driver and a stepper motor.
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 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 and the 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 e-bay so I could get started.
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. 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
// 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); }