忘備録など

忘備録として

ArduinoとラズパイをI2C通信でつなぐ('ω')ノ

今日はArduinoとラズパイをつないでみたいと思います('ω')ノ

 

実はMyoWare(筋電センサ)が届いたのですが、ラズパイにはAD変換器がついてないのでそのままでは使えないのです。

f:id:riderid:20210710002210j:plain

 

ということで、AD変換器がついているArduinoにMyoWareをつけて、ラズパイの方にデータを送るという方法で筋電データを取りたいと思います('ω')ノ

 

今日はそのラズパイとArduinoをつなぐところまでやっていきます('ω')ノ

USBでつなぐ方法もありますが、ここではI2Cシリアル通信をしてみます

I2CはInter-Integrated Circuitの略で、通信プロトコルの一種です

シリアルデータ(SDA)とシリアルクロック(SCL)の2本の通信線を用います('ω')ノ

 

シリアルデータ:Arduino[A4] ラズパイ[GPIO2]

シリアルクロック:Arduino[A5] ラズパイ[GPIO3]

それとGND同士をつなぎます('ω')ノ

f:id:riderid:20210710003029j:plain

 

I2Cの接続のためにまずArduinoにプログラムを書き込みます('ω')ノ

f:id:riderid:20210710003513j:plain

Arduinoには ic2用のライブラリがあるので#include<Wire.h>を書いて使用します

Wire.begin(アドレス)…7ビットのスレーブアドレスを指定。無ければマスターとしてバスに参加する

Wire.onReceive(関数名)…スレーブデバイスがマスターからの送信を受信したときに呼び出される関数を登録する。ここでのスレーブデバイスArduino、マスターはラズパイです('ω')ノ

ここでは信号を受け取ったらreceive関数へ飛ぶようにしています

receiveではWire.read()で受信したバイトを読み取ります

’A’を受け取るとled関数が呼び出されて、ledが光ります('ω')ノ

f:id:riderid:20210710003549j:plain

 

次にラズパイのほうにいきます('ω')ノ

設定(Preferences)からラズパイの設定を押します

f:id:riderid:20210710004834j:plain

 

インターフェイスからI2Cを有効にします('ω')ノ

f:id:riderid:20210710005129j:plain

 

Arduinoときちんと接続できているかを確認します

i2cdetect -y 1 とコマンドを入力します

f:id:riderid:20210710005210j:plain

 

これで設定したアドレスが表示されていたらOKです('ω')ノ

0x8がちゃんと表示されてます

f:id:riderid:20210710005501j:plain

 

ラズパイのプログラムです

f:id:riderid:20210710005629j:plain

smbus(システム管理バス)モジュールをインポートします

bus = smbus.SMBus(1) で引数に1を指定する。

input()で文字を入力させる

もしsakusakuと入力させると、bus.write_byte(0x8, ord('A'))で1バイト’A’を送信します

※write_byte(int addr, char val)

※ord()メソッドは文字をUnicode値に変更する

 

ということで、sakusakuを入力すると’A’が送信されて。。。

f:id:riderid:20210710011416j:plain

 

点灯しました('ω')ノやったー

f:id:riderid:20210710011504j:plain

 

ということでi2c通信ができました('ω')ノ

次回はセンサから値を読み取ってみたいと思います('ω')ノ