venerdì 2 marzo 2012

Arduino e prese radiocomandate:

Ecco il necessario:
-piattaforma ARDUINO (nel mio caso arduino uno)
-prese radiocomandate SILVERCREST mod.53117 comprate alla LIDL
-modulo trasmettitore RF 433.92 mhz (http://www.sparkfun.com/products/10534)
-modulo ricevitore RF433.92 mhz (http://www.sparkfun.com/products/10532).

Dunque..collegando ARDUINO al modulo ricevitore, come indicato in figura:
 Il pin DATA del modulo è da collegare al pin 2 di  Arduino.

ovviamente il modulo è diverso, bisogna guardare i pin del proprio modulo.
Ad esempio il modulo che ho usato io (ricavato da una delle prese radiocomandate è questo:

 Dove il pin 1 è il GND, il pin 2 è il DATA e il pin 3 è il Vcc.

Installando sull'arduino questo sketch (previa installazione del modulo RC-Switch):

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

}

Si ottengono i dati dal telecomando originale, ad esempio, nel mio caso, se schiaccio il tasto A ON ottengo questi 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

Come interpretare questi dati?
Semplice, grazie a questo sito:
http://test.sui.li/oszi/
Incollando qui i dati si ottiene, in forma grafica, l'onda della trasmissione RF.

Da qui ho capito che ogni bit è composto da 4 parti, e che quindi il bit 1 è composto da 3 pulse HIGH e 1 LOW, mentre il bit 0 è composto da 1 pulse HIGH e 3 LOW, di cui ogni PULSE equivale a circa 380 mS, per cui ad esempio il primo bit (936,596) equivale a 3 pulse HIGH e uno LOW, 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:
http://code.google.com/p/rc-switch/wiki/HowTo_Send
ed installando questo sketch:



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);
}


 


Così facendo funziona tutto! 

8 commenti:

  1. Qua ci sono 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

    RispondiElimina
  2.   ciao
    mi aiuti
    quando carico il tuo codice mi da errore su questa riga
    perché?

    mySwitch.enableReceive(0, output);

    RispondiElimina
  3. di seguito l'errore che restituisce:

    error: no matching function for call to 'RCSwitch::enableReceive(int, void (&)(long unsigned int, unsigned int, unsigned int, unsigned int*))'

    RispondiElimina
  4. hai dichiarato la libreria all'inizio?

    RispondiElimina
  5. Puoi spiegare meglio il procedimento che fai subito dopo aver decodificato i valori nell'onda quadra? Mi spiego meglio, non ho capito come ottieni '111011110101011001011100' dall'onda quadra

    RispondiElimina
  6. Salve le volevo chiedere se era possibile inviare il codice di bit a premere di un pulsante come deve essere il codice mi potete aiutare? Vorrei accendere una presa quando voglio e spegnere quando voglio. È possibile?

    RispondiElimina
  7. Ciao anche io voglio realizzare la stessa cosa hai trovato soluzioni?

    RispondiElimina