使用したもの
- Raspberry Pi B+ (OSはRaspbian)
- Arduino UNO
- 測距モジュール GP2Y0A21YK
この測距モジュールはGNDがオレンジでVccが黒というトラップがあるので注意。(図1)
図1 GP2Y0A21YK
Raspberry Pi側の準備
/boot/config.txt の末尾に以下の1行を追加。
dtparam=i2c_arm=on
/etc/modules の末尾に以下の1行を追加。
i2c-dev
/etc/modprobe.d/raspi-blacklist.conf の以下の1行をコメントアウト。
blacklist i2c-bcm2708
また、I2C通信をする際 /dev/i2c-1 を使用するため権限が必要ですが、以下のようにすると毎回sudoしなくてよくなります。(usernameはi2cグループに追加したいユーザで置き換えてください piとか)
$ sudo gpasswd -a username i2c$ sudo usermod -G i2c username でも可能ですが、追加する操作でないためそのユーザに設定されている他のグループの設定まで変わってしまうので gpasswd の方がいいです。
ここで一度再起動します。
$ sudo shutdown -r now
I2C通信の確認をするためのツールをインストールし、試しに実行してみます。
$ sudo apt-get install i2c-tools $ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
sudoなしで実行することができました。まあまだどこにも繋いでないので特になにも表示されないですが。
Error: Could not open file `/dev/i2c-1': Permission denied
Run as root?
とか言われたらグループに追加するのがうまくいってない可能性があります。
配線
RaspberryPiは第3ピン(GPIO 2)がSDA、第5ピン(GPIO 3)がSCL、
Arduinoはアナログピン4がSDA、アナログピン5がSCLとなっています。
RaspberryPi内蔵のプルアップ抵抗があるようなのでそのままArduinoに繋いで大丈夫です。
センサーの出力はアナログピン1に繋いでいます。
図2 配線の例
図3 実際に配線した様子
Arduino(スレーブ)側
以下のスケッチを書き込みます。
#include <Wire.h> void setup() { Wire.begin(8); // スレーブのアドレスを8に設定 Wire.onRequest(psd); // マスターに呼ばれたときに呼び出す関数 } void loop() { delay(100); } void psd() { // 以下は距離[cm]を求める近似計算 int temp, distance; temp = analogRead(1); if(temp<4) temp = 4; // 0除算を回避 distance = (6787 / (temp - 3) ); Wire.write(distance); }
Raspberry Pi(マスター)側
i2cというgemを使用します。
$ sudo gem install i2c
require 'i2c' device = I2C.create('/dev/i2c-1') begin loop do # アドレス0x08のスレーブからサイズ1バイトで受信 data = device.read(0x08, 1) puts "#{data.bytes[0]} cm" sleep(1) end rescue Interrupt exit 0 end
これを実行すると、Arduinoからセンサの値が送られていることが確認できます。
参考サイト
以下のサイトを参考にさせていただきました。
Raspberry PiによるIoT(M2M)【I2C温度センサー/xively/Python】
最近の Raspberry Pi で I2C を有効化する方法
0 件のコメント:
コメントを投稿