Banyak sekali website yang membahas tentang membaca analog input terutama di link ini adafruit yang merupakan sumber utama dari tulisan ini. Setelah membeli Raspberry Pi 2, MCP3008 (yang berfungsi sebagai analog to digital converter), resistor 10k dan FSR (Force Sensitive Resistor) dari amazon, saya mengikuti tutorial pada link tersebut dan mendokumentasinya seperti pada gambar di bawah ini. Untuk lebih lengkap bagaimana cara membaca input analog menggunakan MCP3008 dan Raspberry Pi silahkan baca tulisan ini lebih lanjut.
My Raspberry Pi 2 |
Apa saja yang dibutuhkan?
Tentunya Raspberry Pi, MCP3008, FSR, kabel, dan resistor 10k Ohm. Keterangan lebih lanjut mengenai datasheet MCP3008 dan FSR dapat dilihat di link berikut:
1) MPC30082) FSR
Bagaimana cara merangkainya?
Langkah berikutnya adalah cukup merangkai semua kelengkapan yang disebutkan di atas menjadi seperti pada gambar di bawah ini
Membaca input analog?
Sebelum membaca input analog, terlebih dahulu menginstall RPI.GPIO modul pada Raspberry Pi
sudo apt-get update
sudo apt-get install python-rpi.gpio # untuk python 2.x
sudo apt-get install python3-rpi.gpio # untuk pyhton 3.x
kemudian simpan python code berikut dengan nama "baca_sensor.py"
Sebelum membaca input analog, terlebih dahulu menginstall RPI.GPIO modul pada Raspberry Pi
sudo apt-get update
sudo apt-get install python-rpi.gpio # untuk python 2.x
sudo apt-get install python3-rpi.gpio # untuk pyhton 3.x
kemudian simpan python code berikut dengan nama "baca_sensor.py"
import RPi.GPIO as GPIO
import time
# set up numbering mode to use for channels
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
# read SPI data from MCP3008, 8 possbile adc's (0 thru 7)
def readadc(adcnum,clockpin,mosipin,misopin,cspin):
# to exit from program if channels used are not between 0 and 7
if ((adcnum > 7) or (adcnum < 0)):
return -1
GPIO.output(cspin,True) # shutdown input = 1
GPIO.output(clockpin,False) # start clock low = 0
GPIO.output(cspin,False) # shutdonw input = 0
commandout = adcnum
commandout |= 0x18 # start bit + single-ended bit
commandout <<= 3 # we only need to send 5 bits here
for i in range(5):
if (commandout & 0x80):
GPIO.output(mosipin,True)
else:
GPIO.output(mosipin,False)
commandout <<= 1
GPIO.output(clockpin,True)
GPIO.output(clockpin,False)
adcout = 0
# read in one empty bit, one null bit and 10 ADC bits
for i in range(12):
GPIO.output(clockpin,True)
GPIO.output(clockpin,False)
adcout <<= 1
if (GPIO.input(misopin)):
adcout |= 0x1
GPIO.output(cspin,True)
adcout >>= 1 # first bit is 'null' so drop it
return adcout
# change these as desired - they're the pins connected from these
# SPI port on the ADC to the Cobbler
SPICLK = 18
SPIMISO = 23
SPIMOSI = 24
SPICS = 25
# set up the SPI interface pins
GPIO.setup(SPIMOSI,GPIO.OUT)
GPIO.setup(SPIMISO,GPIO.IN)
GPIO.setup(SPICLK,GPIO.OUT)
GPIO.setup(SPICS,GPIO.OUT)
# FSR connected to adc #0
FSR = 0; # read ch0
T = 15 # duration time in second for measurement
Ts = 0.5 # sampling period
for i in range(int(T/Ts)):
# read the analog pin
Measured_Voltage = readadc(FSR,SPICLK,SPIMOSI,SPIMISO,SPICS)
print 'Voltage = %1.4f' % (Measured_Voltage*5.0/1023)
time.sleep(Ts)
import time
# set up numbering mode to use for channels
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
# read SPI data from MCP3008, 8 possbile adc's (0 thru 7)
def readadc(adcnum,clockpin,mosipin,misopin,cspin):
# to exit from program if channels used are not between 0 and 7
if ((adcnum > 7) or (adcnum < 0)):
return -1
GPIO.output(cspin,True) # shutdown input = 1
GPIO.output(clockpin,False) # start clock low = 0
GPIO.output(cspin,False) # shutdonw input = 0
commandout = adcnum
commandout |= 0x18 # start bit + single-ended bit
commandout <<= 3 # we only need to send 5 bits here
for i in range(5):
if (commandout & 0x80):
GPIO.output(mosipin,True)
else:
GPIO.output(mosipin,False)
commandout <<= 1
GPIO.output(clockpin,True)
GPIO.output(clockpin,False)
adcout = 0
# read in one empty bit, one null bit and 10 ADC bits
for i in range(12):
GPIO.output(clockpin,True)
GPIO.output(clockpin,False)
adcout <<= 1
if (GPIO.input(misopin)):
adcout |= 0x1
GPIO.output(cspin,True)
adcout >>= 1 # first bit is 'null' so drop it
return adcout
# change these as desired - they're the pins connected from these
# SPI port on the ADC to the Cobbler
SPICLK = 18
SPIMISO = 23
SPIMOSI = 24
SPICS = 25
# set up the SPI interface pins
GPIO.setup(SPIMOSI,GPIO.OUT)
GPIO.setup(SPIMISO,GPIO.IN)
GPIO.setup(SPICLK,GPIO.OUT)
GPIO.setup(SPICS,GPIO.OUT)
# FSR connected to adc #0
FSR = 0; # read ch0
T = 15 # duration time in second for measurement
Ts = 0.5 # sampling period
for i in range(int(T/Ts)):
# read the analog pin
Measured_Voltage = readadc(FSR,SPICLK,SPIMOSI,SPIMISO,SPICS)
print 'Voltage = %1.4f' % (Measured_Voltage*5.0/1023)
time.sleep(Ts)
dan langkah terakhir, jalankan perintah berikut pada terminal Raspberry Pi (jangan lupa dijalankan pada direktori yang sama dengan lokasi file baca_sensor.py)
sudo python baca_sensor.py
Outputnya seperti ini
Voltage = 0.0000
Voltage = 0.0000
Voltage = 0.0000
Voltage = 3.2135
Voltage = 2.5681
Perlu diingat, T dan Ts pada baca_sensor.py menunjukkan durasi pengukuran dan periode samping. File dapat didownload di link ini.
Selamat mencoba dan semoga bermanfaat.
good share.. berhubung saya punya proyek berkaitan dengan yg di bahas, apakah untuk nilai keluaran analog dari sensor gas (ex. MQ-x) bisa menggunakan script yang sama seperti yg tertera di atas? thx.
ReplyDelete