BYJ48 Stepper motor + Modulul Driver Stepper ULN2003
Modulul Driver Stepper ULN2003 cu motor Stepper 28BYJ-48 compatibil Arduino de la Roboromania
Speed Variation Ratio 1/64
Stride Angle 5.625° /64
Frequency 100Hz
DC resistance 50Ω±7%(25℃)
Idle In-traction Frequency > 600Hz
Idle Out-traction Frequency > 1000Hz
In-traction Torque >34.3mN.m(120Hz)
Self-positioning Torque >34.3mN.m
Friction torque 600-1200 gf.cm
Pull in torque 300 gf.cm
Insulation grade A
ID-ul Arduino + Library pentru un motor Stepper, foarte ușor de folosit, după conectarea motorului cu arduino Puteți încărca Sketch pe arduino.
Dar …
Trebuie să luați în considerare:
Acest motor are un raport de transmisie de 64 și unghi Stride 5.625 °, astfel că acest motor are un pas de 4096.
steps = Number of steps in One Revolution * Gear ratio .
steps= (360°/5.625°)*64″Gear ratio” = 64 * 64 =4096 . this value will substitute it on The arduino Sketch
For adafruit Stepper Motor , the Stride Angle 7.5° and Gear ratio is 16 , So number of steps in 1 Revolution is :
steps in One Revolution = 360 / 7.5 = 48 .
steps= 48 * 16 = 768
Asta va fi diferit depinde de ce motor utilizați, așa că verificați datele pentru stepper motor pentru a calibra aceste valori.
Motor Driver ULN2003 Breakout conectat la Arduino de la IN1 – IN4 la D8 – D11 Respectiv
Pentru a alimenta motorul, utilizați sursa externă de alimentare cu cel puțin 5V-500mA, nu-l alimentați direct de la arduino 5V.
Când încărcați Sketch în arduino, motorul va fi rotit într-o singură direcție Prin tastarea comenzii:
step(steps);
Deci, trebuie să puneți numărul de pași pentru a porni motorul.
Puteți pune valoarea pozitivă pentru o direcție, negativă pentru cealaltă.
Acest motor trebuie să funcționeze ca în tabelul atașat.
Am scris un cod care permite acestui motor să se miște în sensul acelor de ceasornic și contra sensului acelor de ceasornic
codul final pentru acest motor Stepper:
/*
BYJ48 Stepper motor code
Connect :
IN1 >> D8
IN2 >> D9
IN3 >> D10
IN4 >> D11
VCC … 5V Prefer to use external 5V Source
Gnd
*/
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
int Steps = 0;
boolean Direction = true;// gre
unsigned long last_time;
unsigned long currentMillis ;
int steps_left=4095;
long time;
void setup()
{
Serial.begin(115200);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// delay(1000);
}
void loop()
{
while(steps_left>0){
currentMillis = micros();
if(currentMillis-last_time>=1000){
stepper(1);
time=time+micros()-last_time;
last_time=micros();
steps_left–;
}
}
Serial.println(time);
Serial.println(„Wait…!”);
delay(2000);
Direction=!Direction;
steps_left=4095;
}
void stepper(int xw){
for (int x=0;x<xw;x++){
switch(Steps){
case 0:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
break;
case 1:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
break;
case 2:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
break;
case 3:
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
break;
case 4:
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 5:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 6:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 7:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
break;
default:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
}
SetDirection();
}
}
void SetDirection(){
if(Direction==1){ Steps++;}
if(Direction==0){ Steps–; }
if(Steps>7){Steps=0;}
if(Steps<0){Steps=7; }
}
Am tăiat dimensiunea codului în jos și l-am modificat astfel încât să puteți specifica viteza și nu aveți nevoie de direcție. Doar apelați „stepper ()” și dați numărul de pași pe care doriți să îl rotiți.
Utilizați numere negative pentru a inversa direcția.
Probabil că va trebui să modificați valorile pentru IN1-IN4 pentru a se potrivi cu pinii folosiți de pe Arduino:
#define IN1 5
#define IN2 4
#define IN3 3
#define IN4 2
#define FULL_ROTATION 4076
const int phases1[] = {0, 0, 0, 0, 0, 1, 1, 1};
const int phases2[] = {0, 0, 0, 1, 1, 1, 0, 0};
const int phases3[] = {0, 1, 1, 1, 0, 0, 0, 0};
const int phases4[] = {1, 1, 0, 0, 0, 0, 0, 1};
int Phase = 0;
int Speed = 100; //MUST BE 1 – 100
void setup()
{
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
Serial.begin(115200);
}
void loop()
{
stepper(FULL_ROTATION);
stepper(-FULL_ROTATION);
}
void stepper(int count)
{
int rotationDirection = count < 1 ? -1 : 1;
count *= rotationDirection;
for (int x = 0; x < count; x++)
{
digitalWrite(IN1, phases1[Phase]);
digitalWrite(IN2, phases2[Phase]);
digitalWrite(IN3, phases3[Phase]);
digitalWrite(IN4, phases4[Phase]);
IncrementPhase(rotationDirection);
delay(100/Speed);
}
}
void IncrementPhase(int rotationDirection)
{
Phase += 8;
Phase += rotationDirection;
Phase %= 8;
}
Am schimbat codul puțin pentru a scăpa de direcție și pentru a folosi semnul minus pentru rotirea CCW și plus pentru CW rotativ.
De asemenea, vreau să dezactivez motorul după fiecare rotire.
Scrieți doar câți pași ai nevoie și executa.
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
int Steps = 0;
void setup()
{
Serial.begin(115200);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// delay(1000);
}
void loop() {
while (Serial.available()>0){
int st = Serial.parseInt();
if(Serial.read()==’\n’){
String message = „STEPS „;
message+=st;
Serial.println(message);
stepper(st);
delay(500);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
}
}
void stepper(int doSteps){
int xw =abs(doSteps);
for (int x=0;x<xw;x++){
switch(Steps){
case 0:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
break;
case 1:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
break;
case 2:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
break;
case 3:
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
break;
case 4:
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 5:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 6:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 7:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
break;
default:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
}
delay(1);
if(doSteps>=0){ Steps++;}
if(doSteps<0){ Steps–; }
if(Steps>7){Steps=0;}
if(Steps<0){Steps=7; }
}
}
Codul ar putea
să fie simplificat.
Folosind matrice, redenumirea variabilelor și simplificarea controlului
/*
BYJ48 Stepper motor code
Conectați :
IN1 >> D8
IN2 >> D9
IN3 >> D10
IN4 >> D11
VCC … 5V folosiți external 5V Source
Gnd
*/
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
const int NBSTEPS = 4096;
const int STEPTIME = 900;
int Step = 0;
boolean Clockwise = true;
int arrayDefault[4] = {LOW, LOW, LOW, LOW};
int stepsMatrix[8][4] = {
{LOW, LOW, LOW, HIGH},
{LOW, LOW, HIGH, HIGH},
{LOW, LOW, HIGH, LOW},
{LOW, HIGH, HIGH, LOW},
{LOW, HIGH, LOW, LOW},
{HIGH, HIGH, LOW, LOW},
{HIGH, LOW, LOW, LOW},
{HIGH, LOW, LOW, HIGH},
};
unsigned long lastTime;
unsigned long time;
void setup(){
Serial.begin(9600);
Serial.println(„Starting…”);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop(){
unsigned long currentMicros;
int stepsLeft = NBSTEPS;
time = 0;
while(stepsLeft > 0){
currentMicros = micros();
if(currentMicros – lastTime >= STEPTIME){
stepper();
time += micros() – lastTime;
lastTime = micros();
stepsLeft–;
}
}
Serial.println(time);
Serial.println(„Wait…!”);
delay(2000);
Clockwise = !Clockwise;
stepsLeft = NBSTEPS;
}
void writeStep(int outArray[4]){
for (int i=0;i < 4; i++){
digitalWrite(IN1 + i, outArray[i]);
}
}
void stepper(){
if ((Step >= 0) && (Step < 8)){
writeStep(stepsMatrix[Step]);
}else{
writeStep(arrayDefault);
}
setDirection();
}
void setDirection(){
(Clockwise) ? (Step++) : (Step–);
if(Step>7){
Step=0;
}else if(Step<0){
Step=7;
}
}
Succes !
Colectivul Roboromania