Raspberry Pi + MCP3002で照度センシング

先日書いたMCP3002でのアナログ入力方式で照度センシング基板を作った。
今回、片面基板の銅箔面に部品を載せる方法にした。両面基板は以前にも書いた様に、CNCで切削するには位置合わせが面倒なのだ。

Sense with MCP3002

MCP3002を用いた照度センサ

以前、OpenStickで作った基板はこれ。

OpenStickを用いた照度センサ

OpenStickを用いた照度センサ

多チャンネルが不要なら、MCP3002で作る方がかなりシンプルになる。

 

Raspberry Piで正統派のアナログ入力

Raspberry Piでのアナログ入力方法として、OpenStickを用いる例を先日書いたが、今回はA/D変換ICを用いる正統派の方法を試してみた。

使用したのは秋月電子で¥200のMCP3002。アナログ入力が2CHあり、SPIでRaspberry Piと接続する。

回路図

RaspiAN_SPI

回路図

Raspberry Pi側の準備
こちらを参考に設定した。

  1. sudo apt get install python-dev  でpython-devをインストール
  2. /etc/modprobe.d/raspi-blacklist.confファイルをエディタで開き、
    blacklist spi-bcm2708 行の先頭に#を追加してコメントアウト。
  3. リブート後、lsmodコマンドを実行して「spi_bcm2708    ・・・」の表示がある事を確認。
  4. 下記を実行してPython-spiをインストール
    mkdir python-spi
    cd python-spi
    wget https://raw.github.com/doceme/py-spidev/master/setup.py
    wget https://raw.github.com/doceme/py-spidev/master/spidev_module.c
    sudo python setup.py install

お試し
次のスクリプトをspiread.pyという名前で作成。

#!/usr/bin/env python
# _*_ coding: utf-8 _*_

import spidev
import time

CE=0

spi = spidev.SpiDev()
spi.open(0,CE)

while True:
retspi = spi.xfer2([0x68,0x00])
value = (retspi[0]*256+retspi[1]) & 0x3ff
print value
time.sleep(1)

実行結果(可変抵抗でアナログ値を変化させながら実行した例)

$ ./spiread.py
0
0
128
292
489
1023
1023
1023

Raspberry PiのSPIはCE0とCE1端子を用いて2個のSPIデバイスを個別に使用できる。これをスクリプト中では変数CEで指定している。
spi.xfer2()に渡している0x68はMCP3002に対し、「シングルエンド動作」、「アナログ入力CH0を使用」、「MSPから出力」 を設定している。 変換結果は配列retspiに2バイトで入るので、連結して下位10ビットを取出した後、print文に渡している。
なおspi.xfe2()に渡す値0x68を0x78に変更するとCH1入力を使用する事になる。

OpenStick方式と比べると・・・

  1. ICが安い
    OpenStickで使うPIC18F2550は350円。更に発振子やUSBコネクタが必要だが、MCP3002だと200円で殆ど外付け部品が不要。
  2. チャンネルが2つだけ
    OpenStickだとアナログ10CHで更にデジタル入力も使えるがMCP3002は2CHのみ。
  3. プログラムが簡単
    慣れや使用言語にもよると思うが・・・ジョイスティックの値を取るよりSPIの方が簡単な気がする。
  4. PIC18F2550のアナログソースは最大2.5KΩのインピーダンスにせよと取説に記載がある。 一方MCP3002の取説によるとアナログ入力リークが0.001μA(TYP)なので、こちらの方が扱いやすそうである。
  5. OpenStickはUSB電源駆動なので0~5Vの範囲でA/D変換する。 MCP3002はRaspberry Piと直結する場合、SPI信号が3.3VなのでA/D変換も0~3.3Vの範囲となる。