2013/08/29

BeagleBoneでI2C液晶を使ってみる

BeagleBoneに温度センサーをつけて温度のログを取るものは作りましたが、現在の温度をリアルタイムで見たいので、何かしら表示器をつけようと思いました。

BeagleBoneにはGPIOがたくさんあるので7セグLEDを駆動しても良いのですが、せっかくI2Cの機能を持っているので、これを使うことにしました。

I2Cはひとつのマスタと複数のスレーブをバスにつなげることができる2線式の通信規格です。
マイコンが使用するポートを減らすために作られたとのこと。

  I2Cの使い方
  I2C@wikpedia

さて、I2Cを利用するにもI2C対応の表示機が無いと実験すら出来ないので、秋月電子でI2C液晶キットを買いました。
I2C接続小型LCDモジュールピッチ変換キット 600円なり。
送料が500円かかるため、この際なので表面実装LED等、他にも部品を買いました。

無印BeagleBone1号機は温度計として運用しているので、2号機にubuntu13.04を載せてI2Cの実験をします。

2号機には2013-08-24のイメージを使用しました。
イメージの取得と書き込み方法については下記ページを参照ください。
 BeagleBoardUbuntu@eLinux.org

Kernel3.8のBeagleBoneはCapeManagerを使用してCapeを積んでいく方式となっているため
仮想Capeファイルが必要になります。I2CのCapeファイルを自作するほどの技量はないので、ファームウェアディレクトリにI2Cがないか探します。

 ubuntu@arm:cd /lib/firmware
 ubuntu@arm:/lib/firmware$ ls | grep -i I2C
 BB-I2C1-00A0.dtbo
 BB-I2C1A1-00A0.dtbo

2個出てきました。

どのピンを使っているのか、dtboファイルをソースに変換して確認します。

 sudo apt-get install device-tree-compiler
 dtc -I dtb -O dts -o BB-I2C1.dts BB-I2C1-00A0.dtbo
 dtc -I dtb -O dts -o BB-I2C1A1.dts BB-I2C1A1-00A0.dtbo

その結果、BB-I2C1-00A0はP9_17,P9_18のMux Mode2、BB-I2C1A1-00A0はP9_24とP9_26のMux Mode3を使うことがわかりました。どちらもI2C1を使うので、同時に登録しないほうが良さそうです。

Capeがあるとわかれば早速CapeManagerに登録します。CapeManagerの番号は環境によって異なるので適宜読み替えてください。

 sudo -s
 cd /sys/devices/bone_capemgr.7
 echo BB-I2C1 > slots

登録できてるか確認します。
 dmesg | grep capemgr
 bone-capemgr bone_capemgr.7:  Baseboard:A335BONE,00A5,0512BB000366'
 bone-capemgr bone_capemgr.7: compatible-baseboard=ti,beaglebone
 bone-capemgr bone_capemgr.7: slot #0: No cape found
 bone-capemgr bone_capemgr.7: slot #1: No cape found
 bone-capemgr bone_capemgr.7: slot #2: No cape found
 bone-capemgr bone_capemgr.7: slot #3: No cape found
 bone-capemgr bone_capemgr.7: initialized OK.
 bone-capemgr bone_capemgr.7: part_number 'BB-I2C1', version 'N/A'
 bone-capemgr bone_capemgr.7: slot #4: generic override
 bone-capemgr bone_capemgr.7: bone: Using override eeprom data at slot 4
 bone-capemgr bone_capemgr.7: slot #4: 'Override Board  Name,00A0,Override Manuf,BB-I2C1'
 bone-capemgr bone_capemgr.7: slot #4: Requesting part number/version based 'BB-I2C1-00A0.dtbo
 bone-capemgr bone_capemgr.7: slot #4: Requesting firmware 'BB-I2C1-00A0.dtbo' for board-name 'Override Board Name', version '00A0'
 bone-capemgr bone_capemgr.7: slot #4: dtbo 'BB-I2C1-00A0.dtbo' loaded; converting to live tree
 bone-capemgr bone_capemgr.7: slot #4: #2 overlays
 bone-capemgr bone_capemgr.7: slot #4: Applied #2 overlays.

登録できているみたいですね。

早速BeagleBoneのP9_17,P9_18にI2C液晶をつないで実験してみましょう。
下記ページを参考にやっていきます。


まずはI2Cバスがいくつあるか確認します。

 sudo -s
 i2cdetect -l
 i2c-0 i2c     OMAP I2C adapter  I2C adapter
 i2c-1 i2c     OMAP I2C adapter  I2C adapter
 i2c-2 i2c     OMAP I2C adapter  I2C adapter

0から2まであります。全部スキャンしてしまいましょう

 root@arm:~# i2cdetect -y -r 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
 00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 20: -- -- -- -- UU -- -- -- -- -- -- -- -- -- -- -- 
 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 70: -- -- -- -- -- -- -- -- 

ハズレ。

 root@arm:~# i2cdetect -y -r 1
      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
 00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 50: -- -- -- -- UU UU UU UU -- -- -- -- -- -- -- -- 
 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 70: -- -- -- -- -- -- -- --  

これまたハズレ。
man i2cdetectによると、UUはカーネルドライバーで使用されてるアドレス、--は応答がなかったアドレスとのことです。

 root@arm:~# i2cdetect -y -r 2
      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
 00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e -- 
 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 70: -- -- -- -- -- -- -- --                         

いた!

バス番号が2、アドレスが0x3eであることがわかりました。

コマンドを打っていきます。

 i2cset -y 2 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
 i2cset -y 2 0x3e 0 0x38 0x0d 0x01 i
 i2cset -y 2 0x3e 0x40 0x53 0x57 0x49 0x54 0x43 0x48 i
 i2cset -y 2 0x3e 0x00 0xc0 i 
 i2cset -y 2 0x3e 0x40 0x53 0x43 0x49 0x45 0x4e 0x43 0x45 i

表示できた
無事、文字が出ました。
文字は出ましたが、あの命令は何なのでしょうか?

i2csetのオプションをまずは見てみます。

 i2cset [-f] [-y] [-m MASK] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]

これを元に解釈すると、最初の -y 2 0x3eは「I2Cバスの2番、アドレス0x3eにユーザの確認なしで書き込む」という意味になります。(-yはインタラクティブモードをOffにするオプション)
最後の i は「I2Cブロックデータを書き込む」となります。
データアドレスの部分は0x00と0x40になっていますが、これはコントロールバイトで、データシートによると、コントロールバイトは
 [CO][RS][0][0] [0][0][0][0]
で構成されており、RSが1の場合はデータ書き込み、RSが0の時は制御コマンド書き込みになるようです。0x00は制御コマンド、0x40はデータ書き込みという事になります。COはよくわかりません。

データシートの初期設定方法を見ると、
  1. 電源をONにする
  2. 40ms以上待つ
  3. 0x38を送って通常コマンドにする
  4. 0x39を送って拡張コマンドにする
  5. 0x14を送って内部オシレータの周波数を設定する(?)
  6. 0x70を送ってコントラストを決める
  7. 0x56を送ってアイコンなどのコントラストを決める
  8. 0x6cを送ってフォロワーコントロールを設定する(?)
  9. 200ms以上待つ
  10. 0x38を送って通常コマンドにする
  11. 0x0Cを送ってディスプレイのON/OFFを設定する
  12. 0x01を送ってディスプレイをクリアする
  13. 初期化終了
となっています。最初の2行がこれにあたりますね。

3行目はASCIIコードで"SWITCH"
4行目がDDRAMのアドレスを0x40に変更(つまり2行目の一番最初)に移動
5行目がACSIIコードで"SCIENCE"

となります。

表示はできるようになりましたが、ACSIIコードを指定するのは面倒なので
pythonでこのLCD用のライブラリを作ってみたいと思います。
あとはこの液晶のコマンドについても調べたいところです。


ではまた。

2013/08/22

BeagleBoneでネットワーク対応型温度ロガーを作る

朝、汗びっしょりで起きるので夜中の室温は何度ぐらいになってるの?と疑問に思ってから約1ヶ月、ようやくネットワーク対応温度ロガーが出来上がりました。

機能
  • 5分おきに温度ログを取り、テキストに保存します
  • ログは1日ごとに1ファイルになります
  • 1日ごとに温度の遷移グラフを作ります
  • Webページで直近3日のグラフを見ることができます


LANケーブルとACアダプタを取り付けて常時運転させ、cronで5分おきに温度ログを取得しています。

出来上がったグラフを見てみると、夜中は室温が1度〜2度ほど上昇しているのがわかります。
意外と上がってないようですね。
34度を指しているセンサーも2つありますが、これはセンサー固有の誤差と思います。
本来であれば25度の部屋などにセンサーをおいて、25度を指すようにオフセットを求めてやる必要があると思いますが、今回は推移が見たかったのでそのまま使っています。




apacheの公開ディレクトリにphpのスクリプト等を置いているので、Webブラウザを積んでる端末であれば家のどこからでも温度を確認できるようになりました。
Kindleでもみれます



今回使用した部品
  • 無印BeagleBone( BeagleBone Blackでも動くはず)
  • 温度センサー LM35DZ 6個
  • 1kΩの抵抗 6個(LM35DZの出力とGND間に設置してます)
  • ACアダプタ

今回作ったコード一式はgithubにあげてあります。
  BBTempSensor@github

現時点ではBeagleBone周りの温度しか測れませんが、屋外の気温や特定のモノ(鉢植えの中等)の温度も測れるようにするために、XBeeとも組み合わせてみようかと思います。

自分で作らなければならないのが大変ですが、自分が満足するものを好きなように作れるのがDIYのいいところですね。

ではまた。


2013/08/16

BeagleBoneで温度ロガー 気温のログをグラフで表示する

前回まででBeagleBone(無印)に温度センサーを接続してA/D変換して取り込み、
時刻付きで温度のログファイル(CSV形式)を取ることができるようになりました。

さすがにCSVの中身を毎回見るのは面倒なので、グラフにして温度の推移を表示することにします。

ブラウザ経由でどのPCからも見れるようにするため、phpのグラフライブラリを探し、pChartを使うことにしました。

まずはBeagleBoneにphpとその他ライブラリをインストールします。
  sudo apt-get update
  sudo apt-get install php5 libapache2-mod-php5 php5-gd


そのあとpChartをインストールします。
pChart-download

あとはサンプルコードとドキュメントをもとにグラフを書きます。

部屋の温度。
センサーごとにばらつきがあるようですが、だいたい29度ぐらいで推移していることがわかります。

今はページを表示するたびにグラフを作成しているので表示まで10秒程度かかりますが、ひとまずグラフが書けるようになったので、色々と調整して温度ロガーシステムを作り上げたいと思います。



2013/08/12

BeagleBone Black 秋月電子でも取り扱い開始!

久しぶりに秋月電子のWebショップを覗いていたら、Beagle Bone Blackの取り扱いが始まっているではありませんか。 8月8日から販売されているようですね。

というわけで夏休みのついでにBeagleBone Blackを使いはじめたい人向けの部品リストを作ってみました。

BeagleBone Black    \4,980
http://akizukidenshi.com/catalog/g/gM-06867/

プラスチックナット+連結(6角ジョイント)スペーサー(10mm)セット \100
(BeagleBoneの足として利用できます)
http://akizukidenshi.com/catalog/g/gP-01864/

FTDI USBシリアルケーブル 3.3V   \1,340
(BeagleBone Blackに直接シリアル接続できます)
http://akizukidenshi.com/catalog/g/gM-05840/

ブレッドボード・ジャンパーワイヤ15cm各色 \300
http://akizukidenshi.com/catalog/g/gP-02935/ (青)
http://akizukidenshi.com/catalog/g/gP-02932/ (赤)
http://akizukidenshi.com/catalog/g/gP-02933/ (黒)

ブレッドボードEIC-102BJ ジャンパピン付き  \700
http://akizukidenshi.com/catalog/g/gP-00285/

超小型スイッチングACアダプター5V2A \600
(BeagleBoneBlack 単独で動かす場合は必要です)

超高輝度3mm赤色LED \180
http://akizukidenshi.com/catalog/g/gI-04767/

タクトスイッチ 100個セット \700
(ブレッドボードに若干挿しづらいです)
http://akizukidenshi.com/catalog/g/gP-01282/

高精度IC温度センサ LM35DZ \100
http://akizukidenshi.com/catalog/g/gI-00116/

CDSセル 20mm
(明るさで抵抗値が変わる明るさセンサ)
http://akizukidenshi.com/catalog/g/gI-00248/

シャープ測距モジュール ¥800
(距離センサー)
http://akizukidenshi.com/catalog/g/gI-03158/

その他 Amazonで買える便利部品たち。






その他(2)
シリアル通信で表示できる2.4インチカラー液晶ディスプレイ
http://www.ddlab.jp/shop/edisp/index.cgi


とまぁ思いつくところはこんな感じです。


お盆は普通どおり勤務なので工作する時間はあまりありませんが、
寝ている時に部屋が熱いので温度ロガーを作り、何度まで到達しているか確認してみたいと思います。
pythonで温度のログをとり、phpのグラフライブラリを使って温度グラフを作成し、スマートフォンやタブレットから見れるように出来ればいいかな〜と考えてます。

ではまた。