Raspberry PI

Bevezetés

Ahogy az első cikkemben jeleztem, szeretnék építeni egy robot autót, amit a Raspberry Pi-vel vezérelnék távolról, miközben egy web kamera segítségével láthatnám, hogy merre jár az autó. Ez volna tehát a "NAGY" terv, amihez most hozzá kezdtem.
Hozzávalók
1 db Raspberry Pi
1 db DC motor vezérlő (L298N) - > L298N board from EBAY
1 db RC kisautó
1 db Webkamera
1 db 5V-os külső akku -> G7701-5000mAh-Portable-External-Battery
1 db Ultrahangos távolságmérő -> [Ultrasonic Distance-Sensor HC-SR04]
Képekben




Másfél hónapos várakozást követően minden alkatrészem megérkezett, úgyhogy hozzákezdhettem a megvalósításnak.

Kapcsolási rajz

1. Lépés : Valahogy össze kell kötni a Raspberry Pi-t az L298N motorvezérlővel és a 2 db DC motorral. Rengeteg fórumot kellett átnyálaznom, mire sikerült kibogozni, hogy mit-mivel kössek össze, hogy minden jól működjön, a végeredmény pedig ez lett:
"Kapcsolási rajz"

PI-----------L298N
PIN2 ------ VCC
PIN6 ------ GND
PIN8 ------ IN1
PIN10 ------ IN2
PIN12 ------ ENA1 (Motor 1 PWM control)
PIN24 ------ IN4
PIN26 ------ IN3
Ext. 5V --- 5V
Ext. GND --- GND
Magyarázat
Az L298N motorvezérlővel 2 db DC motort tudunk meghajtani, illetve szabályozni a motorok forgási irányát és sebességét. A Raspberry Pi-n sajnos csak 1 db tű található, amivel a sebességet tudjuk állítani, így csak az egyik motor lesz változtatható sebességű, a másik az marad fix, de ez jelen esetben nem is probléma, mivel a kisautón, csak a hátsó motor szolgál meghajtásra, az első csak kormányoz.
Mivel nem akartam közvetlenül a Pi-ről venni az 5V-os tápot a motorokhoz, ezért ahhoz külső akksit használtam, aminek a földjét szintén rákötöttem a motorvezérlő földjére.
Első körben, nem az autó motorjait használtam, hanem 2 db CD meghajtóból kiszerelt, éppen kéznél lévő motorokkal kísérleteztem.
Miután mindent összekötöttem mindennel, nagy levegőt vettem, elmondtam egy imát magamba és benyomtam az elosztó kapcsolóját, hogy lássam, nem-e történik valami baj, de a kezem végig a kapcsolón maradt, hogy ha netán valami füstölni kezdene, tudjam menteni a menthetőt. Szerencsére nem füstölt semmi, a Rapberry Pi szépen bootolt, úgyhogy megnyugodtam :)
Rapberry Pi GPIO portjait könnyű vezérelni, mivel egy úriember írt hozzá egy library-t, amit azon nyomban le is szedtem és feltelepítettem.
Nem maradt más hátra, áttanulmányoztam a példa programokat és nekiálltam C-ben megírni a motor vezérlő szoftvert, amihez készítettem egy "szép" kis GUI felületet is:

Az L298N-en van 4 db tű (IN1,IN2,IN3,IN4) amivel meg tudjuk mondani, hogy melyik motor merre forogjon, tehát ha ezeket összekötjük a PI-nek a megfelelő GPIO tüskeivel és küldünk rájuk egy 1-est vagy 0-át, a motorok máris forogni kezdenek. :D

Ha a MOTOR1 sebességet is szeretnénk szabályozni, akkor a PIN12-ön keresztül kell egy 0-255-ig terjedő értéket küldenünk a motorvezérlő ENA1 tűjére.(ENA2-vel a MOTOR2-öt tudnánk vezérelni, ha a Pi-n volna még egy PWM-et tudó tű, de sajnos nincs)

A forráskód

A forráskód pedig:
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <softPwm.h>
#include <termios.h>
#include <unistd.h>

int mygetch( ) {
struct termios oldt,
newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}



int main (void)
{
int enableA = 1;
int enableB = 6;
int h1 = 16;
int h2 = 15;
int h3 = 11;
int h4 = 10;
int speed= 10;
char valasz;
char motor;
char parancs;


if (wiringPiSetup() == -1)
exit (1);




softPwmCreate (enableA,0,255);
softPwmCreate (enableB,0,255);
pinMode (h1, OUTPUT);
pinMode (h2, OUTPUT);
pinMode (h3, OUTPUT);
pinMode (h4, OUTPUT);



while (1){
system( "clear" );
printf("\033[0;36m");
printf ("____________________________________________\n");
printf ("| Raspberry Pi & 2DC motor & L298N & PWM |\n");
printf ("|___________________________________________|\n");
printf("\033[0;37m");
printf ("|Press 1 to select motor 1 |\n");
printf ("|Press 2 to select motor 2 |\n");
printf ("|Press Q to selected motor FORWARD |\n");
printf ("|Press W to selected motor BACKWARD |\n");
printf ("|Press E to selected motor STOP |\n");
printf ("|Press + to SPEED UP |\n");
printf ("|Press - to SPEED DOWN |\n");
printf ("|___________________________________________|\n");

printf ("|Press X to EXIT |\n");
printf ("|___________________________________________|\n");

if(motor == '1') {
printf("\033[0;31m");
printf ("[Motor 1 selected]\n");
}
if(motor == '2') {
printf("\033[0;31m");
printf ("[Motor 2 selected]\n\033[0;31m");
}

if(parancs == 'q') {printf("\033[0;35m");printf ("[FORWARD]\n");}
if(parancs == 'w') {printf("\033[0;35m");printf ("[BACKWARD]\n");}
if(parancs == 'e') {printf("\033[0;35m");printf ("[STOP]\n");}
printf("\033[0;32m");
printf("[Speed: %d]",speed);
printf("\033[0;37m");
printf ("\nYour choice: ");
valasz=mygetch();
printf("\n");
system("clear");

if(valasz == '+') {
if(speed<250) {speed=speed+10;softPwmWrite (enableA, speed);}
}

if(valasz == '-') {
if(speed>0) {speed=speed-10;softPwmWrite (enableA, speed);}
}




if(valasz == '1') {
motor='1';
parancs=' ';
}
if(valasz == '2') {
motor='2';
parancs=' ';
}

if(valasz == 'q') {
parancs='q';
if(motor == '1') {
digitalWrite (h1, 0);
digitalWrite (h2, 1);
softPwmWrite (enableA, speed);
printf ("Motor 1\n");

}
if(motor == '2') {
digitalWrite (h3, 0);
digitalWrite (h4, 1);
printf ("Motor 2\n");

}

printf ("Motor turn FORWARD\n");
}
if(valasz == 'w') {
parancs='w';
if(motor == '1') {
digitalWrite (h1, 1);
digitalWrite (h2, 0);
printf ("Motor 1\n");
softPwmWrite (enableA, speed);

}
if(motor == '2') {
digitalWrite (h3, 1);
digitalWrite (h4, 0);
printf ("Motor 2\n");

}
printf ("Motor turn BACKWARD\n");
}

if(valasz == 'e') {
parancs='e';
if(motor == '1') {
digitalWrite (h1, 1);
digitalWrite (h2, 1);
printf ("Motor 1\n");

}
if(motor == '2') {
digitalWrite (h3, 1);
digitalWrite (h4, 1);
printf ("Motor 2\n");

}

printf ("Motor STOP\n");
}

if(valasz == 'x') {
printf ("EXIT\n");
digitalWrite (h1, 0);
digitalWrite (h2, 0);
digitalWrite (h3, 0);
digitalWrite (h4, 0);
break;
}


}


}

Befejezés

Miután végeztem, nem maradt más hátra, mint lefordítani a programot:gcc ./dcmotor.c -o dcmotor -L/usr/local/lib -lwiringPi és kipróbálni.
(Persze nem elsőre sikerült ezt összehozni, de a számtalan próbálkozástól megkíméllek benneteket :D )
Az eredmény nagyon büszkévé tett, mivel sikerült a számomra, legnehezebbnek vélt akadályt átugrani. Innentől a fejemben lévő terv szerint, már mindennek simán kell történnie :D , de majd kiderül.
Mielőtt hátradőltem volna a fotelban, még gyorsan szétszedtem a kisautót és csináltam pár képet róla:






Valahogy igy fog kinézni, ha minden rajta lesz.....





Ami még hátra van
- Összekötni az autó motorját a motorvezérlővel és kitesztelni.
- Létrehozni a weblapot, amihez meg kell írni a C programokat, amiket CGI-ként meghívhatok a motorvezérléshez
- Weblapba beleintegrálni a webkamera képét.
- Kitesztelni a HC-SR04 távolságmérőt és megírni hozzá a programot
- "Összegyúrni" mindent egybe.. .:)
Folytatom.....

Nincsenek megjegyzések:

Megjegyzés küldése