LoginSignup
7
6

More than 5 years have passed since last update.

ArduinoでMaster-Slave方式を実現する方法

Last updated at Posted at 2015-11-14

はじめに

制作をしていく中で、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);
  }
}

参考文献

2台のarduinoをI2Cバスで接続して通信を行う実験
3台のArduinoをI2Cで通信してみた

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6