KKM: Stepper motor i ULN2003 driver

Početnik si s Croduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM!

Kako Koristiti Module (KKM) je serija blog tutorijala e-radionice na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Croduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.

Osnovne karakteristike

Htjeli mi to ili ne, motori se nalaze u hrpi uređaja koje koristimo svakodnevno. Printeri, laptopi, perilice rublja, električni brijači, quadcopteri i još puno, puno toga. Ipak, jako je mali postotak ljudi koji znaju i upravljati s njima. Najbolje i najjednostavnije nešto naučiti je kada imamo fizički primjer, upravo stoga volimo Croduino i KKM tutorijale.

DSC_4679
Karakteristike 28BYJ-48 stepper motora:
Napon: 5V
Kut jednog okreta: 5.625°
Omjer okreta: 64
Frekvencija: 100HZ
za više pogledajte datasheet

Što i kako radi stepper motor?

Princip rada stepper motora obraditi ćemo na primjeru unipolarnog stepper motora 28-BYJ48.

858-01 Pogled na BYJ-48 motor iznutra.
Stepper, ili koračni, motor rotira pokretni dio preciznim koracima u određenim vremenskim intervalima. Puls se šalje do serije zavojnica (naš motor ima 4 zavojnice) koje čine prsten oko rotora, ali one same su statične pa taj dio motora zovemo stator. Preciznost motora se izražava brojem koraka koje motor pravi kako bi napravio puni krug, 360°. Možemo ju izračunati iz formule: broj koraka = ( 360°/stupanj jednog okreta) * omjer okreta. Na primjeru našeg steppera to je: (360°/5.625°) * 64 = 4096 koraka.

StepperMotorizvor slike wikipedia.
Princip rada možemo vidjeti na gifu iznad. Svaki stepper motor radi na način da se serije zavojica u statoru "pale" naizmjenično u smjeru u kojem želimo okretati motor, odnosno "stoje" u istom stanju ako želimo da motor miruje.

Kako povezati modul na Croduinom?

Stepper motor spojiti ćemo na ULN driver, a njega na Croduino. Slika prikazuje dijelove modula ULN2003. Za više, pogledajte datasheet.

DSC_8619
Stepper motor, ULN2003 breakout pločicu i Croduino spojiti ćemo kako pokazuje slika ispod.

28BYJ-48_bb

Kod

/*
* BYJ48 Koracni motor s ULN breakout boardom
* Spojite :
* IN1 - D8
* IN2 - D9
* IN3 - D10
* IN4 - D11
* VCC - 5V
* Gnd - gnd
*
* e-radionica.com
*/
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
int koraci = 0;
boolean smjer = true;
unsigned long vrijemeZadnje = 0; // biljeziti cemo vrijeme
unsigned long vrijemeTrenutno = 0; // koje je potrebno da se
unsigned long vrijeme = 0; // se izvrsi zadani kut
int koraciPreostalo = 4095; //ovaj koracni ukupno ima 4095 koraka
void setup()
{
Serial.begin(115200);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop()
{
while(koraciPreostalo > 0) // dokle je preostalo koraka do punog okreta
{
vrijemeTrenutno = micros(); //zapisi trenutno vrijeme u micro sek
if(vrijemeTrenutno - vrijemeZadnje >= 1000)
{
stepper(1); //pozovi funkciju stepper (vidi dolje void stepper)
vrijeme = vrijeme + micros() - vrijemeZadnje;
vrijemeZadnje = micros();
koraciPreostalo--;
}
}
Serial.println(vrijeme);
Serial.println("Pricekaj..!");
delay(2000);
smjer = !smjer; // obrni smjer
koraciPreostalo = 4095; // resetiraj broj koraka
}
void stepper(int brojKoraka)
{
for (int x=0; x < brojKoraka; x++) { switch(koraci) { 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; } postaviSmjer(); } } void postaviSmjer() { if(smjer==1){ koraci++; } if(smjer==0){ koraci--; } if(koraci>7){ koraci=0; }
if(koraci<0){ koraci=7; }
}
Leave a Reply