Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

はじめに

制作をしていく中で、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で通信してみた

UT-HACKs
東大生エンジニアと藝大・美大デザイナーからなる新進気鋭のクリエイター集団です。 技術と芸術の融合で、「心を動かすモノづくり」をしています。
http://www.uthacks.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away