Sunteți pe pagina 1din 11

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.
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 acceleratii folosind ADXL335

poti masura nivelul de alcool in aerul expirat folosind senzori MQ-3

poti masura concentratiile de gaze GPL, gaz metan sau monoxid de carbon

poti masura gradul de indoire sau forta de apasare

poti masura distante cu senzori Sharp sau cu senzori ultrasonici

poti masura nivelul de lumina din incapere, temperatura sau nivelul de umiditate

poti detecta prezenta umana intr-o incapere

http://www.robofun.ro/forum
poti detecta sunetul

Cum utilizezi shield-ul pe pinii SPI ai placii Raspberry PI ?

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.

1. Infige Sensorshield-ul in portul placii Raspberry PI.

2. Conecteaza un senzor de indoire brick.


Senzorul brick se conecteaza dupa urmatorul tabel:

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

3. Conecteaza alimentatorul de 5V si cablul de retea.

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

6. Incarca modulul prin comenzile :

sudo modprobe spidev


sudo modprobe -a spi-bcm2708

7. Vizualizeaza daca modulul apare din nou in lista prin comanda:

lsmod

8. Urmeaza sa instalezi pachetul git si pachetul python-dev:

sudo apt-get install git-core

sudo apt-get install python-dev

http://www.robofun.ro/forum
9. Acum vei descarca pachetul py-spidev si il vei compila:

cd /home

sudo git clone git://github.com/doceme/py-spidev

cd py-spidev/

sudo python setup.py install

Exemple de coduri sursa.

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:

sudo nano adc.py

sudo python adc.py

http://www.robofun.ro/forum
import spidev
import time

spi = spidev.SpiDev()
spi.open(0,0)

# read SPI data from MCP3008 chip, 8 possible adc's (0 thru 7)


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):
print "ADC(", adcInput,")=", readadc(adcInput)
time.sleep(1)

Dupa executie vei obtine urmatoarea imagine:

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)

Dupa executie vei obtine urmatoarele rezultate:

http://www.robofun.ro/forum

S-ar putea să vă placă și