雨の今朝は通常出勤です。
Arduino UNO R3を2台使ってI2C Master Slave接続の検証です。
Masterから指令を送り、Slaveがこれを受けてプログラムを実行。
Slaveのプログラムが完了してからSlaveがMasterに信号を返送して終わると言うものです。ソースコードは以下の通りです。
Master側:
  Wire.beginTransmission(slave_address);
  Wire.write(shirei) ;
  Wire.endTransmission(false);  // 
ココがポイント
  Wire.requestFrom(slave_address,1);
  while (Wire.available()) {
   signal_from_slave = Wire.read();
    Serial.write(signal_from_slave);
  }  
  Serial.println();
  Wire.endTransmission();
Slave側:
void receiveEvent(int n)
{
  shirei= 0;
  for (int i=0; i < n; i++)
  {
    if(Wire.available())
    {
       shirei = Wire.read();
       Serial.print(shirei,HEX);
       Serial.print(" ");
    }
    Serial.println();
   // 以下shirei値に応じた処理
}
void requestEvent()
{
   Serial.println("recept request.");
   if (shirei == 0) // shirei値に応じた返値設定
   {
      signal_from_slave = 0x00;
   }
   if (shirei == 1)
   {
      signal_from_slave = 0x01;
   }
   Wire.write(signal_from_slave);
}
void setup() {
  Serial.begin(9600);
  Wire.begin(address);
  // マスタへ返値を送信する割込関数の設定
  Wire.onRequest(requestEvent);
  // マスタから指令を受信する割込関数の設定
  Wire.onReceive(receiveEvent);
  Serial.println("i2c slave test");
}
Master側のWire.endTransmission(false);のfalseオプションがミソで、これにより、クロックストレッチが設定されるものと思っています。
Arduino UNO R3は3,240円。一方PIC16F1829は370円と10倍近い値段の開きがあります。
でも、
使いやすさや公開情報量の豊富さではPICを圧倒しています。
ただ、極めて残念なのは
本チャンのパソコンでArduino UNO R3(Leonardも然り)が全く使えないことです。
依然としてノーパソでプログラムローディング等を行わざるを得ません。
今日は夕食が外食になりました。
肉丼定食です。
