Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/ognigiorno.com/wp-content/plugins/math-comment-spam-protection/math-comment-spam-protection.php:1) in /var/www/html/ognigiorno.com/wp-includes/feed-rss2.php on line 8 Elettronica Pratica – OgniGiorno.com https://www.ognigiorno.com insieme tutti i giorni Sun, 29 Apr 2012 20:53:39 +0000 en-US hourly 1 https://wordpress.org/?v=5.8.10 Un’architettura completa https://www.ognigiorno.com/2009/09/08/un%e2%80%99architettura-completa.html https://www.ognigiorno.com/2009/09/08/un%e2%80%99architettura-completa.html#respond Tue, 08 Sep 2009 11:00:29 +0000 http://www.ognigiorno.com/?p=358 Read More »Un’architettura completa]]> Vediamo come realizzare una scheda flessibile e potente utilizzando il PIC16F887. Tramite questa scheda riusciamo a realizzare quasi ogni circuito, basando la struttura su un BUS con cui interfacciare le varie periferiche.
arch

Qui viene presentata l’architettura e descritto il funzionamento di massima. Da qui si può partire poi per la personalizzazione, in base ai desideri di ciascuno.

La mia scelta è stata quella di utilizzare un controllore abbastanza potente, da essere considerata davvero una soluzione universale. Comprato direttamente da microchip spendiamo meno di 3 auro, quindi non considero uno “spreco” quando la realizzazione ci porta a realizzazioni semplici.
Esempi di utilizzo sono i classici ed ormi inflazionati robot, antifurto, centraline di controllo, più o meno tutto, limitatamente alla nostra capacità e voglia di scrivere firmware e pensare a periferiche da collegare.

Lo schema di massima è visibile in figura e mostra una configurazione abbastanza utilizzabile: tastiera e display sono quasi onnipresenti nei nostri circuiti, quindi sono collegati e gestiti direttamente dal controllore. Le altre due porte del processore servono per la realizzazione del BUS e del canale di interrupt. In questo modo realizziamo un BUS multiprotocollo con la gestione di interrupt.

Multiprotocollo perché sono inserite le linee seriali e i2c, ma anche i restanti 4 pin che permettono uno scambio di 4 bit. Ogni connettore al BUS ha inoltre un collegamento ad un diverso pin della porta B che gestisce gli interrupt. busIn questo modo ogni scheda può prevedere un pin di segnalazione e il software sulla mainboard ne riconosce la segnalazione, in base alla posizione.

]]>
https://www.ognigiorno.com/2009/09/08/un%e2%80%99architettura-completa.html/feed 0
Come pilotare i servo con i PIC https://www.ognigiorno.com/2009/05/01/come-pilotare-i-servo-con-i-pic.html https://www.ognigiorno.com/2009/05/01/come-pilotare-i-servo-con-i-pic.html#respond Thu, 30 Apr 2009 23:22:53 +0000 http://www.ognigiorno.com/?p=337 Read More »Come pilotare i servo con i PIC]]> futaba_s3003_servoI servomotori (o servo) sono dei dispositivi molto utili per chi si diletta nella costruzione di robot e più in generale per tutte le realizzazioni che uniscono meccanica ed elettronica (spesso chiamata meccatronica o cibernetica). Si tratta in effetti di motori di precisione controllabili elettronicamente. Vediamo in questo articolo come funzionano e come fare per controllarli tramite microcontrollori.

Cosa sono i servomotori

In un piccolissimo contenitore racchiudono un motore, un riduttore ed il circuito che lo controlla. Il riduttore serve per aumentare la potenza disponibile. Il circuito permette di controllare la posizione del servo tramite impulsi inviati su un singolo filo.

I servo hanno infatti tre soli fili di collegamento. Si tratta di positivo e negativo di alimentazione e del filo di controllo (spesso erroneamente indicato come PWM).

Il rotore che esce dal corpo del servo (che può essere di plastica o metallico) ha collegata una croce che permette di utilizzarlo nelle costruzioni. Hanno solitamente liberta di movimento limitata a 180 gradi (mezzo giro). Smontandoli è possibile modificarli per eliminare questa limitazione e renderlo libero di girare 360 gradi come un motore normale.

Come si controllano

L’impulso di controllo serve per controllare la posizione, cioè per far muovere il rotore fino a che non raggiunge l’angolazione desiderata.

Il controllo è un segnale alto che si ripete a distanza di 20 ms, seguito dal livello basso. In base alla durata dell’impulso 1, il servo si posiziona tra 0 e 180 gradi.

Nel disegno è illustrato il meccanismo e la tabella di seguito riporta alcuni esempi (ogni costruttore porta delle leggere differenze)

sheetservo

Impulso di controllo Cavi di collegamento
Costruttore min. centro. max Hz + batt -batt impulso
Futaba 0.9 1.5 2.1 50 rosso nero bianco
Hitech 0.9 1.5 2.1 50 rosso nero giallo
Graupner/Jr 0.8 1.5 2.2 50 rosso marrone arancio
Multiplex 1.05 1.6 2.15 40 rosso nero giallo
Robbe 0.65 1.3 1.95 50 rosso nero bianco
Simprop 1.2 1.7 2.2 50 rosso azzurro nero

Le caratteristiche

Coppia: la forza che è in grado di esercitare. È espressa in kg/cm e indica quanti chili il servo è in grado di muovere per ogni cm di lunghezza del braccio (a partire dal perno di rotazione)

Velocità di rotazione. Espressa solitamente in gradi (o secondi) al secondo

Angolo di rotazione. Più diffusi servo che ruotano 180, ma ce ne sono che limitano a 90 o estendono a 270 il loro movimento

Tipo di ingranaggi: plastica o metallo. È indice della robustezza

]]>
https://www.ognigiorno.com/2009/05/01/come-pilotare-i-servo-con-i-pic.html/feed 0
Digitalizzare il plastico del trenino https://www.ognigiorno.com/2009/04/23/digitalizzare-il-plastico-del-trenino.html https://www.ognigiorno.com/2009/04/23/digitalizzare-il-plastico-del-trenino.html#respond Thu, 23 Apr 2009 11:04:38 +0000 http://www.ognigiorno.com/?p=330 Read More »Digitalizzare il plastico del trenino]]> Un progetto dedicato agli appassionati di modellismo ferroviario che permette di digitalizzare il controllo di scambi, segnali e altri dispositivi presenti nel plastico.
scambiomarklin

Il circuito presentato è studiato per trenini Märklin, ma modificabile per adattarlo a tipologie diverse. Come vedremo, la parte di alimentazione è pensata per la corrente alternata, la modifica per adattarla a corrente continua richiede poco e, anzi, permette di ridurre le dimensioni ed il numero di componenti.


Il vantaggio che deriva da questo progetto lo si vede principalmente nel numero di cavi con cui abbiamo a che fare nel cablaggio dell’impianto. A differenza del metodo tradizionale, per cui dobbiamo prevedere 3 fili dalla centrale di comando ad ogni dispositivo (eventualmente riducibile a 2), con un circuito digitale riusciamo ad utilizzare tre soli fili comuni a tutti i dispositivi controllati. Oltre ai due di alimentazione, il terzo filo è quello su cui viaggiano i dati.

Il formato in cui vengono trasmessi i dati prevede di inviare le informazioni relative a quale operazione e quale dispositivo è chiamato a reagire.

Il funzionamento
Il controllo avviene tramite una centralina a disposizione dell’operatore (il modellista che si diverte con locomotive e trenini vari).
Ogni dispositivo viene poi controllato direttamente da un decodificatore. Il decodificatore è collegato in ingresso al BUS di comunicazione (i tre fili che partono dalla centralina) e in uscita direttamente allo scambio da controllare.
Siccome tutti i decoder sono collegati insieme, deve essere individuato un sistema per fare in modo che ciascuno riconosca il comando a cui deve rispondere. Per questo ad ogni decodificatore verrà assegnato un codice (indirizzo). Parliamo poi di “comando” per identificare l’azione che vogliamo controllare. Usando sempre lo scambio come esempio, i comandi sono due: dritto e storto.
Quando l’operatore decide di girare uno scambio, dalla centralina parte un messaggio (che arriva a tutti contemporaneamente) che contiene l’indirizzo ed il comando. In questo modo il decoder confronta l’indirizzo con il proprio e, in caso di corrispondenza, esegue il comando.
Nella realizzazione qui descritta ho implementato un protocollo seriale che prevede un solo byte per l’indirizzo. Questo significa che si possono controllare fino a 255 dispositivi differenti. In caso non siano sufficienti, si può modificare il protocollo. 2 byte estendono a 65535 il numero di dispositivi.

La centralina
La centralina è costituita da una tastiera numerica ed un display a 4 cifre. Ho utilizzato display a 7 segmenti per rendere il numero più visibile e sicuramente più “in stile” con il plastico di come sarebbe stato con un LCD, ma nessuno impedisce di fare diversamente. In questo modo va interpretata la lettura nel modo seguente: le prime tre cifre rappresentano l’indirizzo, la quarta il comando.
centralina_blocchi

Esempio: se chiamiamo 1 il comando “dritto” e 7 “storto”, per raddrizzare lo scambio identificato dell’indirizzo 56, dovremo visualizzare 0561 sul display (056 indirizzo + 1 comando). Visualizzato il numero corretto, si preme “invia” e il messaggio parte dalla centralina.
Nella foto è visibile lo schema a blocchi della centralina. Oltre a quanto descritto, vi è solo l’alimentatore.

Il decodificatore
Lo schema elettrico del decodificatore è visibile qui sotto. La scelta è stata quella di dotare ogni decodificatore di un alimentatore in grado di abbassare a 5v la tensione per il microcontrollore. In questo modo si riescono ad utilizzare solo i tre fili, due dei quali sono comuni con le alimentazioni delle bobine degli scambi. Da 16 a 5 si ottiene una buona stabilizzazione per il PIC anche semplicemente alimentando tramite diodo zener e condensatore il controllore.
Siccome le dimensioni del decodificatore sono davvero contenute (tutto realizzato con componenti SMD), l’aggiunta di 3 componenti non crea grossi problemi. In alternativa, per ridurre ulteriormente le dimensioni, si può prevedere un’uscita a 5v dalla centralina e aggiungere un filo al BUS.
Il jumper serve per l’assegnamento dell’indirizzo. Il decoder funziona normalmente a contatto aperto (senza jumper). Quando presente, il decoder risponde come se avesse indirizzo 0. Dalla centralina è possibile mandare il comando 0 all’indirizzo N, che vene trasmesso come comando N all’indirizzo 0 e interpretato dal decoder che risponde a 0 come comando di assegnamento indirizzo. L’indirizzo viene memorizzato in EEPROM, quindi mantenuto anche a circuito non alimentato.

decoder_schema
A circuito nuovo, va quindi fatto un lavoro di assegnamento indirizzo a tutti i decodificatori. Per comodità si può eseguire questa operazione non necessariamente con i decodificatori montati sul plastico, ma tenerceli comodamente a portata di mano (è più facile mettere e togliere il jumper). Rispetto alla soluzione spesso adottata dei DIP switch, questo metodo permette di ridurre dimensioni e costi del decoder. Visto che ormai il 12F519 costa circa 20 centesimi ed è dotato di memoria Eprom, si riesce a realizzare il decoder con i pochissimi componenti come mostrato nello schema per un costo totale inferiore all’euro!
Idee aggiuntive.
Vediamo ora alcuni spunti per ulteriori implementazioni o estensioni del dispositivo.
Si possono costruire decodificatori destinati a controllare altri dispositivi, in modo per esempio di controllare tramite relè l’illuminazione del plastico, o azionare automatismi come i motorini che muovono gru, piattaforme o altro.
In alternativa al PIC 12F519, per il decodificatore si può utilizzare un controllore con più piedini di uscita, in modo da controllare più di uno scambio con lo stesso decoder.

]]>
https://www.ognigiorno.com/2009/04/23/digitalizzare-il-plastico-del-trenino.html/feed 0
Meglio il C o l’assembler? https://www.ognigiorno.com/2009/04/03/meglio-il-c-o-l%e2%80%99assembler.html https://www.ognigiorno.com/2009/04/03/meglio-il-c-o-l%e2%80%99assembler.html#respond Fri, 03 Apr 2009 10:09:38 +0000 http://www.ognigiorno.com/?p=267 Read More »Meglio il C o l’assembler?]]> Questa è una domanda che spesso si pone chi lavora con i controllori e scrive firmware. Vorremmo avere una risposta universalmente applicabile, ma ogni volta che andiamo in una direzione ci torna il dubbio che forse l’altra scelta sarebbe stata la migliore.
Non voglio certo avere la pretesa di dare la soluzione a questo dilemma, mi fa però piacere descrivere la soluzione che ho adottato, che mi sta facendo lavorare molto bene da parecchio tempo, con una buona efficienza nel tempo dedicato alla scrittura del codice. Riporto inoltre alcune informazioni che permettono sicuramente di farsi un’idea migliore e prendere una decisione.

I problemi da affrontare
La scelta non è dettata esclusivamente dal linguaggio in termini di formalismo e sintattico (altrimenti immagino che tutti andrebbero sul BASIC senza troppi dubbi). Le problematiche da affrontare riguardano
– l’ottimizzazione del codice scritto in termini di risorse impiegate (memoria RAM, Program memory, tempi di esecuzione)
– il controllo diretto delle componenti a basso livello (registri, funzionalità speciali,…)
– il controllo diretto sui tempi di esecuzione necessario quando si lavora in real time
– la gestione della memoria
– la riusabilità del codice scritto e la sua portabilità su controllori differenti
– l’ergonomia nella scrittura del codice

Cosa fa un compilatore

“Il compilatore si occupa di tradurre in codice binario (o codice macchina) il programma scritto nel linguaggio che esso interpreta”. Questo è quello che macroscopicamente si associa al concetto di compilatore. In realtà un buon compilatore fa molto di più, soprattutto in relazione a quanto il linguaggio è “distante” dalla macchina. Si parla di generazione del linguaggio, pensando anche alla reale evoluzione storica che hanno avuto i linguaggi di programmazione

  • 1GL (first generation language) è in effetti il codice macchina. Si tratta della rappresentazione binaria che il processore utilizza ed esegue. Nella programmazione dei controllori lo vediamo leggendo i files .hex che trasferiamo sul controllore. Il programma è costituito da una serie di caratteri binari, come descritto nel datasheet del controllore.
  • 2GL (second generation language) di fatto è l’assembler (o assembly) è poco più che una traduzione in codice mnemonico dei comandi binari.
  • 3GL (third generation language) linguaggi di più alto livello solitamente di tipo procedurale (per esempio C o Java). Il compilatore traduce in codice macchina, effettuando operazioni più complesse della semplice traduzione letterale come avviene per i 2GL.
  • 4GL (fourth generation language) si tratta di linguaggi dalla sintassi che tende ad avvicinarsi al linguaggio naturale (SQL ne è un esempio). Lo cito solo per completezza
  • 5GL (fifth generation language). Sono linguaggi di programmazione che utilizzano ambienti grafici o visuali per interfacciarsi col programmatore. Solitamente si basano comunque su linguaggi 3GL o 4GL.

Spesso si può quindi parlare di assembler e codice macchina come se fossero sinonimi.

Si capisce che un linguaggio 3GL porta delle caratteristiche che complicano la traduzione in linguaggio macchina, in particolare, le strutture tipiche di un linguaggio di programmazione:

  • Variabili
  • Tipi di dati complessi
  • Iterazioni (o cicli)
  • Scelta
  • Procedure

Siccome questi linguaggi hanno l’obiettivo principale di mascherare al programmatore la gestione delle risorse a basso livello (gestione RAM e program memory), è il compilatore che si occupa di automatizzare la traduzione.

Ragioniamo per esempio alle variabili. Quando scriviamo un programma in assembler utilizziamo genericamente indirizzi di memoria per apoggiare dei valori. Se non creiamo intrecci, possiamo utilizzare la stessa locazione per scopi differenti in rami diversi del programma. Per comodità ci costruiamo una “mappa” per cui ci è chiaro l’utilizzo di ogni porzione di memoria.
In C ci limitiamo a dichiarare una variabile sapendo quale è il suo scope (la sua visibilità). La gestione della memoria (scegliere quale locazione, decidere con chi può essere condivisa, da quale ramo di codice può essere scritta, ….) è tutte ad opera del compilatore.
Ogni compilatore implementa un suo preciso meccanismo per effettuare tutte queste operazioni. È proprio qui la differenza dei compilatori.

Proviamo a semplificare il lavoro di un compilatore:

  1. Analisi del codice in termini di “albero delle chiamate”. Elenco di tutte le funzioni con le relative dipendenze (chi chiama chi). Utile per vedere le funzioni che convivono e che quindi non possono condividere aree di memoria
  2. Catalogazione di tutti gli oggetti (funzioni) in termini di dimensione del codice e richiesta di memoria.
  3. Analisi dei parametri di input e resultcode.
  4. Creazione della mappa di memoria. Solitamente viene suddivisa in segmenti logici, dedicati a diverse tipologie di esigenza (variabili, parametri, tipi di dati pi lunghi del byte, …)
  5. In caso di limitazioni del compilatore effettua la gestione per mascherare le limitazioni. Ad esempio i processori di fascia bassa della Microchip hanno una limitazione sulla profondità di chiamata delle funzioni (max 2 livelli) il compilatore deve aggirare il problema. Il compilatore picc di HI-TECH si costruisce una jump table che usa per mascherare call/return con coppie di goto.

Per tutte queste gestioni il codice macchina prodotto da un compilatore contiene molte più istruzioni di quelle strettamente necessarie per eseguire le operazioni a basso livello.
Questo è il motivo per cui genericamente si dice “l’assembler è più performante del C”. Ci si riferisce allo strato di funzionalità base che il compilatore introduce, l’overhead prodotto dal compilatore.
Questo è necessario perché un linguaggio 3GL si propone come linguaggio indipendente dalla macchina fisica su cui viene eseguito. Questa “indipendenza” si paga.
Dopo questa semplificata descrizione, riassumo alcune caratteristiche dei due linguaggi:

Linguaggio C

  • è un linguaggio più comodo. Offre una sintassi e una gestione procedurale che ne agevola la scrittura e la lettura da parte dell’uomo
  • è pressoché indipendente dall’hardware sottostante. Attenzione: questo non significhi che TUTTI i programmi scritti in C sono effettivamente indipendenti dall’hardware. E nel caso di firmware per microcontrollori questo lo si vede spesso ed è una dell considerazioni principali nella scelta del linguaggio. A cosa mi riferisco? L’istruzione RB3 = 1; è un comando C, ma se serve per accendere un LED collegato al piedino 3 della porta B del PIC, questa è una conoscenza hardware necessaria per il funzionamento del programma. Quando programmiamo un microcontrollore non vale l’analogia con il computer. In questo caso, infatti, solitamente il programma C interagisce con il sistema operativo e difficilmente abbiamo la necessità di utilizzare direttamente componenti Hardware.
  • La traduzione in codice macchina perde in efficienza
  • Generalmente la scrittura di codice richiede meno tempo

Assembler

  • permette accesso diretto all’hardware
  • è possibile gestire con precisione i tempi di esecuzione di ogni istruzione
  • la programmazione richiede una buona conoscenza del processore su cui il codice viene eseguito
  • richiede molta attenzione e precisione nella definizione delle strutture.

Indipendentemente dal linguaggio, scrivendo firmware sui controllori è necessario avere la conoscenza del processore con cui stiamo lavorando. Per applicazioni più semplici e avendo a disposizione una buona libreria, con il C possiamo facilmente cavarcela anche senza conoscere i dettagli dell’hardware

La mia scelta
Innanzi tutto va tenuto conto che da hobbista utilizzo strumenti non professionali. Non ho intenzione di spendere migliaia di euro quando con un po’ di lavoro in più (si tratta sempre di passione) posso ottenere ottimi risultati gratis.
I miei strumenti sono MPLAB ed il compilatore Picc di HI-TECH versione freeware.
A meno di intervenire pesantemente su parametri di configurazione del compilatore, avere a disposizione compilatori con buona ottimizzazione e avere una conoscenza del compilatore più dispendiosa della conoscenza del processore, ci sono molte operazioni che non sono di fatto possibili in C.
Cito un esempio: le routine di trasmissione seriale. Scritte in C e compilate per i controllori PIC baseline funzionano senza problemi. Compilando lo stesso codice su controllori di fascia diversa, il compilatore cambia i criteri di ottimizzazione (che sono poi legati a effettive differenze hardware) e smettono di funzionare. C’è una spiegazione. Nella comunicazione seriale (bit banging) è richiesta una precisa gestione del tempo. L’overhead introdotto dal compilatore nel secondo caso è tale per cui sarebbe richiesta una ricalibrazione dei ritardi introdotti nel codice.

Abbiamo un’alternativa, la stessa scelta che è stata fatta nel mondo dei computer. Ormai a costi bassi possiamo trovare controllori sempre più potenti, che offrono come funzionalità base quasi tutto quello che serve, con memoria pressoché illimitata. Quindi per far lampeggiare un LED scriviamo un semplice programma in C e lo facciamo girare su un controllore 1 32bit dotato di porta USB, Ethernet, con 32k di program memory, 256k memoria RAM, gestione nativa del BUS I2C e SPI, 32 convertitori A/D, …
Forse è un po’ eccessivo? È comunque una possibilità. Con i computer hanno fatto così!

Io preferisco identificare il processore più adatto allo scopo e dimensionarlo correttamente, disegnare il circuito e dimensionare il tutto in base alle effettive esigenze.
Come linguaggio utilizzo insieme il C e l’assembler: ho costruito una buona libreria di funzioni base in assembler che utilizzo chiamandole da funzioni C. Solitamente il main lo scrivo in C, scrivo in C funzioni che non richiedono particolare ottimizzazione, uso le funzioni assembler e sto sempre attento alla percentuale di risorse utilizzate. Quando sforo, mi tocca sempre convertire in assembler alcune delle funzioni C.

]]>
https://www.ognigiorno.com/2009/04/03/meglio-il-c-o-l%e2%80%99assembler.html/feed 0
Alcuni consigli per progettare un impianto fotovoltaico https://www.ognigiorno.com/2009/04/01/alcuni-consigli-per-progettare-impianto-fotovoltaico.html https://www.ognigiorno.com/2009/04/01/alcuni-consigli-per-progettare-impianto-fotovoltaico.html#respond Wed, 01 Apr 2009 17:08:54 +0000 http://www.ognigiorno.com/?p=264 Read More »Alcuni consigli per progettare un impianto fotovoltaico]]> Riporto alcuni suggerimenti per migliorare le prestazioni e l’efficienza degli impianti fotovoltaici. Si tratta di considerazioni che non sempre sono considerate ma che richiedono davvero poco per avere miglioramenti notevoli nella resa dell’impianto

La distribuzione della corrente va fatta ad alta tensione. Può sembrare più comodo, avendo già pannello e batteria a 12V, utilizzare questa tensione per la distribuzione. Questo va bene solo se si lavora con basse potenze, quindi per esempio parlando di impianto di illuminazione a basso consumo. Non va dimenticato che a parità di potenza, la corrente (ampere) aumenta col diminuire della tensione (Volt). 100W corrispondono a circa 8A lavorando a 12V e circa 0,45 a 220V.
Corrente alta significa dispersione, cavi grossi e surriscaldamento. La potenza disponibile verrebbe dispersa quasi tutta lungo il cavo. È questo il motivo per cui la distribuzione geografica avviene ad alte tensioni e l’impianto di casa è ad alta tensione

Il pannello deve essere il più possibile vicino alle batterie. Il motivo è lo stesso del punto precedente. In questo modo si accorcia il percorso a bassa tensione, e quindi la tratta di maggior dispersione

Meglio un impianto grande che tanti piccoli. O almeno raggruppare le batterie. Siccome l’utilizzo tramite accumulatore offre i suoi vantaggi da quanto riusciamo a sfruttare la carica della batteria, avere a disposizione due batterie che offrono la stessa energia in due piccoli impianti non rende come averne una grossa. Il rischio è quello di trovarsi con batterie mezze cariche, ma non avere la potenza necessaria

Abbinare un impianto solare termico per il riscaldamento. Riscaldare acqua elettricamente non è efficiente e ci porterebbe a potenze in gioco molto maggiori. Se si affianca un impianto termico e si utilizza la caldaia elettrica come aggiunta si ha maggior efficienza in termini di investimenti (costi) sull’impianto.

Orientare i pannelli a sud garantisce l’esposizione migliore al sole. Va tenuto in considerazione pensando al posizionamento. Ad averne la possibilità si può pensare ad un inseguitore solare, un dispositivo ch varia l’inclinazione a l’orientamento del pannello, in modo da tenerlo costantemente perpendicolare ai raggi solari.

I pannelli vanno mantenuti sempre puliti per migliorarne l’irraggiamento. Decidendo la posizione, consideriamo che devono essere raggiungibili periodicamente. Pensare di metterli sul tetto e dimenticarli significa non avere corrente l’anno dopo…

Tenere in considerazione il periodo invernale per fare i conti. Siccome l’efficienza dipende da molti fattori legati al posizionamento e alla quantità di luce che ricevono, facciamo i conti con il caso peggiore. Secondo chi ci vende l’impianto va sempre bene tutto e non ci sono problemi. Se pensiamo ad un investimento importante, forse ci conviene fare delle rilevazioni preliminari per capire realmente la resa che avrebbe l’impianto finale.

Pensiamo anche al miglioramento dell’efficienza energetica di casa. Non abbiamo ancora lampadine a basso consumo? Possiamo effettuare modifiche anche comportamentali che portano ad una riduzione dei consumi? Sono domande che ci dovremmo fare indipendentemente dall’installazione di un impianto fotovoltaico, ma che sicuramente in questa occasione permettono di avere grandi risultati. Solo un esempio: un temporizzatore permette di distribuire il consumo nell’arco della giornata diminuendo la potenza massima che ci serve.

Fidiamoci di che ci vende l’impianto, ma ragioniamo con la nostra testa: quando si compra, l’impianto è sempre quello che va bene per noi e il migliore che si potesse scegliere. E poi… come mai il costo coincide sempre con il massimo spendibile per ottenere il contributo statale previsto per le agevolazioni fiscali?

]]>
https://www.ognigiorno.com/2009/04/01/alcuni-consigli-per-progettare-impianto-fotovoltaico.html/feed 0
Come pilotare i display LCD tipo HD44780 https://www.ognigiorno.com/2009/03/30/come-pilotare-i-display-lcd-tipo-hd44780.html https://www.ognigiorno.com/2009/03/30/come-pilotare-i-display-lcd-tipo-hd44780.html#respond Mon, 30 Mar 2009 08:12:13 +0000 http://www.ognigiorno.com/?p=254 Read More »Come pilotare i display LCD tipo HD44780]]> Un valido dispositivo di output quando si lavora con i controllori è il display LCD. Ne esistono diversi per dimensioni (numero di righe e lunghezza righe). Quello mostrato nella foto è 2×16, ma l’interfacciamento è lo stesso anche con altre dimensioni. Il protocollo qui descritto (con allegato codice sorgente in C) prevede un interfacciamento di 4 bit di dati (oltre ai 3 di controllo).

hd44780

I collegamenti del display
(Fare comunque riferimento alla documentazione tecnica del produttore. Nel mio caso si tratta di Hitachi HD44780)

Pin Nome
1 Vss
2 Vdd
3 Contrasto (collegare a massa)
4 RS
5 RW (di solito a massa)
6 E
7 D0 (n.c. per interfacciamento a 4 bit)
8 D1 (n.c. per interfacciamento a 4 bit)
9 D2 (n.c. per interfacciamento a 4 bit)
10 D3 (n.c. per interfacciamento a 4 bit)
11 D4
12 D5
13 D6
14 D7

Dalla tabella vediamo che per utilizzare un collegamento a 4 bit dobbiamo utilizzare i 4 più significativi del display, il register Select (RS) e il pin Enable (E)

Protocollo di comunicazione

  1. Portare RS a 1 per invio dati, 0 per invio di comando
  2. Portare E a 1
  3. Valorizzare i 4 bit più significativi
  4. Portare E a 0
  5. Portare E a 1
  6. Valorizzare i 4 bit meno significativi
  7. Portare E a 0

In caso di interfacciamento a 8 bit, i dati vanno inviati tutti in una volta
Inserire un ritardo di almeno 2ms tra ogni operazione

Inizializzazione del display
Appena acceso, il display, va inizializzato, inviando i comandi base. Primo fra tutti la selezione del modo di comunicazione a 4 o 8 bit.
La sequenza esatta è visibile dal codice sorgente scaricabile qui

Inviare caratteri al display
Dopo l’inizializzazione è possibile inviare i caratteri trasmettendo il loro valore ASCII.
Il display incrementa automaticamente la posizione, quindi non è necessario fare nulla tra un carattere ed il successivo

Il codice allegato
Il codice che allego l’ho testato con controllori PIC (!6f506, 16F84, 16F689 e 16F887), ma è utilizzabile con tutti i controllori che hanno almeno 6 piedini disponibili.

]]>
https://www.ognigiorno.com/2009/03/30/come-pilotare-i-display-lcd-tipo-hd44780.html/feed 0
Utilizzare le tastiere a matrice https://www.ognigiorno.com/2009/03/23/utilizzare-le-tastiere-a-matrice.html https://www.ognigiorno.com/2009/03/23/utilizzare-le-tastiere-a-matrice.html#respond Mon, 23 Mar 2009 10:37:10 +0000 http://www.ognigiorno.com/?p=209 Read More »Utilizzare le tastiere a matrice]]> Vediamo in questo articolo come utilizzare le tastiere a matrice tramite un controllore PIC. Queste tastiere si possono trovare in commercio, o si possono far realizzare su misura a costi piuttosto bassi (meno di 8 euro l’una). Permettono di ottimizzare il numero di piedini utilizzati per i tasti, in quanto per NxM tasti sono necessari solo N+M connessioni al microprocessore.
Nell’immagine è poi visibile un esempio di come montare la tastiera.

tastiera_muro

Utilizzando la placca BTicino delle prese shuko ho installato la tastiera al muro con un lavoro praticamente invisibile, dalla resa altamente professionale. La tastiera utilizzata è di quelle a membrana con adesivo sul retro. Per l’installazione ho incollato la tastiera al supporto nero (quello su cui solitamente si incastrano gli interruttori o le prese) e applicato la placca. Il circuito è inserito nella scatola all’interno del muro.
Le tastiere a matrice le possiamo anche reperire in un qualsiasi mercatino, per esempio acquistando un vecchio telefono, o possiamo realizzarle noi stessi, collegando gli interruttori in uno schema righe/colonne.

La logica consiste nel raggruppare righe e colonne della tastiera e collegare tutti i terminali a porte di I/O del controllore. Le porte vanno quindi configurate in Input per le colonne e Output per le righe (o viceversa). Le linee in ingresso dovrebbero avere una resistenza di pull-up (o pull-down, se preferiamo. Il codice va poi scritto di conseguenza).

tastiera_matrice
La routine che legge il tasto premuto deve ciclare sui piedini attestati alle righe, portando a livello basso uno alla volta. Leggendo le colonne in assenza ti tasto premuto, si leggerà 1 su tutti i piedini. Quando la lettura è 0 significa che è stato premuto il tasto corrispondente all’incrocio riga/colonna (riga portata bassa, colonna letta).

Le tecniche per ciclare sulle righe sono differenti: nell’esempio da me riportato vengono modificate una per una direttamente. In alternativa si può utilizzare l’operatore si shift. Dipende da quali sono i terminali a cui sono collegate. Ne dobbiamo tenere conto (se possibile) in fase di progettazione. Non sempre è possibile perché ormai i controllori hanno molti piedini dedicati a funzioni speciali (UART, SPI, I2C, convertitori A/D, PWM, …) per cui non sempre riusciamo dedicare alla tastiera piedini contigui della stessa porta.

Immediatamente dopo aver effettuato la lettura va inserito un piccolo ritardo come antirimbalzo.
Nel codice sorgente che ho allegato vediamo un altro controllo sulla pressione, inserito solo per un tasto, ma utilizzabile tranquillamente per tutti. Associato alla pressione di un tasto ho due differenti codici di ritorno in caso di pressione breve o prolungata.

unsigned char ReadKey (void) {
unsigned char tt;

for (;;) {
PORTC = 0xff;

RC5 = 0;
if (RB5 == 0)
return 0x0b;
if (RB4 == 0)
return 0;
if (RB3 == 0) {
tt = 0;
while (!RB3) {
DelayMs (2);
tt++;
if (tt > 200)
return 0x1a;
}
return 0x0a;
}

RC5 = 1;
RC4 = 0;
if (RB5 == 0)
return 9;
if (RB4 == 0)
return 8;
if (RB3 == 0)
return 7;

RC4 = 1;
RC3 = 0;
if (RB5 == 0)
return 6;
if (RB4 == 0)
return 5;
if (RB3 == 0)
return 4;

RC3 = 1;
RC1 = 0;
if (RB5 == 0)
return 3;
if (RB4 == 0)
return 2;
if (RB3 == 0)
return 1;
}

...

c = ReadKey();
DelayMs (200);

]]>
https://www.ognigiorno.com/2009/03/23/utilizzare-le-tastiere-a-matrice.html/feed 0
Un protocollo di comunicazione seriale https://www.ognigiorno.com/2009/03/08/un-protocollo-di-comunicazione-seriale.html https://www.ognigiorno.com/2009/03/08/un-protocollo-di-comunicazione-seriale.html#respond Sun, 08 Mar 2009 17:02:05 +0000 http://www.ognigiorno.com/?p=92 Read More »Un protocollo di comunicazione seriale]]> Vediamo come realizzare un semplice protocollo di comunicazione basato sul trasferimento seriale. Si tratta di un protocollo basato su messaggi, implementabile in tutti i circuiti basati su controllore, in modo da riuscire a modula rizzare la progettazione.

Costruire circuiti o semplici robot ci porta sempre ad avere bisogno delle stesse periferiche: schede display, tastiera, RTC, …

Lavorando in questo modo, per ogni progetto dobbiamo occuparci della progettazione della scheda madre e di come interagisce con le sue periferiche.

Il protocollo qui descritto offre alcuni vantaggi che lo rendono applicabile anche sui controllori pi piccoli. Ecco le caratteristiche principali:

  • Protocollo single master/multi slave
  • Basato su messaggi a risposta singola: ogni comando è costituito da un messaggio di andata (da master verso slave) e una risposta
  • Previsto indirizzamento. Il messaggio contiene l’indirizzo del destinatario. È possibile quindi avere più periferiche sulla stessa linea.
  • Ogni messaggio contiene più controlli di integrità. Viene garantita una buona qualità della trasmissione tramite il byte di vli (indica la lunghezza del messaggio) e il check
  • Esiste un indirizzo di broadcast
  • Assegnamento dinamico dell’indirizzo delle periferiche

Formato dei messaggi

Comando: [stx][vli][1][cmd][addr]…data…[crc][etx]

Risposta: [stx][vli][0][cmd][addr]…data…[crc][etx]

stx: 0x02

vli: Variable length indicator

cmd: codice che identifica il comando da inviare o a cui si risponde

addr: indirizzo di destinazione o sorgente, in caso di risposta

data: eventuali dati aggiuntivi. Dipende dal comando.

crc: controllo sui dati trasmessi. Io ho implementato XOR su tutti i byte

Etx: 0x03

]]>
https://www.ognigiorno.com/2009/03/08/un-protocollo-di-comunicazione-seriale.html/feed 0