2016-05-29 07:26:40
I2C通信を勉強したいです
テーマ:ブログArduinoの作例を探しているとI2C通信がよく出てきますが、
実はI2C通信について何もよくわかっていないので勉強をしたいです。
I2C通信についてはここやここに解説がありました。
1親機がスタートを宣言して
2通信相手のスレーブアドレスを指定
3親側からの書き込みか、親が読み込みかを指定
4子機から返事をして通信スタート
51バイトごとに通信して、最後に親からストップ信号

という流れでよいでしょうか?Sさん…!
https://www.arduino.cc/en/Tutorial/MasterWriter
ArduinoのWireライブラリで簡単にI2C通信ができるようです。
親側スケッチ
#include
void setup() {
Wire.begin(); // ()だと親。()内に数字入れると子機のアドレスになる
}
byte x = 0;
void loop() {
Wire.beginTransmission(8); // transmit to device #8子機(8)と通信開始
Wire.write("x is "); // sends five bytes 文字送信(5文字)
Wire.write(x); // sends one byte 数字送信
Wire.endTransmission(); // stop transmitting STOP信号送信
x++;//1ループごとに送る数字が1増える
delay(500);
}
子機側スケッチ
#include
void setup() {
Wire.begin(8); // join i2c bus with address #8 スレーブアドレス8として設定
Wire.onReceive(receiveEvent); // register event 親機から通信来たらこの関数を開始
Serial.begin(9600); // start serial for output シリアルモニタ表示用
}
void loop() {
delay(100);
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
while (1 < Wire.available()) { // loop through all but the last 親機から最後以外は文字が送られてくるので文字列として受信?
char c = Wire.read(); // receive byte as a character 一文字ずつ受信
Serial.print(c); // print the character 一文字ずつシリアルモニタに表示
}
int x = Wire.read(); // receive byte as an integer 最後の数字を受信
Serial.println(x); // print the integer 数字をシリアルモニタに表示
}
こういうことでしょうか?Sさん!
子機側のシリアルモニタにこのように表示されていきます。

まだ"while (1 < Wire.available())"の仕組みがあまりよくわかりません・・・
実はI2C通信について何もよくわかっていないので勉強をしたいです。
I2C通信についてはここやここに解説がありました。
1親機がスタートを宣言して
2通信相手のスレーブアドレスを指定
3親側からの書き込みか、親が読み込みかを指定
4子機から返事をして通信スタート
51バイトごとに通信して、最後に親からストップ信号

という流れでよいでしょうか?Sさん…!
https://www.arduino.cc/en/Tutorial/MasterWriter
ArduinoのWireライブラリで簡単にI2C通信ができるようです。
親側スケッチ
#include
void setup() {
Wire.begin(); // ()だと親。()内に数字入れると子機のアドレスになる
}
byte x = 0;
void loop() {
Wire.beginTransmission(8); // transmit to device #8子機(8)と通信開始
Wire.write("x is "); // sends five bytes 文字送信(5文字)
Wire.write(x); // sends one byte 数字送信
Wire.endTransmission(); // stop transmitting STOP信号送信
x++;//1ループごとに送る数字が1増える
delay(500);
}
子機側スケッチ
#include
void setup() {
Wire.begin(8); // join i2c bus with address #8 スレーブアドレス8として設定
Wire.onReceive(receiveEvent); // register event 親機から通信来たらこの関数を開始
Serial.begin(9600); // start serial for output シリアルモニタ表示用
}
void loop() {
delay(100);
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
while (1 < Wire.available()) { // loop through all but the last 親機から最後以外は文字が送られてくるので文字列として受信?
char c = Wire.read(); // receive byte as a character 一文字ずつ受信
Serial.print(c); // print the character 一文字ずつシリアルモニタに表示
}
int x = Wire.read(); // receive byte as an integer 最後の数字を受信
Serial.println(x); // print the integer 数字をシリアルモニタに表示
}
こういうことでしょうか?Sさん!
子機側のシリアルモニタにこのように表示されていきます。

まだ"while (1 < Wire.available())"の仕組みがあまりよくわかりません・・・