martedì 22 novembre 2011

Human Machine Interface, quando le macchine parlano e sentono

Nel post di oggi vorrei mostrarvi un progetto sperimentale di Interfaccia Utente, realizzato alcuni anni fa (nel 2004 ...come passa in fretta il tempo!). Tuttavia il progetto resta ancora attuale, salvo qualche aggiornamento nei singoli componenti che, troppo spesso, hanno un ciclo di vita piuttosto breve.

(click sull'immagine, per ingrandire)

Il tema fondamentale è ancora quello di come realizzare delle macchine che possano interagire in maniera efficace con l'utente e di come realizzare interfacce intuitive ed efficienti, ...in poche parole di come dosare le "palline" dello zucchero quando prendiamo il caffè alla "macchinetta" aziendale (operazione che in effetti richiede ...un minimo di esercizio! Vero?). Prima di scendere nei dettagli, guardiamo insieme il video che ho realizzato per Voi:


State ancora ballando al ritmo Techno di NeXus? Noooo? Nell'elettronica un pò di musica non guasta! Ok, i file MP3 li scarico prevalentemente da jamendo.com, attenendomi, strettamente, al tipo di licenza con cui l'Autore distribuisce i contenuti qui sul Pianeta Terra. A proposito, la licenza di questo blog è Creative Commons - BY - NC - SA, stesso discorso per i video sul canale YouTube "liberaelettronica".


Nel video abbiamo visto delle card colorate che vengono posizionate in prossimità di un avvolgimento. Si tratta di TAG RFID (Radio Frequency IDentification) il cui funzionamento è ben illustrato nella pagina Wikipedia che trovate qui. Display LCD e Tastiera 4x4, meritano forse minore attenzione, ma restano pur sempre un elemento fondamentale nell'interazione con la Macchina. L'applicazione prevedeva anche ingressi analogici a 12bit, ingressi digitali optoisolati e uscite digitali a transistor e relè.
Da notare che, nel circuito che vi propongo nella seguente figura, le macchine possono comunicare anche tra loro e, pertanto, utilizzare canali di comunicazione quali Reti GSM (telefoni cellulari) e Reti Intranet/Internet. Dovremo quindi provvedere a realizzare le dovute interfacce (nel nostro caso una porta seriale RS232 per il modem GSM e un Core Module XPORT per le connessioni Ethernet e TCP/IP).


Pubblicare tutto il codice ANSI C di questa applicazione risulterebbe eccessivamente pesante per il blog, ma è disponibile per coloro che me lo richiederanno via email.
Vi anticipo solo un frammento di codice per leggere dalla tastiera 4x4:

/* key pad 16 layout
    1   2   3   F
    4   5   6   E
    7   8   9   D
    A   0   B   C
*/

unsigned char keypad16_read(void) {

    unsigned char scan, tmp_scan, col, col_drive, ret_code;

    /* init column driver */
    col_drive = 0x0E;

    /* scan row by col (low=key pressed) */
    for (col=0; col<4; col++) {   

        /* set column (PG0,1,,3) */
        P2_reg &= 0xF0;
        P2_reg = P2_reg | (col_drive & 0x0F);
        P2 = P2_reg;

        /* read row (EXP0,1,,3) */
        scan = P3 & 0x3F;
        scan >>= 2;

        /* if key pressed and hold */
        if ((scan & 0x0F) < 0x0F){

            delay_ms(10);
            tmp_scan = P3 & 0x3F;
            tmp_scan >>=2;

            if (tmp_scan == scan) {
                /* compose scan code */
                scan = scan | (col_drive << 4);

                /* ASCII conversion */
                switch (~scan) {

                    case 0x88 : ret_code = '1'; break;
                    case 0x84 : ret_code = '2'; break;
                    case 0x82 : ret_code = '3'; break;
                    case 0x81 : ret_code = 'F'; break;
                    case 0x48 : ret_code = '4'; break;
                    case 0x44 : ret_code = '5'; break;
                    case 0x42 : ret_code = '6'; break;
                    case 0x41 : ret_code = 'E'; break;
                    case 0x28 : ret_code = '7'; break;
                    case 0x24 : ret_code = '8'; break;
                    case 0x22 : ret_code = '9'; break;
                    case 0x21 : ret_code = 'D'; break;
                    case 0x18 : ret_code = 'A'; break;
                    case 0x14 : ret_code = '0'; break;
                    case 0x12 : ret_code = 'B'; break;
                    case 0x11 : ret_code = 'C'; break;

                    default : ret_code = 0;
                }

                break; /* terminate for cicle */

            } else {
                /* key spike */
                ret_code = 0;
            }
        } else {
            /* no key pressed */
            ret_code = 0;
        }

        /* set column driver for the next column */
        col_drive <<= 1;
        col_drive |= 0x01;
    }

    return ret_code;
} 

Qui Pianeta Terra ...ove le macchine hanno un ruolo sempre crescente, a presto.

Nessun commento:

Posta un commento