My little place on the web

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

projects:steppermotor [2013/01/06 12:44]
elger
projects:steppermotor [2016/11/16 13:06]
Line 1: Line 1:
-====== 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 ====== 
-<​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>​