Hola Chicos/as.
Hace unos meses comencé un nuevo tema para recibir las señales de mandos a distancia rolling code tipo KEELOQ Aquí, está en el post #6 del enlace anterior.
.
Tras mucho navegar y como siempre con la ayuda de foreros, encontré y modifiqué un código que nos permite recibir y mostrar en serial monitor el código cambiante recibido.
Ahora me gustaría programar mi propio mando con arduino, generando mi propio numero de serie, numero de fabricante y poderlo transmitir y recibir con el otro codigo.
He buscado y rebuscado y solo encuentro codigos que hacen cosas parecidas pero no lo que quiero:
Uno de ellos, recibe keeloq y retransmite ese codigo.
Otro, genera datos keeloq con arduino pero para programar el chip original HCS301 de un mando (Fuera de arduino)
Otro, encripta/desencripta pero siempre el mismo codigo. Este ultimo pensé que era el bueno, pero no hace la función rolling code, siempre transmite lo encriptado, pero siempre lo mismo. Pego debajo el codigo:
/*
* Este codigo está modificado para que simule una transmision de una trama Rolling Code, simulando un control remoto con tecnología Keeloq. Muchas lineas no sirven para nada de momento y las eliminaré del codigo original.
* No realiza la función de cambio de codigo en cada transmisión. Solo envía varias veces el codigo de 64 bits definido en byte Buffer_Fix[4] y en unsigned long enc.
* La duración de los pulsos es correcta y se han hecho pruebas con un receptor keeloq real. Al enviar el codigo correcto, el receptor obedece. Obviamente solo una vez.
* Lo que se busca es una transmision que el receptor acepte y obedezca para lo cual la trama emitida por nuestro arduino, debe estar colocada en como el siguiente ejemplo:
* 2 F604BDA A4CBF45E donde 2 es el numero de canal, F604BDA es el numero de serie y A4CBF45E es la parte de codigo encriptado. Nosotros aquí lo estamos simulando y en vez de encriptar, enviaremos el resultado.
*
*/
#define TX 8 ////Data del TX al Pin 8 del arduino
#include <Keeloq.h>
byte CODE1[4]; // Paquete número 1
byte CODE[8]; // Paquete terminado
byte TCODE[8];
byte Key[7];
byte Buffer_Manufac[8] = {0x01, 0x02, 0x03, 0x04, 0x0A, 0x0B, 0x0C, 0x0D};///Como estamos simulando, esta clave creo que no se necesita.
byte Buffer_Fix[4] = {0xDA, 0x4B, 0x60, 0x2F};////Aquí pongo el numero de serie simulado invertido. Este se transmitiría 2F604BDA. El primer digito (2) es el canal
unsigned long key1 ,key2 ;
void setup()
{
Serial.begin(9600);
pinMode(TX, OUTPUT);
Key[0]=Buffer_Fix[0]^Buffer_Manufac[0];
Key[1]=Buffer_Fix[1]^Buffer_Manufac[1];
Key[2]=Buffer_Fix[2]^Buffer_Manufac[2];
Key[3]=((Buffer_Fix[3]&0x0F)|0x20 )^Buffer_Manufac[3];
Key[4]=Buffer_Fix[0]^Buffer_Manufac[4];
Key[5]=Buffer_Fix[1]^Buffer_Manufac[5];
Key[6]=Buffer_Fix[2]^Buffer_Manufac[6];
Key[7]=((Buffer_Fix[3]&0x0F)|0x60 )^Buffer_Manufac[7];
key1 = Key[0]; key1<<=8;
key1+= Key[1]; key1<<=8;
key1+= Key[2]; key1<<=8;
key1+= Key[3];
key2 = Key[4]; key2<<=8;
key2+= Key[5]; key2<<=8;
key2+= Key[6]; key2<<=8;
key2+= Key[7];
Keeloq k(key1,key2);
//unsigned long enc = k.encrypt(0xD3107D55);
unsigned long enc = (0x5EF4CBA4);/////Aquí pongo invertido lo que quiero que transmita como si fuese la parte encriptada. Esto lo transmite así, a continuacion del Numero de serie: A4CBF45E
// De esta manera lo que transmitimos es esto 2F604BDAA4CBF45E. Así se ve en el serial monitor.
//Serial.print("After encrypt: ");
//Serial.println(enc,HEX);
CODE1[3]=enc; enc>>=8;
CODE1[2]=enc; enc>>=8;
CODE1[1]=enc; enc>>=8;
CODE1[0]=enc;
}
void loop()
{
CODE[0] = CODE1[0];
CODE[1] = CODE1[1];
CODE[2] = CODE1[2];
CODE[3] = CODE1[3];
CODE[4] = Buffer_Fix[0];
CODE[5] = Buffer_Fix[1];
CODE[6] = Buffer_Fix[2];
CODE[7] = Buffer_Fix[3];
Serial.print(CODE[7],HEX);
Serial.print(CODE[6],HEX);
Serial.print(CODE[5],HEX);
Serial.print(CODE[4],HEX);
//Serial.print (" Encript ");
Serial.print(CODE[3],HEX);
Serial.print(CODE[2],HEX);
Serial.print(CODE[1],HEX);
Serial.print(CODE[0],HEX);
Serial.println("");
for (int i=0; i<50; i++) {//Transmite 50 veces la misma trama
SendKeeloq(CODE);
}
delay(5000);// Repite la tranmision completa cada 10 segundos.
}
void SendMeander(unsigned int meanderLen)
{
digitalWrite(TX, HIGH);
delayMicroseconds(meanderLen);
digitalWrite(TX, LOW);
delayMicroseconds(meanderLen);
}
// Keeloq ----------------------------------------------
void SendKeeloqPreambula()
{
for (byte i=0; i<11; i++)
SendMeander(400);
}
void SendKeeloq(unsigned char *TCODE)
{
signed char a;
SendKeeloqPreambula();
digitalWrite(TX, HIGH);
delayMicroseconds(400);
digitalWrite(TX, LOW);
delayMicroseconds(10*400);
for(a=0; a<66; a++)
{
digitalWrite(TX, HIGH);
delayMicroseconds(400);
if(TCODE[a/8]&(1<<(a%8))) digitalWrite(TX, LOW);
delayMicroseconds(400);
digitalWrite(TX, LOW);
delayMicroseconds(400);
}
delay(16);
}
//---------------------------------------------------------
Se parece a lo que yo quiero pero no cambia el codigo transmitido.
Lo que busco es algo como esto: Tu elijes el numero de serie y numero de fabricante, le aplica el algoritmo keeloq y lo transmite. Ello provoca que recibamos cada vez una parte del codigo diferente. Así:
Canal 2 Serie 57A18CA Rolling Code B46B586A
Canal 2 Serie 57A18CA Rolling Code 3289E1E2
Canal 2 Serie 57A18CA Rolling Code F5617E5B
Canal 2 Serie 57A18CA Rolling Code 85CBB827
Canal 2 Serie 57A18CA Rolling Code 6C2B7429
Canal 2 Serie 57A18CA Rolling Code 1456BF04
Canal 2 Serie 57A18CA Rolling Code 47E765A3
Canal 2 Serie 57A18CA Rolling Code ECDCE013
Codigo que programa un HCS301 con nuestros datos
Alguien tiene o sabe una url donde encontrar un código que te permita elegir numero de serie y clave de fabricante todo en arduino ??
Gracias y saludos