Связь arduino через xbee

Тема в разделе "Arduino & Shields", создана пользователем DmitryDmitry, 18 май 2013.

  1. DmitryDmitry

    DmitryDmitry Нуб

    Прошу помощи в установлении связи между двумя arduino при помощи xbee. Прошил xbee в X-CTU, подключил через шилды к arduino. Пытался подать сигнал на 8 контакт первого контроллера и принять его с 8 контакта второго контроллера. Но на выходе второго всегда держится высокий уровень. Подозреваю, что неправильно написана программа. Но где ошибка не понятно.
    Вот скетч для первого:

    //Считывание сигнала с джойстика

    int forwardsPin = 8;

    void setup()
    {
    Serial.begin(9600);
    }

    void loop()
    {
    int val = digitalRead(forwardsPin);
    Serial.println(val);
    delay(50);
    }

    Вот для второго:

    //Прием сигнала

    int input1 = 8;

    void setup()
    {
    Serial.begin(9600);
    }

    void loop()
    {
    while(Serial.available() == 0);
    int data = Serial.read();
    digitalWrite(input1, data);

    while (Serial.available()) { Serial.read(); }
    }


    Строчку while (Serial.available()) { Serial.read(); } взял как замену Serial.flush(); с комментария Амперки к видео. Так же плохо понимаю значение функции available.
     
  2. Unixon

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

    Функция available() возвращает количество байт, которые вы можете прочитать через read().
    Запись "while (Serial.available())" равноценна "while (Serial.available()!=0)".
     
  3. Unixon

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

    Передача
    Код (C):

    const int PIN_INPUT = 8;

    void setup()
    {
     pinMode(PIN_INPUT, INPUT);
     Serial.begin(9600);
    }

    void loop()
    {
     int val = digitalRead(PIN_INPUT);
     Serial.println(val);
     delay(50);
    }
     
    Прием
    Код (C):

    const int PIN_OUTPUT = 8;

    void setup()
    {
     pinMode(PIN_OUTPUT, OUTPUT);
     digitalWrite(PIN_OUTPUT, LOW);
     Serial.begin(9600);
    }

    void loop()
    {
     if (Serial.available())
     {
      byte data = Serial.read();
      digitalWrite(PIN_OUTPUT, data);
     }
    }
     
     
  4. DmitryDmitry

    DmitryDmitry Нуб

    Загрузил эти скетчи. После того как загорается красным цветом индикатор RSSI, на 8 контакте принимающей ардуины появляется высокий уровень и не исчезает.
     
  5. Mitrandir

    Mitrandir Гуру

    так команды погасить не проступало.

    Unixon немного ошибся имхо, надо вместо Serial.println использовать Serial.write.


    как я понял из скетчей и описания работы, digitalWrite(PIN_OUTPUT, data)

    гасит выход если дата равна 0, и выдает логическую единицу если data не равна 0.

    т.е. digitalWrite(PIN_OUTPUT,12) то же самое что и digitalWrite(PIN_OUTPUT,1)

    передатчик делает
    int val = digitalRead(PIN_INPUT);
    допустим val = 1, посылает по сериалу через принтлн, который преобразует 1 в строку 1 и посылает 3 байта : 49 13 10.

    Приемник получает эти цифры и делает
    digitalWrite(PIN_OUTPUT,49)
    digitalWrite(PIN_OUTPUT,13)
    digitalWrite(PIN_OUTPUT,10)

    зажигая три раза подряд огонек

    затем допусти отпустили кнопку,
    val = 0, передатчик посылает по сериалу через принтлн, который преобразует 0 в строку 0 и посылает 3 байта :48 13 10.

    Приемник получает эти цифры и делает
    digitalWrite(PIN_OUTPUT,48)
    digitalWrite(PIN_OUTPUT,13)
    digitalWrite(PIN_OUTPUT,10)

    продолжая зажигать выход
     
    Megakoteyka и DmitryDmitry нравится это.
  6. Mitrandir

    Mitrandir Гуру

    как нибудь блютус можно перевесить с Serial на Serial1 на меге?
     
  7. warman

    warman Гик

    воткнуть к другой Xbee-сокет на MegaIO шилде :)
     
    Mitrandir нравится это.
  8. DmitryDmitry

    DmitryDmitry Нуб

    надо вместо Serial.println использовать Serial.write.


    Вот так заработало. Всем спасибо.