Cílem tohoto projektu bylo vytvořit jednoduchý způsob na ovládání krokového motoru s modulem L298N. Bude se skládat ze tří částí: Ř-duino-LED s rotačním enkodérem, modul L298N a krokový motor. Po zpuštění programu můžeme začít otáčet s rotačním enkodér a podle směru otáčení enkodéru se otočí i krokový motor. Signál z rotačního enkodéru budeme zpracovávat a posílat do modulu L298N, který ovládá krokový motor.
- Ř-duino-LED
- externí zdroj 12V 1,2A (min)
- krokový motor
- rotační enkodér
- modul L298N
- vodiče
Jedná se o rotační vstupní součástka, která při otáčení její osou poskytuje informaci o této rotaci a také jejím směru. Zároveň tento typ rotačního enkodéru obsahuje i tlačítko, které lze aktivovat stiskem celé osy enkodéru. V kombinaci s Ř-duinem tak lze tento enkodér využít jako ovládací prvek pro všemožná zapojení, například jako ovladač pro pohyb v menu či jako digitální potenciometr pro řízení servomotorů. Velkou výhodou při srovnání s běžnými potenciometry je ten fakt, že u rotačního enkodéru není omezen počet otáček a můžeme tedy osou enkodéru otáčet donekonečna na obě strany. Enkodér má disk s kontaktními pintami rovnoměrně umístěnými od sebe. Když začneme otáčet knoflíkem, disk se také pohybuje a dostává se do kontaktu s výstupními kolíky S1 a S2 jeden po druhém, čímž generuje dvě čtvercové vlny současně. Ty mi můžeme porovnat a zjistit kterým směrem se enkodér otáčí.
Jedná se o inteligentní motorový řidič (Motor Driver IC) na bázi CMOS, který je schopný řídit dva DC motory nebo jeden krokový motor, jako v našem případě. Obvod L298N je široce používán v mnoha aplikacích, jako jsou roboti, automatizované systémy, chytré domácnosti, průmyslové aplikace a mnoho dalších. Obvod L298N má několik vlastností, které ho dělají vhodným pro řízení motorů.
Známí tež jako stepper motor je typ elektrického motoru, který se používá k posunu nebo rotaci v malých úsecích, známých jako kroky. Princip fungování krokového motoru je následující: Motor obsahuje několik komutátorů, které jsou přiřazeny k jednotlivým cívkám. Cívkové pásky jsou navrženy tak, že při přiřazení komutátorů k cívkám se vytváří elektromagnetické pole. Elektromagnetické pole způsobí pohyb cívkových pásků. Při pohybu cívkových pásků se motor pohybuje krokovým způsobem, tj. v malých úsecích.
(poznámka: "Enable" piny jsou společně propojené jumpery. Je jednoduché si tohoto na schématu nevšimnout.)
Po zapojení obvadu je ještě nutné připojit ke L298N externí zdroj. Připojte jej na piny +12 a GND.
Sledujeme výstupy enkodéru a porovnáváme je spolu, na zásadě tohoto porovnání poznáme jakým směrem enkodér otáčíme a pomocí funkce attachinterrupt budeme aktivovat krokový motor pouze pokud nastane změna ve výstupu enkodéru. Jakmile pootočíme s enkodérem program rozpozná jakým směrem otáčíme enkodér a určí směr pohybu. Jeden krok se skládá ze čtyř částí z toho upravuje, ale směr pouze 2 a 4 částí a ty program mění na zásadě směru (podrobnější popis v programu). Tento pohyb odešleme L298N modulu a ten na zásadě tohoto signálu sepne cívky a krokový motor se pohne o jeden jeho krok. Tento postup se bude opakovat vždy když pohneme enkodérem.
(soubor ke stažení výše)
#include <Arduino.h>
//určení pinů pro řduino
#define in1 4 //piny pro L298N modul
#define in2 5
#define in3 6
#define in4 7
#define encoder0PinA 2 //piny rotačního enkodéru
#define encoder0PinB 3
int A = HIGH; //proměná pro změnu směru
int B = LOW;
//opakující se smyčka
void setup() {
pinMode(in1, OUTPUT); //definice pinů pro L298N modul
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(encoder0PinA, INPUT);
pinMode(encoder0PinB, INPUT);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(encoder0PinA), doEncoder, CHANGE); //tato část spustí "void doencoder" pouze pokud nastane změna na enkodéru
}
//tato smyška se jednou spustí po jednom pohybu enkodéru
void doEncoder(){
if(digitalRead(encoder0PinB) == digitalRead(encoder0PinA)){ //tato část rozhoduje jestli se enkodér otáčí vpčed nebo vzat
A = LOW;
B = HIGH;
Serial.println("vpřed"); //upravení cyklusu vpřed
}
else{
A = HIGH;
B = LOW;
Serial.println("vzad"); //upravení cyklusu vzat
}
digitalWrite(in1, HIGH); //cyklus krokáče který se ovlivnujě na zísadě hořejšího rozpoznání
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(5);
digitalWrite(in1, A);
digitalWrite(in2, B);
digitalWrite(in3, B);
digitalWrite(in4, A);
delay(5);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(5);
digitalWrite(in1, B);
digitalWrite(in2, A);
digitalWrite(in3, A);
digitalWrite(in4, B);
delay(5);
}
void loop(){} //bez loopu arduino ide nás nenechá nahrát code, tato část nemá jiný účel}Pokud krokový motor nejezdí zkontrolujte si zapojení cívek a zapojení pokud jezdí motor obráceným směrem musíte prohodit cívky v modulu. Můžeme také prohodit piny S1 a S2 nebo obrátit piny propojující Ř-duino a L298N modul. Redukce enkodéru k motoru není dokonalá 1x1 je 1x3/4 neboli jedna otáčka enkodéru se projeví jako 3/4 otáčky krokového motoru. Při velké zátěži motoru se chladič na modulu zahřívá. Pokud budeme otáčet enkodér až moc rychle Ř-duino nebude stíhat signály enkodéru a motor se bude zasekávat.



