rc-switch

Prese telecomandate

In fase di sviluppo Stesura preliminare In fase di sviluppo

La libreria rc-switch permette di ricevere, analizzare e trasmettere i codici tipicamente usati per controllare tramite telecomando prese elettriche come quelle mostrate nella fotografia di apertura. Si tratta di un prodotto che utilizza tecnologie che, con un certo eufemismo, possono essere classificate come legacy, ma che hanno il vantaggio di non dipendere da servizi cloud, da internet o da smartphone e PC.

L'obbiettivo è quello di sostituire il telecomando della fotografia di apertura con Arduino al fine di poter programmare l'accensione e lo spegnimento degli utilizzatori collegati alle prese. Questa soluzione permette ad Arduino di controllare apparecchiature alimentate alla tensione di rete senza dover collegare nessun circuito auto-costruito a tensioni pericolose, aspetto critico per esempio in ambienti scolastici.

Il livello fisico

Il sistema utilizza una portante radio con frequenza 433.9 MHz con modulazione OOK (nota 1). Sono necessari i seguenti due moduli, o simili, disponibili per pochi euro presso tutti gli abituali fornitori di componenti elettronici:

Un trasmettitore ef un ricevitore 433.9 MHz

I moduli possono essere usati anche senza antenna esterna, garantendo una copertura di qualche metro, più che adeguata per molte applicazioni.

Analisi del segnale

Innanzitutto è necessario analizzare il segnale trasmesso. Collegando un oscilloscopio al pin RX del modulo ricevitore RXB6 è possibile osservare il segnale quando è premuto uno dei tasti del telecomando:

Codice per l'accensione della presa con indirizzo 1 

Codice per lo spegnimento della presa con indirizzo 1 

Le sequenze mostrate sono ritrasmesse continuamente fintanto che il tasto è premuto, separate da un intervallo di circa 11 ms.

I due grafici precedenti sono stati ottenuti con un Picoscope 3405A impostando il trigger avanzato come di seguito mostrato:

Trigger avanzato

Quando non è premuto alcun tasto sul telecomando, l'uscita del demodulatore è un segnale casuale causato dal rumore:

 

La decodifica può essere fatta osservando la figura seguente:

Il codice di decodifica

La libreria per Arduino rc-switch permette la decodifica del segnale mostrato sopra. Queste librerie possono essere installare attraverso il gestore di librerie di Arduino oppure direttamente da GitHub, sito dove sono presenti gli esempi e la documentazione.

L'hardware da realizzare è semplice: si collega il pin RX del modulo ricevitore RXB6 ad uno dei pin di Arduino (D2 nell'esempio seguente).

Il codice seguente mostrerà sul monitor seriale alcune delle caratteristiche del frame ricevuto in corrispondenza della pressione dei vari pulsanti del telecomando:

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

void setup() {
 Serial.begin(9600);
 mySwitch.enableReceive(0); // Uso dell'interrupt 0, pin 2
}

void loop() {
 if (mySwitch.available()) {
  Serial.print(mySwitch.getReceivedValue(), BIN);
  Serial.print(" (0x");
  Serial.print(mySwitch.getReceivedValue(), HEX);
  Serial.println(")");

  Serial.print (mySwitch.getReceivedBitlength());
  Serial.println (" bit");

  Serial.print ("Ritardo: ");
  Serial.print (mySwitch.getReceivedDelay());
  Serial.println (" us");

  Serial.print ("Protocollo: ");
  Serial.println (mySwitch.getReceivedProtocol());
  Serial.println ("");

  mySwitch.resetAvailable();
 }
}

L'output mostra per ciascun frame corrispondente ad un determinato pulsante:

Attività 1

Decodificare il frame corrispondente alla pressione di ciascuno dei tasti del telecomando

Il codice di codifica

I codici ricavati con l'attività 1 possono essere usati per attivare o disattivare le prese.

L'hardware da realizzare è semplice: si collega il pin TX del modulo FS1000A ad uno dei pin di Arduino (D10 nell'esempio seguente).

Il codice è intuitivo:

#include <RCSwitch.h>

#define SW1ON "000000010100010001010101"
#define SW1OFF "000000010100010001010100"

RCSwitch mySwitch = RCSwitch();

void setup() {
 Serial.begin(9600);
 mySwitch.enableTransmit(10);
 mySwitch.setProtocol(1);
 mySwitch.setPulseLength(353);
 mySwitch.setRepeatTransmit(15);
}

void loop() {
 mySwitch.send(SW1ON);
 delay(1000);
 mySwitch.send(SW1OFF);
 delay(1000);
}

In alternativa alla stringa binaria, invero piuttosto scomoda, è possibile usare il numero corrispondente in decimale o esadecimale, specificando la lunghezza in bit. Per esempio:

#define SW1ON 0x14455
...
mySwitch.send(SW1ON,24);

Note

  1. Il tutto potrebbe in realtà utilizzare un qualunque modulatore/demodulatore, anche ottico
  2. In base ai fogli tecnici del circuito integrato presente nel telecomando originale (HS2262) la durata dell'impulso breve e dell'impulso lungo dovrebbero essere 1/4 e 3/4 della durata del bit, cioè 355 µs e 1 066 µs. La differenza, non piccolissima, riscontrata non sembra però essere significativa


Pagina creata nel febbraio 2022
Ultima modifica: 23 febbraio 2022


Licenza "Creative Commons" - Attribuzione-Condividi allo stesso modo 3.0 Unported


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima