Egg box con Sensore sonico

Costruiamo una lampada luminosa con Arduino, un sensore sonico ed…una scatola di uova :)

Come abbiamo già visto le scatole traslucide per il trasporto delle uova sono un ottima base per creare piccole lampade, per diverse ragioni:

  • sono facili da trovare
  • sono leggere
  • sono abbastanza rigide
  • possono essere incollate con del Vinavil (strano ma vero)

Questa versione di eggbox è composta da una sola scatola da quattro uova e da un sensore sonico che potete trovare su amazon per meno di 5€. In realtà il suo prezzo dovrebbe essere meno di 3€, ma considerando l’affidabilità di Amazon (viene recapitato in meno di 3 giorni e senza costi di spedizione) è ancora un prezzo accettabile.

Cosa vi serve:

  1. Arduino Uno
  2. Cavi rigidi di 3-4 colori
  3. Un sensore sonico
  4. Uno o più led ad alta luminosità
  5. Un caricabatterie usb da cellulare, dal costo contenuto. Ongi tanto nei supermercati trovate offerte per caricabatterie sotto i 10€.
  6. Un paio di mini breadboard.

Arduino uno viene montato al contrario sulla superficie piana della scatola di uova:per tenerlo in posizione vengono creati 4 buchi da cui vengono passati quattro fili rigidi da connettere al sensore sonico

Inoltre su un lato viene fatto un buco per far passare il cavo USB, che verrà alimentato con batteria USB.

arudino_egg_effect1

Il codice che ho progettato è una variante di un esempio d’uso del sensore sonico, ed è integrato con NilRTOS, di cui ho già ampiamente parlato.

Il sensore ha bisogno di 4 connessioni e non tre come il Ping  ma non richiede pin PWM e costa sei volte di menoQuesto tutorial è molto chiaro e pure in italiano.

Le connessioni sono l’alimentazione da 5volt, la massa e due pin Trigger e Echo. Inviando un valore su Trigger si legge il risultato su Echo.

[code lang=”cpp”]
//HC RS04 Sensore ultrasuoni
const int triggerPort = 7;
const int echoPort = 8;
const int blueLed=11;
const int maxDistCm=28;
#include
#include

void setup() {

pinMode( triggerPort, OUTPUT );
pinMode( echoPort, INPUT );
pinMode( blueLed, OUTPUT);
Serial.begin( 9600 );
Serial.println( "Sensore ultrasuoni: ");
nilSysBegin();
}

void loop() {
//nilPrintUnusedStack(&Serial);
//Serial.println();
}

NIL_WORKING_AREA(waUltrasonicSensor, 64);
NIL_THREAD(UltrasonicSensor,arg){
static long lastValue=0;
while(true) {
//porta bassa l’uscita del trigger
digitalWrite( triggerPort, LOW );

//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 ); // nilThdSleepMicorseconds
digitalWrite( triggerPort, LOW );

long duration = pulseIn( echoPort, HIGH );

long r = 0.034 * duration / 2;
if(r != lastValue){

Serial.print( "durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );

//dopo 38ms è fuori dalla portata del sensore
if( duration > 38000 ) Serial.println( "fuori portata");
else {

Serial.print( r ); Serial.print( "cm" );

Serial.print(" ");
nilPrintUnusedStack(&Serial);
if(r <=maxDistCm && r>=5 ){
int v=map(r,5,maxDistCm,0,255);
Serial.print( v );
Serial.print(" LED ");
analogWrite(blueLed, v);
}

}
lastValue=r;
}
//aspetta mezzo secondo ca
/* we
suggest to use over 60ms
measurement cycle, in order to prevent trigger sign
al to the echo signal
*/
nilThdSleepMilliseconds( 60*2 );
}
}

NIL_THREADS_TABLE_BEGIN()
NIL_THREADS_TABLE_ENTRY(NULL /*TH NAME*/, UltrasonicSensor, NULL, waUltrasonicSensor, sizeof(waUltrasonicSensor))
NIL_THREADS_TABLE_END()
[/code]

Il codice dello sketch è molto semplice ma non fatevi ingannare: difatti consente di impostare la luminosità avvicinando od allontanando la mano, ma se la si solleva di scatto il valore impostato rimarrà fisso. Difatti se il valore letto (=la distanza letta) supera la toleranza di 20cm il sistema non fa nulla, ed il led rimane dell’intensità selezionata.

Il sensore poggia sulla mini breadboard e non c’è bisogno di alcuna saldatura, a patto di avere fili della giusta lunghezza e ben tirati.

E’ possibile aggiungere altri led che pulsano con effetti differenti

IMG_2013