Dueだけに当てはまるかどうかわからない興味深い問題があります。2つのArduinoATMegasでI2Cをテストするためのリソースがありません。ここに問題があります:
私には2つのDueがあります。マスターには後で使用されるイーサネットシールドがあります。現在、マスターとスレーブを簡単に区別するために使用されています。I2Cは機能していますが、セットアップは次のとおりです。マスターに接続されたDueのDC「ラウンド」入力に接続された1つの12Vバッテリー:3.3VとGNDが2つのボード間で相互に接続されています:スケッチをアップロードするための1つのUSBケーブル。
マスターからUSBを取り外してスレーブにスケッチをアップロードすると、12 DCのため、USBが接続されていないフェーズの間、両方のボードがオンのままになります。スケッチがアップロードされ、USBはシリアル監視のためにスレーブ側に留まります。
問題:12Vバッテリーがマスターに修正されていない場合。USBのプラグが抜かれた段階では、両方のボードがオフになります。同じスケッチをスレーブにアップロードすると、シリアルモニターは、スレーブが情報を受信していないことを示します。
I2Cのセットアップとスケッチのアップロードが競合していると思います。どうすればこの問題を解決できるので、常に会費に電力を供給する必要はありません。これが12Vバッテリー電源で動作しているコードです。
/**************************************************************************************************
MASTER
****************************************************************************************************/
#include <Wire.h>
byte ISend[4];
void setup()
{
Wire1.begin(); // join i2c bus (address optional for master)
intToByteA((unsigned long)72992);
}
void loop()
{
Wire1.beginTransmission(4); // transmit to device #4
for(int i = 0; i < 4; i++)
{
Wire1.write(ISend[i]);
}
Wire1.endTransmission();
delay(500);
}
void intToByteA(unsigned long num)
{
for (int i = 0; i < 4; i++)
{
ISend[i] = (byte)((num >> (8 * i)) & 0xFF);
}
}
/*********************************************************************************************/
/************************************************************************************************
SLAVE
*************************************************************************************************/
#include <Wire.h>
byte IReceive[4];
void setup()
{
Wire1.begin(4); // join i2c bus with address #4
Wire1.onReceive(receiveEvent); // register event
Serial.begin(9600); // start serial for output
}
void loop()
{
delay(223);
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
unsigned long test = 11;
for(int i = 0; i < 4; i++)
{
IReceive[i] = Wire1.read();
}
test = byteAToInt();
Serial.println(test);
}
unsigned long byteAToInt()
{
unsigned long temp = 0;
for (int i = 0; i < 4; i++)
{
temp += (((unsigned long)IReceive[i]) << (8 * i));
}
return temp;
}