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); }
最近のコメント