メインメニュー
ログイン
ユーザー名:

パスワード:


パスワード紛失

PukiWiki最新記事
[ リロード ]   [ ソース ]  [ トップ | インデックス | 単語検索 | ご意見、ご感想 ]

Counter: 23297, today: 2, yesterday: 9

Raspberry PiとArduinoを接続して連携動作させる

Raspberry Piにはアナログ入力がないのでアナログ入力のあるArduino Unoを
つないで、Arduino Unoでアナログ入力した値をRaspberry Piで読み取って
Raspberry Piに処理させられると何かと便利です。
これができるとRaspberry Piの利点とArduino Unoの利点を両方得られるので
とてもいいです!

今回は、テストのためアナログではないですが、Arduino Unoに赤外線受信センサーをつけて
この値をRaspberry Piで読み取ってRaspberry Piで動作しているインターネットラジオを
コントロールしてみました。

  connect raspberry pi and Arduino Uno
 

まずは問題点を考慮してどのようにつなぐかを検討します。
RPiのGPIOやArduinoの信号線の数は限られてます。
つなぐには、UART(RX,TX)、I2C(SDA(A4), SCL(A5))、SPI(SS,MOSI,MISO,SCK)、USBなど選択がいくつかありますが、
信号の配線が2本で拡張性もあるI2Cでつなぎました。I2Cならスレーブを
複数持つことが出来るので追加するにも好都合で、ついでにGPIOにつないでいるLCDをI2C対応の
LCDにしてしまえばさらにRPiのGPIOに余裕がでます。

つぎにI2Cで接続する際の問題点ですが、Raspberry PiのGPIOは3.3Vなのに対して、
Arduino UNOのインターフェースは5Vです。
これは、「I2Cバス用双方向電圧レベル変換モジュール」をつかえば
簡単にまったく問題なくインターフェースできます。
これはこれで良いと思いますが、自分の場合、Arduino UNOの電源を
Raspberry Piから供給したいので、Arduino UNOの消費電流の問題やArduino UNOに供給すべき
電圧が高いこともあってマイコン部分のATmega328Pをとりだし単体動作で対応することにしました。

単体動作ならRaspberry Piから供給する3.3Vで動作させれば、同じ信号レベルなので、
そのまま信号線をつなぐだけでOKです。電源の2本をあわせても4本の信号線を
インターフェースするだけですみ消費電流もとても小さいです。
流れとしては、Arduino UNOへスケッチをアップしたあと、ATmega328Pのマイコンを
とりだし、SDA、SCL、3.3V、GNDをつなぐだけでそれほど難しくありません。

I2C接続

Raspberry Piをマスターとして動作させ、Arduino(ATmega328P)をスレーブとして動作させます。

I2CのSDA、SCLの2本の信号はプルアップしないといけませんが、Raspberry Pinボードで
1KΩの抵抗で3.3Vへプルアップしているので直結でOKです。

信号の配線は、

Raspberry Pi
 P1-03 → SDA
 P1-05 → SCL

Arduino Uno
  A4 → SDA
  A5 → SCL

  i2c pullup registor, raspberry pi and arduino
 

スレーブを複数接続できることからスレーブにはアドレスを設定しておきます。
今後使うかもしれないI2CのLCD(50h)、気圧センサー(60h)、予約のアドレス(00h〜10h)などを避けて設定しておきます。
7ビットモードのアドレス空間は128アドレス(00h〜7Fh)もあるので、これらを除いても選び放題です。
ちなみに最大接続数は予約の16アドレスを除いた112アドレスです。
ということで今回は、21hをアドレスとして設定しました。

Arduino Uno側の設定

Arduinoでスケッチを書く時は、Wire.hのライブラリを使います。

アドレス設定

#define SLAVE_ADDRESS 0x21

Wire.begin(SLAVE_ADDRESS);

あとは、Wire.onRequest関数、Wire.write関数を使ってデータをRaspberry Piへ送信します。

Raspberry Pi側の設定

I2Cを使えるようにする
1. /etc/modulesにi2c-devを追加
2. /etc/modprobe.d/raspi-blacklist.confのblacklist i2c-bcm2708をコメントにします。
これでリブートすればI2Cデバイスが使えるようになります。

I2Cのツールをインストールします。
 sudo apt-get install i2c-tools

Raspberry Piにつながれているスレーブを一括で検索できるコマンドがi2cdetectで、実行した結果が以下の通りです。

$ sudo i2cdetect 1 (またはsudo i2cdetect 0)
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
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: -- 21 -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

今回は、Arduinoを21hに設定したので、21に該当する部分が"--"ではなく"21"となってます。
i2cdetectで古いバージョンの基板の場合は、

i2cdetect 0

あたらしいバージョンの基板の場合は、

i2cdetect 1

とします。

あとは、Raspberry Piでプログラムを書きます。
ここでGordonさんのライブラリを使うのであれば、
I2Cのライブラリをインストールして、インクルードします。

#include <wiringPiI2C.h>

wiringPiI2CSetup,wiringPiI2CRead,wiringPiI2CWrite関数でアクセスします。
https://projects.drogon.net/raspberr­y-pi/wiringpi/i2c-library/

i2cツールをつかうのであれば、
i2cset、i2cgetをプログラムから呼び出し。
例えば、

i2cget -y 1 0x21

をshell、c言語、pythonなどから呼び出して使うこともできます。

C言語でLinuxのライブラリを使うのであれば、

#include <linux/i2c-dev.h>

をインクルードして、
open, ioctl, read, writeの関数でアクセスできます。
http://elinux.org/Interfacing_with_I­2C_Devices

ちなみに自分はC言語でLinuxライブラリでコーディングしました。
サンプルはそれぞれ使う関数で検索をかけるとたくさん参考になるものがでてきますので略します。

I2Cでインターフェースできると配線が少なくてとてもいいです!

  関連記事:
Raspberry_Piをエネループ(電池)で動かす
Raspberry_PiでWiFi接続を安定にする2つの方法
Raspberry_Piでインターネットラジオ作ってみた
ラズベリーパイのインターネットラジオ完成!
Raspberry_PiにLCDやスイッチを取り付けるときの注意点
Raspberry_PiのGPIOライブラリ
Raspberry_Piが起動しないときのLEDの点滅
RPiで大きな容量のSDカードから小さな容量のSDカードへまるごとコピーする
Raspberry_Piの周波数を下げて消費電力を下げてみた
ラズベリーパイ、大きさの異なるSDカードでシステム領域を共通にする(ddコマンド)
sendmailでのメール送信が異常に遅い場合の対処
ラズベリーパイで遠隔操作のレスキューロボットを作成 その1
ArduinoでI2C接続するときにSCL,SDAにプルアップ抵抗は必要か?
 

   

ページコメント
投稿された内容の著作権はコメントの投稿者に帰属します。

トラックバック [ トラックバック(0) ]
トラックバック URL: http://myboom.mkch.net/modules/pukiwiki/tb/168