controllo soglie di velocita

Ciao a Tutti!

Chiedevo un consiglio per realizzare con arduino un controllo soglie di velocita , di una ruota che effettua 100 rotazioni al minuto, affinche se supera una certa soglia di velocità mi faccia eccitare un relè e accendere un led. Mi potete aiutare? Volevo utilizzare un sensore ottico o ad effetto di Hall

Grazie!

ciao giovannin

sicuramente dovrai utilizzare un interrupt per rilevare passaggio del riferimento della ruota in modo da essere sicuro di non perderne qualcuno per strada…sarà anche necessario utilizzare millis() per calcolare il tempo trascorso tra un passaggio ed il successivo in modo da calcolarne la velocità/rpm.

poi ovviamente verifiche di soglia tramite if() che eseguiranno quello che vuoi.

per gli interrupt guarda QUI

per millis() guarda QUI e QUI

Grazie ORSO2001,se non chiedo troppo potresti darmi una base di partenza dello sketch? Ad esempio se il sensore hall, legge i denti della ruota che sono 120, la soglia di uscita a 115 giri al minuto.

ciao...semplicemente girando nel forum...leggi QUI

Girando per il forum , ho iniziato a provare e utilizzare uno skecth che poteva fare al caso mio, Ho apportato alcune modifiche , ma sono in difficoltà a controllare un tempo così basso.
Ho trascorse diverse ore a cercare di metterlo a punto, cosa dovrei controllare ?

ecco lo skecth :

void setup(){
pinMode (led,OUTPUT);
pinMode (reedSW,INPUT);
Serial.begin(9600);
}

void loop(){
duratagiro=pulseIn(reedSW,HIGH); //la durata del giro è uguale al tempo trascorso tra HIGH e LOW
duratagiro=pulseIn(reedSW,HIGH,1000000); // Timeout 1 secondo
rpm=60000000/duratagiro; //giri al minuto è uguale a 60 secondi fratto la durata di un giro
Hz=rpm*0,01666666666667;

if (rpm < 100) { // legge se la velocità dell’albero è bassa
digitalWrite(led,LOW); //diseccita relè attuatore
}
if (rpm > 120) { // legge se la velocità dell’albero è sufficente
digitalWrite(led,HIGH); //eccita relè attuatore
}
if (duratagiro == 0){ // Pulsein è andato in timeout
digitalWrite(led,LOW); // legge se la velocità dell’albero è 0
// diseccita relè attuatore
rpm = 0;
Hz = 0;
}
else
{
Hz = 1000000/duratagiro; // numero di giri in un secondo
rpm = Hz * 60; // giri al minuto
}

Serial.println(rpm);
Serial.println(Hz);

delay(300);

}

ciao giovannin

forse il secondo link che ti ho suggerito, quello con pulseIn(), non è adattissimo a quello che devi fare...meglio tornare su millis() ed interrupt.

detto questo...puoi gestire il tuo sensore come INPUT_PULLUP? in questo modo il sensore assumerebbe uno stato certo dall'inizio e potremmo impostare l'interrupt come FALLING.

qual'è il PIN che usi per il sensore?

const int ledPin =  LED_BUILTIN;
const int alarmLedPin =  2;
const int relePin =  3;
const int reedSW =  4;

byte ledState = LOW;
unsigned long previousMillis = 0;
const long interval = 1000;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode (reedSW, INPUT);
  Serial.begin(9600);
}


void loop() {
  unsigned long currentMillis = millis();

  // duratagiro = pulseIn(reedSW, HIGH); //la durata del giro è uguale al tempo trascorso tra HIGH e LOW
  int duratagiro = pulseIn(reedSW, HIGH, 1000000); // Timeout 1 secondo
  float rpm = 60000000.0 / duratagiro;    //giri al minuto è uguale a 60 secondi fratto la durata di un giro
  float Hz = rpm * 0.01666666666667;

  if (rpm < 1000) {           // legge se la velocità dell'albero è bassa
    digitalWrite(alarmLedPin, LOW);        //diseccita relè attuatore
    digitalWrite(relePin, LOW);        //diseccita relè attuatore
  }

  if (rpm > 1200) {           // legge se la velocità dell'albero è sufficente
    digitalWrite(alarmLedPin, HIGH);      //eccita relè attuatore
    digitalWrite(relePin, HIGH);
  }

  if (duratagiro == 0) { // Pulsein è andato in timeout
    digitalWrite(alarmLedPin, LOW);    // legge se la velocità dell'albero è 0
    digitalWrite(relePin, LOW);        //diseccita relè attuatore
    rpm = 0;
    Hz = 0;
  }
  else
  {
    Hz = 1000000 / duratagiro; // numero di giri in un secondo
    rpm = Hz * 60;                          //  giri al minuto
  }

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
    Serial.println(rpm);
    Serial.println(Hz);
  }

}

In questo modo togli il delay.
Dovesti comunque passare ad un calcolo basato sugli interrupt e non sulla pulsein.
Ho messo le definizioni dei pin a caso.

Sono tornato da un viaggio poco piacevole, e sono contento di leggervi qui, intanto grazie!! !!!!

Rispondendo ad ORSO2001 uso il pin 2,ho provato volevo usare un sensore di hall , o utilizzare un encoder rotativo in mio possesso che restituisce 5 impulsi a giro (5volt picco picco uscita onda rettangolare), ma avevo anche pensato ad un ampollina reed dato il basso regime di rotazione. Se uso un sensore di Hall o reed , mi è sufficiente una tacca di riferimento rilevata ogni singolo giro? Ho pensato che dato il basso numero di giri i tempi si allungano troppo .. Ho fatto un esperimento inizialmente con una ventola per PC usando il suo sensore di hall con resistore da 10 kohm di pull-up, ed impostando però le soglie rpm decisamente più alte, rallentando la ventola semplicemente con un dito ad un certo punto il led si accende, però non ho delle caratteristiche proporzionali impostando altre soglie di velocità, sia più alte che basse.

Ma chiedevo perché in questo caso è meglio usare milliss(), ? Ho voglia di imparare. Non immaginate come ero già contento quando sono riuscito a fare qualche semplicissima modifica allo sketch inizialmente.

In pratica su questo albero rotante è calettata una corona dentata che è un argano che tira un carrello lungo un binario se si dovesse rompere la catena , il peso del carrello farebbe accellerare rapidamente l'albero, ecco la necessità di rilevare la velocità e così tramite un relè si attiva un freno elettromagnetico.

Chiedevo anche a Paolo, ma nel tuo skecht è sufficiente cambiare i valori di rpm?

Nel caso specifico ho la rotazione normale a 100 giri minuto e la sovravelocità a 120 oppure per altro caso velocità normale 20 giri sovravelocità 30 .

Dimenticavo di dire che volevo ed ho fatto anche delle prove con un ENCODER ROTATIVO GROVE - ENCODER , a 4 fili non sono riuscito ad interfacciarlo .

schema_circuito_encoder (1).png

Ho provato lo skecht ma non ho nessun output