Get the Flash Player to see this player.

time2online Joomla Extensions: Simple Video Flash Player Module
RaspCar 1.0v Bluetooth

Pierwsza wersja mojego samochodu jest sterowana za pomocą telefonu komórkowego z systemem Android. Telefon łączy się z mini komputerem Raspberry Pi za pomocą bluetooth i przesyła współrzędne X i Y, które przekształcane są na sygnały zrozumiałe dla mostka H.

Do zbudowania robota będzie nam potrzebne kilka rzeczy.

1) Telefon komórkowy z Androidem z odpowiednim oprogramowaniem.

Ja mam HTC Desire z Androidem 2.2, ale program będzie działał także na innych wersja większych niż 2.2. Cały kod można pobrać i przerobić do swoich celów.

http://avrkwiat.nstrefa.pl/omnie/index.php?option=com_content&view=article&id=207&Itemid=235

2) Komputer Raspberry Pi.

Model nie ważny ja akurat mam model A, bo kupiłem go na samym początku. Na kamami można złapać promocję i chyba jest najtaniej:

http://kamami.pl/index.php?ukey=product&productID=199639

Oczywiście lepiej kupić model B :)

3) Moduł mostka H.

Już wcześniej opisywałem mostek H w tym artykule, dlatego nie będę się rozpisywał:

http://avrkwiat.nstrefa.pl/omnie/index.php?option=com_content&view=article&id=7&Itemid=4

Polutowany mostek H można kupić w elektroparku:

http://electropark.pl/moduly-sterowniki-silnikow/2940-modul-podwojny-sterownik-silnika-l298-5901002940002.html

4) Zasilanie 12V:

Następną ważną sprawą jest zasilanie, ponieważ im lepsza wydajność prądowa baterii tym lepiej będą działały silniki. Ja kupiłem baterie 11.1V Li-pol:

http://electropark.pl/redox/1386-pakiet-li-pol-redox-11-1v-1300-mah-20c-5901001386009.html

Silniki podpinamy bezpośrednio do akumulatora poprzez mostek H, a zasilanie komputera puszczamy przez stabilizator UBEC.

5) Stabilizator 5V 3A UBEC

Aby zasilić raspberry należy dostarczyć prąd większy niż 500mA, dlatego zwykłe stabilizatory odpadają. Dobrym rozwiązaniem jest kupić gotowy moduł, który będzie informował nas o spadkach napięcia sygnałem dźwiękowym itp. Ja swojego ubeca kupiłem stąd:

http://www.rctrax.pl/product/Turnigy-3A-UBEC-z-sygnalizatorem-dzwiekowym/?id=7550

Sklep posiada dużo fajnych gadżetów, a przesyłka jest dostarczona w 24h. Więc gorąco polecam.

6) 2x silniki.

Aby nasz samochodzik jeździł należy dodać 2 silniki (obojętnie jakie im mocniejsze tym lepsza zabawa), ja kupiłem takie:

http://electropark.pl/standardowe-silniki/3133-silnik-pololu-19-1-500-obr-min-5901003133007.html

Niestety w zestawie nie ma, ani kół, ani mocowania. Dlatego trzeba dokupić je oddzielnie, albo pomęczyć się samemu kupując części w sklepie budowlanym, tak jak ja to zrobiłem.

W tym sklepie można dostać te same silniki z mocowaniami i kołami:

http://botland.com.pl/silniki/49-silnik-z-przekladnia-19-1.html

http://botland.com.pl/38-przejsciowki

Polecam odwiedzić sklep:

http://www.rctrax.pl

I zakupić silniki razem z mocowaniami i kółkami, oszczędzicie tym samym czas i nerwy.

7) Bluetooth USB.

Tu obojętnie jaki moduł, ja już miałem moduł zakupiony kilka lat temu, więc nie linkuje.

8) Program w Raspberry.

Program który odbiera informację z komórki opisałem już wcześniej "Soft PWM i bluetooth", tu daje zmodyfikowaną wersję dla naszego robota:

/*
 * 
 *      Simple test program to test the wiringPi functions
 *      PWM test
 */

#include <wiringPi.h>

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <softPwm.h>

int main (void)
{

 int i =0;
 char path [50]="";
 FILE *fd;
 char bufor [12]="";
 char tempX[1]="";
 char tempY[1]="";
 int x=0;
 int y=0;

 strcat (path,"/dev/rfcomm0");
 fd = fopen(path,"r");

 if(!fd){
 printf("blad przy otwieraniu");
 return -1;
 }else{

 printf ("Raspberry Pi wiringPi PWM i bluetooth dla silnikow \n") ;

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

 softPwmCreate(0,0,9);
 softPwmCreate(1,0,9);
 softPwmCreate(2,0,9);
 softPwmCreate(3,0,9);

 for (;;)
 {
 if(!fgets(bufor,11,fd)){
 printf("blad odczytu pliku");
 return -1;
 }else{
 //printf(bufor);
 //napis jest w postaci X=-2;Y=9;\r\n
 for(i=0;i<12;i++){
 if(bufor[i]=='X'){
 if(bufor[i+2]=='-'){
 tempX[0]=bufor[i+2];
 tempX[1]=bufor[i+3];
 }else{
 tempX[1]=bufor[i+2];
 tempX[0]='0';
 }
 }
 if(bufor[i]=='Y'){
 if(bufor[i+2]=='-'){
 tempY[0]=bufor[i+2];
 tempY[1]=bufor[i+3];
 }else{
 tempY[1]=bufor[i+2];
 tempY[0]='0';
 }
 }
 }
 printf("X=");
 printf(tempX);
 printf("Y=");
 printf(tempY);
 printf("\r\n");
 x=atoi(tempX);
 y=atoi(tempY);

 }
//GPIO0 - int1 prawy przód 
//GPIO1 - int2 prawy tył
//GPIO2 - int3 lewy przod
//GPIO3 - int4 lewy tył
 if(y>=0){     
 if(x>=0){
 softPwmWrite (1, 0);
 softPwmWrite (3, 0);
 softPwmWrite (0, y);
 softPwmWrite (2, y+x);
 }
 if(x<0){
 softPwmWrite (1, 0);
 softPwmWrite (3, 0);
 softPwmWrite (0, y+abs(x));
 softPwmWrite (2, y);
 }
 }
 if(y<0){
 if(x>=0){
 softPwmWrite (0, 0);
 softPwmWrite (2, 0);
 softPwmWrite (1, abs(y));
 softPwmWrite (3, abs(y)+x);
 }
 if(x<0){
 softPwmWrite (0, 0);
 softPwmWrite (2, 0);
 softPwmWrite (1, abs(y)+abs(x));
 softPwmWrite (3, abs(y));
 }
 }


 delay (1) ;

 }

 return 0 ;
 }
softPwmWrite (0, 0);
softPwmWrite(1,0);
softPwmWrite (2, 0);
softPwmWrite(3,0);
 fclose(fd);
}


Jak widać algorytm jest banalny. Najpierw zostaje odczytany String z bluetooth w postaci np. "X=-3;Y=9". Współrzędna Y odpowiada za kierunek jazdy, czyli Y>0 odpowiada za jazdę w przód, a Y<0 za jazdę w tył. Im większa liczba tym szybciej samochód jedzie. Współrzędna X koryguje tor jazdy, dlatego dodawana jest do współrzędnej Y. Im współrzędna X jest większa tym samochód mocniej skręca.