Raspberry Pi I2C How-To ガイド by @azarashi55

注)Raspberry PiのGPIOポートはCPUであるARMプロセッサーに直結されています。
また、GPIOポートで許容される電圧は3.3Vまでで、5Vには耐えられません(過電
圧保護回路はついていません)。
 また、CPUに直結されているために、端子間のショート、静電気等でRaspberry
Pi本体が壊れる可能性もあります。
 GPIOポートを使用する際には、十分に注意の上、あくまで自己責任で使用して
下さい。

Intro.
 この文書は、Raspberry PiをI2C経由でTMP102に接続し、気温データを取得す
るまでのHow-Toです。
 前提としている環境は、
・PC(Windows7 or WindowsXP)+sshクライアント(TeraTerm、puttyなど)
・DHCPサーバー機能をもつブロードバンドルーター
 です。

1.Raspberry Piの購入
http://jp.rs-online.com/web/generalDisplay.html?id=raspberrypi
から購入できます。(要:クレジットカード)
#ちなみに、今購入しても出荷まで4ヶ月ほど待つようです・・・。
2.Raspberry Pi以外に必要なもの
 Raspberry Pi本体には特に別途RS Onlineで購入しない限りケーブル・電源類
は付属されていません。そこで、以下のものを準備します。
・LANケーブル
・電源(推奨はしませんが電源電圧さえ合っていればAndroidスマホのMicroUSB
電源が流用可能です、なお5V 700mAの供給能力が必要です)
・SDカード(最低でもSDHC class4 4GBが推奨されています)
・X環境を使う場合には、HDMIケーブル+USBキーボード+USBマウス
(なお、母艦となるPCにVNCクライアントをインストールすれば、HDMIケーブル
のみでも使えます)
・SDHCカード対応SDカードリーダー・ライター
・Raspberry Piとブレッドボード接続用メスーオスジャンパーワイヤ
(千石通商、秋月電子などで取り扱っています)
3.Raspberry Pi用SDカードの準備
 http://www.raspberrypi.org/downloads
 から、公式に推奨されているRaspbian(Debian Wheezyベース)のイメージファ
イルをダウンロードします。
 RaspbianイメージファイルをSDHCカードに書き込むツールとして、Win32 Disk Imager
をダウンロードします。
http://www.softpedia.com/get/CD-DVD-Tools/Data-CD-DVD-Burning/Win32-Disk-Imager.shtml
 ZIP形式なので、適当なフォルダーに展開します。
 SDHCカードをリーダー・ライターに挿入し、ドライブレター(例:G:など)を
確認します。
 Win32 Disk Imagerを起動し、Image Fileで先ほどダウンロードしたRaspibian
イメージファイルを選択します。次にDeviceの欄に先ほど確認したSDHCカードの
ドライブレターが表示されていることを確認します(ココは重要!!)
 間違いがなければ、Writeボタンを押してイメージファイルを書き込みます。
 数分で書き込みが終わり、”Write Successful”と出たら無事書き込めていま
すので、Exitボタンを押し終了します。
4.Raspberry Piの準備・起動
 本体を取り出し、LANケーブル、イメージファイル書き込み済みSDHCカードを
刺します。Raspberry Piには電源スイッチはありませんので、MicroUSBケーブル
を差し込むとそれだけで電源が入ります。
 10秒ほどOKのLEDがチカチカと明滅し、OKのLEDが消灯するとRaspberry Piの
起動が完了しています。Raspbianの場合、イメージファイルを書き込んだ”素”
の状態ではDHCPクライアントが起動し、IPアドレスを取得するので、ブロードバ
ンドルーター上でDHCPで割り当てられたIPアドレスを確認します。
5.Raspberry Piの初期設定
 Windows(ここから先はホストPCはLinuxでもMacOSでもなんでもsshクライアン
トさえ動けば何でもOKです)のsshクライアントを起動し、IPアドレスを指定し
て接続します。初期設定では
Username: pi
Password: raspberry
 となっていますので、これでログインします。
 次に、
$ sudo raspi-config
 で最低限の初期設定を行います。
 とりあえずは、timezoneを”Asia”→”Tokyo”に変更するぐらいでいいかと
思います。ちなみにlocaleにja_JP.UTF-8を追加すると、各種メッセージが日本
語(UTF-8)になります。
 rebootを求められるので再起動します。

 毎回、IPアドレスを確認してログインするのも大変だ、という方は
/etc/network/interfacesを修正して、固定IPを振っておくといいでしょう。設
定方法はDebianと一緒です(当たり前ですが・・・)。
6.I2Cデバイスを扱えるようにする
 Raspbianでは、I2Cデバイス用モジュールがあるものの、初期設定では読み込
まれないようになっています。
 そこで、以下のファイルを編集します。
/etc/modules に以下一行を追加
i2c-dev

/etc/modprobe.d/raspi-blacklist.conf の以下一行をコメントアウト
blacklist i2c-bcm2708

 上記内容を反映するために、
$ sudo reboot
 で再起動します。

$ dmesg
 で
[    7.833728] bcm2708_i2c bcm2708_i2c.0: BSC0 Controller at 0x20205000 (irq 79)
[    7.942068] bcm2708_i2c bcm2708_i2c.1: BSC1 Controller at 0x20804000 (irq 79)
 の行が表示されればI2Cデバイスモジュールが読み込まれています。
7.I2C用パッケージのインストール
 今回はHow-Toということで、Debianパッケージのi2c-toolsを利用してみます。
$ sudo apt-get install i2c-tools
8.TMP102の接続
 Raspberry Piの場合、GPIOポートにI2C用のピンヘッダ、3.3V電源、GNDがあり
ますので、3.3Vで駆動するTMP102(http://www.switch-science.com/products/detail.php?product_id=258
を使ってみます。
 接続前に、
$ sudo shutdown -h now
 で、Raspberry Piを停止状態(Halt)にし、LANケーブル、電源ケーブルを外
します。
#PWRのLEDのみが点灯している状態でHalt状態になっています。

 Raspberry PiのGPIOピン配列は
http://elinux.org/RPi_Low-level_peripherals
 など各所に出ています。

 接続が終わったら、再びLANケーブルを刺し、電源を入れます。

 TMP102はADD0端子にV+を接続するとI2Cアドレスが0x49に指定されます。
$ sudo i2cdetect 0
 で、実際に0x49に表示が現れることを確認しましょう。

 今回はHow-Toということで、http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=11319
からサンプルのbashスクリプトを拝借してみます。

#!/bin/bash

hexraw=$(sudo i2cget -y 0 0x49 0x00 w)
while [ “$hexraw” == “” ]; do
    hexraw=$(sudo i2cget -y 0 0x49 0x00 w)
done

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

echo “scale=4; $dec*0.0625” | bc

 なお、このスクリプト内で使われている計算ソフトbcはraspbianにはデフォル
トでは入っていませんので、
$ sudo apt-get install bc
 もしておきます。

pi@raspberrypi ~ $ ./tmp102.sh
29.8125
pi@raspberrypi ~ $

 のように気温データが取得できていれば成功です。

オマケ編

A.bootcカーネルを使う
http://www.bootc.net/projects/raspberry-pi-kernel/
 で公開されている、3.2 Kernelを使うともっと楽にTMP102の値が取得できるの
でやってみました。

 まず、http://www.bootc.net/projects/raspberry-pi-kernel/を参考に、
kernelイメージをとってきます。
$ wget http://apt.bootc.net/debian/pool/main/l/linux-source-3.2.23-rpi1+/linux-image-3.2.23-rpi1+_1_armel.deb

 ここからの操作はsudoでやっているとややこしいので、suでrootになって実行
します。
$ su passwd
お好きなrootのパスワードを設定して下さい。

$ su
rootになります。

 次に行うファームウェアアップデートで意外にSDカードの容量を消費するので、
あらかじめ
# raspi-config
 から、”expand_rootfs”を選択し、SDカードの全領域をRaspberry Piで使え
るようにしておきます。(SDHC class10 16GBのカードで大体数十分かかります)

次にSDHCカード内のkernelのファームウェア(おそらくkernel moduleを指して
いると思います)をアップデートします。
# wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && chmod +x /usr/bin/rpi-update
# apt-get install git-core
# /usr/bin/rpi-update
数分かかります。
# dpkg –force-architecture -i linux-image-3.2.23-rpi1+_1_armel.deb
 エラーメッセージが出ますが、無視します。
(Raspbianはアーキテクチャーがarmhfだが、入れようとしているkernelのアー
キテクチャーはarmelなため。なお、kernelのアーキテクチャーがarmelでも
armhfなアプリケーションはそのまま使えます)

# cd /boot
 現在のkernelを退避
# cp -p ./kernel.img /root
 3.2 kernelをコピー
# cp vmlinuz-3.2.23-rpi1+ /boot/kernel.img
# reboot

 これで、3.2 kernelで起動します。

$ uname -a
Linux raspberrypi 3.2.23-rpi1+ #3 Sun Jul 15 16:46:51 BST 2012 armv6l GNU/Linux
$ su
# apt-get install lm-sensors
 0x49の部分はI2Cデバイスアドレスに合わせて適宜変更して下さい
# echo tmp102 0x49 > /sys/class/i2c-adapter/i2c-0/new_device
# exit
$ sensors
tmp102-i2c-0-49
Adapter: bcm2708_i2c.0
temp1:        +29.2°C  (high = +160.0°C, hyst = +150.0°C)

$

 と、あっさりとTMP102のデータが取れました。

・3.2 kernelの長所・短所まとめ
長所)
 3.2 kernelでサポートされているI2Cデバイスについては極めて簡単に
データが取得できる

短所)
 3.2 kernelを導入するまでの手順が比較的大変
 ファームウェアの更新でSDカードの容量が必要となる
 I2Cデバイスがkernelモジュールの内部に隠蔽されるので、一旦
new_devicesにI2Cデバイスを登録してしまうと、ユーザーランドからI2Cデバイ
スにアクセスできず、生のI2Cデバイスのデータを取得できなくなる
 3.2 kernelが現状armelアーキテクチャーでコンパイルされているため
に、armhfと比べて浮動小数点演算を必要とするアプリケーション(ウェブブラ
ウザその他もろもろ)の動作が遅くなる(はず・・・)

B.参考URL
・Raspberry Piの公式サイト
http://www.raspberrypi.org/

・Raspberry PiのGPIOポートなどについて
http://elinux.org/RPi_Low-level_peripherals

・Raspberry Pi 3.2 Kernel(bootc kernel)について
http://www.bootc.net/projects/raspberry-pi-kernel/