2013年12月21日土曜日

気温をつぶやくRaspberry Pi

今回は
  • I2C温度センサで室温測定
  • コマンドラインTwitterクライアントでつぶやく
の合わせ技を試してみました。
RPiが30分おきに室温をつぶやいてくれる一種のbotのようなものですな。

I2C温度センサモジュールADT7410の接続

アナログデバイセズのI2C温度センサIC「ADT7410」を搭載したセンサモジュールがいつものオシャレ雑貨店もとい秋月電子で1個500円(http://akizukidenshi.com/catalog/g/gM-06675/)で手に入ります。こいつをRaspberry Piのピンヘッダ(P1)へ下記のように接続します。
  • ピン3 - SDA
  • ピン4 - VDD
  • ピン5 - SCL
  • ピン6 - GND
ピンソケットを2x2に並べて、気合の空中配線。



RaspbianでI2Cを使えるようにする

ハードワーク(いろんな意味で)はここまでです。ソフトの方をいじっていきましょう。
まずOSのRaspbianで、I2Cドライバがデフォルトでブラックリストに入っているため、これを解除しておきます。
エディタでblacklistファイルを開き、
$ sudo vim /etc/modprobe.d/raspi-blacklist.conf
下記の行をコメントアウト。
# blacklist i2c-bcm2708
次にロードするカーネルモジュールにI2Cドライバを追加。
$ sudo vim /etc/modules
末尾に下記の行を追加。
i2c-dev
それから、I2C使用のパーミッションを与えるため、ユーザをi2cグループに追加します。
$ sudo gpasswd -a pi i2c
これで下回りの準備はOK。

i2c-toolsのインストールと温度の取得

コマンドでI2C温度センサの値を取得できるようにします。i2c-toolsをインストール。
$ sudo apt-get install i2c-tools
これで、i2cgetコマンドでセンサ値を読み出せるようになります。
$ i2cget -y 1 0x48 0x00 w
0xe80d
が、エンディアンが逆転して出てくるので、上位バイトと下位バイトを入れ替えて読む必要があります。その上で、初期設定の解像度13ビットで読んでいる場合、下位3ビットは捨て、4ビット目から16ビット目(すなわち[15:3])が有効な値として扱えます。このうちMSBが符号で、1なら零下の気温をあらわします。MSBを除いた12bitで、1階調あたり0.0625℃の解像度で温度の値が示されます。
たとえば上記の0xe80d場合、まずエンディアン入れ替えで0x0de8となり、これを下位3ビット捨てて(つまり8で割って)0x1BD、10進数に直して445、解像度の0.0625℃をかけて、27.8125℃となります。

コマンドラインTwitterクライアント「TTYtter」のインストール

さて、ただの温度計ではつまらないので、計測された室温を全世界に向けて盛大につぶやいていただきましょう。自動でTwitterへ投稿させるため、コマンドラインのTwitterクライアント「TTYtter」を使用します。
まずはダウンロードとインストール。Perlスクリプトなのでビルドはしません。chmodで実行パーミッションだけ与えておきます。
$ wget http://www.floodgap.com/software/ttytter/dist2/2.1.00.txt
$ sudo mv 2.1.00.txt /usr/local/bin/ttytter
$ sudo chmod +x /usr/local/bin/ttytter
初回の実行でOAuthのためのPINコード入力を求められます。次のように表示されたら、とりあえずENTERを押し、
$ ttytter
(中略)
** This wizard will overwrite /home/pi/.ttytterkey
Press RETURN/ENTER to continue or CTRL-C NOW! to abort.
つづいて下記リストの中ほどにあるような、ランダムトークンをクエリに含むURLが表示されるので、これをブラウザで開きます。
Request from http://api.twitter.com/oauth/request_token ... SUCCEEDED!

1. Visit, in your browser, ALL ON ONE LINE,

https://api.twitter.com/oauth/authorize?oauth_token=<ランダムトークン>

2. If you are not already signed in, fill in your username and password.

3. Verify that TTYtter is the requesting application, and that its permissions
are as you expect (read your timeline, see who you follow and follow new
people, update your profile, post tweets on your behalf and access your
direct messages). IF THIS IS NOT CORRECT, PRESS CTRL-C NOW!

4. Click Authorize app.

5. A PIN will appear. Enter it below.

Enter PIN>
Twitterにログインしていれば、下の画像のようなページにPINコード(複数桁の数字)が表示されます。このPINコードをコマンドラインに入力しENTERを押します。



これでTTYtterでTwitterを利用できるようになります。試しに普通のツイートをしてみます。
$ ttytter -status="Hello, TTYtter"
trying to find cURL ... /usr/bin/curl
test-login SUCCEEDED!
post attempt SUCCEEDED!
タイムラインに表示されればOK。


気温を取得するスクリプトの作成、TTYtterとの連携

TTYtterに流すため、温度の取得、エンディアンの入れ替え、摂氏への換算をワンストップで処理するスクリプトを作成します。さっきのi2cgetコマンドをpopenで実行したあと、ちょこちょこ処理して数字を標準出力させます。
$ vim temperature.py
#!/usr/bin/env python
import os
import re

hex_temp = os.popen("/usr/sbin/i2cget -y 1 0x48 0x00 w").read()
hex_temp = hex_temp[4:6] + hex_temp[2:4]

print int(int(hex_temp, 16) / 8 * 0.0625)
とりあえず零下には未対応。屋内仕様なのでね。そんな部屋いたら死んでまう。あと小数点以下は切り捨て。
スクリプト内ではi2cgetコマンドはフルパスで書いておきます。これをしないと、後でcrontabに登録したときになぜかうまく実行できないってなことになります。
で、パーミッションを実行可能に。
$ chmod +x temperature.py
実行してみます。
$ ./temperature.py
27
できたかな。これをTTYtterに食わせると
$ ttytter -status="$(/home/pi/temperature.py) ($(date +\%R))"
世界中のフォロワーたち(総勢0名)が我が城の室温を知るわけです。クールだぜ。
ttytterコマンドの引数-statusとしてtemperature.pyスクリプトの出力が入るように指定します。dateコマンドで時刻も併せて入れておくといいでしょう。


crontabによる定期実行

一回つぶやいただけだと見逃してしまううっかりなフォロワーさんもいらっしゃると思うので、30分おきに最新の気温を測定してツイートします。さながらデータロガーといったところ。
$ crontab -e
0,30 * * * * /usr/local/bin/ttytter -status="$(/home/pi/temperature.py) ($(date +\%R))" -silent
ttytterの-silentオプションは、インタラクティブなコマンドラインのTwitterクライアントとしての使用をせず、今回のようにスクリプト等で実行させる場合のために、標準出力を無効にします。


参考情報

TTYtter for Perl - Floodgap Software
I2C and Raspbian wheezy - AB Electronics UK

0 件のコメント:

コメントを投稿