Fri 02/03, 2012

BeagleBone で I2C センサを使う [Electronics ]

BeagleBone_I2CUsing the beaglebone as a weatherstation [Koen's blog] 辺りを参考に I2C 温度センサデバイス LM73 を I2C2 につないでみた。

まず、何も接続していない状態で i2c2detect コマンドを使って I2C2 バスの状態を見ると、このようにタイムアウトエラーになる。
# i2cdetect -r -y 3
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          [   98.424914] omap_i2c omap_i2c.3: controller timed out
-- [   99.424914] omap_i2c omap_i2c.3: controller timed out
-- [  100.424911] omap_i2c omap_i2c.3: controller timed out
-- [  101.424916] omap_i2c omap_i2c.3: controller timed out
-- [  102.424908] omap_i2c omap_i2c.3: controller timed out
^C 
#
これはポートを pull-up すべきところが pull-down されているためであるらしい。mux をみると 0x63 であるから、なるほど pull-down になっている。MODE は 3 で I2C2 が選択されている。
# cat /sys/kernel/debug/omap_mux/uart1_rtsn
name: uart1_rtsn.i2c2_scl (0x44e1097c/0x97c = 0x0063), b NA, t NA
mode: OMAP_PIN_OUTPUT | OMAP_MUX_MODE3
signals: uart1_rtsn | NA | d_can0_rx | i2c2_scl | spi1_cs1 | NA | NA | NA
# cat /sys/kernel/debug/omap_mux/uart1_ctsn
name: uart1_ctsn.i2c2_sda (0x44e10978/0x978 = 0x0063), b NA, t NA
mode: OMAP_PIN_OUTPUT | OMAP_MUX_MODE3
signals: uart1_ctsn | NA | d_can0_tx | i2c2_sda | spi1_cs0 | NA | NA | NA
#
で、これを pull-up とするには 0x73 とすれば良い。
# echo 0x73 > /sys/kernel/debug/omap_mux/uart1_rtsn
# cat /sys/kernel/debug/omap_mux/uart1_rtsn
name: uart1_rtsn.i2c2_scl (0x44e1097c/0x97c = 0x0073), b NA, t NA
mode: OMAP_PIN_OUTPUT | OMAP_MUX_MODE3
signals: uart1_rtsn | NA | d_can0_rx | i2c2_scl | spi1_cs1 | NA | NA | NA
# echo 0x73 > /sys/kernel/debug/omap_mux/uart1_ctsn
# cat /sys/kernel/debug/omap_mux/uart1_ctsn
name: uart1_ctsn.i2c2_sda (0x44e10978/0x978 = 0x0073), b NA, t NA
mode: OMAP_PIN_OUTPUT | OMAP_MUX_MODE3
signals: uart1_ctsn | NA | d_can0_tx | i2c2_sda | spi1_cs0 | NA | NA | NA 
#
こうしておいて再度バスの様子を見る。
#  i2cdetect -r -y 3
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
#
ここに LM73 (スレーブアドレス 100100=0x48)をつなぐと(p9-19:I2C2_SCL, P9-20:SDA)、このようになる。
# i2cdetect -r -y 3
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
#
そして Linux カーネルに対し、アドレス 0x48 に LM73 が接続されたことを指示する(How to instantiate I2C devices)。I2C2 は Linux で i2c-3 に割り当てられている。
# echo lm73 0x48 > /sys/class/i2c-adapter/i2c-3/new_device
# 
確認。このようにできるのは LM73 用のドライバーモジュールが用意されているためである。この後で i2cdetect を実行すると '48' の部分が 'UU' になっている。
# dmesg | grep -i lm73
[ 2264.522285] i2c i2c-3: new_device: Instantiated device lm73 at 0x48
[ 2264.548761] lm73 3-0048: hwmon0: sensor 'lm73'
#
でもって、センサの出力値を取ってみる。
# cat /sys/bus/i2c/drivers/lm73/3-0048/temp1_input
25500
# 
これを 1/1000 すると摂氏での温度となる。25.5 度と実際より多少高い値になっているようだが、まあ良しとしておこう。

2012.02.04 追記
BeagleBone + Processing.js参考ページには Node.js と Processing.js によるアプリケーションが紹介されていたので、これを LM73 用に修正してみたのがこれ。元々は "Weather Station" として気圧計+温度計であったものを気圧計部分を削除し、温度計の設定を LM73 に合わせただけ。npm install socket.io が必要。気圧計部分を削除しないと初回の動作はするがエラーでサーバが停止してしまう。
# cat weatherstation/bmp085-pressure.js
exports.tempConfig = {
    file: "/sys/bus/i2c/drivers/lm73/3-0048/temp1_input", // "/sys/bus/i2c/drivers/bmp085/3-0077/temp0_input",
    unit: "° C",
    delay: 2000,
    scale: 1000, // 10,
    rangeHigh: 40,
    rangeLow: -20,
};
#
Posted by masato at 10:27 PM
このエントリーのトラックバックURL: http://bird.dip.jp/cgi-bin/mt/mt-tb.cgi/1821
コメントする

おそらく携帯電話等からは投稿できません。日本語文字列を含まないコメントやトラックバック、および当サイトへの言及を含まないトラックバックは御遠慮いただいております。また、90日以上経過した記事へのコメントはできません。










名前、アドレスを登録しますか?