Arduino RobotCar készítése L298N motorvezérlővel

18. Projekt -- Arduino robot autó L298N motorvezérlővel -- V1.0

 by Roboworld Hobbielektronika

Rövid leírás:
Ebben a rövid projektben bemutatjuk neked hogyan tudsz egy kis robotautót készíteni egy L298N típusú motorvezérlővel. Fontos, mielőtt elkezdenéd ezt a projektet mindenképp tekintsd meg az előző 17. projektet, ahol az L298N típusú motorvezérlőről van szó, valamint H- hídkapcsolatról és PWM jelről. Ezen dolgok ismerete elengedhetetlenek ebben a projektben.

Hardware:
1db Arduino UNO mikrovezérlő
1 db L298N motorvezérlő
2 db DC motor
1db Joystick
1db lemez/falap az autó vázához

Kapcsolási rajz

Amire szükségünk van az két DC motor egy Arduino mikrovezérlő, egy L298N motorvezérlő valamint egy Joystick, amivel irányíthatjuk az autónkat. Valamint szükségünk van egy lemezre vagy funérlapra (3mm) vagy plexire, amiből kitudjuk alakítani a kisautónk vázát. Ha a lap megvan akkor már csak rá kell erősíteni a fém forgó kereket.

Tápellátásként pedig 3db 3,7V-os Li-ion akkumulátort használunk, amely így összesen 11,1V.

Váz alakja:
                                                      Méret: 220 x 175 x 65mm

Most pedig nézzük meg a programkódot. (lentebb megtalálható a teljes kód)

int xAxis = analogRead(A0); // Olvassa a Joystick X tengelyének értékét 
int yAxis = analogRead(A1); // Olvassa a Joystick Y tengelyének értékét 
Miután definiáltuk a pineket, a joystickról érkező tengelyértékeket (X, Y tengely) olvassuk le a loop szekcióban elsőként. A joystick két potméterből áll, amelyek az Arduino analóg bemeneteihez vannak kötve. Az értéke 0- 1023-ig terjed. Amikor a joystick középen áll (alaphelyzet) akkor mindkét potméter értéke kb. 512 értéken áll.

Ahogy a fenti képen is látható a Joystick alaphelyzetéhez egy tolerancia határt definiálunk Ez a tartomány 470- 550 -ig terjed. Tehát ha a joystick Y tengelyét visszafelé mozgatjuk és az érték 470 alá esik akkor a két motor forgási iránya megfordul és elindul az autó hátrafelé. A 470-0 tartományt a PWM jelnek megfelelően 0-255 -re konvertáljuk. Ez a PWM tartomány lényegében a motor sebességét adja.

// Az Y tengelyt az előre és hátramenet irányítására használjuk 
if (yAxis < 470) { 
// Motor A hátramenet 
    digitalWrite(in1, HIGH); 
    digitalWrite(in2, LOW); 
// Motor B hátramenet 
    digitalWrite(in3, HIGH); 
    digitalWrite(in4, LOW); 
//Az Y tengely a hátramenet miatt 470-0  0-255 tartományra konvertáljuk. Ahogy növekszik ebben a tartományban az érték //(PWM) úgy nő a motor sebessége. 
    motorSpeedA = map(yAxis, 470, 0, 0, 255); 
    motorSpeedB = map(yAxis, 470, 0, 0, 255); 
} 
Hasonló a helyzet, ha a Joystick Y tengelyét előre mozgatjuk, az érték meghaladja az 550-et és a motorok elindulnak előre. Az 550-1023 tartományt pedig 0-255 szakaszra konvertáljuk. Ha a joystick középen marad a sebesség 0 lesz.

Most pedig nézzük meg, hogyan használjuk az X tengely az autó jobb és bal irányú vezérlésére.

// X-tengely a jobb és bal irányra használjuk 
if (xAxis < 470) { 
//Konvertáljuk az X tengely 470-0 tartományát 0-255 tartományra. 
   int xMapped = map(xAxis, 470, 0, 0, 255); 
// Balra irányít - Csökkenti a bal motor sebességét, míg a jobb oldalit növeli 
   motorSpeedA = motorSpeedA - xMapped; 
   motorSpeedB = motorSpeedB + xMapped; 
// A tartomány meghatározása 0 és 255 között. 
if (motorSpeedA < 0) { 
    motorSpeedA = 0; 
} 
if (motorSpeedB > 255) { 
    motorSpeedB = 255; 
} 
} 

Először konvertálnunk kell az X tengely értékét 0-255 ös tartományra. A balra történő mozgáshoz ezt az értéket használjuk, hogy a bal oldali motor sebességét csökkentsük és a jobb oldaliét növeljük. Itt az aritmetikai függvények miatt két további „if” állítást használunk arra, hogy a motor fordulatszámát,sebességét 0-255 tartományra korlátozzuk.

A metódus ugyan ez, ha a fordulást másik irányba szeretnénk, hogy bekövezzen.

Az alkalmazott feszültségtől és a motortól függően alacsonyabb fordulatszámnál a motor nem tud mozogni és zümmögő hangot produkál. Az általam használt motorok esetén a motorok zümmögő hangot adtak, ha a PWM jel nem érte el a 70-et. Ezért módosítottam a 0-255 tartományt 70-255 közötti sebességre.

Végül a PWM jelet az L298N engedélyező (EN1, EN2) pinjeihez küldjük

//Alacsony fordulatszámon történő zümmögés megakadályozása.
// Motortól függően a motorok nem mozognak, ha PWM érték 
// 70-nél kisebb 
if (motorSpeedA < 70) { 
motorSpeedA = 0; 
} 
if (motorSpeedB < 70) { 
motorSpeedB = 0; 
} 
analogWrite(enA, motorSpeedA); // Elküldeni PWM jelet a MOTOR A-nak 
analogWrite(enB, motorSpeedB); // Elküldeni PWM jelet a MOTOR B-nek 
Teljes mintakód:


#define enA 9 
#define in1 4 
#define in2 5 
#define enB 10 
#define in3 6 
#define in4 7 

int motorSpeedA = 0; 
int motorSpeedB = 0; 

void setup() { 
pinMode(enA, OUTPUT); 
pinMode(enB, OUTPUT); 
pinMode(in1, OUTPUT); 
pinMode(in2, OUTPUT); 
pinMode(in3, OUTPUT); 
pinMode(in4, OUTPUT); 
} 
void loop() { 
int xAxis = analogRead(A0); // Olvassa a Joystick X tengelyének értékét 
int yAxis = analogRead(A1); // Olvassa a Joystick X tengelyének értékét 
//Az Y tengelyt az előre és hátramenet irányítására használjuk 
if (yAxis < 470) { 
// Motor A hátramenet 
digitalWrite(in1, HIGH); 
digitalWrite(in2, LOW); 
// Motor B hátramenet 
digitalWrite(in3, HIGH); 
digitalWrite(in4, LOW); 
//Az Y tengely a hátramenet miatt 470-0 à 0-255 tartományra konvertáljuk. Ahogy növekszik ebben a tartományban az érték //(PWM) //úgy nő a motor sebessége. 
motorSpeedA = map(yAxis, 470, 0, 0, 255); 
motorSpeedB = map(yAxis, 470, 0, 0, 255); 
} 
else if (yAxis > 550) { 
// Motor A előremenet 
digitalWrite(in1, LOW); 
digitalWrite(in2, HIGH); 
// Motor B előremenet 
digitalWrite(in3, LOW); 
digitalWrite(in4, HIGH); 
//Az Y tengely a előremenet miatt 550-1023 à 0-255 tartományra konvertáljuk. Ahogy növekszik ebben a tartományban az //érték(PWM) úgy nő a motor sebessége. 
motorSpeedA = map(yAxis, 550, 1023, 0, 255); 
motorSpeedB = map(yAxis, 550, 1023, 0, 255); 
} 
// Ha a Joystick középen van akkor nincs motor mozgás 
else { 
motorSpeedA = 0; 
motorSpeedB = 0; 
} 
// X-tengely a jobb és bal irányra használjuk 
if (xAxis < 470) { 
//Konvertáljuk az X tengely 470-0 tartományát 0-255 tartományra. 
int xMapped = map(xAxis, 470, 0, 0, 255); 
// Balra irányít - Csökkenti a bal motor sebességét, míg a jobb oldalit növeli 
motorSpeedA = motorSpeedA - xMapped; 
motorSpeedB = motorSpeedB + xMapped; 
// A tartomány meghatározása 0 és 255 között. 
if (motorSpeedA < 0) { 
motorSpeedA = 0; 
} 
if (motorSpeedB > 255) { 
motorSpeedB = 255; 
} 
} 
if (xAxis > 550) { 
//Konvertáljuk az X tengely 550-1023 tartományát 0-255 tartományra. 
int xMapped = map(xAxis, 550, 1023, 0, 255); 
// Jobbra irányít - Csökkenti a jobb motor sebességét, míg a bal oldalit növeli 

motorSpeedA = motorSpeedA + xMapped; 
motorSpeedB = motorSpeedB - xMapped; 
// A tartomány meghatározása 0 és 255 között. 
if (motorSpeedA > 255) { 
motorSpeedA = 255; 
} 
if (motorSpeedB < 0) { 
motorSpeedB = 0; 
} 
} 
// Alacsony fordulatszámon történő zümmögés megakadályozása. Motortól függően a motorok nem mozognak, ha PWM érték //70-nél  kisebb 
if (motorSpeedA < 70) { 
motorSpeedA = 0; 
} 
if (motorSpeedB < 70) { 
motorSpeedB = 0; 
} 
analogWrite(enA, motorSpeedA); // Elküldeni PWM jelet a MOTOR A-nak 
analogWrite(enB, motorSpeedB); // Elküldeni PWM jelet a MOTOR A-nak 
} 

A következő 19.projektben pedig ezt az autót fogjuk kiegészíteni úgy, hogy vezeték nélkül is lehessen irányítani. A segítségünkre egy bluetooth modul lesz, valamint egy Androidos okostelefon.

Letöltés
A leírás PDF-ben itt található
A mintakódot innen lehet letölteni


Megjegyzések