「Raspberry PiにA/DコンバータMCP3002をつなぐ」でRaspberry Pi2にMCP3002 ADCを接続し、SPI経由でアナログセンサー値を読みだせるようにした。pythonからSPI通信を行うために py-spidev を使ったが、WiringPi v2 の python wrapper を使ってもSPIの制御が可能なので、ここではWiringPi2 pythonを使ってSPI経由でアナログセンサーを読みだしてみる。
実験用回路
- Raspberry Pi2の SPI0.0 に MCP3002 をつなぎ、MCP3002 の channel 0 に圧力センサー FSR400 を接続する。
- GPIO 25 に LED をつなぐ。
WiringPi を使った SPI / GPIO 制御
MCP3002 から圧力センサーの値を読み出し、THRESHOLD 値を超える値が観測されたら LED を点滅させるプログラムを python で実装する。
SPI Library を使って読みだす
MCP3002のデータシートにしたがって、0x68,0x00の2バイトを送信すると、CH0に接続したセンサー値2バイト(有効なのは下位10ビット)が返ってくる。0x68の代わりに0x78とすれば CH1 に接続したセンサー値が得られる。
read_adc_wp2.py
#!/usr/bin/env python3
import wiringpi2 as wp
import time
# SPI channel (0 or 1)
SPI_CH = 0
# SPI speed (hz)
SPI_SPEED = 1000000
# GPIO number
LED_PIN = 25
# threshold
THRESHOLD = 200
# setup
wp.wiringPiSPISetup (SPI_CH, SPI_SPEED)
wp.wiringPiSetupGpio()
wp.pinMode(LED_PIN, wp.GPIO.OUTPUT)
while True:
buffer = 0x6800
buffer = buffer.to_bytes(2,byteorder='big')
wp.wiringPiSPIDataRW(SPI_CH, buffer)
value = (buffer[0]*256+buffer[1]) & 0x3ff
print (value)
if value > THRESHOLD:
wp.digitalWrite(LED_PIN, wp.GPIO.HIGH)
time.sleep(0.2)
wp.digitalWrite(LED_PIN, wp.GPIO.LOW)
time.sleep(0.2)
time.sleep(1)
MCP3002 Extension を使う
WiringPi2 には MCP3002 の extension があるので、これを使えば、SPI通信を意識することなくアナログセンサーの値を読み出すことができる(PIN_BASE が CH0, PIN_BASE + 1 が CH1)。
read_mcp3002.py
#!/usr/bin/env python3
###
### read MCP3002 ADC analog value via RasPi SPI
###
import wiringpi2 as wp
import time
# SPI channle (0 or 1)
SPI_CH = 0
# pin base (above 64)
PIN_BASE=70
# GPIO number
LED_PIN = 25
# threshold
THRESHOLD = 200
# setup
wp.mcp3002Setup (PIN_BASE, SPI_CH)
wp.wiringPiSetupGpio()
wp.pinMode(LED_PIN, wp.GPIO.OUTPUT)
# if a sensor value is over THRESHOLD,
# flash led.
while True:
value = wp.analogRead(PIN_BASE)
print (value)
if value > THRESHOLD:
wp.digitalWrite(LED_PIN, wp.GPIO.HIGH)
time.sleep(0.2)
wp.digitalWrite(LED_PIN, wp.GPIO.LOW)
time.sleep(0.2)
time.sleep(1)