должен ли считывать коды Радиомодуль 433МГц, MX-05V/XD-RF-5V от пульта 433.92?

Тема в разделе "Проводная и беспроводная связь", создана пользователем stepviz1, 6 ноя 2016.

  1. stepviz1

    stepviz1 Нерд

    Припаял антенну все равно в сериал порт тишина !
    Как можно проверить работоспособность приемника ? У меня нет второй Ардуины !
     
  2. stepviz1

    stepviz1 Нерд

    Побывал этот скетч тоже тишина !



    #define LED_PIN 13
    #define HCS_RECIEVER_PIN 2 // пин к которому подключен приемник для брелков


    class HCS301 {
    public:
    unsigned BattaryLow : 1; // На брелке села батарейка
    unsigned Repeat : 1; // повторная посылка
    unsigned BtnNoSound : 1;
    unsigned BtnOpen : 1;
    unsigned BtnClose : 1;
    unsigned BtnRing : 1;
    unsigned long SerialNum;
    unsigned long Encript;

    void print();
    };

    volatile boolean HCS_Listening = true;
    byte HCS_preamble_count = 0;
    uint32_t HCS_last_change = 0;
    uint32_t HCS_start_preamble = 0;
    uint8_t HCS_bit_counter; // счетчик считанных бит данных
    uint8_t HCS_bit_array[66]; // массив считанных бит данных
    #define HCS_TE 400 // типичная длительность имульса Te
    #define HCS_Te2_3 600 // HCS_TE * 3 / 2

    HCS301 hcs301;

    #define HCS_DEBUG_

    #ifdef HCS_DEBUG

    uint16_t HCS_PulseDuration[12];
    uint16_t HCS_BitDuration[66];
    uint32_t HCS_msg_duration;

    struct dta_ {
    uint16_t delay;
    byte f;
    byte st;
    };

    volatile dta_ arr[1000];
    volatile int poz_a = 0,poz_b = 0;
    #endif

    void HCS301::rint(){
    String btn;

    if (BtnRing == 1) btn += "Ring";
    if (BtnClose == 1) btn += "Close";
    if (BtnOpen == 1) btn += "Open";
    if (BtnNoSound == 1) btn += "NoSound";

    String it2;
    it2 += "Encript ";
    it2 += Encript;
    it2 += " Serial ";
    it2 += SerialNum;
    it2 += " ";
    it2 += btn;
    it2 += " BattaryLow=";
    it2 += BattaryLow;
    it2 += " Rep=";
    it2 += Repeat;

    Serial.println(it2);

    }

    void setup() {

    Serial.begin(9600);
    attachInterrupt(0, HCS_interrupt, CHANGE);

    pinMode(LED_PIN, OUTPUT);
    pinMode(HCS_RECIEVER_PIN, INPUT);
    }

    void loop() {

    if(HCS_Listening == false){

    HCS301 msg;
    memcpy(&msg,&hcs301,sizeof(HCS301));

    msg.print();
    #ifdef HCS_DEBUG
    if(msg.SerialNum != 639){

    Serial.println("Raw >>>>>>>>>>>>>>>>>>>>>>>");
    while(1){
    if(poz_b == poz_a) break;
    Serial.println(String(poz_b)+String(" ")+String(arr[poz_b].delay)+String(" ")+String(arr[poz_b].f == 0 ? "LOW":"HIGH")+String(" ")+String(arr[poz_b].st));
    poz_b++;
    }
    Serial.println("Data >>>>>>>>>>>>>>>>>>>>>>>");
    for(int i = 0;i<66;i++){ Serial.println(HCS_bit_array); }
    } else {

    }
    poz_a = 0,poz_b = 0;
    #endif

    HCS_Listening = true;
    }
    }

    //

    void HCS_interrupt(){

    if(HCS_Listening == false){
    return;
    }

    uint32_t cur_timestamp = micros();
    uint8_t cur_status = digitalRead(HCS_RECIEVER_PIN);
    uint32_t pulse_duration = cur_timestamp - HCS_last_change;
    HCS_last_change = cur_timestamp;

    #ifdef HCS_DEBUG
    if(poz_a < 999){
    arr[poz_a].delay = pulse_duration;
    arr[poz_a].f = cur_status == HIGH ? 0 : 1;
    poz_a++;
    }
    #endif

    // ловим преамбулу
    if(HCS_preamble_count < 12){
    if(cur_status == HIGH){
    if( ((pulse_duration > 200) && (pulse_duration < 400)) || HCS_preamble_count == 0){
    // начало импульса преамбулы
    if(HCS_preamble_count == 0){
    HCS_start_preamble = cur_timestamp; // Отметим время старта преамбулы
    }
    } else {
    // поймали какую то фигню, неправильная пауза между импульсами
    HCS_preamble_count = 0; // сбрасываем счетчик пойманных импульсов преамбулы
    goto exit;

    }
    } else {
    // конец импульса преамбулы
    if((pulse_duration > 400) && (pulse_duration < 600)){
    #ifdef HCS_DEBUG
    HCS_PulseDuration[HCS_preamble_count] = pulse_duration;
    #endif
    // поймали импульс преамбулы
    HCS_preamble_count ++;
    #ifdef HCS_DEBUG
    arr[poz_a-1].st = HCS_preamble_count;
    #endif
    if(HCS_preamble_count == 12){
    // словили преамбулу
    //HCS_Te = (cur_timestamp - HCS_start_preamble) / 23; // вычисляем длительность базового импульса Te
    //HCS_Te2_3 = HCS_Te * 3 / 2;
    HCS_bit_counter = 0;
    goto exit;
    }
    } else {
    // поймали какую то фигню
    HCS_preamble_count = 0; // сбрасываем счетчик пойманных импульсов преамбулы
    goto exit;
    }
    }
    }


    // ловим данные
    if(HCS_preamble_count == 12){
    if(cur_status == HIGH){
    if(((pulse_duration > 300) && (pulse_duration < 900)) || HCS_bit_counter == 0){
    // начало импульса данных
    } else {
    // неправильная пауза между импульсами
    HCS_preamble_count = 0;
    goto exit;
    }
    } else {
    // конец импульса данных
    if((pulse_duration > 300) && (pulse_duration < 900)){
    HCS_bit_array[65 - HCS_bit_counter] = (pulse_duration > HCS_Te2_3) ? 0 : 1; // импульс больше, чем половина от Те * 3 поймали 0, иначе 1

    #ifdef HCS_DEBUG
    HCS_BitDuration[HCS_bit_counter] = pulse_duration;
    #endif
    HCS_bit_counter++;
    #ifdef HCS_DEBUG
    arr[poz_a-1].st = HCS_bit_counter;
    #endif
    if(HCS_bit_counter == 66){
    // поймали все биты данных

    HCS_Listening = false; // отключем прослушку приемника, отправляем пойманные данные на обработку
    HCS_preamble_count = 0; // сбрасываем счетчик пойманных импульсов преамбулы
    #ifdef HCS_DEBUG
    HCS_msg_duration = cur_timestamp - HCS_start_preamble;
    #endif

    hcs301.Repeat = HCS_bit_array[0];
    hcs301.BattaryLow = HCS_bit_array[1];
    hcs301.BtnNoSound = HCS_bit_array[2];
    hcs301.BtnOpen = HCS_bit_array[3];
    hcs301.BtnClose = HCS_bit_array[4];
    hcs301.BtnRing = HCS_bit_array[5];

    hcs301.SerialNum = 0;
    for(int i = 6; i < 34;i++){
    hcs301.SerialNum = (hcs301.SerialNum << 1) + HCS_bit_array;
    };

    uint32_t Encript = 0;
    for(int i = 34; i < 66;i++){
    Encript = (Encript << 1) + HCS_bit_array;
    };
    hcs301.Encript = Encript;
    }
    } else {
    // поймали хрень какую то, отключаемся
    HCS_preamble_count = 0;
    goto exit;
    }
    }
    }

    exit:;

    //digitalWrite(LED_PIN,cur_status);
    }
     
  3. mcureenab

    mcureenab Гуру

    Оставьте пока работу с последовательным портом. Банальные помехи могут нарушать работу канала.

    Сначала нужно выяснить, ловит ли приемник хоть какой то сигнал от пульта. Для этого стоит хотя бы помигать светодиодом в ответ на сигнал от приемника. Скорее всего приемник не настроен на частоту пульта. В некоторых пределах приемник можно настроить вращая сердечник катушки индуктивности, которая находится в центре модуля.
    Приемник работает в режиме OOK/ASK - есть несущая - есть сигнал на выходе приемника, нет несущей - нет сигнала (разве что фоновый шум). С передатчиком из набора этот модуль работает? На металлической "таблетке" передатчика какое число пропечатано?
     
    stepviz1 нравится это.
  4. mcureenab

    mcureenab Гуру

    Проверка - на передатчик подаем напряжение. На выходе данных приемника постоянная 1. Отключаем передатчик, на приемнике уровень данных 0. Сигнал 0 или 1 вольтметром определяется. Это постоянное напряжение, если конечно передатчик просто включен, а не посылает пакет данных из 0 и 1.
     
    stepviz1 нравится это.
  5. stepviz1

    stepviz1 Нерд

    Нет второй ардуины что бы проверить работоспособность передатчика ! Как можно проверить передатчик ? И какой скетч туда залить для проверки ? Правильно понял что можно просто подать напряжение на передатчик и в сериал порте должен увидеть к примеру 1 или 0 ! На передатчике написано 433.92 (на таблетке)
     
  6. mcureenab

    mcureenab Гуру

    433.92 это номинальная частота передатчика MHz. Но фактически частота наверняка отличается, поэтому на приемнике есть подстроечный дроссель с переменной индуктивностью. На заводе комплект из передатчика и приемника настраивают на одну частоту. Принцип настройки ни чем не отличается от настройки бытового аналогового радиоприемника. Крутим ручку, добиваемся наилучшего приема радиостанции. А тут наибольшей дальности связи.

    Для проверки приемника нужен только вольтметр и источник питания (можно взять питание с Ардуины). Подаем питание на GND (-, 0В),VCC (+5В) приемника и передатчика. На штырьки GND и DATA приемника вешаем вольтметр. Штырек DATA передатчика замыкаем то на GND, то на VCC и смотрим на показания вольтметра. Напряжение должно синхронно меняться на 0В и на 5В.
    Отключаем передатчик. Нажимаем кнопки на пульте, смотрим на показания вольтметра. Короткие импульсы он не поймает, но больше 0 должен показать. Тут лучше на Ардуину установить скетч осциллограф и посмотреть форму сигнала.

    Что касается библиотеки RemoteReceiver, то не факт, что она поддерживает протокол и коды вашего пульта.

    Последовательный порт предполагает некоторый протокол передачи данных. Иначе это просто порт общего назначения.
     
    stepviz1 нравится это.
  7. stepviz1

    stepviz1 Нерд

    Понял спасибо буду пробовать!
     
  8. Этот скетч читает распространенные брелки от ворот, шлагбаумов и тп, плюс ретранслирует его. Соотв, из него можно выдернуть часть которая считывает код.
     

    Вложения: