BeagleBone Black のハードウェアハック(6)Hacking BeagleBone Black, part 6
2014 年 1 月 23 日
BeagleBone Blackのセンサ表示のコードをまとめる。
これまで作ってきたコードを組み合わせて、BeagleBone Blackに取り付けたLCDに時刻と温度、照度を表示するプログラムを作成しました。
工夫した点は次の通りです。
(1) AD変換のために使ったAdafruitのライブラリはpythonで書かれています。シェルスクリプトから制御しようとした場合、毎回pythonのスクリプトを呼び出すことになります。 このため、AD変換の機能もシェルスクリプトで記述しました。
(2) (1)に伴い、capeの初期化もシェルスクリプトに入れました。
(3) タイミングに依ってAD変換が失敗することがあったので、リトライするようにしました。
完成したコードは次の通りです。(/usr/local/bin/i2c-time-and-temp.sh)
#!/bin/bash unset TERM i2cset=/usr/local/sbin/i2cset bus=1 chip=0x3e LANG=C #initialize cape if ! grep -q cape-bone-iio /sys/devices/bone_capemgr.9/slots ; then echo cape-bone-iio > /sys/devices/bone_capemgr.9/slots ; sleep 1; fi porttmp=`find /sys -name \*AIN1\* -print` portcds=`find /sys -name \*AIN3\* -print` # initialize LCD display $i2cset -y $bus $chip 0 0x38 0x39 0x14 0x7f 0x5f 0x6c i sleep 0.5 $i2cset -y $bus $chip 0 0x38 0x0d 0x01 i sleep 0.5 while true ; do msg1=`date +"%X" | perl -pe '$_=join" ",map{ord }split//'` while true ; do temp=`cat $porttmp 2>&1 /dev/null ` if [ $? -eq 0 ]; then break; fi done while true ; do light=`cat $portcds 2>&1 /dev/null` if [ $? -eq 0 ]; then break; fi done ttmp=`echo "( $temp.0 - 500.0) * 0.1" | bc` light1=`echo " $light / 18" | bc` msg2=`echo $ttmp $light1\% | perl -pe '$_=join" ",map{ord }split//'` # echo $msg2 $i2cset -y $bus $chip 0 0x01 $i2cset -y $bus $chip 0x40 $msg1 i $i2cset -y $bus $chip 0 0xc0 i $i2cset -y $bus $chip 0x40 $msg2 i sleep 1 done
起動時にこのスクリプトをバックグラウンドで動かすようにします。
/lib/systemd/system/lcd.serviceの設定
[Unit] Description=LCD Display [Service] Type=simple ExecStart=/usr/local/bin/i2c-time-and-temp.sh [Install] WantedBy=multi-user.target
サービスの登録
# ln -s /lib/systemd/system/lcd.service /etc/systemd/system # systemctl daemon-reload # systemctl start lcd.service # systemctl enable lcd.service
カテゴリー: BeagleBone, Physical Computing