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

2013年12月17日火曜日

Raspberry Piからメール送信

異常が生じたとか、センサに何か入力があったとか、Raspberry Piに何かさせて近くを離れるときにリモートでレスポンスが欲しいことがあります。方法はいろいろありますが、メールがシンプルな方法の一つでしょう。なのでコマンドラインからメールを送れるようにしてみます。

送信時にSMTPサーバが必要になるので、自分のアカウントでGmailのSMTPをリレーするようにします。

まずはMTA(メール転送エージェント)のインストール。Postfixとかqmailとかいろいろ選択肢がありますが、とりあえずここではEximを。
次にEximの設定を行っていきます。

General type of mail configuration:
mail sent by smarthost; received via SMTP or fetchmail
System mail name:
localhost
IP-addresses to listen for incoming SMTP connections:
127.0.0.1 ; ::1 (そのまま)
Other destinations for which mail is accepted:
(空白)
Machines to relay mail for:
(空白)
IP address or host name of the outgoing smarthost:
smtp.gmail.com::587
Hide local mail name in outgoiong mail?
<No>
Keep number of DNS-queries minimal (Dial-on-Demand)?
<No>
Delivery method for local mail:
mbox format in /var/mail/
Split configuration into small files?
<No>
Root and postmaaster mail recipient:
<Ok>

続いて、SMTPの認証情報をファイルに書き込みます。 内容は以下のとおり。使いたいGmailアカウントのアドレスとパスワードを書いておきます。
変更の適用。
mailコマンドを使うためmailutilsをインストール。
では送信テスト。
うまく設定できていれば、程なくして設定したGmailのアカウントからメールが送られてきます。

参考情報

debianサーバでメールを送る(exim4編)- ひゃまだのブログ

2013年12月1日日曜日

UDOOのArduino DueでLED点灯

i.MX6とArduino Dueが一体になったUDOOが家にやってきたわけですが、2つのパートがどのように連携できるか探るために、まずはAuruino DueでLチカから試してみたいと思います。一応、初めて使うことになるので、必要なツールのインストールとかも含めてメモっておきます。

UDOO上のArduino IDEを使ってみる

まずは点灯するLEDを接続しておきます。適当なLEDを持ってきて、アノード(長い方のリード)をGPIO13ピンに、カソード(短い方のリード)を隣のGNDに接続します。公式サイトのチュートリアルだと電流制限抵抗なしで繋いでますが、私は心配なので一応470Ωをはさんでおきました。

公式で配布しているLinaro Ubuntu 12.04 LTSのSDカードイメージを使っている場合、プリインストールされたArdiono IDEが利用可能です。起動するとデスクトップにアイコンがあるので、ダブルクリックして起動します。
gnome-screenshotをインストールするとスクリーンキャプチャできます
で、LED点灯のための下記コードを記述します。
VerifyしてUpload。とりあえずLEDの点灯を確認できるわけですが。

何でしょう、Arduino IDEでのコンパイル、めっちゃ重い!たったこれだけのコードなのに、1分くらいはかかってるように感じます。PCと比べると、組み込み向けのCortex-A9での使用感はこんなもんでしょうか。。さすがにこれだと作業性が悪いので、PCのArduino IDEから扱えるようにしたいと思います。

Arduino IDE 1.5 インストール & パッチ当て

まず、Arduino IDEは1.5以降のバージョンである必要があるそうです。ここから1.5.5 BETAをダウンロードします。インストーラを使うか、ZIP版を任意のフォルダに展開するかしてインストールしたら、次にパッチ当てをします。UDOOのArduino Dueパートを担うAtmel Sam3Xを書き換えるためにはERASE信号とRESET信号が必要なのですが、通常のArduinoボードと違ってUDOOにはこれが実装されていないらしく、Arduino IDEにパッチを当てることでこれに対応するそうです。環境に合わせて、ここにおいてあるパッチをダウンロードしてきて展開し、中身をArduino IDEのインストールディレクトリの所定の場所に上書きコピーします。Windowsであれば、<arduino-1.5.5のインストール場所>\hardware\tools\の下にbossac.exeを上書きコピー、同梱のcygwin1.dllも一緒にコピーします。

シリアルドライバのインストール

それから、UDOOのUSBコネクタ(CN6)にシリアル接続するためのPC側のドライバをインストールしておきます。ここからOSに合わせたZipファイルをダウンロードし、展開してインストーラを実行します。その上でPCとUDOOのCN6をマイクロUSBケーブルで接続すると、ドライバが自動インストールされ、COMポートとして認識されます。


コード記述、実行

PCにインストールしたArduino IDE 1.5.5で、コードを記述しVerify、Uploadします。このとき、USB接続したUARTのラインがi.MX6ではなくSAM3Xにつながるよう、J18のジャンパは外しておく必要があります。これでPCからもArduino Dueに書き込みできるはずですが、電源を切っても先ほどのプログラムがフラッシュに残っていて、再起動時にそのまま実行されるので、同じコードだと変化がわからないかも知れません。その場合はdigitalWrite()する値をLOWに変えるとか、コードを少し変えてみるといいです。私は、LED点滅するよう下記のコードで試しました。



参考情報

Getting started with Arduino-IDE on UDOO - udoo.org
Get the Arduino-IDE ready to program UDOO - udoo.org
UDOO programming the embedded Arduino microcontroller - elinux.org