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!