max485 UNO+Mega

Тема в разделе "Arduino & Shields", создана пользователем user999, 29 авг 2017.

  1. user999

    user999 Гик

    Добрый день!
    Загружаю пример библиотеки SoftEasyTransfer на UNO и на MEGA. Связываю их с помощью двух модулей MAX485. Если MEGA выступает мастером (SoftEasyTransfer_TX_Example) и отправляет данные, а UNO слейвом (SoftEasyTransfer_RX_Example) и принимает данные, то пример работает. А если скетчи поменять местами, то пример не работает. MEGA не принимает данные. Кто работал с этой библиотекой, в чем может быть дело?
     
  2. NikitOS

    NikitOS Король шутов Администратор

    Почему сразу же библиотека?! Вы загрузили правильно(выбор платы,порта и.т.д)
     
  3. user999

    user999 Гик

    ну конечно
     
  4. sslobodyan

    sslobodyan Гик

    А прием-передача переключается правильно? Обычная проблема на 485. Библиотека простейшая, там нечему не работать :) Если конечно порт принимает-отдает символы корректно.
     
  5. user999

    user999 Гик

    В примере она не переключается. На одной плате управляющий пин в LOW (которая принимает), на другой в HIGH (которая передает)
     
  6. b707

    b707 Гуру

    Совсем не "конечно" - ошибка в библиотеке в тыщу раз мнее вероятна. чем то что вы что-то сделали неправильно сами
     
  7. sslobodyan

    sslobodyan Гик

    Вначале отправьте просто один байтик и примите на приемной стороне. Заработает - тогда юзаем библиотеку.
     
  8. user999

    user999 Гик

    Если перепутать тип платы или порт, скетч не загрузится, ошибки вылезут. В моем случае ошибок нет. Загружается отлично, Но когда меняешь местами скетчи на платах, то работать перестает
     
  9. 9xA59kK

    9xA59kK Гик

    А где сам скетч?? И как вы соединяете. У UNO и Mega разные порты на rx tx.
     
  10. user999

    user999 Гик

    SoftEasyTransfer_RX_Example
    Код (C++):
    #include <SoftEasyTransfer.h>

    /*   For Arduino 1.0 and newer, do this:   */
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(2, 3);

    /*   For Arduino 22 and older, do this:   */
    //#include <NewSoftSerial.h>
    //NewSoftSerial mySerial(2, 3);


    //create object
    SoftEasyTransfer ET;

    struct RECEIVE_DATA_STRUCTURE{
      //put your variable definitions here for the data you want to receive
      //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
      int16_t blinks;
      int16_t pause;
    };

    //give a name to the group of data
    RECEIVE_DATA_STRUCTURE mydata;

    void setup(){
      mySerial.begin(9600);
      //start the library, pass in the data details and the name of the serial port.
      ET.begin(details(mydata), &mySerial);

      pinMode(13, OUTPUT);

    }

    void loop(){
      //check and see if a data packet has come in.
      if(ET.receiveData()){
        //this is how you access the variables. [name of the group].[variable name]
        //since we have data, we will blink it out.
        for(int i = mydata.blinks; i>0; i--){
          digitalWrite(13, HIGH);
          delay(mydata.pause * 100);
          digitalWrite(13, LOW);
          delay(mydata.pause * 100);
        }
      }
      //you should make this delay shorter then your transmit delay or else messages could be lost
      delay(250);
    }
     
    Добавил в setup:
    Код (C++):
      pinMode(10, OUTPUT);
      digitalWrite(10, LOW);
    SoftEasyTransfer_TX_Example
    Код (C++):
    #include <SoftEasyTransfer.h>

    /*   For Arduino 1.0 and newer, do this:   */
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(2, 3);

    /*   For Arduino 22 and older, do this:   */
    //#include <NewSoftSerial.h>
    //NewSoftSerial mySerial(2, 3);



    //create object
    SoftEasyTransfer ET;

    struct SEND_DATA_STRUCTURE{
      //put your variable definitions here for the data you want to send
      //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
      int16_t blinks;
      int16_t pause;
    };

    //give a name to the group of data
    SEND_DATA_STRUCTURE mydata;

    void setup(){
      mySerial.begin(9600);
      //start the library, pass in the data details and the name of the serial port.
      ET.begin(details(mydata), &mySerial);

      pinMode(13, OUTPUT);

      randomSeed(analogRead(0));

    }

    void loop(){
      //this is how you access the variables. [name of the group].[variable name]
      mydata.blinks = random(5);
      mydata.pause = random(5);
      //send the data
      ET.sendData();

      //Just for fun, we will blink it out too
       for(int i = mydata.blinks; i>0; i--){
          digitalWrite(13, HIGH);
          delay(mydata.pause * 100);
          digitalWrite(13, LOW);
          delay(mydata.pause * 100);
        }

      delay(5000);
    }
     
    Добавил в setup:
    Код (C++):
      pinMode(10, OUTPUT);
      digitalWrite(10, HIGH);
    Соединил так:
    [​IMG]
    RO - на 2-й пин
    DI - на 3-й пин
    DE и RE - перемычка и на 10-й пин
     
  11. sslobodyan

    sslobodyan Гик

    От же ж елки-палки :) Байтик просто от одной платы к другой гоняли? Без всяких библиотек, чисто у одной стороны Serial.print а на другой стороне Serial.available и прочитать этот байтик? А затем сменить роли у плат? Ну это же первое, что надо сделать при проблемах с передачей. Не надо лезть в дебри библиотек, даже 100% рабочих. Сначала проверьте среду передачи. Неконтакт, разные настройки портов, случайно ткнулись не в тот пин, не работает модуль 485 - да проблем может быть мульен с хвостиком :) А вы раз - и отбросили все их одним байтиком. Потому что байтик пошел - значит и структура должна пойти через библиотеку :) А пока гадаем на кофейной гуще чего там могло случиться.
     
    arkadyf нравится это.
  12. user999

    user999 Гик

    Взял 2 меги. Подключил по вышеуказанной схеме.
    rx скетч:
    Код (C++):
    char buffer[100];
    void setup(){
      Serial.begin(9600);
      pinMode(10, OUTPUT);
      digitalWrite(10, LOW);
    }

    void loop(){
      int i = 0;
      if (Serial.available()) {
        delay(100);
        while (Serial.available() && i<99) {
          buffer[i++] = Serial.read();
        }
        buffer[i++] = '\0';
        if (i > 0) {
          Serial.println(buffer);
        }
      }
    }
    tx скетч:
    Код (C++):
    void setup(){
      Serial.begin(9600);
      pinMode(10, OUTPUT);
      digitalWrite(10, HIGH);
    }

    void loop(){
      for(int i=0;i<20;i++) {
        Serial.print(i);
        delay(1000);
      }
    }
    Одна мега принимает инфу, другая нет. Модули max485 менял местами, не помогло. Может что не так подключил? Причем мега принимает, которая вчера от уны не принимала.
     
  13. sslobodyan

    sslobodyan Гик

    Вот, начинает приходить понимание процесса отладки :) А теперь отцепитесь от 485, свяжите модули напрямую (надеюсь питание у них по 3 вольта?) по сериалу и повторите эксперимент. Заработает - ардуины в порядке, дальше ищем проблему с 485. Не заработает - проблемка в какой-то из ардуин.
    И желательно не выдумывать себе огромные тестовые скетчи. Будьте проще - отсылайте один байтик каждую секунду. А на приемнике как только доступен байт на чтение - считываем и зажигаем светодиод. Ждем 300 мс и тушим светодиод. Все, никаких возможных проблем с массивами, индексами и т.п. Проверяем только связь.
     
  14. user999

    user999 Гик

    Короче 3 дня потратил, что бы связать UNO+MEGA+MEGA. То одна не читает порт, то другая не отправляет.
    С UNO вопрос решился увеличением ожидания:
    вместо
    Код (C++):
    digitalWrite(DIR, HIGH);
              delay(10);
              ETtx.sendData();
              delay(50);
            digitalWrite(DIR, LOW);
    поставил
    Код (C++):
    digitalWrite(DIR, HIGH);
              delay(50);
              ETtx.sendData();
              delay(100);
            digitalWrite(DIR, LOW);
    А вторая MEGA никак не хотела работать на Serial0, пришлось на Serial1 подключать.
    Может кому пригодится информация