#はじめに
制作をしていく中で、Arduinoから出力させるピンが足りなくなることがあります。そのような時に、ArduinoをMaster-Slave方式に分割することを考えました。
#方法
WireとよばれるライブラリがArduinoには標準搭載されています。これを用いるとArduino間でMaster-Slave方式の通信が可能になります。この通信の方式をI2C通信と呼びます。この通信を行うためにはArduinoのA4ピンとA5ピン同士を接続する必要があります。また、電源供給元が異なる場合は、GND同士も接続しましょう。
#コード
Master側
ここでは、PCからのシリアル通信を受け取って、Slave側に通信を行っています。デバック用に13番ピンにLEDを接続しています。
master.ino
#include <Wire.h>
void setup() {
Serial.begin(9600);
Wire.begin();
pinMode(13,OUTPUT);
}
void loop() {
char c = Serial.read();
if(c=='1'){
digitalWrite(13,HIGH);
Wire.beginTransmission(8) ; // 通信の開始処理、スレーブのアドレスは8とする
Wire.write("1",strlen("1")); // 通信データ送信
Wire.endTransmission();
}else if(c=='0'){
digitalWrite(13,LOW);
Wire.beginTransmission(8) ; // 通信の開始処理、スレーブのアドレスは8とする
Wire.write("0",strlen("1")); // 通信データ送信
Wire.endTransmission();
}
}
Slave側
ここでは、Master側から来たI2C通信を読み取って、通信が有った時に割り込み関数を呼び出しています。読み取ったデータに応じて13番ピンのLEDをon/offしています。
slave.ino
#include <Wire.h>
void setup() {
Wire.begin(8) ; //アドレスを8に設定
pinMode(13,OUTPUT);
Wire.onReceive(myReadLine); //割り込み関数の指定
}
void loop() {
//ここでは何もしない。
}
void myReadLine(int a){
char c;
if(Wire.available()) c = (char)Wire.read();
if(c=='1'){
digitalWrite(13,HIGH);
}else if(c=='0'){
digitalWrite(13,LOW);
}
}
#参考文献