Loc. JN65KO - E-Mail: iz3gak@alfa.it
CQ ZONE 15 - ITU ZONE 28 - WIP VENEZIA

Op. Cristian Voltarel
Via Perugia, 19
30021 Caorle VENEZIA
            Italy

Spinner Speed di IZ3GAK – 27/08/2017


Descrizione:
Questo progetto nasce per gioco, o meglio, è un gioco, infatti dopo aver comprato numerosi spinner a mio figlio, ho pensato di costruire un gioco che potesse dare un senso a questo oggetto...
Il gioco consiste nel misurare la velocità di rotazione dello spinner ed accendere 3 LED: rosso= scarso; giallo = medio e verde = forte; ma bisogna poi leggere la velocità sul display. Chi ha raggiunto la velocità maggiore vince.
Per far ciò ho utilizzato un trasmettitore ad infrarossi e il relativo ricevitore, quando il fascio di luce viene interrotto, cioè ogni volta che una pala lo attraversa, il microcontrollore registra il tempo e visualizza quindi i giri al minuto.



In fase di test su breadbord.




Ho utilizzato una scatola per impianti elettrici.




Io all'opera...




3 batterie sono più che sufficienti per farlo funzionare per molto tempo... consuma pochissimo.




Il risultato finale; i fotodiodi sono montati su 2 squadrette alla stessa altezza.



Video su youtube.

Componenti e materiale:

1 scatola per impianti elettrici dove contenere il gioco completo
1 interuttore
1 pulsante per il reset
1 led verde
1 led giallo
1 led rosso
5 resistenze da 220ohm
1 fotodiodo BPV10NF (RX)
1 VSLY5850 (TX)
1 arduino UNO o arduino NANO
1 LCD 1602A
1 modulo I2C per il display
1 basetta millefori

Collegamenti:




Sketch:

/*

* SPINNER SPEED V1.0 - 27/08/2017

* alcune parti sono state prese da internet e modificate per rendere il gioco più carino

*/

#include <LiquidCrystal_I2C.h>

// initialize the library with the numbers of the interface pins

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);



const unsigned long sampleTime = 100;

const int maxRPM = 5000; // indicare il valore massimo della barra LCD

int rpmMaximum = 0;



//definisce le uscite usate per l'accensione dei LED

#define led_r 4 //rosso

#define led_g 5 //giallo

#define led_v 6 //verde



//definisce le velocità limite per l'accensione dei relativi LED

int vel_min = 2000;

int vel_max = 4000;



int val;

long last=0;

int stat=LOW;

int stat2;

int contar=0;

int time;



/* leggere il valore VAL da monitor seriale e impostare circa 10-20 sens= in meno rispetto al valore letto

* senza passaggio di ostacoli. Attenzione che ogni volta che si cambiano le misure del TX - RX

* bisogna ricalibrare il valore di sens=

*/

int sens=80;

int nPalas=3; // numero di pale dello spinner



int milisegundos=500; // il tempo di ogni lettura

void setup()

{

lcd.begin(16, 2);

Serial.begin(9600);

pinMode(13,OUTPUT);

pinMode(4,OUTPUT);

pinMode(5,OUTPUT);

pinMode(6,OUTPUT);



//scrivi sul display messaggio di benvenuto

lcd.setCursor(0, 0);

lcd.print("SPINNER SPEED");

lcd.setCursor(0, 1);

lcd.print("Edoardo Andrea");

delay(3000);



//scrivi sul display velocità dei led

lcd.clear();

lcd.setCursor(0, 0);

lcd.print("I LED INDICANO:");

lcd.setCursor(0, 1);

lcd.print("Rosso = SCARSO");

delay(3000);



//scrivi sul display velocità dei led

lcd.clear();

lcd.setCursor(0, 0);

lcd.print("Giallo = MEDIO");

lcd.setCursor(0, 1);

lcd.print("Verde = FORTE");

delay(3000);

}



void loop()

{

val=analogRead(0);



//if(val>100) time = millis()/1000; //tempo trascorso in secondi da finire... per la prossima versione

if(val<sens)

stat=LOW;

else

stat=HIGH;

digitalWrite(13,stat); //sul pin13 si vede lo stato del circuito

//acceso quando il fascio viene ricevuto



if(stat2!=stat){ //conta quando lo stato cambia da scuro a chiaro e viceversa

contar++;

stat2=stat;

}

if(millis()-last>=milisegundos){

double rps=((double)contar/nPalas)/2.0*1000.0/milisegundos;

double rpm=((double)contar/nPalas)/2.0*60000.0/(milisegundos);

Serial.print((contar/2.0));Serial.print(" RPS ");Serial.print(rps);

Serial.print(" RPM");Serial.print(rpm);Serial.print(" VAL ");Serial.println(val);Serial.println(time);





if (rpm > rpmMaximum) rpmMaximum = rpm;

lcd.clear();

displayRPM(rpm);

displayBar(rpm);

if (rpmMaximum <= vel_min)

{ digitalWrite(led_r, HIGH); }

else if (rpmMaximum > vel_min && rpmMaximum <= vel_max)

{ digitalWrite(led_g, HIGH); }

else if (rpmMaximum > vel_max)

{ digitalWrite(led_v, HIGH); }

contar=0;

last=millis();

}

}



void displayRPM(int rpm)

{

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(rpm,DEC);

lcd.setCursor(7,0);

lcd.print(rpmMaximum, DEC);

lcd.setCursor(13,0);

lcd.print("MAX");

Serial.print("RPM = ");

Serial.print(rpm);

Serial.print(" MAX RPM = ");

Serial.println(rpmMaximum);

}



void displayBar(int rpm)

{

int numOfBars=map(rpm,0,maxRPM,0,15);

lcd.setCursor(0,1);

if (rpm!=0)

{

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

{

lcd.setCursor(i,1);

lcd.write(1023);

}

}

}

Ulteriori annotazioni:

Verificare bene i collegamenti, ricordarsi di collegare correttamente il display quando si usa arduino nano.



Home Page