I2Cとデータの表示の練習として、センサー-Arduino-Arduino-LCDとデータを転送するシステムを作りました。

・システムの詳細
 SlaveのArduino(以下スレイブ)では、MasterのArduino(以下マスター)から要求があった時にセンサーの値を読み取りマスターにそのデータを返します。また、マスターではスレイブにデータの要求をし、帰ってきたデータをLCDに表示します。

・配線
 そのためにまず、スレイブには使うセンサー(今回は半固定抵抗器)をつなぎ、マスターにはLCDと通信するためにArduinoとLCDのSDA,SCL,VCC,GNDをつなぎます。Arduino間はI2C通信を行うためにSDA,SCL,GNDをつなぎます。
 実際に配線するとこんな感じです。キタナイ...
IMG_1013


・プログラム
マスター
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
  LiquidCrystal_I2C lcd(0x3F, 16, 2); // I2C: 0x3F, 16x2 LCD
  long c=0;

void setup() {
  Wire.begin();
  lcd.init(); 
  lcd.backlight();
  Serial.begin(9600);
}

void loop() {
  Wire.requestFrom(8,1);
  while (Wire.available()) {
    c = Wire.read();
    Serial.println(c);
  }
  lcd.setCursor(0, 0);
  if(c >99){
  lcd.print(c);}
  else{
    if(c >9){
    lcd.print(" ");//LCDの出力を整えるための空白
    lcd.print(c);}
    else{
    lcd.print("  ");//LCDの出力を整えるための空白
    lcd.print(c);
    }}
  delay(100);
}


スレイブ
#include <Wire.h>
int val1=0;

void setup() {
  Serial.begin(9600);
  Wire.begin(8);
  Wire.onRequest(requestEvent);
}

void loop() {
  delay(100);
}

void requestEvent() {
  val1=analogRead(0)/4;
  Serial.println(val1);
  Wire.write(val1);
}

・動作
 実際の動作の様子はこんな感じです。マスター、スレイブ、LCDの値がずれることなく同期できています。



 今回はこんな感じで、今まで通信系のことを一切やっていなかったので勉強になりました。まあ、サークルとかで使うかもしれないのでその時に生かせたらいいな...と。

 後期が始まるまで二週間切ってしまったので、制作実験用の期待の改良をやんないとなぁと思いつつ机の上にあってジャマな三相モーターも動かせるようにならないとなぁと思っています。それではまた今度