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();
}