Помогите поймать сигнал RF передатчика...

Тема в разделе "Проводная и беспроводная связь", создана пользователем KoKaiN, 15 ноя 2018.

  1. KoKaiN

    KoKaiN Нерд

    Всем доброго дня!

    Контекст такой - есть две Ардуино, которые требуется соединить "в одну сторону" с помощью приемника и передатчика на 433МГц.

    Не знаю насколько это принципиально, но использую библиотеки VirtualWire и передаю свою структуру данных длиной 6 байт на скорости 4000 б/с.

    Если я в loop() без каких либо перерывов на стороне передатчика отправляю данные, а в loop() на стороне приемника их принимаю (тоже без других подпроцессов) - все хорошо, данные передаются (видимо в какие-то моменты циклы приема передачи совпадают).

    Но если я нагружаю приемник и прередатчик какой-то логикой, когда между передачей появляются нерегуляргые задержки, а между сеансами приема - другие нерегулярные задержки, циклы практически не совпадают и пакеты не ловятся. Если хотя бы на одной стороне задержки убрать - ловиться нормально. Значит причина в несинхронности сеансов.

    Возможно ли на принимающей стороне повесить сигнал приемника на прерывание (свободный пин с прерыванием есть)? Какую библиотеку для работы с приемником использовать (VirtualWire подойдет)?
     
  2. parovoZZ

    parovoZZ Гуру

    значит сперва надо почитать даташиты на приборы, а не тупо копировать код с тырнетов.
     
  3. KoKaiN

    KoKaiN Нерд

    Да, спасибо за исчерпывающий совет.
    На этом можно закрывать ветку.

    Но если у кого-то будут конкретные предложения - код ниже

    Код (C++):
    #include <VirtualWire.h>
    #include <EasyTransferVirtualWire.h>

    byte unique_device_id = 2;   // номер устройства
    EasyTransferVirtualWire ET;

    struct SEND_DATA_STRUCTURE {
      byte device_id;      // код отправителя
      byte destination_id; // код полчателя, 0 - все, 1- мастер, 2-слейв 1,..
      byte packet_id;      // ID пакета
      byte command;        // тип команды управления, 0 - все выключить, 1 - управление анимацией
      unsigned int data;   // передаваемые данные от 0 до 65535
    };

    SEND_DATA_STRUCTURE mydata;

    const int receive_pin = 3; //код для приемника
    volatile unsigned long previousMillis = 0;   // момент последнего изменения состояния

    void setup() {

      ET.begin(details(mydata));

      vw_set_rx_pin(receive_pin); //код приемника
      vw_setup(4000);      // Скорость приёма
      vw_rx_start();       // Запуск режима приёма

      mydata.device_id = unique_device_id;
      mydata.destination_id = 2;
      mydata.command = 0;
      mydata.data = 0;

      Serial.begin(9600);
      Serial.println("Started.");

      randomSeed(analogRead(0));

    }

    void loop() {
      timer_LED_State();
      recMyData(); //код приемника
    }

    void recMyData()
    {
      if (ET.receiveData()) // получили пакет данных, обрабатываем
      {
        Serial.print("Got: ");
        Serial.print("Device ID: ");
        Serial.print(mydata.device_id);
        Serial.print(" Destination ID: ");
        Serial.print(mydata.destination_id);
        Serial.print(" Packet ID: ");
        Serial.print(mydata.packet_id);
        Serial.print(" Command: ");
        Serial.print(mydata.command);
        Serial.print(" Data: ");
        Serial.print(mydata.data);
        Serial.println();
      }
    }


    void timer_LED_State()
    {
      int interval = 100;
      unsigned long currentMillis = millis(); // текущее время в миллисекундах
      if ((currentMillis - previousMillis) > interval) {
        previousMillis = currentMillis;    // сохраняем последний момент, когда менялось состояние светодиода
        int d = random(100);
        delay(d); //тут начинаются процессы, которые я заменил задержкой и которые можно/нужно прервать при поступлении нового сигнала с приемника
      }
    }
     
     
    regent.correon нравится это.
  4. https://www.airspayce.com/mikem/arduino/VirtualWire/
    Тут хвалятся, что RadioHead совместима и более продвинута. Английский !
    Без инфы об радио-девайсах трудно что советовать.
     
    Последнее редактирование: 4 дек 2018
  5. Belkin

    Belkin Гик

    Возможно, только вы ни слова ни сказали про используемое оборудование.
    parovoZZ и не только вам про это же сказали...
    Какой интерфейс используется радиоканалом, тем прерыванием и пользуйтесь.
     
  6. KoKaiN

    KoKaiN Нерд

    Спасибо, буду пробовать.
    Про оборудование действительно не подумал написать так как все брал на Амперке и почему-то подумал что само собой разумеется. Пардоньте
    Беспроводной приёмник на 433 МГц http://amperka.ru/collection/wireless/product/rf-433-receiver
    Беспроводной передатчик на 433 МГц http://amperka.ru/collection/wireless/product/rf-433-transmitter
    Arduino Nano http://amperka.ru/collection/arduino/product/arduino-nano

     
  7. Belkin

    Belkin Гик

    Где-то уже говорил про них - какашка, которую не исправить... ;)
    Перечень недовольства даже не буду прикладывать...
    Первое - необходимость согласования (50/50) для устойчивой связи.

    Использую HC-12 - в разы удобнее и практичнее, но дороже...