Multiservo и i2c.

Тема в разделе "Arduino & Shields", создана пользователем gabbapeople, 28 май 2017.

  1. gabbapeople

    gabbapeople Нуб

    Помогите пожалуйста есть ардуина master общается с второй (slave) по i2c. У каждой свой адрес в шине заявлен. Ко второй подключен multiservo shield. Как сделать чтоб второй ардуино (слейв) работал в роли мастера для шилда и не конфликтовал при этом с первой ардуиной. Копался в библиотеке, пробовал но ничего не получилось.
     
  2. qwone

    qwone Гик

    Какая каша у вас в голове. В сети должен быть только один мастер, а остальные слейвы. Это вопрос принципа. Есть начальник он один, а есть подчиненные. А если каждый подчиненый будет мнить себя начальником то будет бардак. Если к примеру начальник уезжает в отпуск, то он оставляет за себя И.О. , который и будет начальником. Или же подчиненый решает отдать команду другому подчиненому, то сначало он заявку ложит на стол начальнику, а уже начальник отдает команду. Альтернатива хаос в делах.
     
  3. gabbapeople

    gabbapeople Нуб

    Мастер может вести себя как слейв косвенно. Вот пример:


    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
     
  4. Unixon

    Unixon Оракул Модератор

    Очевидные решения:
    а) сделать мастером ту, к которой подключен шилд;
    б) между ардуинами использовать не I2C, а другой интерфейс;
     
    arkadyf нравится это.