2012/11/04からのアクセス回数 84537
ここからの例は、以下の資料を参考にしています。
RPi Low-level peripheralsによるとRaspberry Piのピン割り当ては、以下のようになっています。私の作成したmbed互換ライブラリのピン配置(MyIO)、GPIO、WiringPiのピン番号も合わせて示しています。
IOの制御の定番のLEDのオン・オフを試してみます。
最初に、3.3Vに接続してLEDが正常に点灯することを確認します。 抵抗は220Ωから1KΩの間と説明されていたので、手持ちの330Ωを使いました。
LEDの極性は、線の長い方がアノードになっています。
短いカソードを抵抗とつなげ、アノードに3.3V(IOピンの左上)を接続、青のグラウンド線をGND(IOピンの右上から3番目)に接続します。
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と同様に黄色のLEDも配置してみました。
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
LEDの制御ができたので、今度はI2C接続を試してみます。
I2Cデバイスとして、エレキジャックNo.8の付録に付いていたLM73という温度センサーを使います。
RaspberryPiからI2Cを使う例として、 Raspberry Pi I2C How-To ガイド に沿って動作を確認することにします。
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をブレッドボードにセットし、以下のように接続します。RaspberryPiの回路図を見るとI2Cデバイスとの接続時に必要なプルアップ抵抗がすでにセットされているのでI2Cデバイスとの接続に抵抗は不要です。
LM73のピン番号を1番から反時計回りに付けた場合、以下のようになります。
LM73のSCLをRaspberryPiの左上から3番目SCL(白線)、LM73のSDAをRaspberryPiの左上から2番目SDA(緑線)に接続します。
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のデータシートとも合致します。
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で確認しました。
以上、お詫びして訂正します。
皆様のご意見、ご希望をお待ちしております。