[[FrontPage]]

#contents

2012/11/04からのアクセス回数 &counter;

** 参考資料 [#h43dfbb1]
ここからの例は、以下の資料を参考にしています。
- Raspberry Pi - A Quick-Start Guide
- [[Raspberry Pi I2C How-To ガイド>http://www.gvc-on.net/?p=288]]

*** IOピン配置 [#s39d01c6]
[[RPi Low-level peripherals>http://elinux.org/RPi_Low-level_peripherals]]によるとRaspberry Piのピン割り当ては、以下のようになっています。私の作成したmbed互換ライブラリのピン配置(MyIO)、GPIO、WiringPiのピン番号も合わせて示しています。

&ref(My-Pin-Layout.jpg);

** LED制御 [#dce587ec]
IOの制御の定番のLEDのオン・オフを試してみます。

*** ブレッドボードでの配置 [#d3f3db64]
最初に、3.3Vに接続してLEDが正常に点灯することを確認します。
抵抗は220Ωから1KΩの間と説明されていたので、手持ちの330Ωを使いました。

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

&ref(led2.jpeg);

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

&ref(LED-pin.png);

*** WiringPiのインストール [#n61c0a6f]
RaspberryPiのIOを制御するためのライブラリWiringPiと制御コマンドgpioを
[[Gordons Projects>https://projects.drogon.net/raspberry-pi/wiringpi/]]
が公開しています。

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

最新のWiringPiは、gitを使っての配布に変わったので、git-coreをインストールします。
#pre{{
$ sudo apt-get install git-core
}}

ソースを配置するディレクトリを作成し、そこにインストールします。
#pre{{
$ mkdir -p local/src
$ cd local/src/
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build
}}

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

*** LEDのOn/Off [#k23fa0ca]
赤のLEDと同様に黄色のLEDも配置してみました。

&ref(LED-gpio.png);

- ブレッドボードのGND(黒の線)をPI-02の上から3番目のGroundに接続
- 赤のLED(緑の線)をPI-02の上から6番目のGPIO18に接続
- 黄色のLED(白の線)をPI-02の上から8番目のGPIO23に接続

gpioコマンドを使って以下のように入力してみてください。赤と黄色のLEDが点灯します。
#pre{{
$ gpio -g mode 18 out
$ gpio -g write 18 1
$ gpio -g mode 23 out
$ gpio -g write 23 1
}}

- 1行目は、GPIO18のモードを出力にセット
- 2行目は、GPIO18に1を書き込み(セット)
- 1行目は、GPIO23のモードを出力にセット
- 2行目は、GPIO23に1を書き込み(セット)

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

#pre{{
$ gpio -g write 18 0
$ gpio -g write 23 0
}}

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

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

RaspberryPiからI2Cを使う例として、
[[Raspberry Pi I2C How-To ガイド>http://www.gvc-on.net/?p=288]]
に沿って動作を確認することにします。

*** RaspberryPiでI2Cを使えるようにする [#f82dc47c]
Raspbianでは、I2Cデバイス用モジュールがあるものの、初期設定では読み込
まれないようになっています。
そこで、以下のファイルを編集します。
/etc/modules に以下一行を追加
#pre{{
i2c-dev
}}

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

設定を反映するために、rebootします。
#pre{{
$ sudo reboot
}}

再起動が完了したら、I2Cモジュールが組み込まれたか確認します。
#pre{{
$ 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用パッケージをインストールします。
#pre{{
$ sudo apt-get install i2c-tools
}}


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

&ref(LM73-setting.png);

LM73のピン番号を1番から反時計回りに付けた場合、以下のようになります。
- GNDは、2番
- VDDは、3番
- SCLは、4番
- SDAは、6番

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

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

#pre{{
$ 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から温度を取り出す [#me119003]
i2c-toolを使って以下のスクリプトを実行します。((onusayさんのご指摘でプログラムを見直したところ誤りがありました。修正し、お詫びします))

#pre{{
$ 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をインストールします。

#pre{{
$ sudo apt-get install bc
}}

LM73.shの実行結果は、以下のようになりました。
#pre{{
$ ./LM73.sh
13.4332
}}

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

*** プログラムのミスについて [#ne20c1d6]
onusayさまより、補正の係数が0.125ではないかとのご指摘を頂き、プログラムを調査しました。

上記のプログラムに以下のチェックプリントを挿入しました。
#pre{{
echo $hexraw
echo $msb $lsb
echo $dec
}}
この結果、以下の出力がありました。
#pre{{
0x940a
0a 9
169
10.5625
}}

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

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

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

** コメント [#rc1f1933]
#vote(おもしろかった[163],そうでもない[2],わかりずらい[7])
#vote(おもしろかった[164],そうでもない[2],わかりずらい[7])

皆様のご意見、ご希望をお待ちしております。
- 0.0781っておかしくないですか -- [[onusay]] &new{2013-03-27 (水) 23:30:15};
- この部分は、上記のサイトの例をそのまま使い、接続確認的なところがあります。計算された値も温度計と比べるとちょっとずれていました。申し訳ありません。mbedライブラリの値は温度計と近い値となっていました。 -- [[竹本 浩]] &new{2013-03-28 (木) 20:19:40};
- LM73の仕様書をみると0.125になりませんか? -- [[onusay]] &new{2013-03-30 (土) 22:06:13};
- 確かにダブルミスをしておりました。修正し、補足説明を追加しました。 -- [[竹本 浩]] &new{2013-03-31 (日) 09:33:51};
- LEDのON/OFF を参考にして、Mathematica で制御できました。http://mmays.hatenablog.com/entry/2014/02/08/224413 -- [[ysato]] &new{2014-02-08 (土) 23:00:03};
- 「エレキジャックNo.8の付録に付いていたLM73という温度センサー」を購入する方法を教えてください。google で検索したがわかりません。よろしくお願いします。 -- [[ysato]] &new{2014-02-10 (月) 15:11:37};
- LM73 温度センサーを手に入れることができた。「エレキジャックNo.8」の中古本(付録未開封)をamazonで購入できた。 -- [[ysato]] &new{2014-02-13 (木) 11:22:56};
- ysatoさん、よかったですね。もっと入手のよいもので試して見ます。 -- [[竹本 浩]] &new{2014-02-13 (木) 12:21:49};
- IOピン配置の図ですが、GPIO21(PCM_DOUT)ってありますが、21ではなく27の間違いではないですか?  -- [[marimo]] &new{2014-02-21 (金) 14:20:11};
- LM73による温度測定をMathematicaを使ってプロットできました。http://mmays.hatenablog.com/entry/2014/02/22/173634 -- [[ysato]] &new{2014-02-22 (土) 17:48:42};
- Vernier温度センサーによる温度測定をMathematicaでプロットできました。http://mmays.hatenablog.com/entry/2014/02/25/132227 -- [[ysato]] &new{2014-02-25 (火) 13:33:00};
- Mathematicaと外部センサーの連携成功おめでとうございます。 -- [[竹本 浩]] &new{2014-02-25 (火) 16:44:05};
- 測定した温度データを Dropbox にアップロードできました。http://mmays.hatenablog.com/entry/2014/03/03/125919 -- [[ysato]] &new{2014-03-03 (月) 13:02:16};
- 温度センサーLM73 と Vernier の測定データを比較した。温度差0.5℃ で一致した。http://mmays.hatenablog.com/entry/2014/03/05/121258 -- [[ysato]] &new{2014-03-05 (水) 12:21:39};
- すごい、それはLM73は精度がよいとことの証明ですね! -- [[竹本 浩]] &new{2014-03-05 (水) 16:16:03};
- marimoさんへ、私も同じ疑問を持ってました。2種類のpin位置(revision 1 and 2)があることを知りました。このWeb に書いてあります。http://www.doctormonk.com/2013/02/raspberry-pi-and-breadboard-raspberry.html -- [[ysato ]] &new{2014-04-12 (土) 10:45:42};
- ysatoさま、フォロー頂きましてありがとうございます。今後ともよろしくお願いします。 -- [[竹本 浩]] &new{2014-04-12 (土) 21:50:45};
- このページのアクセス数が3万回を越えているのに驚きました。 -- [[ysato]] &new{2014-10-25 (土) 23:23:53};
- ysatoさま、お知らせ頂きましてありがとうございます。これは嬉しい! -- [[竹本 浩]] &new{2014-10-26 (日) 12:08:11};

#comment_kcaptcha


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