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 pensieri riguardo “TiDiGino Contest, Lampadario a fibre ottiche radiocomandato di Mauro Alfieri

  • Pingback: Mauro Alfieri » Blog Archive » Arduino progetto per TiDiGino

  • 23/08/2011 in 14:53
    Permalink

    E la foto non rende appieno l’idea… quando si illuminano le costellazioni è uno spettacolo incredibile!
    Bravo Mauro!

    Risposta
  • 23/08/2011 in 15:29
    Permalink

    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!

    Risposta
  • 30/08/2011 in 10:45
    Permalink

    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.

    Risposta
  • 31/08/2011 in 17:38
    Permalink

    Salve, sarei interessato al suo progetto.
    Come posso fare per contattarla?
    I miei recapiti:
    3290508202
    Roberto Gentile
    Cordiali saluti

    Risposta
    • 31/08/2011 in 18:42
      Permalink

      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

      Risposta
  • 01/09/2011 in 19:57
    Permalink

    Complimenti Mauro anche per il blog.
    Felice

    Risposta
  • 13/09/2011 in 13:52
    Permalink

    Bellissimo progetto, complimenti.Dove hai reperito la fibra ottica?Grazie, ciao

    Risposta
    • 13/09/2011 in 17:30
      Permalink

      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.

      Risposta
  • 10/11/2011 in 18:50
    Permalink

    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

    Risposta
  • 11/11/2011 in 12:43
    Permalink

    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?

    Risposta
  • 11/11/2011 in 18:16
    Permalink

    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?

    Risposta
  • 14/11/2011 in 11:46
    Permalink

    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

    Risposta
  • 24/09/2013 in 20:47
    Permalink

    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

    Risposta
  • 08/01/2015 in 09:52
    Permalink

    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!!!

    Risposta

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Ricevi un avviso se ci sono nuovi commenti. Oppure iscriviti senza commentare.