Get the Flash Player to see this player.

time2online Joomla Extensions: Simple Video Flash Player Module
RaspCar 2.0v WiFi

W tej wersji nasz RaspCar będzie sterowany przez stronę www, a kamera umieszczona na nim będzie na bieżąco pokazywała obraz. Jest to duża zaleta ponieważ w ten sposób będziemy mogli podłączyć się do naszego samochodu z każdego miejsca na ziemi (oczywiście jeśli mamy stałe IP).

Podłączenie kamery i serwera lighttpd opisywałem już wcześniej w tym artykule, więc odsyłam do niego:

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

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

Mając już kamerkę należy skonfigurować serwer tak, aby mieć bezpośredni dostęp do pinów z poziomu www. W tym celu potrzebne są nam skrypty cgi, które będą odbierać dane z www i wykonywać program. Sporo informacji o tym jak skonfigurować RPI jest tu:

http://netduinoplusfun.wordpress.com/category/raspberry-pi/
http://andrewbaker.me/?page_id=44

Ja oczywiście pokaże jak to zrobić.

Instalujemy lighttpd i odpalamy skrypty cgi:

sudo lighttpd-enable-mod cgi

Wchodzimy do pliku konfiguracyjnego cgi:

sudo nano /etc/lighttpd/conf-enabled/10-cgi.conf

I zmieniamy go w następujący sposób:

W tym momencie katalog z plikami cgi-bin został przeniesiony do katalogu www/cgi-bin. Właśnie w tym miejscu należy stworzyć katalog i wgrywać pliki wykonywalne. Oczywiście przed testami należy restartować serwer:

sudo /etc/init.d/lighttpd restart

Następnie tworzymy plik C z programem, który ma przechwycić informację i wykonać jakieś polecenia. Nadajemy temu plikowi możliwość  wykonywania skryptów jako root:

sudo chown root example.cgi
sudo chmod u+s example.cgi

W moim przypadku cały program będzie znajdował się w katalogu var/www/cgi-bin/ to tu będziemy wgrywać program. Testując kilka opcji uznałem, że najlepszy program to taki, który wykorzysta program z poprzedniej wersji RaspCara1.0.

Cała aplikacja będzie działała w następujący sposób:

Najpierw serwer www przechwyci stringa w postacie np: "X=3;Y=2;", który będzie przekazywany do pliku rasp (plik rasp jest skompilowanym programem raspcar2.c) Przekazywanie parametrów odbywa się poprzez wpisanie w przeglądarkę:

http://192.168.1.106/cgi-bin/rasp?X=3;Y=0;

Gdzie 192.168.1.106, to nasz serwer www postawiony na raspberry;
cgi-bin, to katalog z programami;
rasp, to program wykonywalny;
X=3;Y=0, to string, który przekazywany jest do pliku test.txt.

Kody źródłowe do programu rasp znajdują się tu:

#include <wiringPi.h>

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

int main (void)
{
 char *data;
 FILE *fp;

 int x=0;
 int y=0;
 int i =0;
 fp=fopen("test.txt","a");
 if (!fp){
 printf("nie mozna otworzyc pliku");
 return -1;
 }
 printf("Content-Type: text/plain\n\n");
 printf ("RaspCar2.0 zapisywanie danych do pliku test.txt przez WiFi \n") ;

 data = getenv("QUERY_STRING");
 //data="X=1;Y=0;";    
 if(!data){
 printf("Nie przekazano parametrów");
 }else {
 fprintf(fp,"%s",data);
 fclose(fp);    

 } 
 return 0 ;
}

Sam program zapisuje stringa do pliku test.txt. W tle działa program pwm.c podobny do programu z RaspCar1.0, tylko ze zmienioną ścieżką do pliku. Tym razem zamiast z rfcomm, dane są pobierane z test.txt. Program pwm.c przedstawiony jest poniżej:

#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 bufTemp[12]="";
 char tempX[1]="";
 char tempY[1]="";
 int x=0;
 int y=0;

 strcat (path,"/var/www/cgi-bin/test.txt");
 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);
}

Mając już tak przetestowany program możemy rozpocząć pracę nad przekazywaniem wartości z html.