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

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;
}
}

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
Megjegyzés küldése