A nagyon sokoldalú Raspberry Pi egyik hiányossága, hogy nem rendelkezik beépített analóg bemenetekkel, szemben pl. az Arduino-val. Ezt a hiányosságot nagyon könnyen orvosolhatod egy olcsó, és egyszerűen használható A/D átalakítóval, pl. a Microchip gyártmányú MCP3008-as IC-vel.
Az áramkör 8 darab, 10-bit felbontású bemeneti csatornát tartalmaz, a Raspberry felé pedig SPI protokollon keresztül küldi a digitális információkat.
Az alábbi leírásban bemutatom az MCP3008 és a Raspberry pi összekapcsolásának módját, a bemeneti csatornák kiolvasásának lehetőségét python program segítségével, ill. egy egyszerű összeállítási példát, ahol egy fényérzékelő LDR és egy analóg jelet szolgáltató hőmérsékletmérő szenzor (TMP36) kapcsolódik az IC két bemeneti csatornájához.
Mikre lesz szükséged?
- Raspberry Pi
- MCP3008 8 csatornás ADC
- Fényérzékeny ellenállás (Light Dependent Resistor – LDR)
- TMP36 hőmérséklet mérő szenzor
- 10 KΩ-os ellenállás
Vezetékelés
Az integrált áramkör 16 kivezetéses, un. DIL (dual in line) tokozású változatát használtam, ez a leg megfelelőbb kivitel breadbord alkalmazása esetén. Az IC egyik oldalán található csatlakozási pontok a bemenetek, a másik oldalon találhatók a tápfeszültség, illetve az SPI busz kivezetései.
Az ábrán az MCP3008 első analóg csatornájára (CH0) tesztelési célból egy potenciométer csúszóérintkezője kapcsolódik, itt GND és a pozitív tápfeszültség (3,3V) közötti analóg feszültség vehető le.
Az IC és a Raspberry GPIO port összekötése:
IC | Raspberry GPIO |
VDD | 3.3V |
VREF | 3.3V |
AGND | GROUND |
CLK | GPIO11 (P1-23) |
DOUT | GPIO9 (P1-21) |
DIN | GPIO10 (P1-19) |
CS | GPIO8 (P1-24) |
DGND | GROUND |
A teljes kapcsolás két szenzorral egészül ki, az első csatornára (CH0) egy LDR, a második csatornára (CH1) egy TMP36 hőmérsékletmérő szenzor kapcsolódik:
Az alkalmazott szenzorok:
A fenti összeállításhoz használható mintaprogram:
#!/usr/bin/python import spidev import time import os # Open SPI bus spi = spidev.SpiDev() spi.open(0,0) spi.max_speed_hz=1000000 # Function to read SPI data from MCP3008 chip # Channel must be an integer 0-7 def ReadChannel(channel): adc = spi.xfer2([1,(8+channel)<<4,0]) data = ((adc[1]&3) << 8) + adc[2] return data # Function to convert data to voltage level, # rounded to specified number of decimal places. def ConvertVolts(data,places): volts = (data * 3.3) / float(1023) volts = round(volts,places) return volts # Function to calculate temperature from # TMP36 data, rounded to specified # number of decimal places. def ConvertTemp(data,places): # ADC Value # (approx) Temp Volts # 0 -50 0.00 # 78 -25 0.25 # 155 0 0.50 # 233 25 0.75 # 310 50 1.00 # 465 100 1.50 # 775 200 2.50 # 1023 280 3.30 temp = ((data * 330)/float(1023))-50 temp = round(temp,places) return temp # Define sensor channels light_channel = 0 temp_channel = 1 # Define delay between readings delay = 5 while True: # Read the light sensor data light_level = ReadChannel(light_channel) light_volts = ConvertVolts(light_level,2) # Read the temperature sensor data temp_level = ReadChannel(temp_channel) temp_volts = ConvertVolts(temp_level,2) temp = ConvertTemp(temp_level,2) # Print out results print "--------------------------------------------" print("Light: {} ({}V)".format(light_level,light_volts)) print("Temp : {} ({}V) {} deg C".format(temp_level,temp_volts,temp)) # Wait before repeating loop time.sleep(delay)
A forráskód letölthető: analog.py