Помогите пожалуйста есть ардуина master общается с второй (slave) по i2c. У каждой свой адрес в шине заявлен. Ко второй подключен multiservo shield. Как сделать чтоб второй ардуино (слейв) работал в роли мастера для шилда и не конфликтовал при этом с первой ардуиной. Копался в библиотеке, пробовал но ничего не получилось.
Какая каша у вас в голове. В сети должен быть только один мастер, а остальные слейвы. Это вопрос принципа. Есть начальник он один, а есть подчиненные. А если каждый подчиненый будет мнить себя начальником то будет бардак. Если к примеру начальник уезжает в отпуск, то он оставляет за себя И.О. , который и будет начальником. Или же подчиненый решает отдать команду другому подчиненому, то сначало он заявку ложит на стол начальнику, а уже начальник отдает команду. Альтернатива хаос в делах.
Мастер может вести себя как слейв косвенно. Вот пример: Master // Written by Nick Gammon // February 2012 #include <Wire.h> const byte MY_ADDRESS = 25; const byte SLAVE_ADDRESS = 42; const byte LED = 13; void setup() { Wire.begin (MY_ADDRESS); Wire.onReceive (receiveEvent); pinMode (LED, OUTPUT); } // end of setup void loop() { for (int x = 2; x <= 7; x++) { Wire.beginTransmission (SLAVE_ADDRESS); Wire.write (x); Wire.endTransmission (); delay (200); } // end of for } // end of loop void receiveEvent (int howMany) { for (int i = 0; i < howMany; i++) { byte b = Wire.read (); digitalWrite (LED, b); } // end of for loop } // end of receiveEvent Slave // Written by Nick Gammon // February 2012 #include <Wire.h> const byte MY_ADDRESS = 42; const byte OTHER_ADDRESS = 25; void setup () { Wire.begin (MY_ADDRESS); for (byte i = 2; i <= 7; i++) pinMode (i, OUTPUT); Wire.onReceive (receiveEvent); } // end of setup void loop() { int v = analogRead (0); Wire.beginTransmission (OTHER_ADDRESS); Wire.write (v < 512); Wire.endTransmission (); delay (20); } // end of loop // called by interrupt service routine when incoming data arrives void receiveEvent (int howMany) { for (int i = 0; i < howMany; i++) { byte c = Wire.read (); // toggle requested LED if (digitalRead (c) == LOW) digitalWrite (c, HIGH); else digitalWrite (c, LOW); } // end of for loop } // end of receiveEvent
Очевидные решения: а) сделать мастером ту, к которой подключен шилд; б) между ардуинами использовать не I2C, а другой интерфейс;