Visualizzazione post con etichetta Talking Car. Mostra tutti i post
Visualizzazione post con etichetta Talking Car. Mostra tutti i post

venerdì 7 febbraio 2014

Giocando con i Led Matrix 8x8

Mi sono finalmente arrivati per posta alcuni moduli LED Matrix 8x8, gestiti dal Max7219.
Quando li ho comperati avevo intenzione di montarli a mo' di mattonella per giocare un po' con la grafica spartana che consentono. Ho trovato alcuni progetti che utilizzano mattonelle a matrice di led che sono composte da 4 pezzi messi a comporre un quadrato, sui quali viene trasferito un disegno creato con un cellulare ed inviato via bluetooth.

Nell'attesa del loro arrivo però, come al solito, mi sono venuti in mente diversi altri progetti che li vedono protagonisti, infatti, al loro arrivo ho iniziato subito a montarli in linea, in orizzontale anzichè in vetricale come avevo pensato inizialmente, in modo da poter scrivere delle frasi ed ottenere una leggibilità anche a qualche metro di distanza.
Non voglio svelare completamente il progetto finale, che è piuttosto impegnativo
e che da solo sono sicuro di non saper portare a termine, considerate le mie scarse capacità nella programmazione, voglio però intanto descrivere i test che ho fatto fino ad oggi e le cose che ho scoperto.
Se poi qualcuno volesse aiutarmi nell'impresa.... e' sempre il benvenuto.
Dunque il modulo in questione comunica attraverso la porta SPI (non credo che sia proprio standard) con il nostro Arduino,l' alimentazione necessaria  sono i 5 volt ed e' sufficiente quella fornita dalla scheda Arduino. Il protocollo SPI consente di collegare piu' devices sulla stessa linea di comunicazione, infatti della nostra Led Matrix se ne possono collegare fino a 8 in cascata. Ho iniziato a caricare lo sketch di test su Arduino dopo aver provveduto al montaggio del kit (eh si, la Matrice di led arriva spezzettata e con le istruzioni di montaggio da reperire sul web in un linguaggio cino-angolosassone-casareccio che deve assolutamente essere interpretato, soprattutto per quanto riguarda il montaggio della matrice in lattice sullo zoccolo fornito nel kit. Se dovrai montarne uno e' bene ricordare che la scritta laterale stampata su un solo lato della matrice in lattice deve rimanere a destra guardando il circuito appena montato, tenendo  il Max7219 in basso.
Come si puo' vedere in figura qui a fianco.
PS, se qualcuno riesce a decifrare cosa ha scritto nelle istruzioni il venditore cinese  nel suo inglese inventato, gli pago da bere!
Quindi, come si puo' vedere dalle foto che sto allegando all'articolo, ho montato le mattonelline tutte in fila a comporre una matrice di 8x40 led.
Completato questa parte del montaggio e del cablaggio, sono passato ad aggiustare il software per i miei scopi.
Inizialmente ho caricato il programma di test che si puo' trovare nella cartella examples allegata alla libreria.











Qui di seguito lo sketch che accompagna la libreria che gestisce la matrice,
questo e' il primo sketch che ho caricato nei prossimi articoli le modifiche apportate per farlo funzionare nel  progetto Talkin'Car


Sketch LCDemoMatrix

//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,11,10,1);

/* we always wait a bit between updates of the display */
unsigned long delaytime=100;

void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
}

/*
 This method will display the characters for the
 word "Arduino" one after the other on the matrix. 
 (you need at least 5x7 leds to see the whole chars)
 */
void writeArduinoOnMatrix() {
  /* here is the data for the characters */
  byte a[5]={B01111110,B10001000,B10001000,B10001000,B01111110};
  byte r[5]={B00111110,B00010000,B00100000,B00100000,B00010000};
  byte d[5]={B00011100,B00100010,B00100010,B00010010,B11111110};
  byte u[5]={B00111100,B00000010,B00000010,B00000100,B00111110};
  byte i[5]={B00000000,B00100010,B10111110,B00000010,B00000000};
  byte n[5]={B00111110,B00010000,B00100000,B00100000,B00011110};
  byte o[5]={B00011100,B00100010,B00100010,B00100010,B00011100};

  /* now display them one by one with a small delay */
  lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  delay(delaytime);
  lc.setRow(0,0,r[0]);
  lc.setRow(0,1,r[1]);
  lc.setRow(0,2,r[2]);
  lc.setRow(0,3,r[3]);
  lc.setRow(0,4,r[4]);
  delay(delaytime);
  lc.setRow(0,0,d[0]);
  lc.setRow(0,1,d[1]);
  lc.setRow(0,2,d[2]);
  lc.setRow(0,3,d[3]);
  lc.setRow(0,4,d[4]);
  delay(delaytime);
  lc.setRow(0,0,u[0]);
  lc.setRow(0,1,u[1]);
  lc.setRow(0,2,u[2]);
  lc.setRow(0,3,u[3]);
  lc.setRow(0,4,u[4]);
  delay(delaytime);
  lc.setRow(0,0,i[0]);
  lc.setRow(0,1,i[1]);
  lc.setRow(0,2,i[2]);
  lc.setRow(0,3,i[3]);
  lc.setRow(0,4,i[4]);
  delay(delaytime);
  lc.setRow(0,0,n[0]);
  lc.setRow(0,1,n[1]);
  lc.setRow(0,2,n[2]);
  lc.setRow(0,3,n[3]);
  lc.setRow(0,4,n[4]);
  delay(delaytime);
  lc.setRow(0,0,o[0]);
  lc.setRow(0,1,o[1]);
  lc.setRow(0,2,o[2]);
  lc.setRow(0,3,o[3]);
  lc.setRow(0,4,o[4]);
  delay(delaytime);
  lc.setRow(0,0,0);
  lc.setRow(0,1,0);
  lc.setRow(0,2,0);
  lc.setRow(0,3,0);
  lc.setRow(0,4,0);
  delay(delaytime);
}

/*
  This function lights up a some Leds in a row.
 The pattern will be repeated on every row.
 The pattern will blink along with the row-number.
 row number 4 (index==3) will blink 4 times etc.
 */
void rows() {
  for(int row=0;row<8;row++) {
    delay(delaytime);
    lc.setRow(0,row,B10100000);
    delay(delaytime);
    lc.setRow(0,row,(byte)0);
    for(int i=0;i<row;i++) {
      delay(delaytime);
      lc.setRow(0,row,B10100000);
      delay(delaytime);
      lc.setRow(0,row,(byte)0);
    }
  }
}

/*
  This function lights up a some Leds in a column.
 The pattern will be repeated on every column.
 The pattern will blink along with the column-number.
 column number 4 (index==3) will blink 4 times etc.
 */
void columns() {
  for(int col=0;col<8;col++) {
    delay(delaytime);
    lc.setColumn(0,col,B10100000);
    delay(delaytime);
    lc.setColumn(0,col,(byte)0);
    for(int i=0;i<col;i++) {
      delay(delaytime);
      lc.setColumn(0,col,B10100000);
      delay(delaytime);
      lc.setColumn(0,col,(byte)0);
    }
  }
}

/* 
 This function will light up every Led on the matrix.
 The led will blink along with the row-number.
 row number 4 (index==3) will blink 4 times etc.
 */
void single() {
  for(int row=0;row<8;row++) {
    for(int col=0;col<8;col++) {
      delay(delaytime);
      lc.setLed(0,row,col,true);
      delay(delaytime);
      for(int i=0;i<col;i++) {
        lc.setLed(0,row,col,false);
        delay(delaytime);
        lc.setLed(0,row,col,true);
        delay(delaytime);
      }
    }
  }
}

void loop() { 
  writeArduinoOnMatrix();
  rows();
  columns();
  single();
}




Talkin'Car ovvero come parlare al conducente della macchina che ti segue

Quanti di voi guidatori provetti, hanno sentito l'esigenza di far sapere il vostro pensiero al guidatore della auto che vi segue, magari mentre vi tallona sulla corsia di sorpasso a 180 km/h?
Oppure al camionista che avete oltraggiato mettendovi con la vostra auto tra lui ed il collega che lo precede a 35Km/h sul Passo della Cisa?
A me, devo dirvi la verita', mi e' capitato moltissime volte. Ho quindi pensato di realizzare questo progetto che va a coprire proprio questa fondamentale esigenza. Comunicare agli altri! Magari occhio a cosa comunicate, ma di questo non voglio sapere nulla, ognuno e' reponsabile delle porprie azioni e delle proprie realizzazioni!

Quindi vado a spiegare come si compone il porgetto che sottolineo, non e' ancora concluso, alcune parti infatti non sono ancora state sviluppate per intero.

La base fondamentale e' il Display a matrice di Led che deve avere una lunghezza congrua con la possibilita' di visualizzazione a distanza,  infatti, se anche con una mattonella 8x8 e' possibile comunicare, a distanza di qualche decina di metri, come nel caso di due auto che si seguono in strada, un unico pezzo risulta povero e quasi invisibile.
Ho optato per collegare 5 pezzi di mattonelline 8x8 per ottenere una matrice di Led di 8x40, così facendo ottengo una striscia di circa 35 cm sufficientemente visibile a qualche metro di distanza.

Arduino naturalmente sara' la scheda di controllo di Talkin'Car, er la praticita' d'uso e la facilita' di programmazione. Il progetto iniziale (diciamo la versione Base) avra' la possibilita' di scrivere sulla matrice cosi' costruita solo alcune frasi pre-impostate, selezionabili attraverso un Encoder ed un sistema di scelta basato su Menu' scorrevoli visualizzati su Display 1602, cioe' il classico Display a due righe e sfondo verde che viene utilizzato per molti progetti su Arduino.(quello visualizzato in foto qui sopra)
Nelle versioni successive, il progetto prevede l'inserimento della possibilita' di scrivere frasi che poi verranno visualizzate sulla matrice a Led attraverso un cellulare ed un collegamento Bluetooth.
La versione Enterprise del progetto vedra' invece la possibilita' di visualizzare frasi direttamente "dettate" a voce alla Talkin'Car, attraverso un sistema di riconoscimento vocale e traduzione STT (Speak To Text ) che si basera' su Cellulare o BeagleBone Black e collegamento ad internet disponibile.
Diciamo pure che questa parte del progetto dovro' essere coadiuvato da qualcuno che se ne intenda di programmazione molto piu' di quanto non me ne intenda io!
Il sistema potrebbe anche essere collegato ad una EasyPromo, la mia creazione che legge gli SMS e che potrebbe essere utilizzato anche su Vetrine Parlanti, attivate dal'invio di SMS ad un numero di telefono stabilito.
Chiunque voglia cimentarsi con me nello sviluppo di queste versioni del progetto e' libero di farsi avanti attraverso i riferimenti qui sul sito, sto cercando contatti per aumentare il numero e la consistenza dei progetti in essere. Partecipate numerosi!
Questa la descrizione del progetto, a breve i primi sketch per il funzionamento delle varie periferiche collegate.
a presto TecnoGeppetto