Documente Academic
Documente Profesional
Documente Cultură
Attribution-NonCommercial-NoDerivs
CC BY-NC-ND
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.
Raspberry PI SensorShield V3
SensorShield V3 iti permite sa conectezi la placa Raspberry PI orice tip de senzor analogic. Iata
o parte dintre aplicatiile posibile cu acest tip de sensor shield:
poti masura concentratiile de gaze GPL, gaz metan sau monoxid de carbon
poti masura nivelul de lumina din incapere, temperatura sau nivelul de umiditate
http://www.robofun.ro/forum
poti detecta sunetul
Varianta prin care se realiza comunicatia master-slave intre Raspberry PI si shield-ul de senzori
era prin emularea portului SPI. Motivul era ca la inceput, in sistemul de operare al placii, nu exista
suport pentru portul SPI hardware, desi fizic era deja acolo. Pe parcursul tutorialului vei instala o
librarie care iti ofera accesibilitate la portul SPI al placii.
http://www.robofun.ro/forum
Senzor brick pin VCC SensorShield V3 pin 5V
Senzor brick pin GND SensorShield V3 pin GND
Senzor brick pin OUT SensorShield V3 pin A0
http://www.robofun.ro/forum
4. Logheaza-te prin SSH la placa si vezi daca modulul portului SPI este vizibil sau nu.
Tasteaza comanda:
lsmod
5. Daca modulul spidev nu apare in lista atunci este cazul sa il activezi. Deschide fisierul
prin comanda urmatoare si plaseaza caracterul # in fata liniei: blacklist spi-bcm2708
http://www.robofun.ro/forum
sudo nano /etc/modprobe.d/raspi-blacklist.conf
lsmod
http://www.robofun.ro/forum
9. Acum vei descarca pachetul py-spidev si il vei compila:
cd /home
cd py-spidev/
Primul exemplu afiseaza in terminal valorile convertorului A/D, fara conversii ulterioare. Vei
vedea mai tarziu cum transformam valoarea obtinuta in volti, grade Celsius sau cm. Fiecare exemplu il
scrii intr-un fisier nano. Il salvezi cu CTRL X si Y iar apoi il executi cu cea de-a doua comanda:
http://www.robofun.ro/forum
import spidev
import time
spi = spidev.SpiDev()
spi.open(0,0)
while True:
for adcInput in range(0,8):
print "ADC(", adcInput,")=", readadc(adcInput)
time.sleep(1)
http://www.robofun.ro/forum
Al doilea exemplu de cod sursa iti afiseaza valoarea cuprinsa intre 0 si 1023, tensiunea
exprimata in Volti si temperatura in grade Celsius.
Conecteaza un senzor de temperatura brick asa cum ai conectat si senzorul de indoire brick la
shield-ul de senzori si incarca urmatorul cod:
http://www.robofun.ro/forum
import spidev
import time
spi = spidev.SpiDev()
spi.open(0,0)
def readadc(adcnum):
if ((adcnum > 7) or (adcnum < 0)):
return -1
r = spi.xfer2([1,(8+adcnum)<<4,0])
adcout = ((r[1]&3) << 8) + r[2]
return adcout
while True:
for adcInput in range(0,8):
value = readadc(adcInput)
voltage = value * 5
voltage /= 1024.0
tempCelsius = (voltage-0.5)*100
print "---------------------------"
print "ADC(", adcInput,")= ", value
print "---------------------------"
print "Voltage: ", voltage
print "---------------------------"
print "Temp: ", tempCelsius
time.sleep(1)
Al treilea exemplu de cod iti afiseaza distanta unui senzor Sharp (0-80cm) conectat la intrarea
A0. Senzorul Sharp se conecteaza in aceeasi maniera ca si senzorii precedenti.
Copiaza codul sursa de mai jos si executa-l.
import spidev
import time
spi = spidev.SpiDev()
spi.open(0,0)
def readadc(adcnum):
if ((adcnum > 7) or (adcnum < 0)):
return -1
r = spi.xfer2([1,(8+adcnum)<<4,0])
adcout = ((r[1]&3) << 8) + r[2]
return adcout
http://www.robofun.ro/forum
while True:
value = readadc(0)
value = value * 0.0048828125
distanta = 30*pow(value, -1.10)
print "Distanta: ", distanta
time.sleep(1)
http://www.robofun.ro/forum