Arduino e prese radiocomandate...ecco la SOLUZIONE :-D

Ciao a tutti,
accantonato al momento il progetto sugli infrarossi (grazie a tutti quelli che mi hanno aiutato!) mi sono messo subito a caccia di un nuovo progetto, ovvero interfacciare il mio fido arduino alle prese telecomandate che ho in casa.
Queste prese vengono telecomandate tramite RF a 433.92 Mhz. Ne ho sacrificata una per vedere come è fatta e ho trovato che moduli riceventi hanno questo modulo RF a tre pin contrassegnato KT-JSMK-6B:

Dove il pin1 è il GND, il pin2 è il "DATA" e il pin3 è il Vcc (5v).

Allora ho provato ad buttare sull'arduino lo sketch del virtualwire preso da un sito da esempio:

#include <VirtualWire.h>  // you must download and install the VirtualWire.h to your hardware/libraries folder
#undef int
#undef abs
#undef double
#undef float
#undef round
void setup()
{
    Serial.begin(9600);    

// Initialise the IO and ISR
    vw_set_ptt_inverted(true);    // Required for RX Link Module
    vw_setup(2000);                   // Bits per sec
    vw_set_rx_pin(11);           // We will be receiving on pin 23 (Mega) ie the RX pin from the module connects to this pin.
    vw_rx_start();                      // Start the receiver
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // check to see if anything has been received
    {
    int i;
     // Message with a good checksum received.
        
    for (i = 0; i < buflen; i++)
    {
        Serial.print(buf[i]);  // the received data is stored in buffer
        }
    Serial.println("");
     }
}

ma ovviamente se premo un tasto sul telecomando non succede nulla (e te pareva se mi riusciva alla prima) :frowning:
Il virtualWire è correttamente installato e il modulo funzionante (perchè rimontato sulla presa riprende a funzionare correttamente)...
avete qualche suggerimento?
devo per forza comprare dei moduli specifici?

GRAZIE!

uhmm, prova a leggere i dati "raw", ovvero senza passare dalla libreria... sicuro dei pin? hai controllato quando la presa è collegata con un voltimetro se i pin corrispondono? e ancehe il voltaggio di lavoro?

Come posso leggere in raw?

Per i pin sono "abbastanza" sicuro, in quanto se collego il tester ai pin1 e 3 mi legge 5 volt...

molto semplice, nel loop metti una pulseIn(pin, HIGH) e una pulseIn(pin, LOW). a questo punto quando premi il telecomando dovrebbe funzionare.

Attenzione, che 5V dovresti leggerli anche tra VCC e il pin del segnale! infatti probabilmente anche lui è normalmente LOW, se dovresse essere normalmente HIGH allora potresti confondere VCC con il pin del segnale... te capì? non credo che il multimetro (o il tuo occhio) sia abbastanza veloce da notare i segnali in arrivo dal telecomando... se sei fortunato e i segnali sono continui, otterrai una specie di PWM e quindi sul multimetro leggereai una tensione variabile se per casi uno dei pin su cui sei collegato è quello del segnale.

Non ho però capito una cosa... il segnale emesso dal radiocomando di che genere è? una serie di bit, tipo l'infrarosso oppure viene inviata una stringa di caratteri?

chissenefrega. o meglio: anche se fosse una stringa, una stringa, o un singolo carattere, non è altro ce una serie di bit che seguino un particolare schema.

Una volta che hai individuato questo schema (che sia un treno di bit o una serie di caratteri, che comunque sono un treno di bit), ti basta replicarlo con un emettitore (probabilmente quei moduli possono solo ricevere)

Se poi vuoi sbatterti per cercare di dare un significato a quei bit puoi farlo, ma è inutile, a meno che la sequenza non sia variabile, cosa molto poco probabile (l'apertura delle mecchine moderne forse segue questo schema).

L' integrato che c'é nella presa radiocomandata oltre il ricevitore é un HX2272 o PT2722?
Hai provato con questa libreria?

Ciao Uwe

Ciao uwe, purtroppo non si riesce a leggere la sigla sul chip perchè sembra abrasa o comunque cancellata...ora sono a lavorare per cui non posso controllare meglio, ma posso provare ad aprire un'altra presa e vedere se si riesce a leggere qualcosa...appena posso, posto la sigla...

Rieccomi..
dunque..come dicevo le sigle dei chip sono abrase per cui non si riesce a capire di cosa si tratta..ho comunque dato un'occhiata al link che mi ha fornito uwe, e nella fattispecie ho collegato il modulo che ho in mio possesso e ho caricato lo sketch come indicato in questa pagina:

e finalmente ho ottenuto un lunga (49) striscia di dati in formato RAW:
7115,925,600,925,600,925,600,430,1100,430,1100,430,1100,925,600,925,600, etc etc .

Ho provato in qualche modo ad interpretarli, seguendo questa pagina:

ma ovviamente non ci sono riuscito...
qualcuno può fornirmi una manina? grazie!

arriviamoci con la logica...
tanto per cominciare non hai fatto abbastanza test, ma iniziamo a fare qualche IPOTESI (ah, il metodo scientifico)
925,600 si ripete abbastanza spesso, e anche 430,1100... rimane quel 7115 che non capisco da dove esca..

7115 - 925,600 - 925,600 - 925,600 - 430,1100 - 430,1100 - 430,1100 - 925,600 - 925,600,

Ora sorgono spontanee le domande... se i codici che hai postato partono dall'inizio, il 7115 può essere una falsa lettura, magari a causa di un "salto" di tensione, inizializzazione del circuito, inizializzazione trasmissione (chiamato SYNC nel link che hai postato) o qualcosa di simile.

ad occhio io direi che un tasto è identificato da 2 numeri, e in questo caso abbiamo 3 sequenze, di cui una incompleta OPPURE 2 sequenze e un segnale trascurabile per ora, OPPURE che 7115 sia SYNC, la durata di un clock sia ~1500

Immagino che questa squenza arrivi solo quando premi il tasto, ed essendo il tuo dito molto lento, venga inviato più volte.

Quindi le domande da porsi sono:

  1. Il modulo acceso e basta, che succede?
  2. Se premi 2 volte lo stesso tasto che succede?
  3. Se premi 2 tasti diversi (non insieme) che succede?

lesto:
arriviamoci con la logica...
tanto per cominciare non hai fatto abbastanza test, ma iniziamo a fare qualche IPOTESI (ah, il metodo scientifico)

guarda, mi sono dimenticato di specificare che i numeri che ho postato sono una media, ovvero ho fatto 10 pressioni di tasto diverse per fare una media ed erano tutte più o meno su quei valori, con una differenza di +/- 10 (ad esempio, il primo valore era 7111,7112,7108,7117etc etc quindi alla fine veniva di media 7115)...

925,600 si ripete abbastanza spesso, e anche 430,1100... rimane quel 7115 che non capisco da dove esca..

si, infatti avevo pensato che ad esempio il 925/600 fosse tipo lo zero e il 430/1100 l'uno, o viceversa...

7115 - 925,600 - 925,600 - 925,600 - 430,1100 - 430,1100 - 430,1100 - 925,600 - 925,600,

Ora sorgono spontanee le domande... se i codici che hai postato partono dall'inizio, il 7115 può essere una falsa lettura, magari a causa di un "salto" di tensione, inizializzazione del circuito, inizializzazione trasmissione (chiamato SYNC nel link che hai postato) o qualcosa di simile.

leggendo quel sito, più o meno tutti i chip hanno un inizio con il sync e quel 7115 appunto potrebbe equivalere al Sync.. ma come si deve interpretare? mah..

ad occhio io direi che un tasto è identificato da 2 numeri, e in questo caso abbiamo 3 sequenze, di cui una incompleta OPPURE 2 sequenze e un segnale trascurabile per ora, OPPURE che 7115 sia SYNC, la durata di un clock sia ~1500

Immagino che questa squenza arrivi solo quando premi il tasto, ed essendo il tuo dito molto lento, venga inviato più volte.

Quindi le domande da porsi sono:

  1. Il modulo acceso e basta, che succede?
  2. Se premi 2 volte lo stesso tasto che succede?
  3. Se premi 2 tasti diversi (non insieme) che succede?

risposte:

  1. se accendo il modulo senza premere nulla, non succede nulla tranne che legge delle piccole stringhe di numeri..forse interferenze? forse qualche altra trasmissione?
  2. se premo più volte lo stesso tasto mi esce la stessa stringa più volte, con piccolissime variazioni
  3. questa mi manca...e ora sono a lavorare e non posso provare... :frowning:
    [/quote]

bene, allora ora conosci tutti i comandi, anche se non sai cosa vogliono dire... ora ti serve un trasmettitore senza protocollo (se no diventa difficile combinare qualcosa), e replicare i comandi raw... sinceramente non ti serve altro. se poi vuoi capire cosa significano quei comandi... dubito si vada molto oltre a un mucchio di 1 e 0

lesto:
bene, allora ora conosci tutti i comandi, anche se non sai cosa vogliono dire... ora ti serve un trasmettitore senza protocollo (se no diventa difficile combinare qualcosa), e replicare i comandi raw... sinceramente non ti serve altro. se poi vuoi capire cosa significano quei comandi... dubito si vada molto oltre a un mucchio di 1 e 0

ecco, è proprio qui il problema..
seguendo quel sito, ho costruito il ricevitore e ok. Però sotto la sezione trasmissione i vari sketch che ci sono indicano come inviare una serie di zero e di uno oppure il comando in versione HEX, ma non accenna minimamente all'invio del RAW puro.. è proprio per quello che mi sto fossilizzando per capire come trasformare la mia stringa di numeri in una seguenza di zeri e di uno...
ma forse sto sbagliando approccio..boh!

Dunque..ho fatto una prova con questo sketch:

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

void setup() {

  Serial.begin(9600);
  
  mySwitch.enableTransmit(10);
  
}

void loop() {

  mySwitch.send("111010111010101000011100");
//accende il gruppo 1
  delay(5000);  
  mySwitch.send("111000111001100100101100");
//spegne il gruppo 1
  delay(5000);
}

Teoricamente dovrebbe accendere la presa radiocomandata 1 ogni 5 secondi e dopo 5 secondi spegnerla.
In realtà succede che si accende o si spegne in maniera quasi random, come se il segnale non fosse inviato proprio sulla frequenza precisa...
ho anche provato a cambiare il valore della lunghezza dell'impulso con mySwitch.setPulseLength(320) ma niente...
eppure il trasmettitore si trova a 50 cm dal ricevitore (ho provato anche diverse altre distanze)...

Ciao a tutti,
finalmente ci sono riuscito, dopo un lungo periodo di meditazione!
Dunque..parto dall'inizio:

Tramite questo sketch:

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  Serial.begin(9600);
  mySwitch.enableReceive(0, output);

}

void loop() {

}

void output(unsigned long decimal, unsigned int length, unsigned int delay, unsigned int* raw) {

  if (decimal == 0) {
    Serial.print("Unknown encoding.");
  } else {
    Serial.print("Decimal: ");
    Serial.print(decimal);
    Serial.print(" (");
    Serial.print( length );
    Serial.print("Bit) ");
    Serial.print(" PulseLength: ");
    Serial.print(delay);
    Serial.println(" microseconds");
  }
  
  Serial.print("Raw data: ");
  for (int i=0; i<= length*2; i++) {
    Serial.print(raw[i]);
    Serial.print(",");
  }
  Serial.println();
  Serial.println();

}

e il mio fido arduino montato seguendo questo sito:

ho recuperato questa stringa di dati:

Unknown encoding.Raw data: 7116,936,596,928,592,932,604,428,1100,424,1100,420,1100,920,604,428,1108,428,1092,432,1092,928,600,432,1096,428,1088,932,600,428,1088,436,1100,932,600,428,1092,932,596,432,1092,928,600,928,596,432,1092,432,1108

Ora si trattava solo di trasformare questi numeri in una serie di 0 e di 1 da poter re-inviare, così ho fatto mediante questo sito:
http://test.sui.li/oszi/
immettendo quei dati mi esce lo schema del segnale e da li ho capito che ogni bit è composto da 4 parti, e che quindi il bit 1 è composto da 3 pulse ON e 1 off, mentre il bit 0 è composto da 1 pulse ON e 3 off, di cui ogni PULSE equivale a circa 380 mS, per cui ad esempio il primo bit (936,596) equivale a 3 pulse on e uno off, ovvero a UNO.
Seguendo questo schema ho tradotto la nostra stringa di dati in una serie di 1 e di 0, più precisamente questa:
111011110101011001011100

Ora, montando un trasmettitore RF sull'arduino come questo schema:

ed installando questo sketch:

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

void setup() {

  Serial.begin(9600);
  mySwitch.enableTransmit(10);
  mySwitch.setPulseLength(380);
  
}

void loop() {
  Serial.println("Invio segnale per accendere");
  mySwitch.send("111011110101011001011100");
  delay(5000);  

  Serial.println("Invio segnale per spegnere");
  mySwitch.send("111000111001100100101100");
  delay(5000);  
}

dovrei ottenere che accendo e spengo la presa radiocomandata ogni 5 secondi.
Invece non funziona.
Ed è qui che mi sono perso per giorni e giorni, fino ad oggi che ho avuto l'illuminazione!
Il problema sta nel segnale di sincronizzazione iniziale (7116) che nella versione di RCSwitch dice che è fatto da 1 pulse ON e 31 pulse OFF.
Ora, visto che all'inizio abbiamo detto che ogni PULSE equivale a 380mS circa, il nostro segnale di sincronizzazione doveva essere di circa 11700 mS, invece è circa 7100, ovvero equivalente a 18 pulse OFF.
Così ho modificato il file della libreria di RCSwich, ovvero RCSwitch.cpp, nella riga dove dice

void RCSwitch::sendSync() {
  this->transmit(1,31);
}

e ho sostituito 31 con 18, col risultato che ora funziona PERFETTAMENTE!!!!! che bello!!!

Ecco i codici di tutti i tasti del telecomando:

tutti on 111010 0011100111101 10010
tutti off 111010 1110101010000 10010

Aon 111011 1101010110010 11100
Aoff 111011 0000111111100 01100

Bon 111001 1010001000001 10101
Boff 111010 0111110011010 00101

Con 111010 0011100111101 11110
Coff 111010 1110101010000 11110

Don 111010 1011000101110 10111
Doff 111011 1000010010111 10111

grazie a tutti quanti che mi hanno supportato ma anche a chi mi ha sopportato! :slight_smile:

I miei complimenti!

solo una cosa non ho capito, stai usando come trasmettitore una schedina tx comprata, o quella del telecomando?

Davide.

complimenti e grazie per la condivisione,
:slight_smile:

dab77:
I miei complimenti!

solo una cosa non ho capito, stai usando come trasmettitore una schedina tx comprata, o quella del telecomando?

Davide.

ciao, come trasmettitore sto usando un semplice modulo Tx433.92 comprato su ebay, ma è tipo questo:
RF Link Transmitter - 434MHz - WRL-10534 - SparkFun Electronics, non mi andava di smembrare il telecomando!! :slight_smile:

quanti metri copri con questo trasmettitore ?

Il datasheet dice che in condizioni ottimali raggiunge 500 piedi, circa 150 metri..