2台のarduinoをI2Cバスで接続して通信を行う実験
今日はI2Cバスの学習のため2台のArduinoをI2Cバスで接続する実験を行いました。
きむ茶ガレージハウスさんのHPのI2Cの実験の記事で勉強させていただきました。
この前作成した4桁7セグLEDを接続しているArduino(スレーブ)にマスタのArduinoから
表示データを送信して表示するといった構成です。
マスターから見ると、4桁7セグLED表示器は完全にブラックボッスであり、たた単純に
表示データを送るだけです。
思っていたよりも簡単に通信でき、遅れ等も感じられずに表示ができました。
取りあえず、イメージはつかめました。
実際にはエラー処理、制約、バスケーケーブル最大長などの考慮も必要でしょう。
写真の真ん中のは Arduino Pro mini です。Aliexpressで$3.84で売っていたので試しに
買ってみたのですが、ちゃんと動きます。基板上に実装できるサイズなので、
いろいろと使えそうです。
このちっこいArduino pro mini 使えばICたくさん使わなくても簡単にモジュールが作れそうです。
プログラムソースファイル
スレーブ側
//
// arduino I2Cスレーブ
//
#include <Wire.h>
#include <led7segfont.h>
#include <Static7Seg.h>
#include <stdlib.h>
// 4桁7セグLED制御 インスタンスの作成
Static7Seg seg(8,12,11);
char buf[20];
// マスタからの表示用データ受信し表示する
void receiveEvent(int howMany)
{
int n = 0;
// 送信された全てのデータを受信
while(Wire.available()) {
buf[n++] = (char)Wire.read();
}
buf[n] = '\0';
// 受信したデータを7セグLEDに出力
seg.print(buf);
}
void setup() {
seg.print("");
Wire.begin(8) ; // I2Cの初期化、自アドレスを8とする
Wire.onReceive(receiveEvent) ; // 割込み関数の登録
}
void loop() {
}
マスタ側
//
// arduino I2Cマスタ
//
#include <Wire.h>
#include <stdlib.h>
void setup()
{
Wire.begin() ; // I2Cの初期化、マスターとする
delay(5000) ; // 5秒後に開始
}
// データの送信
void seg_print(char *str) {
Wire.beginTransmission(8) ; // 通信の開始処理、スレーブのアドレスは8とする
Wire.write((byte *)str, strlen(str)) ; // 通信データ送信
Wire.endTransmission();
}
// 繰り返し実行されるメインの処理関数
void loop()
{
seg_print(""); delay(1000);
seg_print("1"); delay(1000);
seg_print("12"); delay(1000);
seg_print("345"); delay(1000);
seg_print("1234"); delay(1000);
seg_print("3.141"); delay(1000);
seg_print(" 1"); delay(1000);
seg_print(" 12"); delay(1000);
seg_print(" 123"); delay(1000);
seg_print("1234"); delay(1000);
seg_print(""); delay(200);
seg_print("1234"); delay(200);
seg_print(""); delay(200);
seg_print("1234"); delay(200);
seg_print(""); delay(200);
seg_print("1234"); delay(2000);
}
























最近のコメント