Hola chico.
Ya sé que para un novato, quizás esté picando demasiado alto, pero creo que lo conseguiré.
Estoy tratando de decodificar un código RF Keeloq enviado desde un mando de garaje a mi arduino.
Lo recibo a través de un modulo RF433 y un código de un ruso que había por la red.
El código hace mucho más de lo que yo necesito, pero quiero aprovechar una parte:
Leer en el serial (de momento) el código KEELOQ enviado desde el mando.
Dispongo de un dispositivo con LCD, comprado hace años para precisamente ver el citado código RF.
Lo muestra correctamente si embargo arduino me lo muestra del revés.
Todo se muestra en Hexadecimal.
El orden correcto de los datos es el siguiente:
X = Numero de boton pulsado (Siempre el mismo)
XXXXXXX = Numero de serie del mando. (Siempre el mismo)
XXXXXXXX = Datos encriptados que no viene al caso ahondar en ello, pero cambian en cada pulsación.
Total son 16 digitos en hexadecimal.
Para la explicación, hablaré solo del numero de serie, si consigo ponerlo al derecho, los otros los arreglaré de igual manera.
Mi LCD muestra 0F98958 y arduino muestra 1A919F
Si pasamos cada adigito del arduino a binario uno a uno y los leemos al reves y volvemos a convertir a HEX, coincide con los digitos del arduino pero al revés.
8 = 1000 bin, invierto = 0001, paso a hex = 1
5 = 101 bin, invierto = 1010, paso a hex = A
9 = 1001 bin, invierto queda igual, paso a hex = 9
8 = 1000 bin, invierto = 0001, paso a hex = 1
9 = 1001 bin, invierto = queda igual, paso a hex = 9
F = 1111 bin, invierto = queda igual, paso a hex = F
Veis que coinciden los dígitos pero los coloca al revés. He probado con otros mandos y hace lo mismo.
Este es el código culpable:
#include "math.h"
#define txPin 8
#define rxPin 2
#define signalPin 6
int lastRxValue = 0;
int tempRxValue = 0;
unsigned long lastRxTime = 0;
unsigned long tempTime = 0;
unsigned long difTime = 0;
boolean bValidPacket = false;
int decodeMethod = 1; //0 real - as in manual, 1 inver as Oleg do
//Global vars end
void send_meander(int time){
digitalWrite(txPin, HIGH);
delayMicroseconds(time);
digitalWrite(txPin, LOW);
delayMicroseconds(time);
}
//keelog start
int keelog_state = 0;
int keelogCounter = 0;
byte keelog_code[9];
void keelog_vardump(){
if(decodeMethod == 0){
Serial.println(" - keelog origin - ");
}
else{
Serial.println(" - keelog invert - ");
}
Serial.print(keelog_code[0], HEX);
Serial.print(keelog_code[1], HEX);
Serial.print(keelog_code[2], HEX);
Serial.print(keelog_code[3], HEX);
Serial.println("-hop");
Serial.print(keelog_code[4], HEX);
Serial.print(keelog_code[5], HEX);
Serial.print(keelog_code[6], HEX);
Serial.println("-fix");
Serial.print(keelog_code[7], HEX);
Serial.println("-btn");
Serial.print(keelog_code[8], HEX);
Serial.println("-dop");
/*for(int i = 0; i<9; i++){
Serial.print(keelog_code[i], HEX);
Serial.print(" - ");
}*/
keelog_send(keelog_code);
digitalWrite(signalPin, HIGH);
delay(100);
digitalWrite(signalPin, LOW);
keelog_state = 0;
for(int i = 0; i<9; i++){
keelog_code[i]=0;
}
}
void keelog_send(byte* keelog_code){
Serial.println("- sending keelog -");
for(int i = 0; i<9; i++){
Serial.print(keelog_code[i], HEX);
Serial.print(" - ");
}
for(int i = 0; i<11; i++){//посылаем преамблу
send_meander(400);
}
digitalWrite(txPin, HIGH);
delayMicroseconds(400);
digitalWrite(txPin, LOW);
delayMicroseconds(4000);//посылаем хедер
for( int i = 0; i<9; i++){
if(decodeMethod==1){
for(int i2 = 7;i2>=0;i2--){
if(bitRead(keelog_code[i], i2)){
digitalWrite(txPin, HIGH);
delayMicroseconds(400);
digitalWrite(txPin, LOW);
delayMicroseconds(2*400);
}
else{
digitalWrite(txPin, HIGH);
delayMicroseconds(2*400);
digitalWrite(txPin, LOW);
delayMicroseconds(400);
}
}
}
else{
for(int i2 = 0;i2<8;i2++){
if(!bitRead(keelog_code[i], i2)){
digitalWrite(txPin, HIGH);
delayMicroseconds(400);
digitalWrite(txPin, LOW);
delayMicroseconds(2*400);
}
else{
digitalWrite(txPin, HIGH);
delayMicroseconds(2*400);
digitalWrite(txPin, LOW);
delayMicroseconds(400);
}
}
}
}
}
void keelog_get(){
bValidPacket = false;
if(keelog_state==0){//ждем преамбулу и хедер
if(difTime > 280 && difTime < 620 && lastRxValue != tempRxValue){
keelogCounter ++;
}
else{
if(keelogCounter==23){
if(difTime>2800 && difTime<6200 && lastRxValue == 0){
keelog_state=1;
}
}
keelogCounter = 0;
}
}
else if(keelog_state==1){// получаем биты
if(difTime > 560 && difTime < 1240 && lastRxValue == 1){// получили 1
if(decodeMethod==0){
keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]>>1)|B10000000;
}
else{
keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]<<1)|B00000000;
}
bValidPacket = true;
}
else if(difTime > 280 && difTime < 620 && lastRxValue == 1){
if(decodeMethod==0){
keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]>>1)|B00000000;
}
else{
keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]<<1)|B00000001;
}
bValidPacket = true;
}
else if(lastRxValue == 0){
}
else{
keelog_state=1;
keelogCounter = 0;
}
if(bValidPacket){
keelogCounter++;
if(keelogCounter==66){
keelog_vardump();
keelogCounter = 0;
keelog_state = 0;
}
}
}
}
//keelog end
void setup() {
pinMode(txPin, OUTPUT);
pinMode(rxPin, INPUT);
pinMode(signalPin, OUTPUT);
//
Serial.begin(9600);
Serial.println("start");
lastRxValue = digitalRead(rxPin);
lastRxTime = micros();
//attachInterrupt(0, grab, CHANGE);
}
void loop() {
tempRxValue = digitalRead(rxPin);
if(tempRxValue != lastRxValue){
tempTime = micros();
difTime = tempTime - lastRxTime;
keelog_get();
lastRxTime = tempTime;
lastRxValue = tempRxValue;
}
}
El código hace más cosas pero de momento solo pretendo que lea los mandos al derecho.
Incluso en la linea 14
int decodeMethod = 1; //0 real - as in manual, 1 invert
Lo he puesto en 0, la mezcla de posiciones aún es peor.
Alguien sabría que cambios hacer en esa zona del código para que muestre los datos al derecho ???
Gracias