Leonardo + max485

Тема в разделе "Arduino & Shields", создана пользователем Rustam96, 17 фев 2020.

Метки:
  1. Rustam96

    Rustam96 Нерд

    Помогите разобрать. К Leonardo подключил MAX485 2 шт.
    Через преобразователь подключил к компьютеру.
    Программой COM Port Toolkit 4.0 шлю запросы (06 03 00 01 00 02 94 7C и 03 03 00 01 00 02 94 29 ) в порт.
    Все хорошо если подключено 1-о устройство. Но как только я подключаю 2-е, Первое приходить с лишними байтами а второе вообще не отвечает.

    Код (C++):
    #include <EEPROM.h>
    #include <SoftwareSerial.h>
    #include "crc_modbus.h"
    #include "func.h"

    SoftwareSerial RS485(8, 9);
    const uint8_t ENABLE_PIN = 10;
    uint8_t r[8];
    uint8_t sendr[9];
    long portspeed = 9600;

    double randomDouble;

    void setup(void) {
      RS485.begin(portspeed);
      pinMode(ENABLE_PIN, OUTPUT);
      digitalWrite(ENABLE_PIN, LOW); // переводим модуль в режим приёма данных
      delay(100);
    }

    void loop() {
      //digitalWrite(ENABLE_PIN, LOW);   // переводим модуль в режим приёма данных
      //delay(16);

      if (RS485.available() >= 8) { // если в последовательном порту есть данные для чтения, то ...
        RS485.readBytes(r, 8);
        if (r[0] == EEPROM.read(0)) {
          if (r[1] == 03) {
            RS485.end();//Очищаем буфер обмена
            RS485.begin(portspeed);//инициализируем порт.
            randomDouble = random(-3000, 3000);

            gx.gxval = randomDouble;

            sendr[0] = EEPROM.read(0);
            sendr[1] = r[1];
            sendr[2] = 4;

            sendr[3] = gx.gxd[3];
            sendr[4] = gx.gxd[2];
            sendr[5] = gx.gxd[1];
            sendr[6] = gx.gxd[0];

            unsigned short crc22 = CRC16_MB(sendr, 7);
            c.cval = crc22;
            //Котрольная сумма
            sendr[7] = c.cd[0];
            sendr[8] = c.cd[1];
            digitalWrite(ENABLE_PIN, HIGH);  // переводим модуль в режим передачи данных
            delay(16);
            for (int e = 0; e < 9; e++) { //9 количество значений в массиве.
              RS485.write(sendr[e]);
            }
            digitalWrite(ENABLE_PIN, LOW); // переводим модуль в режим приёма данных
            delay(16);
          }
        } else {
          digitalWrite(ENABLE_PIN, LOW); // переводим модуль в режим приёма данных
          delay(16);
        }
      }
    }
     
  2. parovoZZ

    parovoZZ Гуру

    Надо бы, наверное, схемку приложить. А то не ясно, что к чему подключено.
     
  3. Rustam96

    Rustam96 Нерд

    [​IMG]DE RE = 10 pin
    RO = 8 pin
    DI = 9 pin
    VCC = +5V
    GND = GND Leonardo
    A, B, = Линия
     
  4. parovoZZ

    parovoZZ Гуру

    Это как-то объясняет это:
    ?
     
  5. Rustam96

    Rustam96 Нерд

    Я вопроса не понял. У меня нет объяснения этому феномену.
    1. Может условия не правильны в программе,
    2. считывание входящего пакета,
    3. переключения MAX485 на считывание и запись,
    4. может физическое подключение не верное но пока я это исключаю, когда подключено 1-о устройство ответ получаю нормально.
     
  6. Rustam96

    Rustam96 Нерд

    Нашел вроде ошибку питание не правильно подаю походу.
     
  7. b707

    b707 Гуру

    вас спрашивают, как вы два модуля подключаете. Вы пины только для одного перечислили.
     
  8. Rustam96

    Rustam96 Нерд

    Рисовать не умею
     

    Вложения:

  9. Rustam96

    Rustam96 Нерд

    Сейчас я RAW на питание посадил. Если честно все ровно не работает с 2-я подключенными Leonardo. Но у меня 5В 2А питание может не хватает, пишут надо 7-9В
     
  10. parovoZZ

    parovoZZ Гуру

    Пока не будет схемы, не будет и ответа.
     
  11. Rustam96

    Rustam96 Нерд

    Фото выше не подойдет ?
     
  12. Daniil

    Daniil Гуру

    по ней плохо видно
     
    b707 нравится это.
  13. b707

    b707 Гуру

    5в на RAW подавать нельзя, миниум 7в
    Зато 5в можно без проблем подавать на пин 5в на Леонардо
     
  14. b707

    b707 Гуру

    попробуйте там сами проследить, какая перемычка куда идет... получается?
    Не издевайтесь над людьми, учиться рисовать схемы все равно надо, раз ардуиной увлеклись
     
  15. Rustam96

    Rustam96 Нерд

    Тут получше должно быть.
     

    Вложения:

  16. Rustam96

    Rustam96 Нерд

    7В подал на RAW
     
  17. Rustam96

    Rustam96 Нерд

    Код (C++):
    #include <EEPROM.h>
    #include <SoftwareSerial.h>
    #include "crc_modbus.h"
    #include "func.h"

    SoftwareSerial RS485(8, 9);
    const uint8_t ENABLE_PIN = 10;
    long portspeed = 9600;
    unsigned char buffer[8];

    void setup(void) {
      RS485.begin(portspeed);
      pinMode(ENABLE_PIN, OUTPUT);
      digitalWrite(ENABLE_PIN, LOW); // переводим модуль в режим приёма данных
      delay(100);
      //EEPROM.write(0, id);
    }

    void loop() {
      //digitalWrite(ENABLE_PIN, LOW);   // переводим модуль в режим приёма данных
      //delay(16);

      if (RS485.available() >= 8) { // если в последовательном порту есть данные для чтения, то ...
        RS485.readBytes(buffer, 8);//считываем символы, поступающие через последовательный порт. прекращает свою работу после обработки заданного количества символов.
        uint8_t id = 0x0C;
        //uint8_t id = 0x10;
        for (int f = 0; f < 8; f++) {
          if (buffer[f] == id) {
            digitalWrite(ENABLE_PIN, HIGH);  // переводим модуль в режим передачи данных
            delay(16);
            for (int l = 0; l < 8; l++) {
              RS485.write(buffer[f + l]);
            }
            delay(16);
            digitalWrite(ENABLE_PIN, LOW);
          }
        }
      }
    }
    Упрастил код не использую EEPROM память, У меня пока работает
     
  18. Rustam96

    Rustam96 Нерд

    Начинаю использовать EEPROM не работает. Есть у кого идея как хоронить ID устройства с возможностью изменения не использую EEPROM память? Что бы после перезагрузки не слетела.
     
  19. b707

    b707 Гуру

    ЕЕПРОМ то тут причем?
    Разбирайтесь с кодом. ГДЕ-ТО ЭЛЕМЕНТАРНАЯ ОШИБКА
     
  20. parovoZZ

    parovoZZ Гуру

    Я по фото не гадаю.
    Возможно, что здесь найдётся любитель реверс-инжиниринга, но мне оно не надо. Уважайте других.