Декодирование данных, полученных с помощью радиомодуля WL-101 433 МГц

Я нашел тонны библиотек. Но, как я понимаю, все они сделаны для связи приемника с передатчиком одного и того же типа (WL101 - WL102). И они работают в соответствии со своим особым протоколом.

Я хочу использовать arduino и модуль приемника для анализа различных данных из воздуха на частоте 433 МГц. На выходе этого приемника уже есть сигнал звуковой частоты, поэтому я хотел бы сначала понаблюдать за ним на графике, увидеть определенные изменения амплитуды, когда передатчик находится рядом с моим пультом дистанционного управления, а затем написать свой собственный протокол приема данных для извлечения битов.

Я попытался подключить приемник к аналоговому выходу arduino и построить график, но ничего не выходит, всегда есть какие-то импульсы. Что-то я делаю не так.

uint32_t t; // Time that always increases
uint32_t myTimer1;

unsigned long startTime; //Turn on two timers, this one
unsigned long elapsedTime; // and this one


#include <util/atomic.h>

// Used analog input A0
const uint8_t analog_in = 0;

// The frequency we want to determine is in Hz.
const float SIGNAL_FREQ = 1000.0;

// Bits of time.
const float SAMPLING_FREQ = F_CPU / (128 * 13.0);  // 9.615 kHz
const long PHASE_INC = round(SIGNAL_FREQ / SAMPLING_FREQ * (1L << 16));
const int LOG_TAU = 6;  // tau = 64 / SAMPLING_FREQ = 6.656 ms

// Set the ADC to "free running mode"
static void configure_adc()
{
  ADMUX  = _BV(REFS0)  // ref = AVCC
           | _BV(ADLAR)  // left adjust result
           | analog_in;  // input channel
  ADCSRB = 0;          // free running mode
  ADCSRA = _BV(ADEN)   // enable
           | _BV(ADSC)   // start conversion
           | _BV(ADATE)  // auto trigger enable
           | _BV(ADIF)   // clear interrupt flag
           | _BV(ADIE)   // interrupt enable
           | 7;          // prescaler = 128
}

//Demodulated (I, Q) amplitudes.
volatile int16_t signal_I, signal_Q;

// The interrupt handler is called each time the ADC is ready to read.
ISR(ADC_vect)
{
  // Read the ADC and convert it to a sign number.
  int8_t sample = ADCH - 128;

  // Update the phase of the local oscillator.
  static uint16_t phase;
  phase += PHASE_INC;

  // Multiplication of samples by rectangular waves in quadrature.
  int8_t x = sample;
  if (((phase >> 8) + 0x00) & 0x80) x = -1 - x;
  int8_t y = sample;
  if (((phase >> 8) + 0x40) & 0x80) y = -1 - y;

  // First order low pass filter.
  signal_I += x - (signal_I >> LOG_TAU);
  signal_Q += y - (signal_Q >> LOG_TAU);
}


/ * Return power readings. * /
    static uint16_t get_power_reading()
    {
      int16_t I, Q;
      ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
        I = signal_I;
        Q = signal_Q;
      }
      return sq((int8_t)(I >> LOG_TAU)) + sq((int8_t)(Q >> LOG_TAU));
    }
    void setup()
    {
      configure_adc();
      Serial.begin(9600); // Enable serial port
    }
    
void loop()
{
  // We display power readings every 8 ms.
  static const uint16_t print_period = 8;
  static uint16_t last_print;
  uint16_t now = millis();

  if (now - last_print >= print_period)
  {
      Serial.println(get_power_reading());  // Build a graph (signal power versus time) by which you can determine the optimal threshold
    last_print += print_period;
  }
}

, 👍2

Обсуждение

невозможно догадаться, в чем дело ... мы не знаем, что вы подключили, как вы это подключили и какой код вы запустили, @jsotola

Я пытаюсь построить график и увидеть там низкие и высокие уровни, которые я передаю с помощью своего передатчика. Для этого я использую программу для считывания данных с аналогового порта arduino, к которому подключен модуль приемника 433 МГц. Однако ничего не принимается., @Антон


1 ответ


1

Он не работает из-за:

Скорость

Рассмотрим частоту устройства 433 МГц по сравнению с скорость последовательного монитора. Устройство посылает сигналы с шириной импульсов в диапазоне десятков микросекунд, в то время как последовательный монитор не может отображать так быстро.

Ваш код должен проанализировать сигналы, очистить шум (выход устройства очень шумный) и выяснить протокол. Все это делается с помощью специализированных библиотек, таких как rc-коммутатор, который очень обширен и надежен по сравнению с простым считыванием контакта и выводом выходных данных.

цифровой

Устройство восстановления выдает цифровой импульс, по изменению ширины которого можно определить последовательность чисел, передаваемых пультом дистанционного управления. Каждый такой протокол ASK имеет свои временные характеристики, которым вы должны следовать, чтобы расшифровать код.

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

void setup() {
  Serial.begin(6000000);
  attachInterrupt(digitalPinToInterrupt(1), handleInterrupt, CHANGE);
}

void loop() {
}

void handleInterrupt() {
  bool s = digitalRead(1);
  Serial.println(s);
}

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

,

Спасибо. Но, к сожалению, я не могу получить абсолютно ничего с вашим кодом. Я попытался разобраться в библиотеке, но не получил никаких данных. Насколько я понимаю, библиотека работает строго по определенному протоколу, и импульсы, которые я посылаю, она принимает за шум, может быть., @Антон

Кроме того, используемый вами модуль ограничен запросом, поэтому, если вы отправляете что-либо еще, это не будет обнаружено. Что касается примера кода, а не того, что он прослушивает вывод прерывания 1 (PA23_TC4-W1 на MKR 1010 WIFI), проверьте с помощью своего Arduino, какой контакт он должен отображаться для работы и передачи с совместимого устройства или пульта дистанционного управления., @Nino

Как то мне здесь помог человек при решении подобной задачи, он поделился кодом, который из частот уровня лишь частоту 1 кГц и уже на ней сигнал анализировался. Это было Гомодинное обнаружение. Сейчас я не знаю заранее точной частоты, которую нужно построить, пробовал использовать код, на обнаружение 1 кГц, но он не обнаруживает мой сигнал. Мне нравится этот код тем, что он позволяет установить АЦП ардуино в режиме прямого преобразования, то есть обрабатывать сигнал очень быстро. Подскажите, как можно оставить этот режим работы АЦП, но убрать выделение сигнала 1 кГц?, @Антон

@Эдгар Бонет, я использовал ваш код для обнаружения гармонического сигнала 1 кГц. Скажите, как я могу использовать его для обнаружения прямоугольного импульса длительностью 640 мкс?, @Антон