SlideShare a Scribd company logo
1 of 9
Download to read offline
http://www.robofun.ro Curs Gratuit Arduino si Robotica
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.
http://www.robofun.ro/forum
http://www.robofun.ro Curs Gratuit Arduino si Robotica
Despre Shield-uri Arduino
Shield-urile Arduino reprezinta o modalitate foarte simpla de a extinde functionalitatile
Arduino. Orice shield Arduino este standard, in sensul ca pinii acestuia se potrivesc perfect peste pinii
placii Arduino. In plus, in marea majoritate a cazurilor, pinii shield-ului sunt prelungiti in sus cu
conectori de tip mama. Acesti pini, fiind infipti in pinii Arduino, ii prelungesc practic in sus pe acestia.
Astfel, daca am pus un shield peste Arduino si vrem sa conectam un senzor la pinul A0 al Arduino,
atunci vom conecta senzorul la pinul A0 al shield-ului, si totul va functiona exact ca si cum l-am fi
infipt in pinul A0 al Arduino.
Fiecare shield utilizeaza anumiti pini pentru a se conecta cu Arduino. Astfel, spre exemplu,
shield-ul cu LCD 16X2 utilizeaza pinii 7, 6, 5, 4, 3, 2 iar shield-ul Wifly foloseste pinii 10, 11, 12, 13.
Acesti pini nu mai pot fi folositi in acelasi timp cu shield-ul. Astfel, daca avem un senzor care se
conecteaza pe pinul 3 la Arduino, si noi folosim deja shield-ul cu L298 (care foloseste pinii 3, 5, 6 si 9),
atunci nu vom putea conecta senzorul in acelasi timp cu shield-ul L298. Mai mult, se poate intampla
chiar sa avem doua shield-uri care utilizeaza aceeasi pini (sau o parte dintre pini sunt aceeasi). In aceasta
situatie, de cele mai multe ori se poate aplica o solutie clasica. Anume, pinii shield-ului care intra in
Arduino se indoaie un pic in afara, astfel incat sa nu mai intre in Arduino, ci sa iasa in afara. Apoi, acesti
pini se conecteaza pe deasupra cu pini tata-tata cu alti pini Arduino nefolositi. De la caz la caz, s-ar
putea sa fie nevoie sa faci modificari in libraria asociata senzorului, sau sa modifici doar codul sursa din
programul tau, astfel incat pinii pe care i-ai mutat in alta parte sa fie actualizati si in cod.
Mai jos sunt doua exemple de shield-uri montate peste Arduino.
http://www.robofun.ro/forum
http://www.robofun.ro Curs Gratuit Arduino si Robotica
Modalitati de Comunicare Intre Arduino si Componente
Mai departe vom trece in revista cateva modalitati prin care Arduino se conecteaza cu celelalte
componente (senzori, shield-uri, etc). S-ar putea ca atunci cand vom ajunge la comunicarea seriala, SPI
si I2C lucrurile sa ti se para un pic complicate si dificil de inteles, pentru ca inca nu am introdus nici un
exemplu de dispozitiv care sa comunice astfel. Dupa ce vei vedea mai multe dispozitive explicate in
detaliu in lectiile viitoare, vei intelege mai usor despre ce este vorba.
Citire Date pe Porturile Analogice sau Digitale
Anumite componente se conecteaza direct la porturile digitale sau analogice ale Arduino si astfel
primesc comenzi sau comunica date catre acesta. Astfel, un led se conecteaza la un pin digital si atunci
cand pinul este in HIGH, led-ul se aprinde. Un senzor de lumina se conecteaza la un pin analogic si
folosind "analogRead(<pin>)" obtii valoarea data de senzor. Un buton se conecteaza la un pin digital si
"digitalRead(<pin>)" intoarce 1 daca butonul este apasat si 0 altfel. Un shield driver de motoare cu
L298 sau un LCD se conecteaza la mai multi pini digitali (4, respectiv 7) si primeste comenzi de la
http://www.robofun.ro/forum
http://www.robofun.ro Curs Gratuit Arduino si Robotica
Arduino prin intermediul acestora.
Voi reaminti ca ori de cate ori avem nevoie sa folosim un pin digital ca sa comandam un
dispozitiv, este necesar sa declaram acest pin ca fiind de tip OUTPUT ("pinMode(<pin>, OUTPUT").
Altfel, nu se va intampla absolut nimic atunci cand trecem pinul in HIGH sau in LOW.
Merita sa insistam un pic si asupra citirii datelor pe porturile analogice. Un senzor, la nivel
electric, da pe iesire o tensiune electrica. Este absolut necesar ca aceasta tensiune sa fie intre 0 si 5 V.
Orice senzor special creat pentru Arduino va respecta deja aceasta regula. Mai departe, aceasta tensiune
este preluata de o componenta specializata a lui Arduino, numita "convertorul analog-digital". Aceasta
componenta ofera la iesirea sa un numar intre 0 si 1023, in functie de nivelul de tensiune de la intrare.
Asftel, folosind Arduino, putem citi senzori analogici cu o precizie de exact 1024 de nivele distincte. De
exemplu, folosind senzorul de lumina, vom putea citi cu Arduino exact 1024 de nivele distincte de
iluminare ale mediului ambiant. Daca avem nevoie de o precizie mai buna, atunci va trebui sa trecem la
alt tip de senzori (cel mai probabil, senzori pe I2C).
Comunicare Seriala
Comunicarea seriala este o comunicare de tip digital, in sensul ca pe fir se transmit biti (ca la fel
cum se intampla intr-o retea de calculatoare, doar ca folosind un protocol mult simplificat). Aceasta
comunicare seriala se intampla intotdeauna intre Arduino si calculator, atunci cand Arduino este
programat. O comunicare seriala se intampla intotdeauna la o anumita rata de transfer, care determina
viteza cu care se transmit bitii pe fir. Rate comune de transfer sunt 9600, 19200, 57600, 115200.
Software Serial
SoftwareSerial este tot o modalitate de comunicare seriala, doar ca in loc de a utiliza pinii RX si
TX ai microcontroller-ului (care sunt dedicati pentru o astfel de comunicare), utilizam o librarie
software care emuleaza comunicarea folosind (aproape) oricare doi pini digitali ai placii Arduino.
Avantajul imediat este faptul ca in acest mod putem conecta placa Arduino cu mult mai multe
dispozitive seriale.
http://www.robofun.ro/forum
http://www.robofun.ro Curs Gratuit Arduino si Robotica
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
Serial.begin(9600);
Serial.println("Goodnight moon!");
mySerial.begin(4800);
mySerial.println("Hello, world?");
}
void loop() {
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
In codul de mai sus am declarat pinii 10 si 11 ca fiind cei doi pini care vor emula comunicarea
seriala. Pinul 10 este pinul RX iar pinul 11 este pinul TX. Mai departe, am declarat rata de transfer a
acestei conexiuni seriale ca fiind 4800 (mySerial.begin(4800)) (rata de transfer o stim din specificatiile
dispozitivului cu care urmeaza sa ne conectam). In continuare, orice caracter primit peste conexiunea
seriala emulata este scrisa in Serial Monitor, si orice caracter introdus in Serial Monitor este trimis peste
conexiunea seriala emulata software.
Vei intalni des in proiectele de mai departe acest tip de conexiune. Chiar daca in proiectul
respectiv este folosita conexiunea de tip serial standard, vei putea oricand sa o inlocuiesti cu
SoftwareSerial, ca mai sus.
SPI
SPI este o modalitate de a comunica cu dispozitive de tipul master-slave. Un dispozitiv este
master (de obicei Arduino), si celelalte dispozitive sunt slave. In practica, vei gasi de obicei librarii scrise
de altcineva care incapsuleaza deja comunicare cu dispozitivul peste SPI, asa ca nu va trebui sa iti bati
prea mult capul cu amanuntele. Voi prezenta totusi mai jos cateva elemente ale SPI, ca sa recunosti
termenii atunci cand auzi vorbindu-se de ei.
Comunicarea SPI se face folosind patru canale (fire de conexiune) :
MISO – firul prin care dispozitivele slave trimit date catre master.
MOSI – firul prin care dispozitivul master trimite date catre slave.
SCK – firul prin catre este transmis clock-ul (ritmul de comunicatie)
SS (Slave Select) – acest canal este specific SPI, si este interesant. SPI permite conectarea pe
acelasi bus a mai multor dispozitive, fiecare dispozitiv avand atasat un canal Slave Select. Atunci cand
valoarea din acest canal este LOW, dispozitivul slave comunica cu master-ul. Cand valoarea Slave Select
este HIGH, atunci dispozitivul ignora comunicarea SPI. In acest mod, poti conecta pe acelasi canal SPI
oricat de multe dispozitive, cu conditia ca fiecarui dispozitiv sa ii atasezi un canal Slave Select. Un
http://www.robofun.ro/forum
http://www.robofun.ro Curs Gratuit Arduino si Robotica
exemplu pe care il vei intalni este comunicarea cu shield-ul Ethernet, si in acelasi timp cu SD card-ul
montat pe shield. Ambele folosesc comunicare SPI. Pinul Slave Select conectat la chip-ul Ethernet este
pinul digital 10 Arduino, iar pinul Slave Select conectat la SD card este pinul digital 4. Astfel, atunci
cand vrei sa comunici Ethernet, vei seta pinul 10 in LOW, si pinul 4 in HIGH (doar chip-ul Ethernet
activ), iar atunci cand vrei sa comunici cu SD card-ul, vei seta pinul 10 in HIGH si pinul 4 in LOW
(doar SD card-ul activ). Daca omiti sa faci acest lucru, comenzile trimise catre chip-ul Ethernet vor fi in
acelasi timp receptionate si procesate si de catre SD card, ceea ce va conduce la o functionare
defectuoasa.
In cazul Arduino UNO, pinii Arduino SPI sunt MISO – pinul digital 12, MOSI – pinul digital
11, SCK – pinul digital 13. Pinul default SS este pinul digital 10. In cazul in care ai mai mult de un
dispozitiv SPI, vei folosi mai multi pini Slave Select, nu doar pinul digital 10, fiecare dispozitiv fiind
conectat cu cate un pin Slave Select distinct.
In cazul Arduino Mega, pinii SPI sunt MISO - pinul digital 50, MOSI – pinul digital 51, SCK
– pinul digital 52, si SS – pinul digital 53.
La modul concret, daca ai doua dispozitive SPI, vei incepe prin a identifica pinii MOSI, MISO,
SCK si SS pentru fiecare dispozitiv. Vei conecta apoi impreuna pinii MOSI ai celor doua dispozitive, si
impreuna cu pinul Arduino MOSI, la fel si pentru MISO si SCK. Pentru pinii SS, vei conecta pinul
primului dispozitiv la un pin digital Arduino, iar pinul celui de-al doilea dispozitiv la un alt pin digital
Arduino.
I2C
Comunicarea I2C este un mod interesant de comunicare, in sensul ca necesita doar doua fire de
comunicare, si permite conectarea a oricat de mult dispozitive (cu adrese diferite). Fiecare dispozitiv
I2C are o adresa (care se poate sau nu modifica). De obicei, vei intalni dispozitive I2C cu adresa fixa (pe
care nu o poti modifica), sau dispozitive la care vei putea alege adresa I2C dintr-o lista de cateva adrese
prestabilite (lucru pe care de obicei il faci prin conectarea unui pin de adresa – marcat de obicei ADDR
– la pinul GND, sau VCC, sau SDA, sau SCL).
Ca si in cazul SPI, a intelege modul de comunicare citind datasheet-ul dispozitivului I2C nu
este facil. Primul lucru pe care il fac atunci cand am nevoie sa comunic cu un dispozitiv I2C este sa caut
o librarie deja scrisa pentru dispozitivul respectiv. In acest mod, singurul lucru de care trebuie eu sa tin
cont este adresa dispozitivului. Mai departe, modul concret de comunicare este realizat in intregime de
librarie, eu avand acces doar la informatia utila.
In cazul Arduino UNO, pinii I2C pentru Arduino sunt pinul analogic 4 (care este pinul SDA),
si pinul analogic 5 (care este pinul SCL). Pentru Arduino Mega, pinul digital 20 este pinul SDA si
pinul digital 21 este pinul SCL. In cazul Arduino Leonardo, cei doi pini SDA si SCL sunt distincti,
marcati ca atare pe placa. Pentru a folosi un dispozitiv I2C, vei conecta pinul SDA al dispozitivului cu
pinul SDA al Arduino, pinul SCL al dispozitivului cu pinul SCL al Arduino. In plus, in functie de
dispozitiv, s-ar putea sa fie necesar sa conectezi si pinul de adresa la GND sau la VCC (in cele mai
multe cazuri, pinul de adresa este deja conectat, dar nu intotdeauna).
Un exemplu de senzor I2C este senzorul de temperatura I2C. Pinul de adresa este marcat pe
placa cu “ADDR0”. Dispozitivul acest pin se poate conecta la pinul GND (si atunci dispozitivul va avea
http://www.robofun.ro/forum
http://www.robofun.ro Curs Gratuit Arduino si Robotica
adresa “0x48”), poate fi conectat la VCC (si atunci dispozitivul va avea adresa “0x49”, poate fi conectat
la pinul SDA (si atunci dispozitivul va avea adresa “0x4A”), sau poate fi conectat la pinul SCL (si atunci
dispozitivul va avea adresa “0x4C”). In acest mod, poti conecta pana la patru senzori TMP102 la placa
Arduino.
Daca esti curios, un exemplu de cod care comunica pe I2C poti gasi aici :
http://www.robofun.ro/senzor_temperatura_tmp102
http://www.robofun.ro/forum
http://www.robofun.ro Curs Gratuit Arduino si Robotica
Aceasta a fost lectia 4. In final, as vrea sa te rog sa ne oferi feedback asupra acestei
lectii, pentru a ne permite sa le facem mai bune pe urmatoarele.
Este vorba despre un sondaj cu 4 intrebari (oricare este optionala), pe care il poti
accesa dand click aici.
Sau ne poti contacta direct prin email la contact@robofun.ro .
Iti multumim,
Echipa Robofun.RO
http://www.robofun.ro/forum

More Related Content

What's hot

Curs gratuitarduino lectia7-senzoridistanta
Curs gratuitarduino lectia7-senzoridistantaCurs gratuitarduino lectia7-senzoridistanta
Curs gratuitarduino lectia7-senzoridistantaIulius Bors
 
Motoare pascupasarduinoeasydriver
Motoare pascupasarduinoeasydriverMotoare pascupasarduinoeasydriver
Motoare pascupasarduinoeasydriverIulius Bors
 
Curs gratuitarduino lectia12-conexiunewifi-googledocs
Curs gratuitarduino lectia12-conexiunewifi-googledocsCurs gratuitarduino lectia12-conexiunewifi-googledocs
Curs gratuitarduino lectia12-conexiunewifi-googledocsIulius Bors
 
Curs gratuitarduino lectia11-muzicacuarduino
Curs gratuitarduino lectia11-muzicacuarduinoCurs gratuitarduino lectia11-muzicacuarduino
Curs gratuitarduino lectia11-muzicacuarduinoIulius Bors
 
Arduino comparatorul intern
Arduino comparatorul internArduino comparatorul intern
Arduino comparatorul internIulius Bors
 
Arduino yala electronicabazatapecodsecret
Arduino yala electronicabazatapecodsecretArduino yala electronicabazatapecodsecret
Arduino yala electronicabazatapecodsecretIulius Bors
 
Curs gratuitarduino lectia13-mousesitastatura
Curs gratuitarduino lectia13-mousesitastaturaCurs gratuitarduino lectia13-mousesitastatura
Curs gratuitarduino lectia13-mousesitastaturaIulius Bors
 
Conector bluetoothmatesilver arduino-pc
Conector bluetoothmatesilver arduino-pcConector bluetoothmatesilver arduino-pc
Conector bluetoothmatesilver arduino-pcIulius Bors
 
Arduino uno rfidid-12
Arduino uno rfidid-12Arduino uno rfidid-12
Arduino uno rfidid-12Iulius Bors
 
Arduino comunicatie i2c
Arduino comunicatie i2cArduino comunicatie i2c
Arduino comunicatie i2cIulius Bors
 
Arduino multiplexarea le-durilor
Arduino multiplexarea le-durilorArduino multiplexarea le-durilor
Arduino multiplexarea le-durilorIulius Bors
 
Arduino toraspberrypi firmata
Arduino toraspberrypi firmataArduino toraspberrypi firmata
Arduino toraspberrypi firmataIulius Bors
 
Arduino releemodio2
Arduino releemodio2Arduino releemodio2
Arduino releemodio2Iulius Bors
 
Arduino matriceled8x8
Arduino matriceled8x8Arduino matriceled8x8
Arduino matriceled8x8Iulius Bors
 
Curs gratuitarduino lectia15-seismografcuexcel
Curs gratuitarduino lectia15-seismografcuexcelCurs gratuitarduino lectia15-seismografcuexcel
Curs gratuitarduino lectia15-seismografcuexcelIulius Bors
 
Arduino protocolul 1 wire
Arduino   protocolul 1 wireArduino   protocolul 1 wire
Arduino protocolul 1 wireIulius Bors
 
Set prizecomandatedinarduino
Set prizecomandatedinarduinoSet prizecomandatedinarduino
Set prizecomandatedinarduinoIulius Bors
 
Arduino gsmgprs-shield-partea-a-2-a
Arduino gsmgprs-shield-partea-a-2-aArduino gsmgprs-shield-partea-a-2-a
Arduino gsmgprs-shield-partea-a-2-aIulius Bors
 
Arduino flexsensorbrickbionicfinger
Arduino flexsensorbrickbionicfingerArduino flexsensorbrickbionicfinger
Arduino flexsensorbrickbionicfingerIulius Bors
 

What's hot (20)

Curs gratuitarduino lectia7-senzoridistanta
Curs gratuitarduino lectia7-senzoridistantaCurs gratuitarduino lectia7-senzoridistanta
Curs gratuitarduino lectia7-senzoridistanta
 
Motoare pascupasarduinoeasydriver
Motoare pascupasarduinoeasydriverMotoare pascupasarduinoeasydriver
Motoare pascupasarduinoeasydriver
 
Curs gratuitarduino lectia12-conexiunewifi-googledocs
Curs gratuitarduino lectia12-conexiunewifi-googledocsCurs gratuitarduino lectia12-conexiunewifi-googledocs
Curs gratuitarduino lectia12-conexiunewifi-googledocs
 
Curs gratuitarduino lectia11-muzicacuarduino
Curs gratuitarduino lectia11-muzicacuarduinoCurs gratuitarduino lectia11-muzicacuarduino
Curs gratuitarduino lectia11-muzicacuarduino
 
Arduino comparatorul intern
Arduino comparatorul internArduino comparatorul intern
Arduino comparatorul intern
 
Aiesec University 2012-arduino
Aiesec University 2012-arduinoAiesec University 2012-arduino
Aiesec University 2012-arduino
 
Arduino yala electronicabazatapecodsecret
Arduino yala electronicabazatapecodsecretArduino yala electronicabazatapecodsecret
Arduino yala electronicabazatapecodsecret
 
Curs gratuitarduino lectia13-mousesitastatura
Curs gratuitarduino lectia13-mousesitastaturaCurs gratuitarduino lectia13-mousesitastatura
Curs gratuitarduino lectia13-mousesitastatura
 
Conector bluetoothmatesilver arduino-pc
Conector bluetoothmatesilver arduino-pcConector bluetoothmatesilver arduino-pc
Conector bluetoothmatesilver arduino-pc
 
Arduino uno rfidid-12
Arduino uno rfidid-12Arduino uno rfidid-12
Arduino uno rfidid-12
 
Arduino comunicatie i2c
Arduino comunicatie i2cArduino comunicatie i2c
Arduino comunicatie i2c
 
Arduino multiplexarea le-durilor
Arduino multiplexarea le-durilorArduino multiplexarea le-durilor
Arduino multiplexarea le-durilor
 
Arduino toraspberrypi firmata
Arduino toraspberrypi firmataArduino toraspberrypi firmata
Arduino toraspberrypi firmata
 
Arduino releemodio2
Arduino releemodio2Arduino releemodio2
Arduino releemodio2
 
Arduino matriceled8x8
Arduino matriceled8x8Arduino matriceled8x8
Arduino matriceled8x8
 
Curs gratuitarduino lectia15-seismografcuexcel
Curs gratuitarduino lectia15-seismografcuexcelCurs gratuitarduino lectia15-seismografcuexcel
Curs gratuitarduino lectia15-seismografcuexcel
 
Arduino protocolul 1 wire
Arduino   protocolul 1 wireArduino   protocolul 1 wire
Arduino protocolul 1 wire
 
Set prizecomandatedinarduino
Set prizecomandatedinarduinoSet prizecomandatedinarduino
Set prizecomandatedinarduino
 
Arduino gsmgprs-shield-partea-a-2-a
Arduino gsmgprs-shield-partea-a-2-aArduino gsmgprs-shield-partea-a-2-a
Arduino gsmgprs-shield-partea-a-2-a
 
Arduino flexsensorbrickbionicfinger
Arduino flexsensorbrickbionicfingerArduino flexsensorbrickbionicfinger
Arduino flexsensorbrickbionicfinger
 

Similar to Curs gratuitarduino lectia4-modalitati decomunicare

Raspberry pi firmata - arduino
Raspberry pi   firmata - arduinoRaspberry pi   firmata - arduino
Raspberry pi firmata - arduinoIulius Bors
 
Arduino indicatoare cp-usiram
Arduino indicatoare cp-usiramArduino indicatoare cp-usiram
Arduino indicatoare cp-usiramIulius Bors
 
Adxl345 raspberry pi
Adxl345 raspberry piAdxl345 raspberry pi
Adxl345 raspberry piIulius Bors
 
Raspberry pi wirelesshotspot
Raspberry pi wirelesshotspotRaspberry pi wirelesshotspot
Raspberry pi wirelesshotspotIulius Bors
 
Arduino wifi shield-drivermotoarel298
Arduino wifi shield-drivermotoarel298Arduino wifi shield-drivermotoarel298
Arduino wifi shield-drivermotoarel298Iulius Bors
 
Arduino capacitive sensor-robofun
Arduino capacitive sensor-robofunArduino capacitive sensor-robofun
Arduino capacitive sensor-robofunIulius Bors
 
Arduino alcoolmetru
Arduino alcoolmetruArduino alcoolmetru
Arduino alcoolmetruIulius Bors
 

Similar to Curs gratuitarduino lectia4-modalitati decomunicare (13)

Raspberry pi firmata - arduino
Raspberry pi   firmata - arduinoRaspberry pi   firmata - arduino
Raspberry pi firmata - arduino
 
Arduino indicatoare cp-usiram
Arduino indicatoare cp-usiramArduino indicatoare cp-usiram
Arduino indicatoare cp-usiram
 
Arduino mod-gps
Arduino mod-gpsArduino mod-gps
Arduino mod-gps
 
Arduino - PWM
Arduino - PWMArduino - PWM
Arduino - PWM
 
Arduino sht11
Arduino sht11Arduino sht11
Arduino sht11
 
Adxl345 raspberry pi
Adxl345 raspberry piAdxl345 raspberry pi
Adxl345 raspberry pi
 
Arduino rtc
Arduino rtcArduino rtc
Arduino rtc
 
Raspberry pi wirelesshotspot
Raspberry pi wirelesshotspotRaspberry pi wirelesshotspot
Raspberry pi wirelesshotspot
 
Arduino wifi shield-drivermotoarel298
Arduino wifi shield-drivermotoarel298Arduino wifi shield-drivermotoarel298
Arduino wifi shield-drivermotoarel298
 
Arduino eeprom
Arduino   eepromArduino   eeprom
Arduino eeprom
 
6 protocoale de retea
6 protocoale de retea6 protocoale de retea
6 protocoale de retea
 
Arduino capacitive sensor-robofun
Arduino capacitive sensor-robofunArduino capacitive sensor-robofun
Arduino capacitive sensor-robofun
 
Arduino alcoolmetru
Arduino alcoolmetruArduino alcoolmetru
Arduino alcoolmetru
 

More from Iulius Bors

Raspberry piuln2803
Raspberry piuln2803Raspberry piuln2803
Raspberry piuln2803Iulius Bors
 
Raspberry pi timelapse
Raspberry pi timelapseRaspberry pi timelapse
Raspberry pi timelapseIulius Bors
 
Raspberry pi lcd-shield20x4
Raspberry pi lcd-shield20x4Raspberry pi lcd-shield20x4
Raspberry pi lcd-shield20x4Iulius Bors
 
Raspberry pi bmp085blueedition
Raspberry pi bmp085blueeditionRaspberry pi bmp085blueedition
Raspberry pi bmp085blueeditionIulius Bors
 
Programare in prolog_pentru_inteligenta_artificiala
Programare in prolog_pentru_inteligenta_artificialaProgramare in prolog_pentru_inteligenta_artificiala
Programare in prolog_pentru_inteligenta_artificialaIulius Bors
 
Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...
Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...
Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...Iulius Bors
 
Cum instaleziapachesimysql peraspberrypi
Cum instaleziapachesimysql peraspberrypiCum instaleziapachesimysql peraspberrypi
Cum instaleziapachesimysql peraspberrypiIulius Bors
 
Asamblare statie meteo
Asamblare statie meteoAsamblare statie meteo
Asamblare statie meteoIulius Bors
 
Arduino yun arduino-wifi-ethernet-linux
Arduino yun arduino-wifi-ethernet-linuxArduino yun arduino-wifi-ethernet-linux
Arduino yun arduino-wifi-ethernet-linuxIulius Bors
 

More from Iulius Bors (9)

Raspberry piuln2803
Raspberry piuln2803Raspberry piuln2803
Raspberry piuln2803
 
Raspberry pi timelapse
Raspberry pi timelapseRaspberry pi timelapse
Raspberry pi timelapse
 
Raspberry pi lcd-shield20x4
Raspberry pi lcd-shield20x4Raspberry pi lcd-shield20x4
Raspberry pi lcd-shield20x4
 
Raspberry pi bmp085blueedition
Raspberry pi bmp085blueeditionRaspberry pi bmp085blueedition
Raspberry pi bmp085blueedition
 
Programare in prolog_pentru_inteligenta_artificiala
Programare in prolog_pentru_inteligenta_artificialaProgramare in prolog_pentru_inteligenta_artificiala
Programare in prolog_pentru_inteligenta_artificiala
 
Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...
Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...
Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...
 
Cum instaleziapachesimysql peraspberrypi
Cum instaleziapachesimysql peraspberrypiCum instaleziapachesimysql peraspberrypi
Cum instaleziapachesimysql peraspberrypi
 
Asamblare statie meteo
Asamblare statie meteoAsamblare statie meteo
Asamblare statie meteo
 
Arduino yun arduino-wifi-ethernet-linux
Arduino yun arduino-wifi-ethernet-linuxArduino yun arduino-wifi-ethernet-linux
Arduino yun arduino-wifi-ethernet-linux
 

Curs gratuitarduino lectia4-modalitati decomunicare

  • 1.
  • 2. http://www.robofun.ro Curs Gratuit Arduino si Robotica 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. http://www.robofun.ro/forum
  • 3. http://www.robofun.ro Curs Gratuit Arduino si Robotica Despre Shield-uri Arduino Shield-urile Arduino reprezinta o modalitate foarte simpla de a extinde functionalitatile Arduino. Orice shield Arduino este standard, in sensul ca pinii acestuia se potrivesc perfect peste pinii placii Arduino. In plus, in marea majoritate a cazurilor, pinii shield-ului sunt prelungiti in sus cu conectori de tip mama. Acesti pini, fiind infipti in pinii Arduino, ii prelungesc practic in sus pe acestia. Astfel, daca am pus un shield peste Arduino si vrem sa conectam un senzor la pinul A0 al Arduino, atunci vom conecta senzorul la pinul A0 al shield-ului, si totul va functiona exact ca si cum l-am fi infipt in pinul A0 al Arduino. Fiecare shield utilizeaza anumiti pini pentru a se conecta cu Arduino. Astfel, spre exemplu, shield-ul cu LCD 16X2 utilizeaza pinii 7, 6, 5, 4, 3, 2 iar shield-ul Wifly foloseste pinii 10, 11, 12, 13. Acesti pini nu mai pot fi folositi in acelasi timp cu shield-ul. Astfel, daca avem un senzor care se conecteaza pe pinul 3 la Arduino, si noi folosim deja shield-ul cu L298 (care foloseste pinii 3, 5, 6 si 9), atunci nu vom putea conecta senzorul in acelasi timp cu shield-ul L298. Mai mult, se poate intampla chiar sa avem doua shield-uri care utilizeaza aceeasi pini (sau o parte dintre pini sunt aceeasi). In aceasta situatie, de cele mai multe ori se poate aplica o solutie clasica. Anume, pinii shield-ului care intra in Arduino se indoaie un pic in afara, astfel incat sa nu mai intre in Arduino, ci sa iasa in afara. Apoi, acesti pini se conecteaza pe deasupra cu pini tata-tata cu alti pini Arduino nefolositi. De la caz la caz, s-ar putea sa fie nevoie sa faci modificari in libraria asociata senzorului, sau sa modifici doar codul sursa din programul tau, astfel incat pinii pe care i-ai mutat in alta parte sa fie actualizati si in cod. Mai jos sunt doua exemple de shield-uri montate peste Arduino. http://www.robofun.ro/forum
  • 4. http://www.robofun.ro Curs Gratuit Arduino si Robotica Modalitati de Comunicare Intre Arduino si Componente Mai departe vom trece in revista cateva modalitati prin care Arduino se conecteaza cu celelalte componente (senzori, shield-uri, etc). S-ar putea ca atunci cand vom ajunge la comunicarea seriala, SPI si I2C lucrurile sa ti se para un pic complicate si dificil de inteles, pentru ca inca nu am introdus nici un exemplu de dispozitiv care sa comunice astfel. Dupa ce vei vedea mai multe dispozitive explicate in detaliu in lectiile viitoare, vei intelege mai usor despre ce este vorba. Citire Date pe Porturile Analogice sau Digitale Anumite componente se conecteaza direct la porturile digitale sau analogice ale Arduino si astfel primesc comenzi sau comunica date catre acesta. Astfel, un led se conecteaza la un pin digital si atunci cand pinul este in HIGH, led-ul se aprinde. Un senzor de lumina se conecteaza la un pin analogic si folosind "analogRead(<pin>)" obtii valoarea data de senzor. Un buton se conecteaza la un pin digital si "digitalRead(<pin>)" intoarce 1 daca butonul este apasat si 0 altfel. Un shield driver de motoare cu L298 sau un LCD se conecteaza la mai multi pini digitali (4, respectiv 7) si primeste comenzi de la http://www.robofun.ro/forum
  • 5. http://www.robofun.ro Curs Gratuit Arduino si Robotica Arduino prin intermediul acestora. Voi reaminti ca ori de cate ori avem nevoie sa folosim un pin digital ca sa comandam un dispozitiv, este necesar sa declaram acest pin ca fiind de tip OUTPUT ("pinMode(<pin>, OUTPUT"). Altfel, nu se va intampla absolut nimic atunci cand trecem pinul in HIGH sau in LOW. Merita sa insistam un pic si asupra citirii datelor pe porturile analogice. Un senzor, la nivel electric, da pe iesire o tensiune electrica. Este absolut necesar ca aceasta tensiune sa fie intre 0 si 5 V. Orice senzor special creat pentru Arduino va respecta deja aceasta regula. Mai departe, aceasta tensiune este preluata de o componenta specializata a lui Arduino, numita "convertorul analog-digital". Aceasta componenta ofera la iesirea sa un numar intre 0 si 1023, in functie de nivelul de tensiune de la intrare. Asftel, folosind Arduino, putem citi senzori analogici cu o precizie de exact 1024 de nivele distincte. De exemplu, folosind senzorul de lumina, vom putea citi cu Arduino exact 1024 de nivele distincte de iluminare ale mediului ambiant. Daca avem nevoie de o precizie mai buna, atunci va trebui sa trecem la alt tip de senzori (cel mai probabil, senzori pe I2C). Comunicare Seriala Comunicarea seriala este o comunicare de tip digital, in sensul ca pe fir se transmit biti (ca la fel cum se intampla intr-o retea de calculatoare, doar ca folosind un protocol mult simplificat). Aceasta comunicare seriala se intampla intotdeauna intre Arduino si calculator, atunci cand Arduino este programat. O comunicare seriala se intampla intotdeauna la o anumita rata de transfer, care determina viteza cu care se transmit bitii pe fir. Rate comune de transfer sunt 9600, 19200, 57600, 115200. Software Serial SoftwareSerial este tot o modalitate de comunicare seriala, doar ca in loc de a utiliza pinii RX si TX ai microcontroller-ului (care sunt dedicati pentru o astfel de comunicare), utilizam o librarie software care emuleaza comunicarea folosind (aproape) oricare doi pini digitali ai placii Arduino. Avantajul imediat este faptul ca in acest mod putem conecta placa Arduino cu mult mai multe dispozitive seriale. http://www.robofun.ro/forum
  • 6. http://www.robofun.ro Curs Gratuit Arduino si Robotica #include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX void setup() { Serial.begin(9600); Serial.println("Goodnight moon!"); mySerial.begin(4800); mySerial.println("Hello, world?"); } void loop() { if (mySerial.available()) { Serial.write(mySerial.read()); } if (Serial.available()) { mySerial.write(Serial.read()); } } In codul de mai sus am declarat pinii 10 si 11 ca fiind cei doi pini care vor emula comunicarea seriala. Pinul 10 este pinul RX iar pinul 11 este pinul TX. Mai departe, am declarat rata de transfer a acestei conexiuni seriale ca fiind 4800 (mySerial.begin(4800)) (rata de transfer o stim din specificatiile dispozitivului cu care urmeaza sa ne conectam). In continuare, orice caracter primit peste conexiunea seriala emulata este scrisa in Serial Monitor, si orice caracter introdus in Serial Monitor este trimis peste conexiunea seriala emulata software. Vei intalni des in proiectele de mai departe acest tip de conexiune. Chiar daca in proiectul respectiv este folosita conexiunea de tip serial standard, vei putea oricand sa o inlocuiesti cu SoftwareSerial, ca mai sus. SPI SPI este o modalitate de a comunica cu dispozitive de tipul master-slave. Un dispozitiv este master (de obicei Arduino), si celelalte dispozitive sunt slave. In practica, vei gasi de obicei librarii scrise de altcineva care incapsuleaza deja comunicare cu dispozitivul peste SPI, asa ca nu va trebui sa iti bati prea mult capul cu amanuntele. Voi prezenta totusi mai jos cateva elemente ale SPI, ca sa recunosti termenii atunci cand auzi vorbindu-se de ei. Comunicarea SPI se face folosind patru canale (fire de conexiune) : MISO – firul prin care dispozitivele slave trimit date catre master. MOSI – firul prin care dispozitivul master trimite date catre slave. SCK – firul prin catre este transmis clock-ul (ritmul de comunicatie) SS (Slave Select) – acest canal este specific SPI, si este interesant. SPI permite conectarea pe acelasi bus a mai multor dispozitive, fiecare dispozitiv avand atasat un canal Slave Select. Atunci cand valoarea din acest canal este LOW, dispozitivul slave comunica cu master-ul. Cand valoarea Slave Select este HIGH, atunci dispozitivul ignora comunicarea SPI. In acest mod, poti conecta pe acelasi canal SPI oricat de multe dispozitive, cu conditia ca fiecarui dispozitiv sa ii atasezi un canal Slave Select. Un http://www.robofun.ro/forum
  • 7. http://www.robofun.ro Curs Gratuit Arduino si Robotica exemplu pe care il vei intalni este comunicarea cu shield-ul Ethernet, si in acelasi timp cu SD card-ul montat pe shield. Ambele folosesc comunicare SPI. Pinul Slave Select conectat la chip-ul Ethernet este pinul digital 10 Arduino, iar pinul Slave Select conectat la SD card este pinul digital 4. Astfel, atunci cand vrei sa comunici Ethernet, vei seta pinul 10 in LOW, si pinul 4 in HIGH (doar chip-ul Ethernet activ), iar atunci cand vrei sa comunici cu SD card-ul, vei seta pinul 10 in HIGH si pinul 4 in LOW (doar SD card-ul activ). Daca omiti sa faci acest lucru, comenzile trimise catre chip-ul Ethernet vor fi in acelasi timp receptionate si procesate si de catre SD card, ceea ce va conduce la o functionare defectuoasa. In cazul Arduino UNO, pinii Arduino SPI sunt MISO – pinul digital 12, MOSI – pinul digital 11, SCK – pinul digital 13. Pinul default SS este pinul digital 10. In cazul in care ai mai mult de un dispozitiv SPI, vei folosi mai multi pini Slave Select, nu doar pinul digital 10, fiecare dispozitiv fiind conectat cu cate un pin Slave Select distinct. In cazul Arduino Mega, pinii SPI sunt MISO - pinul digital 50, MOSI – pinul digital 51, SCK – pinul digital 52, si SS – pinul digital 53. La modul concret, daca ai doua dispozitive SPI, vei incepe prin a identifica pinii MOSI, MISO, SCK si SS pentru fiecare dispozitiv. Vei conecta apoi impreuna pinii MOSI ai celor doua dispozitive, si impreuna cu pinul Arduino MOSI, la fel si pentru MISO si SCK. Pentru pinii SS, vei conecta pinul primului dispozitiv la un pin digital Arduino, iar pinul celui de-al doilea dispozitiv la un alt pin digital Arduino. I2C Comunicarea I2C este un mod interesant de comunicare, in sensul ca necesita doar doua fire de comunicare, si permite conectarea a oricat de mult dispozitive (cu adrese diferite). Fiecare dispozitiv I2C are o adresa (care se poate sau nu modifica). De obicei, vei intalni dispozitive I2C cu adresa fixa (pe care nu o poti modifica), sau dispozitive la care vei putea alege adresa I2C dintr-o lista de cateva adrese prestabilite (lucru pe care de obicei il faci prin conectarea unui pin de adresa – marcat de obicei ADDR – la pinul GND, sau VCC, sau SDA, sau SCL). Ca si in cazul SPI, a intelege modul de comunicare citind datasheet-ul dispozitivului I2C nu este facil. Primul lucru pe care il fac atunci cand am nevoie sa comunic cu un dispozitiv I2C este sa caut o librarie deja scrisa pentru dispozitivul respectiv. In acest mod, singurul lucru de care trebuie eu sa tin cont este adresa dispozitivului. Mai departe, modul concret de comunicare este realizat in intregime de librarie, eu avand acces doar la informatia utila. In cazul Arduino UNO, pinii I2C pentru Arduino sunt pinul analogic 4 (care este pinul SDA), si pinul analogic 5 (care este pinul SCL). Pentru Arduino Mega, pinul digital 20 este pinul SDA si pinul digital 21 este pinul SCL. In cazul Arduino Leonardo, cei doi pini SDA si SCL sunt distincti, marcati ca atare pe placa. Pentru a folosi un dispozitiv I2C, vei conecta pinul SDA al dispozitivului cu pinul SDA al Arduino, pinul SCL al dispozitivului cu pinul SCL al Arduino. In plus, in functie de dispozitiv, s-ar putea sa fie necesar sa conectezi si pinul de adresa la GND sau la VCC (in cele mai multe cazuri, pinul de adresa este deja conectat, dar nu intotdeauna). Un exemplu de senzor I2C este senzorul de temperatura I2C. Pinul de adresa este marcat pe placa cu “ADDR0”. Dispozitivul acest pin se poate conecta la pinul GND (si atunci dispozitivul va avea http://www.robofun.ro/forum
  • 8. http://www.robofun.ro Curs Gratuit Arduino si Robotica adresa “0x48”), poate fi conectat la VCC (si atunci dispozitivul va avea adresa “0x49”, poate fi conectat la pinul SDA (si atunci dispozitivul va avea adresa “0x4A”), sau poate fi conectat la pinul SCL (si atunci dispozitivul va avea adresa “0x4C”). In acest mod, poti conecta pana la patru senzori TMP102 la placa Arduino. Daca esti curios, un exemplu de cod care comunica pe I2C poti gasi aici : http://www.robofun.ro/senzor_temperatura_tmp102 http://www.robofun.ro/forum
  • 9. http://www.robofun.ro Curs Gratuit Arduino si Robotica Aceasta a fost lectia 4. In final, as vrea sa te rog sa ne oferi feedback asupra acestei lectii, pentru a ne permite sa le facem mai bune pe urmatoarele. Este vorba despre un sondaj cu 4 intrebari (oricare este optionala), pe care il poti accesa dand click aici. Sau ne poti contacta direct prin email la contact@robofun.ro . Iti multumim, Echipa Robofun.RO http://www.robofun.ro/forum