martedì 29 aprile 2014

Misurare la velocità di una ventola per PC a 3 fili con Arduino

Oggi vediamo un programma che ho scritto io semplificandolo e prendendo spunto da questo progetto, lo sketch misura la velocità di una classica ventola da PC a tre PIN come quella in figura:


Il pin-out del connettore della ventola è questo:



Per contare i giri della ventola ho utilizzato gli interrupt, collegando in led tra VCC 9V e il filo giallo tachimetrico con resistenza da 1K ho verificato che il led si spegne e si accende 4 volte in ogni giro che fa la ventola.
Video:



Oppure potete usare questo semplice sketch come test: 
int pin = 13;
volatile int state = LOW;
void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}
void loop()
{
  digitalWrite(pin, state);
}
void blink()
{
  state = !state;
}

Collegate la ventola ad Arduino come nel seguente schema:
Lo sketch che misura i giri al minuto è questo:

//Sketch creato da Alessandro Riva
//Sito web: http://alessandro-riva-elettronica.blogspot.it/
                                  
volatile int Giri; //memorizza il numero di giri al secondo
int Calc;
int cambiamenti=4; // numero di cambiamenti di stato per ogni giro//The pin location of the sensor
int pinTachimetrico = 2; // Filo tachometrico della ventola, connettere resistenza di pull-up da 10kohm
void rpm ()      //Funzione che viene cambiata dall'interrupt
{ 
 Giri++; 
} 
void setup() 
{ 
 pinMode(pinTachimetrico, INPUT); 
 Serial.begin(9600); 
 attachInterrupt(0, rpm, CHANGE); //interrupt sul pin 2void loop () 
{
   Giri = 0; //Azzare il numero di giri per il calcolo
  interrupts(); // Attiva gli interrupt
   delay (1000); //Aspetta un secondo
    noInterrupts(); // disattiva gli interrupt
   Calc = ((Giri * 60)/cambiamenti);
   Serial.print (Calc, DEC); //Scrive il valore calcolato sulla seriale
   Serial.print (" Giri al minuto\r\n"); //Scrive "giri al minuto
}


Lo sketch conta i giri al secondo attraverso gli interrupt, moltiplica per 60 per ottenere i giri al minuto e divide per 4 (cambiamenti di stato al secondo, questo numero può variare da ventola a ventola) per ottenere i giri reali.
Video:


Ho anche realizzato uno sketch che indica gli RPM su un display LCD, ecco lo sketch:


//Sketch creato da Alessandro Riva
//Sito web: http://alessandro-riva-elettronica.blogspot.it/
#include <LiquidCrystal.h>  
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //RS, ER, data PIN
volatile int Giri; //memorizza il numero di giri al secondo
int Calc;
int cambiamenti=4; // numero di cambiamenti di stato per ogni giro//The pin location of the sensor
int pinTachimetrico = 2; // Filo tachometrico della ventola, connettere resistenza di pull-up da 10kohm
void rpm ()      //Funzione che viene cambiata dall'interrupt
{ 
 Giri++; 
} 
void setup() 
{ 
 lcd.begin(16,2);
 pinMode(pinTachimetrico, INPUT); 
 Serial.begin(9600); 
 attachInterrupt(0, rpm, CHANGE); //interrupt sul pin 2void loop () 
{

   Giri = 0; //Azzare il numero di giri per il calcolo
  interrupts(); // Attiva gli interrupt
   delay (1000); //Aspetta un secondo
    noInterrupts(); // disattiva gli interrupt
   Calc = ((Giri * 60)/cambiamenti);
   Serial.print (Calc, DEC); //Scrive il valore calcolato sulla seriale
   Serial.print (" Giri al minuto\r\n"); //Scrive "giri al minuto
   lcd.setCursor(0, 0);
   lcd.print("RPM: ");
  lcd.setCursor(0, 1);
  lcd.print(Calc);
}

Il display va collegato nel seguente modo:
  • LCD RS pin to digital pin 8
  • LCD Enable pin to digital pin 9
  • LCD D4 pin to digital pin 4
  • LCD D5 pin to digital pin 5
  • LCD D6 pin to digital pin 6
  • LCD D7 pin to digital pin 7
Video:

Per qualsiasi domanda o informazione scrivete qua sotto nei commenti.

6 commenti:

  1. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  2. Ciao,
    grazie per l'articolo: mi è stato utile.

    RispondiElimina
  3. ciao, io dovrei fare una cosa molto simile, ho un sensore effetto hall e un magnete attaccato ad un albero che gira, il risultato alla fine dovrebbe essere molto simile al tuo però con più led.. secondo te il tuo programma può andare bene con qualche modifica? Non ne so molto di programmazione ma ho la necessita di fare questa cosa. grazie mille

    RispondiElimina
  4. Ciao, sono nuovo su arduino. Vorrei leggere la velocità di due ventole ma non riesco ad implementare il tuo script. Hai suggerimenti a riguardo?

    RispondiElimina
  5. Bellissimo progetto molto utile complimenti

    RispondiElimina