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