Связать два Arduino через RS-485 Shield

Тема в разделе "Arduino & Shields", создана пользователем Salomatin, 22 окт 2016.

  1. Salomatin

    Salomatin Гик

    Беру два Iskra Neo и два RS-485 Shield
    Задача:
    С компьютера передать на ведущий Arduino символ "а", а уже он передает команду на ведомый, который в свою очередь зажигает светодиод.

    Собираю схему: Подключаю по USB первый Arduino с компьютером как обычно. Загружаю скетч типа:
    Код (C++):
    int ledPin13 = 13;
    int incomingByte;
    void setup() {
        Serial.begin(9600);
        pinMode(ledPin13, OUTPUT);
      }
    void loop() {
      if (Serial.available() > 0) {
        incomingByte = Serial.read();
        if (incomingByte == 'a') {
          digitalWrite(13, HIGH);
        }
        if (incomingByte == 'b') {
          digitalWrite(13, LOW);
        }
    Посылаю с монитора "а" - светодиод загорается, "в" - гаснет.

    Поскажите примеры подключения двух Arduino при помощи RS-485 Shield. На вики есть пример "Карта активности", но там больше про то как рисовать проемы. Для того чтобы понять, надо для начала просто включить и выключить светодиод. Таких примеров не нашел.

    Понимаю, что нужно передавать через Serial, но он у меня занят на ведомом. Надо переключить на Serial1. Но как это сделать именно на RS-485 Shield. Или это невозможно и надо все перепаивать?
    Хорошо, тогда как подключить пины TX и RX к другим контактам управляющей платы и какие это вызовет изменения в программе.

    Наконец, что должно быть прописано для передачи символа "а" с одной Arduino на удаленную. Уверен что просто, но не найду где почитать.

    Спасибо.
     
  2. ostrov

    ostrov Гуру

    Может вам отдельные модули RS485 купить, цена им 100 руб за пару. И цеплять их можно на любые Serial хоть аппаратные хоть программные.
     
  3.  
    Salomatin нравится это.
  4. Salomatin

    Salomatin Гик

    Хорошо. Наверное так получится короче.
    Тогда собираю такую схему:
    Linux компьютер, к нему подключаю USB-RS485 (куплю). По двум проводам подключаю мои два комплекта Iskra Neo плюс RS-485 Shield
    Буду пробовать включать и выключать светодиод с компьютера на удаленных устройствах.

    Подскажите код кто уже сталкивался. Или интересные ссылки.
    (Если получится запустить, то опубликую тут описание рабочего варианта и примеры кодов)

    Ролик "Проводное соединение Arduino при помощи RS485" посмотрел". Спасибо. Там наглядно показано как TX и RX менять. Но если управлять напрямую с компьютера, то это станет не так важно.
    Хотя хотелось бы все-таки узнать про RS-485 Shield поподробнее. Иначе получается микросхема
    за 20 рублей намного эффективнее, раз все равно паять.
     
    Последнее редактирование: 22 окт 2016
  5. ostrov

    ostrov Гуру

    Принцип работы такой же как обычный UART, то есть в IDE все через класс Serial. Если устройств более двух, то чуть сложнее, надо их согласовывать чтобы не галдели хором. Что до шилда, то он удобен только своим размером и креплением, больше преимуществ нет. Хорошо для прототипирования. А доя готового устройства можно вообще взять голые MAX485(7), припаять к ним нужные резисторы и все будет замечательно работать за копейки.
     
  6. ostrov

    ostrov Гуру

    Задачу саою уточните, я из описания не пойму 2 или 3 устройства.
     
  7. Salomatin

    Salomatin Гик

    Неважно. В наличии два устройства. Для начала зажигать светодиод на одном.
    Пока не могу управлять с компа на первой паре Iskra Neo плюс RS-485 Shield просто мигаю 13 светодиодом и посылаю по Serial символ. Пытаюсь отловить его на втором устройстве.

    То есть сводим задачу к более простому варианту. Есть пара Iskra Neo плюс RS-485 Shield
    Раз в две секунды посылаем в Serial символ "A", через две секунды "B".
    Соединяем со второй парой Iskra Neo плюс RS-485 Shield двумя проводами.
    Вторая пара принимает символ А - зажигает 13 светодиод. Получает В гасит.
     
    Последнее редактирование: 22 окт 2016
  8. ostrov

    ostrov Гуру

    Элементарная задача же. И примеров полно. Даже в Матрешкиных есть.
     
  9. Salomatin

    Salomatin Гик

    Вы не поняли, я уточнил в предыдущем ответе. Мигать светодиодом получается.
    Вопрос как это передать на удаленную Arduino, чтобы светодиод мигал по команде первого
     
  10. ostrov

    ostrov Гуру

    Я пример дал именно про это, только в качестве источника команды сделайте не комп, а вторую Ардуину.
     
  11. ostrov

    ostrov Гуру

    На одном Serial.write() когда надо, на другом можно или постоянно опрашивать в ожидании или сделать по прерыванию через Serial.event().
     
  12. Salomatin

    Salomatin Гик

    Что-то пока не работает. Пробую такой вариант. Может где ошибка.

    Ведущее:
    Код (C++):

    int EN = 2;

    void setup() {
      // initialize digital pin 13 as an output.
      pinMode(13, OUTPUT);
      pinMode(EN, OUTPUT );
      Serial.begin (9600);
    }

    // the loop function runs over and over again forever
    void loop() {
      digitalWrite(EN, HIGH ); // enable send
      digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
      Serial.print ( 'A' );
      delay(2000);              // wait for a second
      digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
      Serial.print ( 'B' );
      delay(2000);              // wait for a second
    }

    Ведомое

    Код (C++):
            #define LED_PIN_YELLOW   13
    void setup()
    {
      // открываем последовательный порт на пинах 1 и 0
      // к которому подключён модуль RS-485
      Serial.begin(9600);
      // 5 пин в режим выхода
      pinMode(LED_PIN_YELLOW, OUTPUT);
    }
    void loop()
    {
      // если появились данные с модуля RS-485
      if (Serial.available() > 0) {
        // считываем
        char c = Serial.read();
        // если символ равен 'A'
        if (c == 'A') {
          // зажигаем светодиод
          digitalWrite(LED_PIN_YELLOW, HIGH);
        } else if (c == 'B') {
          // если символ равен 'B'
          // гасим светодиод
          digitalWrite(LED_PIN_YELLOW, LOW);
        }
      }
    }
     
  13. ostrov

    ostrov Гуру

    Попробуйте вместо Serial.print использовать Serial.write.

    На первый взгляд все правильно, может связи нет? А и Б не перепутали?
     
  14. Salomatin

    Salomatin Гик

    Не помогло.
    Перепроверил. Перепроверил еще раз. Прозвонил, менял местами.

    Там на плате два переключателя еще есть. Но методом научного тыка проверил во всех положениях. Светодиод на второй плате не мигает.

    Есть кто на форуме, кто удачно связывал через RS-485 Shield ?
     
  15. Salomatin

    Salomatin Гик

    Короче разобрался.

    Ошибки в коде никакой нет.

    Есть особенность платы Iskra Neo . В лоб с RS-485 Shield она работать не будет.
    Надо подключаться по другому и обходить программно.
    Удачно соединилась с Arduino Leonardo
    То же самое при работе с протоколом i2c.