完全に個人的な備忘録

完全に個人的な備忘録。学習コストが高くなってきたので、メモしておかないと…片っ端から忘却の彼方なのです。

Raspberry Pi でADC MCP3002 を使ってみる

Raspberry Piはデジタルセンサーだと、GPIO等で値を取得する事ができるが、アナログセンサーは、そのままでは値を取得する事ができない。

ADCでデジタルに変換した後、値を取得する必要がある。

今回、10ビット2ch ADコンバータ MCP3002 を以下から入手したので、使ってみる事にした。

10ビット2ch ADコンバータ MCP3002−I/P: 半導体 秋月電子通商 電子部品 ネット通販

データシートは以下の通り。
http://akizukidenshi.com/download/ds/microchip/mcp3002.pdf

データシートを抜粋すると、ザックリ
f:id:tarancho:20140216210001p:plain
のような感じ。

いきなりアナログセンサーの値を変換しても、正解が解らないので、
f:id:tarancho:20140216210400p:plain
こんな感じで変換してみる事にした。MCP3002は、Vddと入力CHのGNDが共通なので、多分、V1の値は計測できないと思う。なので、V1を計測する時は、V1とV2を入れ替えて継続する事にする。
f:id:tarancho:20140216210459j:plain
ブレッドボードで構築。

Raspberry PiはデフォルトだとSPIが無効になっているので
/etc/modprobe.d/raspi-blacklist.conf
を編集(その前に raspi-config でspiを有効にする必要がありました。raspi3だと blacklist の編集も同時に行なってくれるようです)。

# blacklist spi and i2c by default (many users don't need them)

# blacklist spi-bcm2708
# blacklist i2c-bcm2708

そして再起動。

$ ls -l /dev/spi*
crw------- 1 root root 153, 0 Jan  1  1970 /dev/spidev0.0
crw------- 1 root root 153, 1 Jan  1  1970 /dev/spidev0.1

バイスが存在している事を確認。今回は、
はてな
を参考にして、rubyで組んでみる事にした。

sudo apt-get install ruby ruby1.9.1-dev
sudo gem install wiringpi pi_piper 

でインストールして、プログラムは、以下のような感じで。

require 'pi_piper'
PiPiper::Spi.begin do |spi|
  #
  # +----+----+----+----+----+----+----+----+  +-+-+-+-+-+-+-+-+
  # | X  | 1  |SGL/|ODD |MSBF|X   |X   |X   |  |X|X|X|X|X|X|X|X|
  # |    |    |DIFF|SIGN|    |    |    |    |  | | | | | | | | |
  # +----+----+----+----+----+----+----+----+  +-+-+-+-+-+-+-+-+
  # SGL/DIFF: Single End = 1 / Differential = 0
  # ODD SIGN: CH0 = 0 / CH1 = 1
  #
  raw = spi.write [0x68, 0]
  printf("%02x %02x -> %d\n",
         raw[0], raw[1], (raw[0] * 256 + raw[1]) & 0x3FF)
end

実行結果は、
f:id:tarancho:20140216210923p:plain
正解は 1.1Vと2.2Vなので、合格点で良いかな。