[SOLUCIONADO] HCS301

Saludos. Ahora si estoy totalmente estancado, he probado la recepcion de varios mandos y lo he logrado con los ejemplos que viene con el IDE y algunas otras librerías, pero ahora tengo un control con el HCS301 que funciona en el portón del edificio y también tengo el receptor que usa la placa del portón. Así que por hardware no me preocupo, el problema viene al tratar de capturar lo que envía el mando. En la placa original usa un PIC de la familia de los 18F, pero quería hacerlo con Arduino y no logro captar nada.

Hay alguien que tenga experiencia con este KeeLoq?

Viste esto

http://forum.arduino.cc/index.php/topic,201970.0.html

de donde sale esta librería

otra ayuda
https://discuss.ninjablocks.com/t/hcs301-hopping-code-button-driver/578

y esto lo debes tener

Saludos. He revisado la bibliografia, pero aun no consigo algo que me oriente a la parte de solo recepción, y como plantea el que creo el post como se hace para interpretar lo que el transmisor envía.

Ya me había revisado los datos del HCS301 y se que e codifica y no repite códigos, pero quisiera por los momentos solo recibir estos datos, luego me dedicare a ver como se decodifican. Por lo que leí se que se puede colocar un serial de fabricación personalizado. Y siguiendo la conversación del primer link, no creo comercial tener un encode sin decode, en caso tal el microcontrolador haría la vez de decode. Se que se puede hacer ya que la placa receptora original una un PIC,

Pero entonces no leiste lo que te pasé. https://github.com/franksmicro/Arduino/blob/master/libraries/Keeloq/Keeloq.cpp

lee esto http://arduino.ru/forum/apparatnye-voprosy/biblioteka-chteniya-id-brelkov-signalizatsiii-hcs301-keeloq

Sybyte, chamo me fue de gran ayuda para lo que necesitaba.

realmente el que me funciono fue el ultimo link.

Muchas gracias. dejo el código para los demás interesados.Los comentarios están en ruso, el receptor se conecta al pin 2.O cualquier con interrupcion.

#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;

void setup()
{
  Serial.begin(115200);
  pinMode(HCS_RECIEVER_PIN, INPUT);
  attachInterrupt(0, HCS_interrupt, CHANGE);
  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));
  }
}

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(HCS_preamble_count < 12){
    if(cur_status == HIGH){
      if( ((pulse_duration > 150) && (pulse_duration < 500)) || 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 > 300) && (pulse_duration < 600)){
        // ??????? ??????? ?????????
        HCS_preamble_count ++;
        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 > 250) && (pulse_duration < 900)) || HCS_bit_counter == 0){
        // ?????? ???????? ??????
      } 
      else {
        // ???????????? ????? ????? ??????????
        HCS_preamble_count = 0;
        goto exit;
      }
    } 
    else {
      // ????? ???????? ??????
      if((pulse_duration > 250) && (pulse_duration < 900)){
        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){
          // ??????? ??? ???? ??????
          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 {
        // ??????? ????? ????? ??, ???????????
        HCS_preamble_count = 0;
        goto exit;
      }
    }
  }
exit:;
  //digitalWrite(LED_PIN,cur_status);
}