FrontPage

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

参考資料

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

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

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

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

$ 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に変更します。

$ 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番から反時計回りに付けた場合、以下のようになります。

  • GNDは、2番
  • VDDは、3番
  • SCLは、4番
  • SDAは、6番

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で確認しました。

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

コメント

選択肢 投票
おもしろかった 205  
そうでもない 2  
わかりずらい 9  

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

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

(Input image string)


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

添付ファイル: fileMy-Pin-Layout.jpg 8186件 [詳細] fileLM73-setting.png 1669件 [詳細] fileLED-gpio.png 1752件 [詳細] fileled2.jpeg 1924件 [詳細] fileLED-pin.png 1799件 [詳細] filepin_layout.png 1697件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-24 (月) 10:04:04 (30d)
SmartDoc