プログラムと電子工作の置き場、たまにコラム

日々のスニペットやMaker's系のプログラムを置いてきます。

ADコンバーターとフォトレジスタを使って部屋の明るさを取得しよう。

Raspberry Piは残念ながらアナログ入力ピンが搭載されていないため、
各種アナログセンサーを使った電子工作の際に不便です。
それを解決するために、今回はADコンバーターをブレッドボード上に設置します。
その後、明るさを取得出来るセンサーを使って部屋の明るさを取得しましょう。
さらに、ネットワークを使って部屋が明るくなった、もしくは暗くなった場合にお知らせのEmailを携帯に送信したりというような機能も追加します。

特定の使い方を想定しているわけではないですが、例えばリビングなどで可動させておくと外出中でも、誰か帰ってきたのかな?とわかる。なんていう使い方もできますね。まぁ、条件が限られてしまうので実用的かどうかはさておきですが・・。

f:id:yuriai0001:20131222134201j:plain
f:id:yuriai0001:20150524180432p:plain
MCP3002は半月型の凹みの位置をよく確認してください。
CDSセルに極性はないため、どちらの足を使っても問題ありません。

ちょっと複雑な形になりました!
これで回路図は完了です。


<重要:2014年12月2日>
電子部品キットに含まれる内容物をフォトレジスターからフォトトランジスターに変更しています。フォトトランジスターの場合はこちらを参照してください。


どのような仕組なのかというと、
フォトレジスターは明るさに応じて抵抗値が変化します。
そこで、MCP3002のCH0で値を取得してDin,Doutなどのピンから通信をすることによって、その変化をRaspberryPiで取得できます。その後、人間にもわかるように画面に出力しようという計画です。

では、さっそく取り掛かるにあたって、デフォルトでOFFになってるシリアル通信を有効化しましょう。ターミナルを起動して
$ sudo leafpad /etc/modprobe.d/raspi-blacklist.conf
テキストエディタが起動したら
#blacklist spi-bcm2708
blacklist i2c-bcm2708
のように#を入れてコメントアウトします。保存して終了したらRaspberryPiを再起動してください。

OSを起動したら再度ターミナルで、
$ ls -la /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


前回と同じようにgemライブラリを使用します。
$ sudo gem install pi_piper
念のためgemがきちんとインストールされたか確認してみてください。
$ gem list
Local GEMSという一覧の中にpi_piper(1.3.2)があれば大丈夫です。

[Raspberry Pi2の場合]
$sudo raspi-config
を実行して変更できます。
8 Advanced OptionsからSPIを有効可して再起動してください。

f:id:yuriai0001:20150525084141p:plain
f:id:yuriai0001:20150525084152p:plain

pi_piperなのですが、bcm2835というRaspberry Piのライブラリーを使用しています。
Raspberry Pi2の場合は比較的新しいバージョンのbcm2835を使う必要があります。

レポジトリから直接gem installしてもpi_piperのlibbcm2835.imgが古いままなので動きません。
そこで、直接 githubからcloneしてbuildしてください。

$ git clone https://github.com/jwhitehorn/pi_piper
$ cd pi_piper
$ sudo gem build pi_piper.gemspec
$ sudo gem install pi_piper-2.0.beta.xx.gem
xxは最新のバージョンに対応した数字

今回のプログラムを保存するフォルダーを作りましょう
$ mkdir ruby_projects
では、LeafPadを起動してRubyのコードを作成していきましょう。

require 'pi_piper'
loop do
  value = 0
  PiPiper::Spi.begin do |spi|
    raw = spi.write [0b01101000,0]
    value = ((raw[0]<<8) + raw[1]) & 0x03FF
  end
  puts value
  sleep(1)
end

ライブラリーのおかげで、これだけです!
先ほど作ったフォルダにmcp3002.rbで保存しました。
ではターミナルを開きましょう。
$ cd ruby_project
$ sudo ruby mcp3002.rb
先ほどSPIを有効化しましたが、管理者でしか実行できないようにしてますので、sudoを入れて実行してください。条件にもよりますが、日中で蛍光灯を使ってる部屋なら700~800の値が1秒おきにターミナルに出力されると思います。プログラムを実行中にCDSセルを軽く手で覆うと数値が小さくなりますでしょうか。真っ暗な状態で0付近の値を取るのならば正しく稼働しています。

プログラムの中身の説明とEmailの送信は次の章で行いましょう。
Raspberry Piで計測したデータをEmailで送信する。 - Raspberry Pi 電子工作

ハック ラズベリーパイ Raspberry Pi2 スターターキット

ハック ラズベリーパイ Raspberry Pi2 スターターキット