TiDiGino Contest, Lampadario a fibre ottiche radiocomandato di Mauro Alfieri

Presentiamo la candidatura del Sig. Mauro Alfieri che si propone per la realizzazione del firmware del progetto TiDiGino e che ci presenta una sua recente applicazione con Arduino: Lampadario a fibre ottiche radiocomandato.

Lasciamo la parola a Mauro:
Oggi il mio lavoro è legato ai sistemi informatici open-source, presto consulenza in società medio grandi come sistemista Linux/Aix, affiancando conoscenze di rete (CCNA) e programmando in linguaggio scripting. Parallelamente dall’età di 10 anni ho iniziato a realizzare piccoli kit elettronici con l’aiuto di mio padre e poi proseguendo da solo negli anni dell’adolescenza e fino alla scoperta di Arduino, da subito per me il perfetto connubio tra conoscenze di programmazione (Bash, Csh, Php, Perl, Html, Javascript, …) e di elettronica. Ho iniziato quindi a studiare Arduino e fare qualche esperimento con i Led e l’illuminazione fino a realizzare il mio primo progetto.

Ed ecco il progetto Lampadario a fibre ottiche radiocomandato:
L’idea è stata quella di realizzare un lampadario con dei faretti che nascondesse una sorpresa: un cielo stellato nel mio soggiorno, anche nelle notti coperte. Per realizzar la struttura ho utilizzato del legno, creando dei fori di differente diametro che ospitano le fibre ottiche. La dimensione del lampadario (90 cm x 60 cm) non mi consentiva di utilizzare un unico fascio di fibre per questo ho diviso le fibre in due fasci ciascuno dei quali giunge ad un illuminatore come mostrato in figura:

Ciascun illuminatore è costruito con una basetta millefori con 4 led collegati in modalità ad anodo comune come visibile in figura:

Lo schema di connessione degli illuminatori ad Arduino e relativo circuito di controllo è visibile nello schema in alto: è un circuito molto semplice ed io l’ho realizzato su di una basetta millefori. Per controllare i led ad alta luminosità ho utilizzato 4 transistor di tipo TIP122 la cui base è pilotata con un duty-cycle in PWM da Arduino; tra ciascuna uscita PWM di Arduino e il TIP122 c’è una resistenza da 1 kOhm; i led ad alta luminosità sono connessi in serie a due (uno per illuminatore) e tutte le coppie hanno l’anodo in comune e connesso attraverso una resistenza da 470 Ohm al positivo dell’alimentazione esterna.
Il transistor connesso ai led di colore bianco (white) è collegato al pin 10 di Arduino, quello dei led rossi al pin 9, quello dei led verdi al pin 6, quello dei led blu al pin 5.
Infine il ricevitore IR è un TSOP31238 connesso al positivo della scheda Arduino con una resistenza di 100 Ohm e la cui uscita è collegata al pin 11.

Questo lo sketch utilizzato:

#include <IRremote.h>

#define DELAY_CROMO 100

// Use FNV hash algorithm: http://isthe.com/chongo/tech/comp/fnv/#FNV-param

#define FNV_PRIME_32 16777619

#define FNV_BASIS_32 2166136261

int lettura;

int pLettura;

int pinLed[] = {9,6,5,10};

int fade[] = {255, 180, 128, 90, 64, 45, 32, 23, 16, 12, 8, 6, 4, 3, 2, 1,0};

int RECV_PIN = 11;

boolean _loop = true;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()

{

  _initLeds();         // Init Led

  irrecv.enableIRIn(); // Start the receiver

  //Serial.begin(9600);

}

// Compare two tick values, returning 0 if newval is shorter,

// 1 if newval is equal, and 2 if newval is longer

// Use a tolerance of 20%

int compare(unsigned int oldval, unsigned int newval) {

  if (newval < oldval * .8) {

    return 0;

  } 

  else if (oldval < newval * .8) {

    return 2;

  } 

  else {

    return 1;

  }

}

/* Converts the raw code values into a 32-bit hash code.

 * Hopefully this code is unique for each button.

 */

unsigned long decodeHash(decode_results *results) {

  unsigned long hash = FNV_BASIS_32;

  for (int i = 1; i+2 < results->rawlen; i++) {

    int value =  compare(results->rawbuf[i], results->rawbuf[i+2]);

    // Add value into the hash

    hash = (hash * FNV_PRIME_32) ^ value;

  }

  return hash;

}

void _initLeds()

{

  for (int i=0; i<4; i++)

  {

    pinMode(pinLed[i], OUTPUT);

    analogWrite(pinLed[i], LOW);

  }

}

void _LedRGBOn()

{

  for (int i=0; i<3; i++)

  {

    analogWrite(pinLed[i], 255);

  }    

}

void ledFade(int ledpin, int time_wait) 

{

  for (int i=0; i<17; i++)

  {

    int j=16;

    analogWrite(ledpin, fade[j-i]);

    delay(time_wait);

  }

  delay(time_wait);

  for (int i=16; i>=0; i--)

  {

    int j=16;

    analogWrite(ledpin, fade[j-i]);

    delay(time_wait);

  }

}

void twoLedFade(int ledpin1, int ledpin2, int time_wait) 

{

  for (int i=0; i<17; i++)

  {

    int j=16;

    analogWrite(ledpin1, fade[j-i]);

    analogWrite(ledpin2, fade[i]);

    delay(time_wait);

  }

  delay(time_wait);

  for (int i=16; i>=0; i--)

  {

    int j=16;

    analogWrite(ledpin1, fade[j-i]);

    analogWrite(ledpin2, fade[i]);

    delay(time_wait);

  }

}

void threeLedFade(int ledpin1, int ledpin2, int ledpin3, int time_wait) 

{

  if ( _loop )

  {

  for (int i=0; i<17; i++)

  {

    int j=16;

    analogWrite(ledpin1, fade[j-i]);

    analogWrite(ledpin2, 0);

    analogWrite(ledpin3, 0);

    delay(time_wait);

  }

  delay(time_wait);

  }

  for (int i=16; i>=0; i--)

  {

    int j=16;

    analogWrite(ledpin1, fade[j-i]);

    analogWrite(ledpin2, fade[i]);

    analogWrite(ledpin3, 0);

    delay(time_wait);

  }

  delay(time_wait);

  for (int i=0; i<17; i++)

  {

    int j=16;

    analogWrite(ledpin1, 0);

    analogWrite(ledpin2, fade[i]);

    analogWrite(ledpin3, fade[j-i]);

    delay(time_wait);

  }

  delay(time_wait);

  for (int i=16; i>=0; i--)

  {

    int j=16;

    analogWrite(ledpin1, fade[i]);

    analogWrite(ledpin2, 0);

    analogWrite(ledpin3, fade[j-i]);

    delay(time_wait);

  }

  _loop = false;

  delay(time_wait);

}

void _LedWhiteOn()

{

  analogWrite(pinLed[3], 255); 

}

void loop()

{

  if (irrecv.decode(&results)) {

    unsigned long hash = decodeHash(&results);

    switch (hash) {

    case 0xA4F80719: // Off

      lettura=0;

      break;

    case 0xB9F56762: // 0 (10)

      lettura=0;

      break;

    case 0x8B8510E8: // 9

      lettura=9;

      break;

    case 0x6825E53E: // 8

      lettura=8;

      break;

    case 0x4592E14C: // 7

      lettura=7;

      break;

    case 0x2C452C6C: // 6

      lettura=6;

      break;

    case 0x731A3E02: // 5

      lettura=5;

      break;

    case 0xF5999288: // 4

      lettura=4;

      break;

    case 0x273009C4: // 3

      lettura=3;

      break;

    case 0xAD586662: // 2

      lettura=2;

      break;

    case 0xE13DDA28: // 1

      lettura=1;

      break;

    default:

      Serial.print("Unknown ");

      Serial.println(hash, HEX);    

    }

    irrecv.resume(); // Resume decoding (necessary!)

  }

  if ( lettura != pLettura ) { _initLeds(); }   

  Serial.print("Valore Corrente: ");

  Serial.print( lettura );

  Serial.print(", Valore Precedente: ");

  Serial.println( pLettura );

  pLettura = lettura; 

  switch (pLettura)

  {

    case 0:

      _initLeds();

    break;

    case 1:

      ledFade(pinLed[0], DELAY_CROMO);

    break;

    case 2:

      ledFade(pinLed[1], DELAY_CROMO);

    break;

    case 3:

      ledFade(pinLed[2], DELAY_CROMO);

    break;

    case 4:

      twoLedFade(pinLed[0], pinLed[1], DELAY_CROMO);

    break;

    case 5:

      twoLedFade(pinLed[1], pinLed[2], DELAY_CROMO);

    break;

    case 6:

      twoLedFade(pinLed[0], pinLed[2], DELAY_CROMO);

    break;

    case 7:

      threeLedFade(pinLed[0], pinLed[1], pinLed[2], DELAY_CROMO);

    break;

    case 8:

      _LedRGBOn();

    break;

    case 9:

      _LedWhiteOn();

    break;

  }

}

Io utilizzo un telecomando SAMSUNG che non ha segnali riconosciuti dalla libreria IRremote per cui ho decodificato i segnali con le funzioni:  decodeHash e compare.
Alla pressione dei bottoni 1,2 e 3 sul telecomando si accendono in dissolvenza e si spengono in dissolvenza rispettivamente i led rosso (red), verde (green) e blu;
Alla pressione del 4 si accendono alternatamente i led rosso e verde;
Alla pressione del 5 si accendono alternatamente i led verde e blu;
Alla pressione del 6 si accendono alternatamente i led rosso e blu;
Alla pressione del 7 si accendono in sequenza i led rosso, verde e blu;
Alla pressione dell’8 si accendono contemporaneamente il led rosso, il led verde ed il led blu;
Alla pressione del 9 si accende i led bianco;
Con la pressione del tasto 0 o del bottone di spegnimento del telecomando si spengono tutti i led.
Ed ecco il risultato finale con i led bianchi accesi:

Scarica lo sketch per Arduino e la libreria IR.Remote!

 

18 Commenti

  1. E la foto non rende appieno l'idea... quando si illuminano le costellazioni è uno spettacolo incredibile! Bravo Mauro!
  2. In effetti in questi casi un piccolo video renderebbe meglio l'idea. D'altra parte oggi con in telefonini ad alta risoluzione, YouTube, ecc. è una cosa che si fa in un attimo!
  3. Il progetto è molto interessante. Effettivamente con le condizioni atmosferiche che abbiamo nel nord Italia, poter avere un cielo stellato risolleva il morale. Bravo Mauro! Veramente ottima l'idea.
  4. Salve, sarei interessato al suo progetto. Come posso fare per contattarla? I miei recapiti: 3290508202 Roberto Gentile Cordiali saluti
    • Ho provato a contattarLa al numero fornito, senza risposta, può richiamarmi quando preferisce o chiedere in redazione il mio indirizzo email. In ultimo se non riesce in nessun modo provi digitando mauroalfieri su google il mio blog è ricco di recapiti e non solo. Buona giornata
    • Ho mantenuto quanto promesso, anche se non in alta risoluzione, ho realizzato il video del progetto e l'ho pubblicato su Youtube: http://youtu.be/18O-rQUWHHw e su Vimeo: http://vimeo.com/28924911
    • Grazie, la fibra ottica è di tipo sintetico, normalmente utilizzata nei presepi. Io l'ho acquistata su eBay, la parte difficile è calcolare la metratura necessaria io ne ho acquistato a piccoli lotti per non eccedere con gli scarti.
  5. Salve, ero interessato a questo progetto che è veramente fenomenale. Premetto che è la prima volta che uso Arduino. Volevo fare un effetto simile per creare un cielo stellato per la mia nipotina che nascerà a gennaio. Ho acquistato tutto. Ho creato anche la basetta con tutto il circuito e tutti i componenti. Ho uplodato lo sketch in arduino e ho messo anke la libreria IR, però quando vado a comandare con il telecomando non fa nulla. Potrei avere una mano perfavore. Ci terrei veramente molto. Grazie
  6. Ciao Antonio, poichè hai inserito questo commento anche nel mio Blog ho risposto lì, ti riporto la risposta: mi fa piacere che tu sia fortemente motivato trovo sia un ottimo punto di partenza, a prima vista il problema che hai incontrato sembra dovuto al telecomando il mio sketch è scritto per un telecomando Samsung che ha una codifica differente da altri telecomandi. Tu che telecomando stai utilizzando?
  7. Ciao, grazie per aver risposto. Io ho utilizzato un telecomando univarsale programmato 4 in 1 e ho inserito la programmazione di un Sony, di un samsung e di un mivar però non va con nessuno di loro. Ho provato ad uplodare uno sketch che si trova nella libreria IR e si vede che il telecomando interaggisce con arduino perchè si vede il led Tx che lampeggia alla pressione di un tasto del telecomando. Però quando metto lo sketch per comandare i led, Arduino non riceve nulla. Potrebbe essere il telecomando?
  8. Ciao Antonio, in questo articolo: http://www.mauroalfieri.it/elettronica/tutorial-arduino-ir-con-tsop31238.html trovi degli ottimi spunti per testare il tuo telecomendo, in particolare puoi sostituire la funzione loop() dello sketch che hai caricato su Arduino con quella di 9 righe e vedrai nel apparire nel monitor seriale il codice relativo al tasto che premi sul telecomendo, a questo punto il gioco è fatto. Buon lavoro
  9. Ciao, Ci sono riuscito. Ho provato più codici samsung e alla fine ne ho pizzicato uno che funziona alla perfezione. Grazie per i consigli. Adesso passo alla fibbra ottica.Ciao e grazie ancora
  10. Ciao, come posso controllare anche i faretti tramite telecomando? io ho una relay shield ma non so come modificare il tuo programma per chiudere il contatto dei faretti
  11. Salve, complimenti per il progetto realizzato. Sarei interessato a realizzare il cielo di un presepe con arduino. E' possibile avere lo schema del collegamento elettronico?Ti ringrazio in anticipo!!!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Main Menu