Sunteți pe pagina 1din 9

Textul si imaginile din acest document sunt licentiate

Attribution-NonCommercial-NoDerivs CC BY-NC-ND

Codul sursa din acest document este licentiat


Public-Domain Esti liber sa distribui acest document prin orice mijloace consideri (email, publicare pe website / blog, printare, sau orice alt mijloc), atat timp cat nu aduci nici un fel de modificari acestuia. Codul sursa din acest document poate fi utilizat in orice fel de scop, de natura comerciala sau nu, fara nici un fel de limitari.

RaspberryPI, Firmata si Arduino Ce este Firmata ?


Firmata este un protocol prin care o aplicatie software poate comunica cu un microcontroller. Pe placa Arduino se instaleaza un firmware care va stabili o conexiune cu calculatorul pe care il utilizezi, folosind un protocol special. Evident, in loc de un calculator personal, poti folosi o placa RaspberryPI. Ceea ce obtii este posibilitatea de a utiliza multitudinea de componente din ecosistemul Raspberry PI impreuna cu placa Raspberry PI, intr-un mod extrem de simplu. In cele ce urmeaza voi exemplifica aceste lucruri demonstrand cum anume se controleaza doua motoare de curent continuu din Raspberry PI, folosind o placa Arduino cu Firmata, si cum anume se citesc valorile unui senzor de distanta conectat la placa Arduino direct din codul sursa Python ruland pe Raspberry PI. Componentele de care vei avea nevoie sunt: RaspberryPI Arduino UNO motor cu reductor senzor SharpIR Rangefinder sursa de alimentare pentru RaspberryPI (5V) sursa de alimentare pentru shield L298 (functie de tensiunea de alimentare a motorului)

http://www.robofun.ro/forum

Prima pas este sa testezi protocolul Firmata pe calculatorul personal, iar apoi il vei instala direct pe RaspberryPI. 1. Cupleaza placa shield peste Arduino, pinii Vin si Gnd la o sursa de alimentare(acumulator sau baterii); motoarele le vei conecta la pinii marcati cu MOTOR1 si MOTOR2. Conecteaza platforma Arduino la portul USB al calculatorului personal. 2. selecta: Deschide Arduino 1.0.2 (functioneaza si pe Arduino 1.0) si vei

File Examples Firmata StandardFirmata. 3. Incarca sketch-ul pe Arduino.

4. Descarca urmatoarea aplicatie fie de pe site: http://www.firmata.org/wiki/Main_Page sau direct pentru Windows. 5. astfel. Deschide aplicatia, selecteaza portul si configureaza fereastra

http://www.robofun.ro/forum

6.

Conecteaza senzorul SharpIR Rangefinder astfel.

Arduino 5V Gnd A0

SharpIR Rangefinder rosu negru alb

Daca vei apropia un obiect de senzorul IR, vei observa cum variaza A0, din Firmata Test, in functie de distanta. Urmeaza sa testezi motoarele direct din Firmata Test. In cazul acestui shield, intrarile se afla pe pinii 3, 5, 6 si 9. Fie poti selecta Output pe acesti pini si vei putea controla motoarele prin Low si High, fie poti selecta PWM si sa misti http://www.robofun.ro/forum

de slider. In cazul acesta poti controla viteza de rotatie a motorului. Noteaza-ti care sunt pinii pentru mersul inainte/inapoi pentru fiecare motor.

Poti descoperi si altfel in ce sens se rotesc motoarele astfel incat robotul sa se miste corect. 7. Incarca pe Arduino programul scris mai jos si ajusteaza ordinea pinilor pana cand robotul se misca in mod corect.

http://www.robofun.ro/forum

#define motor_stanga_inainte 5 #define motor_stanga_inapoi 3 #define motor_dreapta_inainte 6 #define motor_dreapta_inapoi 9 void setup() { //initializam pinii pt motoare ca iesiri pinMode(motor_stanga_inainte, OUTPUT); pinMode(motor_stanga_inapoi, OUTPUT); pinMode(motor_dreapta_inainte, OUTPUT); pinMode(motor_dreapta_inapoi, OUTPUT); //e bine sa oprim motoarele pt inceput analogWrite(motor_stanga_inapoi, 0); analogWrite(motor_stanga_inainte, 0); analogWrite(motor_dreapta_inapoi, 0); analogWrite(motor_dreapta_inainte, 0); } void loop() { //inainte, cu viteza maxima, pt 2 secunde analogWrite(motor_stanga_inapoi, 0); analogWrite(motor_stanga_inainte, 255); analogWrite(motor_dreapta_inapoi, 0); analogWrite(motor_dreapta_inainte, 255); delay(2000); //inapoi, cu viteza mica, pt 2 secunde analogWrite(motor_stanga_inapoi, 180); analogWrite(motor_stanga_inainte, 0); analogWrite(motor_dreapta_inapoi, 180); analogWrite(motor_dreapta_inainte, 0); delay(2000); //la stanga: motor_dreapta inainte, motor_stanga oprit analogWrite(motor_stanga_inapoi, 0); analogWrite(motor_stanga_inainte, 0); analogWrite(motor_dreapta_inapoi, 0); analogWrite(motor_dreapta_inainte, 255); delay(2000);//aprox 90 de grade, depinde de baterie //stop pt 5 secunde analogWrite(motor_stanga_inapoi, 0); analogWrite(motor_stanga_inainte, 0); analogWrite(motor_dreapta_inapoi, 0); analogWrite(motor_dreapta_inainte, 0); delay(5000); }

8. Dupa ce ai descoperit ordinea pinilor, StandardFirmata din File Example Firmata.

incarca

firmware-ul

http://www.robofun.ro/forum

Ai inteles in acest moment ce este Firmata si cum se poate folosi impreuna cu Arduino pentru a controla direct senzori / motoare dintr-un calculator personal. Mai departe vom instala Firmata pe Raspberry PI.

Firmata pe RaspberryPI
1. 2. 3. Deschide o sesiune SSH si logheaza-te la RaspberryPI. Conecteaza Arduino la portul USB. Instaleaza pachetele necesare prin comanda:

sudo apt-get install python-serial mercurial

4.

Descarca pyFirmata, modulul de Firmata pentru Python:

hg clone https://bitbucket.org/tino/pyfirmata

5.

Schimba locatia directorului:

cd pyfirmata

6.

Instaleaza modulul.

sudo python setup.py install

7.

Deschide editorul de texte nano:

sudo nano bumper.py

http://www.robofun.ro/forum

8.

Copiaza codul listat mai jos.

#!/usr/bin/python import pyfirmata #pt legatura cu Arduino # Creeaza un obiect Arduino pe portul specificat board = pyfirmata.Arduino('/dev/ttyACM0') #Pinii Arduino pt motoare (ca variabile) PIN_stanga_inainte = board.get_pin('d:5:p') #pinul digital 5 = pwm PIN_stanga_inapoi = board.get_pin('d:3:p') PIN_dreapta_inainte = board.get_pin('d:6:p') PIN_dreapta_inapoi = board.get_pin('d:9:p') # Pornim un thread Iterator care sa se ocupe de datele pe serial (pt analog) it = pyfirmata.util.Iterator(board) it.start() board.analog[0].enable_reporting() #A0 va trimite date #Primele date citite pot fi eronate si le ignor while board.analog[0].read() is None: pass def mergi(stanga, dreapta): #functie pt controlul motoarelor(0..255) if(stanga > 0): PIN_stanga_inapoi.write(0) PIN_stanga_inainte.write(stanga/255.0) #aici se opereaza in #0..1 else: PIN_stanga_inapoi.write(-stanga/255.0) PIN_stanga_inainte.write(0) if(dreapta > 0): PIN_dreapta_inapoi.write(0) PIN_dreapta_inainte.write(dreapta/255.0) else: PIN_dreapta_inapoi.write(-dreapta/255.0) PIN_dreapta_inainte.write(0) print 'Am pornit!' try: while (1): if(board.analog[0].read() * 1024 < 400 ): mergi(255,255) #inainte else: print 'Obstacol!' mergi(180,-180) #dreapta board.pass_time(0.8) #timpul trebuie recalibrat pt #90grade. except: #daca se intrerupe programul (Ctrl-C) mergi(0,0) #stop motoare board.exit() #inchide pyFirmata, inclusiv Iteratorul

http://www.robofun.ro/forum

9. 10.

Salveaza-l cu CTRL + X si Y pentru a confirma. Executa-l cu:

sudo python bumper.py

http://www.robofun.ro/forum