Velocità motore

Salve a tutti,

Avrei la necessità di controllare la velocità di un motore. Nel senso a quanto "corre".Sapete consigliarmi un codice e anche qualcosa a livello di componenti "Hardware"?

Grazie a tutti in anticipo

Di che velocitá parliamo e che tipo di motore hai. Ciao Uwe

è un motore di una manovia che mi fa muovere dei carrelli. dovrei definire la velocità a cui va questo motore o la velocità dei carrelli.Le velocità sono basse in quando i carrelli si muovono lentamente. dovrebbe restituirmi una velocità in metri al secondo o centimetri al secondo.

Ciao Sensori utili sono quelli ottici o magnetici. Per i sensori magnetici devi incollare/montare uno o 2 magneti su uno delle parti che girano (albero motore, asse ruota, ingranaggi, ecc) Per un sensore ottico serve qualcosa che interrompe il fascio ottico o che riflette e non riflette. Al punto di vista di robustezza non sono cosí robusti come quelli magnetici perché lo sporco puó rendere cechi i sensori ottici.

sensore magnetico per esempio: http://www.ethermania.com/shop/index.php?main_page=product_info&products_id=517

Ciao Uwe

Ho il sensore magnetico.

ho visto la funzione pulsein(); ho pensato di contare il numero di giro e di calcorarlo insieme al tempo di ogni giro con la funzione pulsein(); solo che non riesco a contare l'intervallo fra l'inizio del giro e la fine.Sapresti aiutarmi?

Non serve che calcoli il numero di giri. Basta misurare il tenpo tra un impulso e il succesivo. PulseIn() lo fa benissimo. Ciao Uwe

potresti farmi un esempio dell’utilizzo per il controllo dell’impulso tra due input? Grazie mille

http://arduino.cc/en/Reference/PulseIn

Supponimo che il sensore, quando vede un magnete passa da HIGH a LOW, che il sensore sia collegato al Pin 4 e che la variabile "fattore" sia un valore numerico che prevede la demoltiplicazione, la circonferenza della ruota e il calcolo delle unitá.

duration = pulseIn(4, LOW, timeout); velocita = fattore/duration;

Ciao Uwe

Qualcosa del genere?

int pin = A0;
unsigned long duration;
float velocita=0.0;
float raggio = 10;
float circ=0;
void setup()
{
  Serial.begin(9600);
  pinMode(pin, INPUT);
}

void loop()
{
  duration = pulseIn(pin, LOW);
  circ=2*3.14*raggio;
  velocita = circ/duration;
  Serial.println(velocita);
  
}

Ho notato che la funzione pulsein() mi rallenta un pò tutto il sistema:

http://nopaste.info/7f410a0243_nl.html

succede a volte che non mi si incrementano o decrementano le variabili negli if o i relè si attivano i ritardo.Non c’à una funzione che non rallenti tutto?
prima utilizzavo un codice del genere

void setup() 
{
[...]
  pinMode(sensvel, INPUT);//sensore velocità
  
      reedCounter = maxReedCounter;
  circumference = 2*3.14*radius;

  // TIMER SETUP- the timer interrupt allows precise timed measurements of the reed switch
  //for more info about configuration of arduino timers see http://arduino.cc/playground/Code/Timer1
  cli();//stop interrupts

  //set timer1 interrupt at 1kHz
  TCCR1A = 0;// set entire TCCR1A register to 0
  TCCR1B = 0;// same for TCCR1B
  TCNT1  = 0;
  // set timer count for 1khz increments
  OCR1A = 1999;// = (1/1000) / ((1/(16*10^6))*8) - 1
  // turn on CTC mode
  TCCR1B |= (1 << WGM12);
  // Set CS11 bit for 8 prescaler
  TCCR1B |= (1 << CS11);   
  // enable timer compare interrupt
  TIMSK1 |= (1 << OCIE1A);
  
  sei();//allow interrupts
  //END TIMER SETUP
   
}
 ISR(TIMER1_COMPA_vect) {//Interrupt at freq of 1kHz to measure reed switch
  reedVal = digitalRead(sensvel);//get val of A0
  if (reedVal){//if reed switch is closed
    if (reedCounter == 0){//min time between pulses has passed
      mph = (56.8*float(circumference))/float(timer);//calculate miles per hour
      timer = 0;//reset timer
      reedCounter = maxReedCounter;//reset reedCounter
      ms = ((((mph*1.609344)*1000)/3600));
    }
    else{
      if (reedCounter > 0){//don't let reedCounter go negative
        reedCounter -= 1;//decrement reedCounter
      }
    }
  }
  else{//if reed switch is open
    if (reedCounter > 0){//don't let reedCounter go negative
      reedCounter -= 1;//decrement reedCounter
    }
  }
  if (timer > 2000){
    
    mph = 0;//if no new pulses from reed switch- tire is still, set mph to 0
    ms = 0;
  }
  else{
    timer += 1;//increment timer
  } 
}[...]

La pulseIn conta gli impulsi entro un determinato lasso di tempo misura la durata di un impulso. Il codice si ferma finché la pulseIn non termina.

Edit: ups.. avevo scritto una cavolata

sapresti consigliarmi un altro metodo che però non preveda che il flusso si blocchi? tipo con una funzione millis();?

Il timer 1 può essere configurato anche per contare gli impulsi in arrivo sul pin T1. E' lo stesso sistema usato dalla lib FreqCounter E' sicuramente un modo più complesso di quello offerto dalla pulseIn ma senz'altro non bloccante. E' simile al codice che usavi basato sull'uso del timer 1 (a proposito, perché non lo adoperi, se ti funziona?).

allora ti spiego io ho necessità di controllare un motore che gira a bassa velocità.Il magnete che uso è uno di quelli che si usano per gli antifurti tipo questo succede che il motore fa restare il magnete per un certo tempo sul sensore e quindi mi segna velocità massima.inoltre facendo il giro lentamente quando il magnete non è sul sensore mi torna a 0. Non so come risolvere.Quel codice l'ho preso da un speedmeter montato su una bicicletta dove comunque la velocità della ruota e molto maggiore di quella del mio motore.Per questo puntavo a un calcolo del tempo fra due punti.

Potresti mettere 2 o 4 o più magneti e contare un giro ogni 2/4 o più impulsi. In questo modo anche con bassissime velocità riesci ad avere una buona sensibilità. Devi prevedere la possibilità che il magnete si fermi sul sensore eliminando le doppie letture. Tra l'altro non è che potresti linkare il datasheet del sensore?

http://www.hiltron.it/?ln=EN&voce=prodotti&a=C401/P questa è la pagina relativa al sensore.Potresti abbozzarmi un pezzo di codice relativo al controllo di più magneti? Io ho il codice che funziona con uno solo.

Potresti postare lo sketch completo? In quello pubblicato mancano parti di dichiarazioni di variabili e non compila.

Questo è il codice totale

http://nopaste.info/b5c42411b9_nl.html

Una domanda. Ma non potresti usare 2 sensori, disassandoli così che quando uno è chiuso l'altro è aperto e viceversa? In questo modo sapresti se il motore è fermo perché avresti lo stesso magnete impegnato per molto tempo.

Intendi qualcosa del genere?

Se è così , certo che posso farlo.Non ho problemi sulla disposizione dei magneti o altro.