Библиотека чтения ID брелков сигнализациий HCS301 KEELOQ

dom98111
Offline
Зарегистрирован: 04.06.2016

На exit тоже не выходит из меню. И сигналы не ловит 433 came шлакбаум

PM007
Offline
Зарегистрирован: 09.05.2016

На каме нужен другой скетч... этот ждя динамического кода, если я правильно понял...

dreamwait
Offline
Зарегистрирован: 09.06.2014

vlkam, не нашел как здесь в личку писать.

на dreamwait@mail.ru напиши - пообщаемся по теме. Я из Тулы.

 

По теме - пока осилил сканирование/выброс статику САМЕ, NACE 12-24, граббер\cканер на attiny13 (с фрикерклуба), прием динамики - заодно попробую вышевыложенный пример (спасибо автору!). 

Решил сделать гибридное устройство - автономный модуль на Ардуине с экранчиком от нокии и возможностью смены приемников\передатчиков - так как разная модуляция и частота, и по в ноуте - для более серьезного анализа протоколов. Общение через 232 - так как проще то некуда. Уже думаю, как все это прикрутить к модулю 8266 - чтобы через WiFi подключаться к устройству - так удобнее на практике.

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

Можно и родным экранчиком брелка двухстороннего воспользоваться - но тогда attiny13 будет слабовата, нужно получше что-то...

 

 

 

 

Roman-12
Offline
Зарегистрирован: 06.04.2012

Похвастаюсь и я своими наработками на Arduino+Keeloq

https://youtube.com/channel/UCOUCzelLtLYOaGRlZUvxKog

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Впечатляет! Сырцы увидим?

Roman-12
Offline
Зарегистрирован: 06.04.2012

Нет. Ящик пандоры не хочу открывать...

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Roman-12 пишет:

Нет. Ящик пандоры не хочу открывать...

Хотя бы прием посмотреть как написан?

4ishops
Offline
Зарегистрирован: 06.10.2012

Roman-12 пишет:

Нет. Ящик пандоры не хочу открывать...

 

Больших секретов там нет :)

 

Выложите действительно чтение, будет полезно всем. Да и писать код на Arduino и не давать скетч противоречит духу всей платформы и принципам опенсорс.

 

 

PM007
Offline
Зарегистрирован: 09.05.2016

И к чему весь этот выпендрешь .. не хочеш говорить так и молчи нефиг выпендриваться...

PM007
Offline
Зарегистрирован: 09.05.2016

А там нет ничего сложного, всезде уже все написано, главное знать протокол, все остальное дело врмени и желания...

dotcat
dotcat аватар
Offline
Зарегистрирован: 23.05.2018

Greetings From Athens Greece !

Thank You for this wonderful software ! it does what it said and execute flawless !

                                                                                                                    Best Regards !

                                                                                                                     Dotcat

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Автор уж сидит давно, а в Греции-то и не знають... 

piotr
Offline
Зарегистрирован: 02.11.2018

Я в данной теме вообще новичек - вот решил поиграть с ESP8266. Купил приемник с али RX500A и наткнулся на замечательный скэтч от @vlkam, но пришлось малось подправить. Сначало вообще ничего не получил, потом увидел обновленную версию и всеравно ничего... пока не подержал кнопку на брелке подольше - проскользнуло пару считаных кодов - алгоритм считывания неустойчив. Предлагаю попробовать мою подправленную версию от @vlkam

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

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

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;        // счетчик считанных бит данных
uint8_t       HCS_bit_array[66];        // массив считанных бит данных
#define       HCS_TE    400         // типичная длительность имульса 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; // сбрасываем счетчик пойманных импульсов преамбулы
    }
  }
}

 

dotcat
dotcat аватар
Offline
Зарегистрирован: 23.05.2018

Hi guys,

it is possible to use a CC1101 radio module as a receiver for this program ?! . than it could be a work of art. many thanks and best regards for people interested!

dreamwait
Offline
Зарегистрирован: 09.06.2014

Брал CC1101 (китай). На прием отлично работал, на передачу - хоть тресни. Не писались регистры.

Для кейлог алгоритм и библиотеки практически в открытом доступе есть - на фрикерклубе. Единственное что закрыто (но в принципе не очень большая проблема найти на многие популярные) - это заводские коды. Без них невозможно имитировать правильный сигнал.

И да - выпендриваться тут не стоит, хочешь поделиться - выкладывай. Жаба душит - помалкивай в тряпочку.

P.S. Мне самому не нужно, есть граббер пандора - мне достаточно.

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

пандоры ж  не выкрываются граббером. что то вы лукавите походу

dreamwait
Offline
Зарегистрирован: 09.06.2014

Если ты не в теме - лучше помолчать. Слабо в гугле набрать - кодграббер пандора?

https://kodgrabber.biz/kodgrabber-pandora/