Sommario:

Decodificatore sensore RF Arduino: 5 passaggi
Decodificatore sensore RF Arduino: 5 passaggi

Video: Decodificatore sensore RF Arduino: 5 passaggi

Video: Decodificatore sensore RF Arduino: 5 passaggi
Video: One Channel Transmitter and Receiver with 433Mhz RF module 2024, Dicembre
Anonim
Decodificatore sensore RF Arduino
Decodificatore sensore RF Arduino

La mia casa precedente era dotata di un sistema di sicurezza preinstallato con sensori della porta, un sensore di movimento e un pannello di controllo. Tutto era cablato a una grande scatola elettronica in un armadio e c'erano le istruzioni per cablare un telefono fisso per chiamare automaticamente in caso di allarme. Quando ho provato a giocarci, ho scoperto che uno dei sensori della porta era installato in modo incompleto e un altro era intermittente a causa di un allineamento errato. Alla faccia dell'installazione professionale propagandata sul biglietto da visita della società di sicurezza. La mia soluzione all'epoca era acquistare un paio di telecamere di sicurezza Internet e un allarme di sicurezza wireless economico.

Avanti veloce fino ad oggi e quell'allarme wireless è seduto in una scatola nel mio seminterrato. Dopo aver acquistato un ricevitore RF economico, ho deciso di vedere se potevo decodificare i messaggi trasmessi dalla varietà di sensori di allarme e telecomandi che ho. Ho pensato che, poiché funzionavano tutti con la scatola di allarme economica, dovevano utilizzare tutti lo stesso formato di messaggio con solo un ID diverso. Ho scoperto presto che sono simili solo nella struttura generale dei messaggi. Quindi il progetto è passato rapidamente da banale a molto interessante.

Passaggio 1: moduli sensore

Moduli sensore
Moduli sensore
Moduli sensore
Moduli sensore
Moduli sensore
Moduli sensore
Moduli sensore
Moduli sensore

Come puoi vedere nelle immagini sopra, i trasmettitori includono sensori di porta aperta, rilevatori di movimento, telecomandi di inserimento e una tastiera wireless utilizzata per programmare la scatola di allarme. A quanto pare, nessuno di questi dispositivi utilizza la stessa lunghezza di sincronizzazione o durata in bit. L'unico punto in comune, oltre alla lunghezza del messaggio, è il formato di base dei bit. Ogni bit occupa un periodo di tempo fisso con la differenza tra uno zero e uno essendo il ciclo di lavoro delle porzioni alto/basso.

La bella forma d'onda mostrata sopra NON è quella che ho ricevuto per la prima volta. Poiché c'è così tanto traffico nella banda di frequenza 433 MHz, ho dovuto assicurarmi di attivare il sensore appena prima di impostare l'oscilloscopio per eseguire un singolo trigger. Fortunatamente i sensori emettono diverse copie del messaggio di dati quando vengono attivati e i telecomandi e la tastiera continuano a emettere messaggi finché viene premuto un tasto. Utilizzando l'oscilloscopio sono stato in grado di determinare la lunghezza della sincronizzazione e le durate dei bit di dati per ciascun elemento. Come accennato in precedenza, i tempi di sincronizzazione sono diversi e i tempi di bit sono diversi, ma i formati dei messaggi hanno tutti una sincronizzazione di basso livello seguita da 24 bit di dati e un bit di stop. Questo mi è bastato per essere in grado di creare un decodificatore generico nel software senza dover codificare tutti i diversi dettagli per ciascun dispositivo.

Passaggio 2: hardware

Hardware
Hardware
Hardware
Hardware

Originariamente ho costruito un decodificatore di sensori utilizzando un microcontrollore PIC e un linguaggio assembly. Di recente ho giocato con le varianti di Arduino, quindi ho pensato di vedere se potevo replicarlo. Il semplice schema è mostrato sopra e c'è anche una foto del mio prototipo. Tutto quello che ho fatto è stato usare tre cavi jumper comuni per andare dall'Arduino Nano alla scheda del ricevitore RF. L'alimentazione e una singola linea dati sono tutto ciò che serve.

Se leggi il mio Instructable sul "Display 3 in 1 dell'ora e del tempo" vedrai che uso un comune ricevitore RXB6, 433 MHz. Potresti riuscire a far funzionare i ricevitori davvero economici a corto raggio necessario per questo progetto, ma consiglio comunque di utilizzare un ricevitore super-eterodina.

Passaggio 3: software

Il software converte i bit ricevuti in caratteri ASCII visualizzabili. Emette il valore della lunghezza di sincronizzazione e le lunghezze dei bit 1 e 0. Poiché conoscevo già le lunghezze di sincronizzazione e i formati di bit, avrei potuto scrivere il software appositamente per loro. Invece, ho deciso di vedere se potevo scriverlo per ordinare le lunghezze di sincronizzazione e per capire automaticamente i bit di dati. Ciò dovrebbe rendere più semplice la modifica nel caso in cui volessi provare a rilevare altri formati in qualche momento. È importante notare che il software non sa se il primo bit di un messaggio è un 1 o uno 0. Presuppone che sia un 1 ma, se scopre che avrebbe dovuto essere uno zero, invertirà il bit nel messaggio completato prima di inviarlo alla porta seriale.

I tempi dell'impulso di sincronizzazione e dei bit di dati sono determinati utilizzando l'ingresso di interruzione esterno INT0 per attivare un gestore di interruzione. INT0 può attivarsi su un fronte in salita, in discesa o su entrambi i fronti o su un livello basso costante. Il software viene interrotto su entrambi i fronti e misura la quantità di tempo in cui l'impulso rimane basso. Ciò semplifica le cose perché l'avvio/sincronizzazione del messaggio è un impulso di basso livello e i bit possono essere determinati in base al loro tempo di basso livello.

Il gestore dell'interruzione determina innanzitutto se il conteggio acquisito è sufficientemente lungo da essere un impulso di avvio/sincronizzazione. I vari dispositivi che ho utilizzano impulsi di sincronizzazione di 4, 9, 10 e 14 millisecondi. Le istruzioni define per i valori di sincronizzazione consentiti min/max sono in primo piano nel software e sono attualmente impostate per 3 e 16 millisecondi. I tempi dei bit variano anche tra i sensori, quindi l'algoritmo per la decodifica dei bit deve tenerne conto. Il tempo di bit del primo bit viene salvato così come il tempo di un bit successivo che presenta una differenza significativa rispetto al primo bit. Non è possibile un confronto diretto dei tempi di bit successivi, quindi viene utilizzato un "fattore fudge" definito ("Variazione"). La decodifica dei bit inizia assumendo che il primo bit di dati sia sempre registrato come 1 logico. Quel valore viene salvato e quindi utilizzato per testare i bit successivi. Se un successivo conteggio di bit di dati si trova all'interno della finestra di varianza del valore salvato, allora viene registrato anche come 1 logico. Se è al di fuori della finestra di varianza del valore salvato, viene registrato come 0 logico. Se lo 0 logico il tempo di bit è più breve del primo tempo di bit, quindi viene impostato un flag per indicare al software che i byte devono essere invertiti prima di essere visualizzati. L'unico caso in cui questo algoritmo fallisce è quando i bit in un messaggio sono tutti 0. Possiamo accettare questa limitazione perché quel tipo di messaggio non ha senso.

I sensori che mi interessano hanno tutti una lunghezza del messaggio di 24 bit di dati ma il software non si limita a quella lunghezza. C'è un buffer per un massimo di sette byte (è possibile aggiungerne altri) e definisce la lunghezza minima e massima del messaggio in byte. Il software è impostato per raccogliere i bit, convertirli in byte, memorizzarli temporaneamente e quindi emetterli in formato ASCII tramite la porta seriale. L'evento che fa scattare l'uscita del messaggio è la ricezione di un nuovo impulso di start/sync.

Passaggio 4: registrazione dei dati

Registrazione dati
Registrazione dati

Il software è impostato per emettere i dati convertiti come caratteri ASCII tramite l'uscita seriale (TX) di Arduino. Quando ho realizzato la versione PIC avevo bisogno di interfacciarmi con un programma terminale sul PC per visualizzare i dati. Un vantaggio dell'IDE Arduino è che ha una funzione Serial Monitor integrata. Ho impostato la velocità della porta seriale su 115,2k e quindi ho impostato la finestra Serial Monitor sulla stessa velocità. La schermata qui mostra un display tipico con uscite da una varietà di sensori che ho. Come puoi vedere, i dati a volte non sono perfetti ma puoi facilmente determinare quale dovrebbe essere il valore reale di ciascun sensore.

Passaggio 5: software di ricezione di esempio

Software ricevitore di esempio
Software ricevitore di esempio

Ho incluso un elenco di software di esempio che mostra come utilizzare le informazioni raccolte per ricevere una serie specifica di codici per la tua applicazione. Questo esempio è impostato per emulare uno dei miei punti vendita remoti Etekcity. Un comando accende il LED integrato nel Nano (D13) e l'altro comando spegne il LED. Se non hai un LED integrato nel tuo Arduino, aggiungi il resistore e il LED come mostrato nel diagramma. In un'applicazione reale, questa funzione accende/spegne l'alimentazione per una presa elettrica (usando un relè o un triac). I tempi di sincronizzazione, i tempi di bit e i byte di dati previsti sono tutti definiti in anticipo per facilitare la modifica. Puoi utilizzare una qualsiasi delle linee dati rimanenti per attivare/disattivare le cose, ecc. per la tua applicazione specifica. Basta aggiungere il codice di comando applicabile che definisce e sostituire la logica di accensione/spegnimento del LED in "loop" in base alle proprie esigenze.

Consigliato: