RS 485 and Arduino Nano

Тема в разделе "Arduino & Shields", создана пользователем Rabil', 23 ноя 2016.

  1. Rabil'

    Rabil' Нерд

    Добрый день уважаемые Ардуиншики, Нужна помощь.
    Вот уже как 4 месяца бьюсь с интерфейсом RS 485. Не могу заставить работать всю эту канитель. Идея проста 1 Мастер контроллер и 4 слейва.
    Мастер опрашивает каждый слейв, и если на одном из слейвов срабатывает датчик температуры, IMG-20161123-WA0025 — копия.jpg то мастер контролер отдает инструкции на включение одного из светодиодов того же слейва где сработал датчик температуры. Если есть хоть какие то простые скетчи по передачи данных по RS 485 то прошу мне в этом помочь. На этой фотке изображен Мастер контроллер и два слейва, а так слевов будет 4. Датчики температуры на фото не стал соединять, но имейте в виду что один из пинов в слейве датчик температуры, а остальные две светодиоды. И посмотрите пожалуйста правильно ли я все соеденил)))
     
  2. qwone

    qwone Гик

    Соединение это х... Главное организовать протокол. Без организации простого протокола ничего не получится.
    Хотя бы организуй как с DS18B20.
     
  3. Rabil'

    Rabil' Нерд

    Ну вот именно мне и нужен протокол обмена данными. А то что ты мне написал про датчик температуру он мне пока неинтересен.
     
  4. qwone

    qwone Гик

    Последнее редактирование: 23 ноя 2016
  5. Rabil'

    Rabil' Нерд

    протокол передачи данных — набор соглашений интерфейса логического уровня, которые определяют обмен данными между различными программами.
     
  6. qwone

    qwone Гик

    Осталось вам понять что за этими словами стоит.
     
  7. Rabil'

    Rabil' Нерд

    Вы можете мне помочь решить мою проблему???
     
  8. qwone

    qwone Гик

    Ваша проблема в непонимании что такое протокол. А готовых программных решений у меня нет.
     
  9. Alex19

    Alex19 Гуру

    По подключению, сложно сказать по фото, мне не все было видно. Для начала подключите 2 устройства, по данной схеме, мастер и слейв.
    [​IMG]
    Для 3-х и более, данные модули нужно "допилить", почитайте тут - http://forum.amperka.ru/threads/Стабильность-сети-rs485.8502/.

    Затем определитесь как Вы хотите передавать данные, по какому-то протоколу, к примеру Modbus RTU\ASCII или просто отправлять массив с данными между Arduino.

    Сам протокол Modbus RTU, вещь хорошая, но для такой задачи он немного избыточен. Мне кажется, Вам проще и быстрее сделать передачу массивов данных между Arduino. Вот не плохой пример - http://wiki.amperka.ru/projects:activitymap.

    Если захотите Modbus RTU, есть не плохая библиотека - https://habrahabr.ru/post/249043/, в качестве слейва сам использую, в качестве мастера не проверял. У нее есть небольшие ограничения, но судя по задачи они Вас не коснутся.

    UPD. Конечно у Modbus RTU есть свои не оспоримые плюсы в плане надежности, проверке целостности передаваемых данных. Исходил из того, что проект хоббиный, поэтому советовал простую передачу массивами.
     
    Последнее редактирование: 24 ноя 2016
  10. Tomasina

    Tomasina Сушитель лампочек Модератор

  11. SDV

    SDV Нерд

    Доброго времени суток. Пытаюсь разобраться с RS485 на простом примере. Почему-то не получается, подскажите пожалуйста, где и что я сделал не так?
    Схема во вложении.
    Скетч на ардуино нано:
    Код (C++):
    [code]
    #include <SoftwareSerial.h>

    SoftwareSerial RS485 (0, 1);

    #define DIR 10

    void setup(){
      Serial.begin (9600);
      RS485.begin (4800);

      pinMode (DIR, OUTPUT);
      digitalWrite (DIR, LOW);
    }

    void loop(){
      digitalWrite(DIR, HIGH);
      RS485.println(millis());
      digitalWrite(DIR, LOW);
      delay (1000);
      }

     
    скетч для Уно:
    Код (C++):
    [code]
    #include <SoftwareSerial.h>

    SoftwareSerial RS485 (7, 6);

    #define DIR 13

    void setup(){
      Serial.begin (9600);
      RS485.begin (4800);

      pinMode (DIR, OUTPUT);
      digitalWrite (DIR, LOW);
    }

    void loop(){
      if (RS485.available()){
        Serial.write(RS485.read());
      }
    }

     
    [​IMG]
     

    Вложения:

  12. ZAZ-965

    ZAZ-965 Гуру

    @SDV, а зачем вы на Nano инициализируете SoftwareSerial на тех же пинах на которых работает железный Serial? При этом железный Serial инициализируется, но не используется.
    Код (C++):
    #define DIR 10

    void setup(){
      Serial.begin (4800);
      pinMode (DIR, OUTPUT);
      digitalWrite (DIR, LOW);
    }

    void loop(){
      digitalWrite(DIR, HIGH);
      Serial.println(millis());
      digitalWrite(DIR, LOW);
      delay (1000);
      }
     
  13. parovoZZ

    parovoZZ Гуру

    НЕ понял, хочешь преобразователь портов что ле?
    Вот для леонардо. Набросал за 30 секунд. Лично проверено.
    Код (C++):
    #include <SoftwareSerial.h>

    void setup() {

      Serial.begin(9600);
      while (!Serial) {
      }
      Serial1.begin(9600);
      Serial.println("Goodnight moon!");
    }

    void loop() {
      if (Serial1.available()) {
        Serial.write(Serial1.read())
        Serial.println(Serial.read());
      }
      if (Serial.available()) {
        Serial1.write(Serial.read());
      }
    }
     
  14. SDV

    SDV Нерд

    Залил Ваш скетч, теперь Уно начала принимать сигнал, но не корректный, не миллисекунды как нужно, а букву «я» =)) каждую итерацию приема данных…

    Попробовал поменять местами передатчик и приемник. Передатчиком сделал Уно, приемником Нано, опять ни чего не получается… Помогите пожалуйста разобраться со скетчами…
     
  15. SDV

    SDV Нерд

    Попробовал поменять местами передатчик и приемник. Передатчиком сделал Уно, приемником Нано. В мониторе порта на Нано какая-то белиберда... Куда дальше рыть?

    Скетч для Нано
    Код (C++):

    #define DIR 8

    void setup(){
      Serial.begin (4800);
      pinMode (DIR, OUTPUT);
      digitalWrite (DIR, LOW);
    }

    void loop(){
      if (Serial.available()) {
        Serial.write(Serial.read());
    //  digitalWrite(DIR, LOW);
    //  delay (1000);
      }
    }
     
    Скетч для Уно
    Код (C++):

    #include <SoftwareSerial.h>

    SoftwareSerial RS485 (7, 6);

    #define DIR 13

    void setup(){
      Serial.begin (9600);
      RS485.begin (4800);

      pinMode (DIR, OUTPUT);
      digitalWrite (DIR, LOW);
    }

    void loop(){
    //  if (RS485.available()){
    //    Serial.write(RS485.read());
      digitalWrite(DIR, HIGH);
      RS485.println(millis());
      digitalWrite(DIR, LOW);
      delay (1000);
      }
     
     

    Вложения: