FrontPage

2012/11/04からのアクセス回数 83710

参考資料

ここからの例は、以下の資料を参考にしています。

IOピン配置

RPi Low-level peripheralsによるとRaspberry Piのピン割り当ては、以下のようになっています。私の作成したmbed互換ライブラリのピン配置(MyIO)、GPIO、WiringPiのピン番号も合わせて示しています。

My-Pin-Layout.jpg

LED制御

IOの制御の定番のLEDのオン・オフを試してみます。

ブレッドボードでの配置

最初に、3.3Vに接続してLEDが正常に点灯することを確認します。 抵抗は220Ωから1KΩの間と説明されていたので、手持ちの330Ωを使いました。

LEDの極性は、線の長い方がアノードになっています。

led2.jpeg

短いカソードを抵抗とつなげ、アノードに3.3V(IOピンの左上)を接続、青のグラウンド線をGND(IOピンの右上から3番目)に接続します。

LED-pin.png

WiringPiのインストール

RaspberryPiのIOを制御するためのライブラリWiringPiと制御コマンドgpioを Gordons Projects が公開しています。

LEDと抵抗の結線が正しくできていることが確認できたら、WiringPiのライブラリをインストールします。

最新のWiringPiは、gitを使っての配布に変わったので、git-coreをインストールします。

$ sudo apt-get install git-core

ソースを配置するディレクトリを作成し、そこにインストールします。

$ mkdir -p local/src
$ cd local/src/
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build

これで、インストールが完了したので、gpioを使ってLEDのOn/Offを制御してみましょう。

LEDのOn/Off

赤のLEDと同様に黄色のLEDも配置してみました。

LED-gpio.png

gpioコマンドを使って以下のように入力してみてください。赤と黄色のLEDが点灯します。

$ gpio -g mode 18 out
$ gpio -g write 18 1
$ gpio -g mode 23 out
$ gpio -g write 23 1

LEDを消灯するには、書き込み値を1から0に変更します。

$ gpio -g write 18 0
$ gpio -g write 23 0

I2C接続を試す

LEDの制御ができたので、今度はI2C接続を試してみます。

I2Cデバイスとして、エレキジャックNo.8の付録に付いていたLM73という温度センサーを使います。

RaspberryPiからI2Cを使う例として、 Raspberry Pi I2C How-To ガイド に沿って動作を確認することにします。

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

Raspbianでは、I2Cデバイス用モジュールがあるものの、初期設定では読み込 まれないようになっています。 そこで、以下のファイルを編集します。 /etc/modules に以下一行を追加

i2c-dev

/etc/modprobe.d/raspi-blacklist.conf のi2c-bcm2708の部分をコメントアウトします。

#blacklist i2c-bcm2708

設定を反映するために、rebootします。

$ sudo reboot

再起動が完了したら、I2Cモジュールが組み込まれたか確認します。

$ dmesg | grep i2c
[    4.597707] bcm2708_i2c bcm2708_i2c.0: BSC0 Controller at 0x20205000 (irq 79)
[    4.758162] bcm2708_i2c bcm2708_i2c.1: BSC1 Controller at 0x20804000 (irq 79)
[   12.827074] i2c /dev entries driver

のようにドライバーが組み込まれていることを確認します。

I2C用パッケージをインストールします。

$ sudo apt-get install i2c-tools

LM73との接続

LM73をブレッドボードにセットし、以下のように接続します。RaspberryPiの回路図を見るとI2Cデバイスとの接続時に必要なプルアップ抵抗がすでにセットされているのでI2Cデバイスとの接続に抵抗は不要です。

LM73-setting.png

LM73のピン番号を1番から反時計回りに付けた場合、以下のようになります。

LM73のSCLをRaspberryPiの左上から3番目SCL(白線)、LM73のSDAをRaspberryPiの左上から2番目SDA(緑線)に接続します。

LM73のI2Cアドレス

i2cdetectコマンドを使ってLM73のI2Cアドレスを確認します。

$ sudo i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- 4c -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --      

この結果から4CがLM73のI2Cアドレスであることが確認できました。この結果は、LM73のデータシートとも合致します。

LM73から温度を取り出す

i2c-toolを使って以下のスクリプトを実行します。*1

$ cat  <<\EOF >LM73.sh
#!/bin/bash

# set 14bit resolution
sudo i2cset -y 0 0x4c 0x04 0x60
sudo i2cset -y 0 0x4c 0x00 

hexraw=$(sudo i2cget -y 0 0x4C 0x00 w)
while [ "$hexraw" == "" ]
do
    hexraw=$(sudo i2cget -y 0 0x4C 0x00 w)
done

msb=$(echo ${hexraw:4:2})
lsb=$(echo ${hexraw:2:2})
dec=$(printf "%d\n" "0x$msb$lsb")

echo "scale=4; $dec*0.03125/4" | bc
EOF
$ chmod +x LM73.sh

LM73の実行には、bcコマンドが必要なので、以下のコマンドでbcをインストールします。

$ sudo apt-get install bc

LM73.shの実行結果は、以下のようになりました。

$ ./LM73.sh
13.4332

raspberrypi/mbed互換ライブラリの移植では、ここまで説明した処理をmbed互換ライブラリを移植してみました。是非ご覧下さい。

プログラムのミスについて

onusayさまより、補正の係数が0.125ではないかとのご指摘を頂き、プログラムを調査しました。

上記のプログラムに以下のチェックプリントを挿入しました。

echo $hexraw
echo $msb $lsb
echo $dec

この結果、以下の出力がありました。

0x940a
0a 9
169
10.5625

LM73には、14bitモード測定するように初期化しているので、0x940aの値は正しいのですが、 このmsb, lsbを取得する部分でバグがありました。

また、補正定数は、0.125ではなく、0.03125となり、さらに4で割った値が求める値となります。 データシートのTable 4. 14-bitで確認しました。

以上、お詫びして訂正します。

コメント

選択肢 投票
おもしろかった 140  
そうでもない 1  
わかりずらい 7  

皆様のご意見、ご希望をお待ちしております。


(Input image string)

*1 onusayさんのご指摘でプログラムを見直したところ誤りがありました。修正し、お詫びします

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc