Interpretar datos de mando 433MHz con arduino y audacity

Hola Chicos/as.

Tras varios meses jugando con mandos a distancia de 433, librerias RadioHead, Virtualwire y Rc_switch y mandos de garaje del tipo código fijo y código rolling code keeloq, todo funciona.
Consigo leer los datos transmitidos por estos mandos con las librerías citadas y retransmitirlos desde arduino.
Mi problema actual es que tengo un tercer mando que me gustaría incorporar pero debe ser de otro tipo que las librerías y codigos utilizados no reconocen.

Con el código para los keeloq rolling code, de algun ruso de internet,que me funciona bien, veo que quizás podría variar valores de largo del pulso, numero de bits y quizás adaptarlo para que reciba e interprete los datos de este nuevo mando raro.

El codigo que uso para keeloq es este:

// борд "LOLIN(WEMOS) D1 mini lite"

#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;
uint8_t       HCS_bit_counter;        // leer el contador de bits
uint8_t       HCS_bit_array[66];        // conjunto de bits de datos leídos
#define       HCS_TE    400         // duración típica del pulso Te
#define       HCS_Te2_3 600         // HCS_TE * 3 / 2

bool bPreamble = false;
bool bHeader = false;
bool bData = false;
bool bInv = false;

HCS301 hcs301;

void setup()
{
  Serial.begin(9600);

  // Брелки
  pinMode(HCS_RECIEVER_PIN, INPUT);
  attachInterrupt(0, HCS_interrupt, CHANGE);

  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);

  Serial.println("Setup OK");
}


void loop()
{
  long CurTime = millis();

  // проверяем наличие команды брелка
  if (HCS_Listening == false) {

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

    // включаем слушанье брелков снова
    HCS_Listening = true;

    //Serial.println(String("KeyFb#") + String(msg.SerialNum));
    msg.print();

    Serial.println("Data >>>>>>>>>>>>>>>>>>>>>>>");
    for (int i = 0; i < 66; i++) {
      if ((i - 2) % 8 == 0) {
        Serial.print(" ");
      }

      Serial.print(HCS_bit_array[i]);
    }
    Serial.println("");
  }

}

// Функции класса  HCS301 для чтения брелков
void HCS301::print() {
  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 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;

  if (bPreamble) {
    // начало преамбулы обнаружено - ждем заголовок
    
    if (pulse_duration > 3000 && pulse_duration < 6000) {
      // обнаружен заголовок
      bHeader = true;
      HCS_bit_counter = 0;
      bPreamble = false;
      bInv = cur_status == LOW; // получаем инверсные значения импульсов - заголовок должен быть 0

    } else if (pulse_duration < 300 && pulse_duration > 600) {
      // упс - уже не преамбула но какой-то мусор - начнем сначала
      bPreamble = false;
      digitalWrite(LED_PIN, HIGH);
    } else {
      // иначе ждем заголовок...
    }
  } else if (bHeader) {
    // заголовок найден - читаем данные
    if ((pulse_duration > 300) && (pulse_duration < 1100)) { // поставил верхнюю границу 1100 т.к. иногда ESP8266 "неуспевает" обработать прерывание до 200мксек
      // ловим переход с высокого в низкий и анализируем длительность импульса
      if (cur_status == bInv ? HIGH : LOW) {
        HCS_bit_array[65 - HCS_bit_counter] = (pulse_duration > HCS_Te2_3) ? 0 : 1; // импульс больше, чем половина от Те * 3 поймали 0, иначе 1
        HCS_bit_counter++;
        if (HCS_bit_counter == 66) {
          // поймали все биты данных
          bHeader = false;
          digitalWrite(LED_PIN, HIGH);

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

          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[i];
          };

          uint32_t Encript = 0;
          for (int i = 34; i < 66; i++) {
            Encript = (Encript << 1) + HCS_bit_array[i];
          };
          hcs301.Encript = Encript;
        }
      }
    } else {
      // попался мусор
      bHeader = false;
      digitalWrite(LED_PIN, HIGH);
    }
  }  else {
    // ловим преамбулу
    if (pulse_duration > 300 && pulse_duration < 600) {
      // поймали импульс преамбулы
      if (++HCS_preamble_count > 10) {
        // убедились что это преамбула - начинаем искать заголовок около 4000мксек
        // анализируем 10 переходов - хочу поймать первый пакет - когда нет несущей, приемник отдает сплошной мусор,
        // скорее всего всю длину преамбулы получить не удасться.
        bPreamble = true;
        digitalWrite(LED_PIN, LOW);   // зажгем LED - начало пакета найдено

        HCS_preamble_count = 0;
      }
    } else {
      // поймали какую то фигню, неправильная пауза между импульсами
      HCS_preamble_count = 0; // сбрасываем счетчик пойманных импульсов преамбулы
    }
  }
}

El nuevo mando transmite a 433.92 MHz, lleva un PIC, con lo cual poca info me da.
Consigo ller la trama con RTL y editarlo en Audacity. Esto es lo que veo y como creo que hay que interpretar los bits recibidos:

He seguido muchos tutoriales de como interpretar la trama recibida pero no le encuentro sentido para hallar un codigo de unos y ceros logica. Desde mi forma de contar son 74 bits que en diferentes pulsaciones, los primeros se repiten. El resto no pero porque debe ser algun tipo de codigo cambiante tipo hopping code o rolling code...Lo que pretendo es poder leer los unos y ceros con cierta certeza.
Pongo aquí algunas imagenes de un codigo escuchado con RTL, grabado como wav y editado con audacity:




La de arriba es amplida para que se pueda ver la duración....Creo que cada bit es de 0.8ms...creo.
La cuarta es completa con preambulo antes de la trama.
La segunda igual pero sin preambulo
La tercera es solo un trozo ampliado....

Como interpretaríais esos bits para convertirlos en unos y ceros ???

Agradecería ayuda sobre como modificar el código y de como interpretar la trama para convertirla en unos y ceros.

El codigo de arriba muestra esta info cuando se trata de un mando rolling code keeloq:

Encript 4129995690 Serial 8629364 NoSound BattaryLow=0 Rep=0
Data >>>>>>>>>>>>>>>>>>>>>>>
00 10000000 10000011 10101100 01110100 11110110 00101010 10111011 10101010

Eso es lo que pretendo pero con este otro mando desconocido.

Gracias y saludos cordiales

1 Like

Hola Chicos/as.

Aunque no he recibido respuesta, amplío la información que voy recopilando para ayudar a quien me pueda ayudar.

Hablando con el vendedor de este mando de persiana, me indica que que este que me vendió dispone de un numero de serie único que es 00 0E 07.
Estoy seguro que lo transmite y debe ir en la trama que yo recibo con arduino, modulo 433 RX y audacity.
Ahora ya sabiendo que el numero de serie es 00 0E 07, debería ser fácil encontrarlo en la trama... Pero no hay manera. Aparte del numero de serie hay mas números claro. He conseguido saber que el numero de serie va al principio en la primera mitad de la trama, lo que facilita la tarea.

Seguro que interpreto mal los altibajos....

Por ello voy a adjuntar el archivo wav e una imagen de la misma trama...A ver si alguien es capaz de ver en ellos el dichoso 00 0E 07.

Aquí el archivo wav de la trama

Si lo encuentra alguien, que me diga de donde y como lo sacó.

Gracias por adelantado.

1 Like