Ricevitore monocanale per codifica MM53200 e HT-12: autoapprendimento e compatibilità

Piccolo ricevitore monocanale per codifica MM53200 e HT-12, con funzione di autoapprendimento. La decodifica si ottiene mediante un microcontrollore PIC di Microchip, che provvede anche alla memorizzazione dei codici di 10 TX e comanda l’uscita a relé.

La codifica MM53200, che deve il nome all’integrato encoder/decoder dell’allora National Semiconductors, è probabilmente la più antica usata nelle trasmissioni via radio e a infrarossi implementate nei telecomandi; proprio la diffusione e il successo riscosso hanno spinto altri costruttori, come ad esempio la UMC, a sviluppare dei “cloni” come l’UM3750 e (in un secondo momento) l’UM86409 (capace di funzionare anche a 5÷6 volt).

Malgrado il numero limitato di combinazioni (appena 4.096) la codifica MM53200 presenta molti pregi, uno dei quali è la possibilità di controllare i piedini di codifica con livelli logico binari o semplici dip-switch binari, e il fatto che sia la funzione di codificatore, sia quella di decoder, vengono svolte da un unico integrato: a seconda dell’impostazione di un apposito piedino (il 15), l’MM53200 e i suoi cloni possono funzionare da encoder o da decodificatore (esistono due pin per ricevere o trasmettere i codici).

Per quanto oggi si possa considerare limitata, poco sicura, rispetto ai sistemi rolling-code o alla più datata codifica Motorola MC14502x, avendo appena 4.096 combinazioni, la codifica MM53200 si usa ancora molto, soprattutto negli apricancello; perciò, ai tradizionali encoder/decoder, si è aggiunto anche un prodotto della Holtek, l’HT-12, il quale è pienamente compatibile.

Per venire incontro alla richiesta di chi deve fare manutenzione ai radiocomandi basati sulla codifica del genere, soprattutto di chi ha diversi trasmettitori ma non trova più i ricevitori di una determinata centralina apricancello, abbiamo pensato di realizzare un ricevitore monocanale con uscita a relé, capace di identificare i codici a standard MM53200 e di essere abbinato, tramite una semplice procedura, a un massimo di dieci trasmettitori.

Il nostro circuito si candida quindi a sostituire ricevitori esistenti con decodifica MM53200 e la disponibilità della funzione di autoapprendimento permette di abbinare i trasmettitori esistenti con grande facilità, a patto che abbiano come frequenza di clock dell’encoder 1,7 kHz.

Va infatti rammentato che l’MM53200 trasmette stringhe di dati temporizzate dal clock generato da un oscillatore interno, la cui frequenza di lavoro dipende dalla rete R/C collegata tra il piedino 13, il positivo di alimentazione e la massa; in un sistema tradizionale con ricevitore basato su MM53200, UM86409 o UM3750, la rete di clock deve determinare una frequenza uguale a quella posta sull’encoder del trasmettitore, altrimenti, pur impostando alla stessa maniera gli input di codifica (ovvero i dip-switch del codice) il decoder non riesce a identificare le stringhe in arrivo.

Nel nostro ricevitore, la decodifica e l’abbinamento dei codici dei dieci trasmettitori sono affidati a un microcontrollore, il cui firmware è in grado di adattarsi alla frequenza di clock del codificatore posto sul trasmettitore, purché sia 1,7 kHz, di sincronizzarsi con esso e quindi di estrarre il codice per memorizzarlo, ovvero analizzarlo al fine di comandare l’uscita a relé.

Ricevitore a un canale con PIC decoder - montato

Schema Elettrico del ricevitore 433MHz

Il circuito elettrico del nostro ricevitore è davvero essenziale: merito del microcontrollore, che da solo svolge il compito di decoder (ma ha un case grande la metà di quello dell’MM53200) e memoria dei codici, oltre a non avere bisogno di dip-switch e rete di clock.

Nella sezione RF utilizziamo un modulo ricevente Aurel a 433,92 MHz in grado di ricevere le trasmissioni in modulazione d’ampiezza OOK (On Off Key). In particolare, impieghiamo l’AC-RX2 (U3), un modulo ibrido molto economico ma nel contempo affidabile, sufficientemente selettivo e sensibile quanto basta. Il modulo U3 contiene la parte radio del circuito ed è un ricevitore specifico Aurel provvisto di amplificatore del segnale d’antenna (che conferisce una sensibilità di ben -106 dB), stadio di sintonia superrigenerativo sintonizzato a 433,92 MHz mediante compensatore tarato in fabbrica e dotato di filtro RF (il filtro serve a migliorare la selettività, che nei superrigenerativi non è elevata) e demodulatore d’ampiezza.

Completa la dotazione del modulo, uno squadratore a comparatore del segnale digitale (a livello TTL) uscente dal piedino 14 e un amplificatore LF del segnale in uscita dal demodulatore AM.

Sia il ricevitore che il microcontrollore vanno alimentati a 5 V, tensione ottenuta tramite il regolatore U1, un 78L05 in formato TO-92 che ricava i 5 volt partendo dalla tensione di 12 V in ingresso (applicata sulle piazzole PWR e necessaria per alimentare il relé) a 5 V ben stabilizzati.

I condensatori C1 e C2, posti in parallelo all’ingresso del regolatore, eliminano quanto possibile eventuali disturbi in arrivo dalla linea di alimentazione +/- PWR; i condensatori C3 e C4 (posti all’uscita del regolatore), invece, abbattono eventuali disturbi impulsivi e ripple residui.

Il diodo D1 protegge il circuito da eventuali inversioni accidentali della tensione di alimentazione.

Come già accennato, questo progetto è stato realizzato con un PIC12F683, un microcontrollore in formato 8 pin DIL di casa Microchip. Questo integrato dispone di sei porte di I/O, ma solamente cinque di queste sono state utilizzate.

Iniziamo dalla linea GP0 (pin 7): ad essa è collegato il LED LD1 che comunica i diversi stati di funzionamento del sistema, come l’identificazione dei codici MM53200, la loro memorizzazione e cancellazione ed altro ancora. Sulla linea GP1 è collegato il microswitch SW1 che avvia la chiamata delle routine di memorizzazione e cancellazione dei codici; su tale linea è attiva una resistenza di pull-up interna, cosa che forza GP1 allo stato alto quando SW1 non è premuto.

La linea GP2 rappresenta l’ingresso della stringa di dati seriali, ottenuti dalla demodulazione operata dal modulo RF (U3). Il PIC non richiede quarzo per sincronizzare il clock, perché adoperiamo l’oscillatore interno a 4 MHz, calibrato dalla stessa casa madre, e che ha una precisione dell’1%.

L’utilizzo dell’oscillatore interno, oltre a ridurre ulteriormente l’ingombro del circuito, libera le due linee di output GP5 e GP4, qui impiegate per la realizzazione delle uscite bistabile (GP5) e monostabile (GP4).

Per decidere quale tipo di comando debba ricevere il relé di uscita, è stato previsto il jumper a saldare da realizzare sul c.s.; per attivare la modalità bistabile si deve chiudere il contatto centrale sul B, mentre per ottenere il funzionamento monostabile (impulsivo) il contatto centrale va chiuso su M.

L’uscita così selezionata pilota, tramite la resistenza R1, la base di un BC547 montato a emettitore comune, il cui collettore alimenta la bobina del relé miniatura RL1; in parallelo alla bobina si trova il classico diodo che serve, all’interdizione del transistor, a spegnere il picco di tensione inversa che la bobina stessa tende a generare in reazione all’interruzione della corrente, secondo la ben nota Legge di Lenz.

Notate che in modalità monostabile l’uscita non è temporizzata come ci si aspetterebbe, pertanto torna a riposo immediatamente dopo il rilascio del pulsante.

 

 

Il firmware

Il codice sorgente è stato stilato in linguaggio BASIC ed è stato compilato con il compilatore PICBASIC PRO, della microEngineering Labs.

Nel Listato 1 riportiamo due delle più importanti routine: quella di lettura ed interpretazione del segnale e quella di acquisizione di un codice MM53200. Prima di entrare nel merito del firmware, diamo alcuni dettagli sulla parte iniziale del codice sorgente.

Questo ha inizio, come di solito, con la configurazione dei registri del PIC, (quindi l’attivazione dell’oscillatore interno tramite INTIO, del PWRT, della disabilitazione del reset esterno MCLR ecc.).

Fanno seguito alcune definizioni importanti come i codici numerici assegnati ai digit del codice (effettivi e fittizi), delle costanti di tempo e dei parametri di funzionamento (come i valori massimo e minimo dell’escursione del tempo di campionamento dei codici), nonché dell’assegnazione e inizializzazione delle dieci locazioni degli altrettanti codici memorizzabili.

A questo proposito va detto che, per ciascuno di questi, la EEPROM riserva, in modo opportuno, una coppia di byte di locazioni per la memorizzazione dei 12 bit del codice MM53200/HT12.

Ogni locazione coinvolta memorizzerà infatti una parte del valore binario di ogni singolo codice; nello specifico, la prima locazione conterrà gli ultimi 4 bit del codice, mentre la seconda i primi 8 bit del codice, così da avere l’intera rappresentazione dei 12 bit.

Per impostazione predefinita, le prime 20 locazioni (2 locazioni per 10 codici memorizzabili) della EEPROM vengono inizializzate a 255, valore che indica l’assenza del codice in quella specifica locazione.

Durante la fase di memorizzazione, le locazioni in questione conterranno il codice binario del trasmettitore, ma effettuando la cancellazione totale, tutte le 20 locazioni verranno sovrascritte con valore 255.

Fanno seguito le dichiarazioni delle variabili globali utili al programma (del tipo bit, byte e word array), nonché l’assegnazione di nomi fittizi alle linee di I/O (LED, pulsante, input da modulo RF, mono e bistabile).

Adesso entriamo nel vivo del firmware e per la sua analisi facciamo riferimento a quanto segue: all’accensione e dopo l’inizializzazione del sistema, il PIC, se rileva che il pulsante è premuto, avvia la procedura di cancellazione totale dei codici.

A tal proposito si ricorda che non è possibile cancellare un singolo codice per volta. Se SW1 viene mantenuto premuto in fase di avvio viene avviata la procedura di cancellazione totale della memoria, allo stato predefinito. Terminata questa fase (che ha luogo solo all’avvio) si passa al normale utilizzo, durante il quale è anche possibile la memorizzazione dei codici, previa pressione del pulsante di apprendimento.

A seguito della ricezione di un segnale RF valido, viene analizzata la EEPROM per la ricerca di locazioni libere e disponibili per il nuovo codice. In caso negativo, si chiude la procedura di memorizzazione e il LED rimane acceso fisso.

Se invece viene trovata una locazione libera, il PIC memorizza il nuovo codice in formato valido, dando conferma con un triplice lampeggio del LED. La routine di memorizzazione dei codici può essere attivata in qualsiasi momento durante il normale funzionamento del ricevitore.

La sua attivazione, infatti, avviene grazie ad un interrupt sulla linea GP0 (quella di SW1).

Oltre, abbiamo il normale funzionamento del ricevitore con la lettura continua del segnale fornito dal modulo e l’attivazione della linea relé (bistabile o monostabile a seconda della scelta), ogniqualvolta viene riconosciuto un codice presente in memoria.

L’aspetto più complesso, che sta alla base del funzionamento del ricevitore, è sicuramente il riconoscimento di un codice, che si realizza campionando opportunamente il segnale seriale in uscita dal ricevitore RF (U3).

Il principio secondo cui il codice viene campionato è descritto nel Listato 1, dove riportiamo la parte del firmware che si occupa di decifrare il segnale dati a standard MM53200/HT12.

La decodifica della stringa dati in arrivo dal TX si ottiene campionando opportunamente il segnale seriale in uscita dal ricevitore RF (U3).

Listato 1

‘
Decodifica il segnale RF ricevuto
CONTROLLO_RF:
  PULSIN RF, 0, CONTA‘ Misura la lunghezza del segnale di‘ sincronismo
TRENO[0] = CONTA
SELECT CASE CONTA
CASE IS & gt;
1350‘ Se il segnale non è nel range di sincronisimo
RICEVUTO = 0
CASE IS & gt;
1100
FOR I = 1 TO 12‘ Salvo la lunghezza dei 12 impulsi
PULSIN RF, 1, CONTA
IF CONTA & lt;
20 or CONTA & gt;
85 THEN
GOTO FINE
ENDIF
TRENO[I] = CONTA
NEXT I
GOSUB CODIFICA_MM53200
CASE ELSE
RICEVUTO = 0
FINE:
  END SELECT
RETURN

‘ Controllo tra tutti i radiocomandi memorizzati se c’ è quello trasmesso
CERCA_SENSORE:
  LOC = 0
TRoVATO = 0
CH = 0
FOR I = 1 TO TX_MAX‘ Cerco nella memoria sensori(TX_MAX = 10)
CH = CH + 1
read LOC, COD_1B‘ Lettura primo Byte del codice
LOC = LOC + 1
read LOC, COD_2B‘ Lettura secondo byte del codice
LOC = LOC + 1
IF COD_A = COD_1B AND COD_B = COD_2B THEN
TROVATO = 1‘ Codice ricevuto uguale al codice in memoria
goto FINE_CERCA
ELSE
TROVATO = 0
ENDIF
NEXT I
FINE_CERCA:
  RETURN

‘ Decodifica il segnale dei sensori MM53200 / HT12
CODIFICA_MM53200:
  ERRORE = 0
FOR I = 1 TO 12‘ Per tutti e 12 i bit del codice associo un valore‘ binario se la lunghezza dell’ impulso appartiene alla‘ codifica e lo salvo in TRENO[I]
IF TRENO[I] & lt; = 20 or TRENO[I] & gt; = 85 THEN
ERRORE = 1
ENDIF
IF TRENO[I] & gt; = 45 AND TRENO[I] & lt; = 50 THEN
ERRORE = 1
ENDIF
IF TRENO[I] & gt;
20 AND TRENO[I] & lt;
45 THEN
TRENO[I] = 0
ENDIF
IF TRENO[I] & gt;
50 AND TRENO[I] & lt;
85 THEN
TRENO[I] = 1
ENDIF
NEXT I
IF ERRORE = 0 THEN
RICEVUTO = 1
ELSE
RICEVUTO = 0
ENDIF
RETURN

‘ Funziona richiamata appena si riceve un codice RF valido.‘Permette di memorizzare in due byte il valore binario presente nell’ array
COMPRIMI_CODICE:
  COD_A = 255
COD_B = 255
COD_B .0 = TRENO[1]
COD_B .1 = TRENO[2]
COD_B .2 = TRENO[3]
COD_B .3 = TRENO[4]
COD_B .4 = TRENO[5]
COD_B .5 = TRENO[6]
COD_B .6 = TRENO[7]
COD_B .7 = TRENO[8]
COD_A .0 = TRENO[9]
COD_A .1 = TRENO[10]
COD_A .2 = TRENO[11]
COD_A .3 = TRENO[12]
RETURN

Piano di montaggio

Elenco componenti

R1: 4,7 kohm
R2: 470 ohm 
C1: 100 µF 35 VL elettrolitico
C2: 100 nF 
multistrato
C3: 100 nF 
multistrato
C4: 10 µF 35 VL elettrolitico
U1: 78L05
U2: PIC12F683 (MF1111)
U3: AC-RX2
D1: 1N4007
D2: 1N4007
LD1: LED 3 mm verde
T1: BC547
SW1: Microswitch
RL1: relé miniatura 12V

Varie:
- Zoccolo 4+4
- Circuito stampato S0767

 

Collaudo e funzionamento

Il circuito, quindi, una volta alimentato funzionerà immediatamente. Per il collaudo prendiamo uno o più trasmettitori con codifica MM53200 a 433 MHz e con frequenza di clock di 1,7 kHz (ad esempio modelli TX3750-2CS e TX3750-4CS). Fornendo alimentazione, il LED del circuito deve emettere 5 lampeggi ad indicare il corretto avvio.

Vediamo per prima cosa come apprendere i codici.
1. Premere e tenere premuto il pulsante SW1.
2. Il LED verde (LD1) si accende ad indicare che si è in autoapprendimento e che da questo momento possiamo trasmettere il codice che intendiamo memorizzare.
3. Premere il pulsante del radiocomando che si desidera apprendere, e attendere che il LED lampeggi rapidamente tre volte, segno che l’apprendimento è andato a buon fine e che la procedura (almeno se avete premuto e rilasciato SW1) è terminata.

Se il LED rimane fisso, la memoria è piena o il codice trasmesso non è valido.

Notate che il circuito non accetta stringhe di dati, cioè codici del trasmettitore, corrispondenti alla combinazione di codifica che vede tutte le linee del codificatore del TX a livello basso (non potete tenere tutti i dip in stato ON); ciò dipende da come funziona il firmware e per come viene gestita la EEPROM del microcontrollore, il circuito può memorizzare i codici dei trasmettitori senza preclusioni, fuorché per quella che prevede tutti i bit ad 1 (tutti i dip-switch del radiocomando impostati su ON); quindi del trasmettitore potranno essere usate 4.095 invece di 4.096 combinazioni.

Notate altresì che dal momento in cui avete premuto SW1, questo deve essere mantenuto premuto per poter memorizzare il codice; rilasciando SW1, verrà abortita la procedura di memorizzazione (possiamo memorizzare un massimo di 10 codici). Per poter apprendere un nuovo codice, al termine della memorizzazione, rilasciare il pulsante e quindi premerlo nuovamente eseguendo quindi la medesima procedura sopra descritta.

Vediamo, infine, come cancellare la memoria dei codici, premettendo che è possibile cancellare unicamente tutta la memoria e non il singolo codice di un radiocomando tra quelli appresi. La procedura è la seguente.
1. Togliere alimentazione al dispositivo.
2. Premere il pulsante SW1 e tenerlo premuto.
3. Fornire alimentazione.
4. Il LED verde rimane acceso fisso per 2 secondi ad indicare l’avvenuta cancellazione della memoria dei codici.
5. Il LED verde emetterà 5 lampeggi ad indicare l’uscita dalla procedura di cancellazione e l’avvio normale del ricevitore.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Menu