lunedì 17 febbraio 2014

RaspiCam e comando Led rosso

Il meraviglioso modulo Cam della Raspberry Pi funziona ottimamente, ma il Led rosso costruito in fianco alla telecamerina e che ne comunica l'attivazione in certe circostanze o per certi progetti risulta essere fastidioso. Con una semplice istruzione si puo' disattivarlo, in modo che, per esempio, le riprese con poca luce non vengano inficiate dalla illuminazione forzata indotta dal Led.


Ma se come nel mio caso, il funzionamento della telecamera e' previsto per periodi molto lunghi, viene da chiedersi se tutto stia filando liscio, o se per caso, qualcosa si sia inceppato. dei conseguenza, sebbene sia importante lasciare spento il Led durante il funzionamento ho pensato di fare in modo che, magari a comando, o magari importando con cron un richiamo dello script, si possa controllare il regolare funzionamento del sistema facendo lampegggiare il Led solo per pochi secondi.
ecco quindi uno script in python che ci viene in aiuto:



seiviva.py

#!/usr/bin/env python
import time
import RPi.GPIO as GPIO

# Use GPIO numbering
GPIO.setmode(GPIO.BCM)

# Set GPIO for camera LED
CAMLED = 5

# Set GPIO to output
GPIO.setup(CAMLED, GPIO.OUT, initial=False)

# Cinque flash del Led uno ogni 150 millisecondi
# lungo 150 millisecondi
for i in range(5):
  GPIO.output(CAMLED,True)  # On
  time.sleep(0.15)
  GPIO.output(CAMLED,False) # Off
  time.sleep(0.15)

Basta copiarlo in un file, che io ho chiamato seiviva.py , ricordarsi di settare i permessi di lettura sul file appena costruito, e testarlo con  il comando  ./seiviva.py

venerdì 7 febbraio 2014

SMS Reader on Car

Una delle pubblicita' che mi hanno colpito in questi giorni e' quella di due ragazzi in auto che litigano mentre sono in viaggio verso casa dei genitori di Lei.
Lui per farsi perdonare di aver detto alcune frasi sconvenienti sui genitori della ragazza, si mette a smanettare sul cellulare e, dopo qualche attimo, l'auto diventa "parlante" e interviene a fare da pacere tra i due, leggendo un SMS appena ricevuto (inviato da Lui)
guarda il video su youtube qui
Naturalmente, appena guardato il video mi sono messo subito all'opera con il pensiero ed ho architettato il mio personale SMS Reader on Car, che applicato alla presa BF della macchina si comporti esattamente come quello pubblicizzato.
I componenti sono pochi e semplici:
  • Una Raspberry Pi sulla quale ho montato un sistema pulito Debian con una SD sulla quale ho caricato il NOOBS (che figata non dover rifare la formattazione attraverso il pc come era prima dell'uscita del Noobs!)
  • Un Hub USB con almeno 4 porte
  • Un Modem GSM USB
  • Una scheda WiFi per il collegamento ad internet attraverso il WiFi di casa se parcheggiati nel parcheggio sotto casa, o per collegarsi all'access point del cellulare quando in movimento.
  • Alimentazione del tutto 
  • Cavetto per il collegamento audio tra la Raspberry e l'amplificazione dell'auto (io, per il momento in auto non ci sono ancora andato a fare le prove, considerato che dove abito continua a piovere e far freddo ormai da tre mesi ininterrottamente, ma non cambia la sostanza delle cose, Ho collegato l'audio all'audio del monitor sulla scrivania!)
Il motore di tutto e' il servizio di TTS (Text to Speak) di Google al quale il sistema manda il contenuto del messaggio ricevuto dal modem GSM collegato. (il sistema infatti riceve su un numero di cellulare dedicato. Per far si di poter utilizzare il numero di cellulare personale, ci vorrebbe qualche buon anima che, sapendo programmare su Android (per esempio), rendesse il testo del SMS ricevuto disponibile via seriale per la sua elaborazione. Io purtroppo non lo so' fare!)
Google con il suo servizio di TTS lavora istantaneamente il testo e lo converte in file audio che, passato alla Raspberry, attraverso il lettore di file mpg123, lo rende in formato udibile sulla presa audio fisica di Rasp, da qui il collegamento con cavetto all'amplificatore audio dell'auto (o al monitor come nel mio caso, per ora!)

Nell'ordine le operazioni eseguite:

  1. istallazione Debian pulita
  2. istallazione smstools (il pacchetto che gestisce gli SMS ricevuti)
  3. settaggio dello  script eventhandler.sh
  4. settaggio del programma SmsTools modificando il file di configurazione
  5. configurazione wifi (per ilcollegamento ad internet in mobile)
  6. istallazione usbAudio (ho tentato di aumentare la potenza audio che e' scarsina!)
  7. configurazione usbAudio come principale
  8. test usbAudio
  9. istallazione e test di leggiquesto.sh dallo script di Dan Fountain
  10. istallazione mpg123
  11. istallazione Minicom per test seriale
  12. collegamento GPRS GSM modem 
Chi vuole lavorare con me allo sviluppo della app sul cellulare?
Buon divertimento
TecnoGeppetto

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

Display 1602 con adattatore seriale I2C

Per uno dei tanti progetti che ho iniziato (non posso dire terminato perche' buona parte dei miei progetti rimangono incompleti.... accidentaccio ho il segno dei gemelli come ascendente e mi rovina la produttivita'!!).
Allora, dicevo:
Sto construendo un sistema di stampa su Display a matrice di LED, vedi il post precedente.
Per poter controllare il menu di gestione del marchingegno (ps. si chiamera' Talking Car) ho bisogno di avere a disposizione un display con il menu per le scelte di visualizzazione, quindi ho prima collegato la shild apposita di Arduino, ma questa occupa troppi PIN e non mi lascia disponibili quelli di cui ho bisogno per far funzionare il tutto.Allora ho pensato di collegare un display semplice e l'interfaccia I2C (che consente di utilizzare fino a 8 display in cascata) ma soprattutto utilizza solo 2 PIN per la comunicazione.
I PIN sono A4 e A5 perche' sto utilizzando Arduino UNO Rev3
Con gli Arduino precedenti i piedini sono diversi (ho sulla scrivania un Arduino 2009 e sono diventato matto per un pomeriggio intero perche' non funzionava!!!)

Qui la libreria e gli sketch di prova

Sketch di test
/*
Progetto di TecnoGeppetto - by AEnima
Novara 02/02/2014
Parte del progetto Talkin'Car
***********

Collegamento di LCD 1602 con Convertitore I2C
la libreria setta i
PIN
A4  SDA e
A5  SCL
*/

#include 
#include 
LiquidCrystal_I2C lcd(0x27,16,2);  //    16x2 e il tipo del lcd -
                        //address si puo settare attraverso i jumper della scheda
char motd0[16] = "   Talkin' Car ";
char motd1[16] = "   by AEnima  ";
void setup()
{
  lcd.init();                      // inizializza  lcd
 
  // Stampa il messaggio su LCD.
  lcd.backlight();
  lcd.home();
  lcd.print("Hello, world!");
  delay(1000);
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print(motd0);
  lcd.setCursor(0,1);
  lcd.print(motd1);
 }
void loop()
{
}

Come Flashare la rom della Beaglebone Black

Allora, per cominciare spieghiamo a cosa serve una operazione del genere.
Flashare la rom della BeagleBone Black puo' essere utile per installare in un colpo solo tutta l'immagine di un disco.
Io sto utilizzando questo metodo per aggiornare il mio sistema con quello utilizzato dal mio collega di esperimenti, Simone, in una botta sola. Cioe', partiamo con un sistema uguale, facciamo degli esperimenti ognuno per par suo sulla propria  BBB, poi quando riusciamo ad arrivare ad un risultato apprezzabile in una delle due (solitamente  la sua!!!), allora ci passiamo l'immagine totale del disco, e l'altro (solitamente io!) ricopia l'immagine pari pari, per ricominciare dallo stesso punto ed andare avanti nella sperimentazione.

Naturalmente ci vuole lo spazio disponibile sul disco sia su un sistema che  sull'altro, e per essere sicuri si puo' anche utilizzare delle chiavette esterne o la microSD gia' prevista dalla BBB.

Fatta l'immagine con il comando

sudo dd if=/dev/sda(disco da copiare) of=/dev/sdc(disco destinazione) bs=1M

e compattata con gunzip

Il cedente appoggia il file su un server ftp, in modo che possa essere prelevato direttamente dalla BBB ricevente in una fase successiva.

Si fa partire la BBB con una versione di ubuntu che gira su microSD, in modo da avere libero accesso al disco interno del sistema con un sistema operativo che gira al di fuori. Per le istruzioni su come fare una microSD che faccia boot con ubuntu segui questa guida

Fatto il boot su ubuntu, si crea il collegamento con il server ftp dove in precedenza e' stato fatto l'upload il file dell'immagine, si prende e si porta in locale facendo attenzione ad avere lo spazio disponibile sulla microSD (dai nostri esperimenti e' sufficiente una microSD da 2 GB per contenere sia il sistema operativo che l'immagine del nuovo, comunque piu' spazio c'e' meglio e', quindi anche una 4GB non guasterebbe!)
Quindi:
get nome-file-immagine

a questo punto usciamo da ftp con quit
e digitiamo questo comando per copiare pari pari il disco sul disco interno della BBB:

gunzip -c nomefile-immagine.img.gz | dd of=/dev/mmcblk1 bs=1M

Al ritorno del prompt la BBB e' flashata con la nuova immagine. Basta eseguire lo shutdown, estrarre la microSD ed il reboot per ottenere un BBB clone dell'altra.
Naturalmente se tutti i passaggi sono stati eseguiti senza problemi.
Buon divertimento
TecnoGeppetto