フォト
2025年4月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
無料ブログはココログ

« arduinoでI2C接続LCDモジュールを利用する | トップページ | 明けましておめでとうございます »

2013年12月30日 (月)

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

今日はI2Cバスの学習のため2台のArduinoをI2Cバスで接続する実験を行いました。
きむ茶ガレージハウスさんのHPのI2Cの実験の記事で勉強させていただきました。

Dscn2277

この前作成した4桁7セグLEDを接続しているArduino(スレーブ)にマスタのArduinoから
表示データを送信して表示するといった構成です。

01

マスターから見ると、4桁7セグLED表示器は完全にブラックボッスであり、たた単純に
表示データを送るだけです。

思っていたよりも簡単に通信でき、遅れ等も感じられずに表示ができました。
取りあえず、イメージはつかめました。
実際にはエラー処理、制約、バスケーケーブル最大長などの考慮も必要でしょう。

写真の真ん中のは Arduino Pro mini です。Aliexpressで$3.84で売っていたので試しに
買ってみたのですが、ちゃんと動きます。基板上に実装できるサイズなので、
いろいろと使えそうです。

このちっこいArduino pro mini 使えばICたくさん使わなくても簡単にモジュールが作れそうです。

02

プログラムソースファイル

スレーブ側

//
// 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);
}

« arduinoでI2C接続LCDモジュールを利用する | トップページ | 明けましておめでとうございます »

arduino」カテゴリの記事

AVR」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 2台のarduinoをI2Cバスで接続して通信を行う実験:

« arduinoでI2C接続LCDモジュールを利用する | トップページ | 明けましておめでとうございます »