環境情報
Raspberry Pi2 Model B
OS: Raspbian JESSIE
A/Dコンバータ:MCP3002
Python 2.7
目的
Raspberry Pi2 のSPIフォトトランジスタの値をA/Dコンバータを利用して取得し、暗くなったらLEDを点灯させる
用語の説明
SPI通信とは
シリアル・ペリフェラル・インタフェースの頭文字をとってSPI通信と呼び、少ないピンでデータをやり取りする低速インタフェース。
4つの端子で構成される。
SCK・・・Serial Clock
MISO・・・Master In Slave Out
MOSI・・・Master Out Slave In
SS・・・Slave Select
A/D変換とは
アナログ→デジタル変換のことであり、アナログとは連続値でありデジタルとはあるタイミングのスナップショット値のようなもの。
電圧の変化などのアナログ値を、デジタル数値に変換するチップをA/Dコンバータと呼ぶ。
回路
回路は、回路図を用意できないので写真で。。
MCP3002のつなぎ方は、データシートを参考にした。
はまりポイント
プログラムを記載して実行してみたが、一向に値が変わらない現象があったが、その理由はVss端子が+(3.3V)につながっていたためで、GNDにつないだことで、値が得られるようになった。
プログラム
pi-spidev のインストール
pi-spidevは、PythonでSPI通信を利用するためのPythonモジュール。以下のコマンドで利用可能となる。
$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev
$ sudo python setup.py install
データ取得処理
Pythonでの実装は、GPIOとpy-spidevを利用してフォトトランジスタの値が、10を下回ったらLEDを点灯させることを実現する。
以下が、実際のPythonプログラム。
#!/usr/bin/env python
# Read the analog sensor value via MCP3002
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import spidev
import time
import subprocess
def ledFlash(num):
if num < 10:
GPIO.output(LED , GPIO.HIGH)
else:
GPIO.output(LED , GPIO.LOW)
return
GPIO.setmode(GPIO.BCM)
LED = 25
GPIO.setup(LED , GPIO.OUT)
# opne SPI device 0.0
spi = spidev.SpiDev()
spi.open(0 , 0)
try:
while True:
resp = spi.xfer2([0x68, 0x00]) ・・・ポイント①
value = (resp[0] * 256 + resp[1]) & 0x3ff ・・・ポイント②
print value
ledFlash(value) ・・・ポイント③
time.sleep(0.2)
except KeyboardInterrupt:
spi.close()
GPIO.cleanup()
-
ポイント①
MCP3002へのインプット信号は、コンバータの仕様として以下となる。
CH0 から取得する場合 0b01101000、0b00000000 (2進数)
CH1 から取得する場合 0b01111000、0b00000000 (2進数)
spidev.xfer2メソッドに上記の16進数を渡している。 -
ポイント②
resp (応答)から、応答を受け取って(10bit)取得して値をGET
※ここはもう少し詳しくなんでこういう計算式なのか理解する必要あり -
ポイント③
用意しておいたLEDの点滅メソッドに値を引数にして渡している
メソッド内では、値が10以下になったらLEDを光らせている。(部屋が結構暗かったので通常で、16-17の値だったので、10に設定しているがここは光らせたい閾値を変えれば良い)