Creative Commons BY-NC-ND 2.5Questo sito e tutto il suo contenuto sono distribuiti sotto la licenza Creative Commons Attribuzione - Non Commerciale - Non opere derivate 2.5 Italia e con le condizioni d'uso definite nel disclaimer: siete pregati di leggere entrambi questi documenti prima di usufruire dei contenuti di questo sito. Per alcuni contenuti è necessaria una registrazione gratuita: non è necessario pagare e non è necessario accumulare punteggi per accedere agli articoli e scaricare i sorgenti. Basta solo essere onesti. Se volete che questo sito continui a rimanere attivo, a contribuire ogni giorno alla diffusione della cultura libera, non copiate il materiale per ripubblicarlo in altri luoghi : chi fa questo è solo un miserabile e un perdente. Se volete partecipare su settorezero e rendere le vostre idee, i vostri progetti, fruibili da tutti senza limitazioni, come dovrebbe essere in un paese civile e acculturato, potete farlo tranquillamente.

[User Project] Modulo RS485 per centralina persiane elettriche

Autore: Ferdinando Longhi | Data pubblicazione: 6 ottobre 2012
Categorie: I vostri progetti PICmicro 10/12/16 Robotica e Automazione

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

PDFCentralina persiane a 2 ante con modulo RS485 (46.53 kB - 80 downloads)

L'articolo ti è piaciuto o ti è stato utile per risolvere un problema? SettoreZero è realizzato soltanto contenuti originali: tutti gli articoli sono curati con passione dagli autori e nulla viene copiato da altri siti. Supporta e mantieni in vita SettoreZero con una donazione: basta soltanto un caffè o una birra. Puoi supportare SettoreZero anche con uno dei progetti elencati nella sezione servizi o partecipare anche tu con un tuo articolo/progetto personale.

Se desiderate che SettoreZero continui a rimanere gratuito e fruibile da tutti, non copiate il nostro materiale e segnalateci se qualcuno lo fa.

Puoi andare alla fine dell'articolo e lasciare un commento. I trackback e i ping non sono attualmente consentiti.

  1. #1 da skagngh il 11 dicembre 2012

    Intanto complimenti per l’articolo e il progetto.
    Ti chiedo una delucidazione, all’interno del codice, più precisamente nell’interrupt della seriale, utilizzi l’istruzione goto:

    if (Input[1]==Address && Input[3]==1) {
    goto ReadStatus;//Leggo lo stato del modulo
    }

    c’è un motivo in particolare per usare questa istruzione invece di eseguire il codice direttamente nell’if?
    Ciao e grazie.

    • #2 da Ferdinando Longhi il 14 dicembre 2012

      Grazie skagngh !!!
      I complimenti fanno sempre piacere.
      Si, in realta’ potevo mettere l’istruzione direttamente nella riga dell ‘if’, ma credo che sia più’ ordinato così’ come l’ho fatto io.
      Nel momento della creazione del codice non avevo ancora idea di cosa avrebbe fatto la chiamata a ‘ReadStatus’. Il caso ha voluto che fosse una sola riga di codice !!!

Devi essere collegato per lasciare un commento.

  1. Ancora nessun trackback
settorezero.com e il logo Zroid™ ©2007÷2013 Giovanni Bernardo - E' vietata la copia e la distribuzione anche parziale dei contenuti di questo sito web senza l'esplicito consenso dell'autore.
I contenuti di settorezero.com sono distribuiti sotto una licenza Creative Commons Attribuzione-Non Commerciale-Non Opere derivate 2.5 Italia a cui vanno aggiunte le condizioni d'uso definite nel disclaimer.
settorezero.com e tutti i suoi contenuti sono tutelati dalla legge sul diritto d'autore per cui i trasgressori sono perseguibili a norma di legge.
Creative Commons BY-NC-ND 2.5
Il tema di questo sito è basato sul tema Fusion per wordpress, realizzato originariamente da digitalnature e fa uso del plugin Wassup per il computo delle statistiche. Per contattare l'autore siete pregati di utilizzare la sezione contatti.
Per essere aggiornato con tutte le novità di settorezero.com seguici anche anche su Facebook Twitter Tumblr Blogspot Youtube.