Raspberry Pi でI2C通信
北本です。前回、ラズパイのGPIOで入出力ができたということで、次のステップとして距離センサを用いることに挑戦してみます。
今回使用する距離センサは、「シャープ測距モジュール GP2Y0E03」です。前回やったLEDへの出力やトグルスイッチからの入力は、ONかOFFの2通りの情報をやりとりすればよいだけでした。今回のGP2Y0E03は、4~50cmの範囲でセンサと対象との距離を測定することができます。スイッチからの入力のようにON/OFFの2値だけでは、どれぐらいの距離があるのかという情報をまともに伝達できません。ここで用いられるのがI2Cという通信方法です。詳しくはWikipediaを参照とさせていただきます(GP2Y0E03はアナログ出力も可能ですが今は置いておくこととします)。どのような通信方法にも当てはまることですが、一定ルールでON/OFF情報の組み合わせを流すことで、一つの端子だけで様々な値を表せるようになるわけです。非常にざっくり言えばモールス信号と同じようなものですね。キタロボの頭脳となっているArduinoに比べると、ラズパイはセンサ関係には弱いみたいですが、このI2C通信には対応しています。
ラズパイでI2Cを利用するためには、まず、「Raspberry Piの設定」を開いてI2Cを有効にします(この辺、ラズパイのバージョンによってUIの違いがあり、参考書などの説明と食い違っている場合があって少し厄介です)。
そして、ターミナルで
sudo nano /boot/config.txt
と打ち込んでconfig.txtを編集し、
dtparam=i2c_baudrate=50000
と追記してボーレートを50000に設定する必要があるとのことです。
それから、ラズパイの再起動をすれば、I2Cを使えるようになるらしい。
以下のようにセンサとラズパイを接続します。
端子① VDD …… 電源(3.3V)に接続
端子② Vout(A) …… 接続なし(アナログ出力を使用しないため)
端子③ GND …… GNDに接続
端子④ VIN(IO) …… 電源に接続
端子⑤ GPIO1 …… 電源に接続(スタンバイ制御用だが、常に動作していて問題ないので電源に接続)
端子⑥ SCL …… 5ピンに接続
端子⑦ SDA …… 3ピンに接続
そして、
sudo i2cdetect -y 1
とコマンドを入力すれば、GP2Y0E03のデフォルトアドレスである0x40が検出される……はずでしたが検出されません。
dmesg | grep i2c
とコマンドを入力しても、bcm2708_i2cが検出されるはずなのにされません。
原因を特定しようと色々試してみます。センサ自体が故障していないかと、もう1つ購入していた同種のセンサに繋ぎ替えてみます。また、ラズパイに問題がないかと、別のラズパイに取り替えて試してもみます。しかし、それでも上手くいかず。オシロスコープを持ち出して、波形も確認します。I2C通信の波形は確認できませんが、通電は問題ない模様。さらには、Raspbianの再インストールも試みますが、それでもダメでした。
結局、解決せずというところで今回の投稿は締めさせていただきます。半田付けという大きな関門を越えた先にさらなる強敵が待ち受けていたのでした。