Modulo RS485 per centralina persiane elettriche

Dopo aver realizzato la centralina per automatizzare le persiane elettriche (vedi articolo precedente) e aver motorizzato quasi tutte le persiane di casa, ho pensato che sarebbe stato utile un controllo remoto. Nel caso in cui volessi cambiare il tempo di apertura o chiusura, la velocità di rallentamento o altro, avrei dovuto accedere alla centralina e riprogrammare il pic con i nuovi parametri. Perchè quindi non sfruttare al massimo le potenzialità del micro e controllarlo tramite l’ UART?

Sappiamo bene che in realtà la UART è limitata per quanto riguarda la connessione con altri dispositivi nel senso che i segnali digitali a 5 volt possono fare poca strada senza decadere o essere alterati da campi elettromagnetici. Una strada possibile per inviare e ricevere dati e quindi controllare uno o più dispositivi contemporaneamente è sicuramente quello di fare affidamento al bus RS485.

La migliore trattazione sul bus RS485 è sicuramente quella di Vincenzo Villa, vi rimando a questo suo tutorial per informazioni sul funzionamento del bus 485

Ho quindi realizzato una semplice interfaccia basata sull’integrato MAX481:

Il MAX481 non è, ovviamente, l’unico transceiver RS485 disponibile dalla Maxim: nella categoria dei transceivers a basso consumo ne possiamo trovare altri: http://www.maximintegrated.com/datasheet/index.mvp/id/1111 . Ci sono inoltre molti transceiver anche di altre marche.

In particolare il modello da me scelto consente un massimo di 32 dispositivi sullo stesso bus e permette una comunicazione half duplex: posso ricevere e trasmettere ma mai contemporaneamente.

I dip switch visibili nello schema elettrico hanno lo scopo di includere o escludere le resistenze di polarizzazione del BUS (DIP-1 e 2) o per includere la resistenza di fine linea da 150Ω. Molto velocemente ricordo che le resistenze di polarizzazione ottimizzano il segnale nel caso di trasmissioni difficoltose e il valore è inversamente proporzionale al numero di transceiver collegati. La resistenza di fine linea, invece, va posta all’inizio e alla fine della tratta del BUS RS485, ma può essere omessa nel caso in cui la velocità di trasmissione (come nel nostro caso) e’ piuttosto bassa.

Chi volesse un BUS più veloce troverà utile la possibilità di bilanciare la linea selezionando il DIP-3 su ON. Completo la descrizione dello schema spiegando che il pulsante S1 verrà usato per programmare l’indirizzo della centrale e che il LED-1 presente sullo stampato mi mostrerà, con la sua accensione, che sono in modalità programmazione. Il modulo BUS verrà installato sopra la centralina ed il collegamento elettrico avverrà tramite una doppia serie strip maschi.

Modulo RS485

Per finire abbiamo una morsettiera a quattro poli dove possiamo applicare la tensione di 5V ed il segnale della linea seriale 485 indicato comunemente con le  lettere A e B: questo sarà collegato tramite doppino twistato ad un convertitore RS485/USB o RS485/RS232 e quindi al PC. Il modulo e’ stato creato per funzionare con lo standard RS485, ma nessuno vieta (e questo spiega perché è da innesto) di usare altri metodi di trasmissione come ad esempio ICAN, X10 (onde convogliate), XBEE ecc. Il firmware originale del pic, rispetto a quello presente nell’articolo precedente, è stato aggiornato aggiungendo la parte per la gestione della USART e della EEprom, per poter così memorizzare l’indirizzo del modulo più altri parametri di sistema.

Centralina con su innestato il modulo RS485

La memoria del pic16F88 e’ stata completamente utilizzata (99,5%) così come tutte le sue funzionalità:  ho difatti usato il PWM, l’EEprom, la USART, oscillatore interno, interrupt del TMR0 …di sicuro il pic non si annoierà !!! In questo articolo mi limiterò a commentare solo le parti aggiunte nel firmware originale che, ricordo, si trova qui

Per iniziare a comunicare con la centralina abbiamo bisogno di un programma come Hyperterminal (per mia comodità uso Hercules e quindi farò riferimento a questo programma) e un convertitore RS232/RS485 ( se il vostro PC è dotato di porta RS232) o USB/RS485.

Impostiamo i parametri su Hercules: avviamo il software, selezioniamo la modalità di comunicazione seriale ed inseriamo i parametri come in figura (baud rate 9600,N,8,1):

Clicchiamo quindi su open: siamo pronti a ricevere dati. Ora accendiamo la centralina e questa ci invierà una stringa per dirci che è ‘viva’. Vediamo ora come interpretare le stringhe che trasmettiamo o riceviamo. Tutte le stringhe sono composte da 6 bytes e seguono il seguente protocollo:

Dove:

TABELLA 1

I dati di sistema sono: indirizzo centrale, indirizzo gruppo, tempo di apertura della prima anta ecc. , i quali dati vengono richiamati/scritti all’avvio mediante la seguente porzione di codice:

All’accensione del PIC viene eseguito un controllo per verificare se l’ EEprom interna ha nelle sue celle i valori dei dati di sistema oppure no. Infatti, quando si programma il PIC, le celle EEprom hanno tutte il valore di default 0xFF. Questo vuol dire che se controlliamo la locazione di memoria 0 e questa contiene il valore 0xFF vuol dire che dobbiamo memorizzare i nostri dati per ritrovarli alla prossima accensione.

N.D.R.
questa parte di codice poteva essere evitata mediante le funzioni integrate di scrittura eeprom del compilatore, vedi qui,  che memorizzano i dati in eeprom all’atto della programmazione.

Vediamo allora cosa memorizzare:

Il controllo che viene effettuato subito dopo, è quello di verificare se è stato premuto il tasto di programmazione S1. Se così è, il LED si accenderà per segnalare che siamo in modalità programmazione. Il modulo invierà sul BUS il proprio indirizzo per avvisare a chi ascolta con chi stiamo dialogando quindi resta in attesa di ricevere dal PC o chiunque possegga l’indirizzo 0, il nuovo indirizzo che il modulo deve memorizzare. Fatto questo il LED si spegnerà. Possiamo eventualmente uscire da questa modalità semplicemente ripremendo il tasto di programmazione. Questa procedura possiamo usarla anche solo per conoscere l’indirizzo di un modulo non identificato.

La stinga da inviare, tenendo conto di quanto detto prima e ipotizzando che il modulo possegga l’indirizzo 255 e vogliamo dargli quello nuovo pari a 1, sarà:

dove x = dato ininfluente

premiamo il tasto di programmazione S-1, il LED si accenderà. Nel primo campo del riquadro send del terminal, utilizzando valori decimali inseriremo:

#255#000#000#004#001#000

Ipotizziamo adesso di voler aprire le ante con un comando remoto al modulo appena re-indirizzato. Riguardando la tabella 1 sappiamo che dobbiamo inviare il comando 3 seguito dal Dato-1 che assumerà il valore 1 se vogliamo aprire, 2 se vogliamo chiudere e 3 se vogliamo passare al comando successivo : se le ante sono aperte le chiuderemo, se sono chiuse le apriremo.

#001#000#000#003#001#000

Finito il ciclo di apertura, il modulo ci invia una stringa con lo stato attuale delle ante. Ipotizziamo di ricevere come risposta :

#000#001#000#001#001#000

Tradotto vuol dire stiamo rispondendo al modulo con indirizzo 0 (PC) che chi trasmette ha indirizzo 1, che il gruppo di appartenenza e’ 0, che il comando e’ 1 (invio dati di stato delle ante ) e che lo stato e’ 1.

Quest’ultimo valore decimale va decifrato seguendo la tabella 2. I primi tre bit (BIT-0, BIT-1, BIT-2) del suo valore binario mi daranno lo stato della prima anta, mentre i successivi tre (BIT-3, BIT-4, BIT-5) lo stato della seconda anta.

TABELLA 2

Se riceviamo la seguente stringa:

#000#001#000#001#036#000

posso capire che mia moglie ha lasciato il solito stendino davanti alle ante delle persiane !!!! Immaginiamo ora di voler cambiare il tempo di apertura della prima anta a 10 secondi. Dalla tabella 1 sappiamo che il comando da inviare sarà il 2, ma come facciamo ad inviare il dato al posto giusto? Occorre fare riferimento alla tabella 3:

TABELLA 3

Proviamo a comporre la stringa che il PC dovrà inviare al solito modulo 1.

#001#000#000#002#003#010

Dove il primo byte e’ l’indirizzo della centralina (destinatario), il secondo e’ quello del PC  (mittente) al quale stiamo inviando i dati, il terzo e’ il gruppo di appartenenza (vedremo più tardi di che si tratta), il quarto e’ il comando (scrivi), il quinto e’ il valore nuovo da memorizzare, il sesto non e’ usato.

Rileggiamo il valore (comando 5)

#001#000#000#005#003#000

Il modulo risponderà:

#000#001#000#005#003#010

Vediamo ora a cosa serve il parametro gruppo. Mettiamo il caso di voler chiudere con un comando solo tre persiane e con un altro comando altre quattro persiane. Grazie al parametro gruppo possiamo riunire le prime tre centraline sotto il gruppo uno e le altre quattro sotto il gruppo due.In questo modo inviando il comando:

#000#000#001#003#001#000

si apriranno le tre persiane appartenenti al gruppo uno. Da notare che l’indirizzo del destinatario deve essere messo a zero in quanto la centralina prenderà  in considerazione solo il parametro gruppo e non più l’indirizzo del destinatario. Se vogliamo aprire le altre quattro persiane il comando da inviare sarà:

#000#000#002#003#001#000

Va da sè che mettendo tutte le persiane sotto lo stesso gruppo con un comando solo possiamo a aprire o chiudere tutte le persiane contemporaneamente.

Downloads

Centralina persiane a 2 ante con modulo RS485 (627 download)

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)