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
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. In questo modo ogni scheda può prevedere un pin di segnalazione e il software sulla mainboard ne riconosce la segnalazione, in base alla posizione.
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).
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);
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:
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
]]>