Calcolo velocità

Salve ragazzi, sono ancora alle prese con il calcolo di questa velocità.Ho pensato di costruire da me un "encoder" creato con un sensore IR del tipo http://www.kingbright.com/manager/upload/pdf/(1367219496)KTIR0611S(Ver.10).pdf collegato così

La ruota che gira fra i sensori IR è fatta da 13 tick in cui il segnale è LOW e 13 in cui il segnale è HIGH. Ho provato tanti codici che calcolano rpm ( anche quello del playground del sito di arduino) ma nessuno è andatto.Perchè? Il raggio della ruota dell'encoder è 2.25 cm.L'encoder è collegato giusto nel centro di una puleggia di raggio 13.5 cm che va a velocità dell'ordine di 50 cm/min fino a 170 cm/min.A me servirebbe calcolare la velocità angolare (ricavata dagli rpm della puleggia) per poi trasformarla in lineare tramite W x R per avere alla fine un valore che figuri la velocità lineare di una catena collegata alla puleggia. Qualcuno può aiutarmi?

http://forum.arduino.cc/index.php?topic=185004.0

poi rpm*circonferenza corona =metri al minuto

Ciao,
Grazie per la risposta.Ho buttato giò un pò di codice per sfornare questo sketch

#include <secTimer.h>
volatile int statestartt = HIGH;    // stato normale startt
volatile int statestopp=HIGH;       // stato normale stopp
secTimer myTimer;
int time = 0;           //valore durata dente microsecondi
int rpm = 0;             //numero giri
float gradidente = 0.5;     //ampiezza dente in gradi

void setup() {
  Serial.begin(9600);     //comunicazione seriale
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  attachInterrupt(0, startt, FALLING);   //interrupt in inizio dente
  attachInterrupt(1, stopp, RISING);     //interrupt fine dente
}

void loop()
{
  //se il dente è iniziato
  if(statestartt == LOW){
myTimer.startTimer(); //start the timer
    statestartt=HIGH;// reimposta startt
  }
  if(statestopp == LOW) {
   time=myTimer.readTimer();                     //memorizza durata dente
    statestopp = HIGH;                         //reimposta stopp
     myTimer.stopTimer();                         //azzera timer durata dente
    rpm=60/((time/gradidente)*360);      //calcolo rpm
  }
} 
void startt()//interrupt startt
{
  statestartt = !statestartt;  //inverti startt
}

void stopp()//interrupt stopp
{
  statestopp = !statestopp;    //inverti stopp
}

Ho usato la libreria di Leo invece che la stop watch perchè quest ultima mi dava dati di tempo errati( addirittura negativi).Invece quella di leo è precisa inoltre è in secondi quindi ho portato 60000000 a 60.Non ho capito però il sistema per passare da RPM ametri al minuto.Come circonferenza cosa intendi? io ho trovato una formula per il calcolo del perimetro di una corona che è così

2pi(R+r)
Intendevi questa? Inserendo questa mi dava valori errati, non corrispondenti alla realtà.
Inoltre sul motore ho un lcd che mi indica la velocità in centimetri al minuto che al momento mi indica 20 cm/min e sull'arduino mi appaiono 0.01 RPM. Corrispondono?
Ti ringrazio in anticipo.

francescoprisco:
...
Non ho capito però il sistema per passare da RPM ametri al minuto...

Secondo me stai facendo un minimo di confusione ... metri al minuto e' una grandezza lineare relativa ed esprime una velocita', RPM e' una quantita' ed esprime, appunto, una quantita', e le due non sono diretamente dipendenti, senza un'altra grandezza che le accoppi (come ad esempio il diametro esterno di una ruota, che ad un certo numero di RPM percorrera' una certa distanza al minuto, o per dirla in un'altro modo si muovera' ad una certa velocita').

Il numero di metri al minuto della tua ruota (o se preferisci, la velocita' di un punto posto sulla circonferenza esterna della tua ruota), quindi, dipendera' dal suo diametro, oltre che dalla velocita' di rotazione in RPM ... ad esempio, una ruota con un diametro di 1 metro a 10 RPM percorre dieci metri al minuto, una ruota con un diametro di 10cm, a 10RPM percorre un metro al minuto ... e cosi via ...

la circonferenza è diametro * 3.14

non so come faccia il motore a dirti la distanza in quanto tutto dipende dal diametro della corona

se hai una corona con circonferenza di 50cm ogni giro farà passare 50cm di catena, è molto semplice :wink:

l'lcd sul motore è collegato ad un sensore posto nel motoriduttore ( una sorta di frizione) e da li calcola la velocità in cm/m ( non so come).L'arduino che sto configurando è collegato ad un encoder fatto da me posto al centro della puleggia.

Quando il motore va a 20 cm/min (letto dall'lcd) arduino mi conta l'intervallo tra i due interrupt e mi restituisce 12 secondi.Lo spazio percorso è 0.5 gradi misurato con goniometro e mi restituisce come rpm 0.01. La circonferenza della corona è 23.1413.5. la velocità sarà quindi 0.01*(23.1415.5) = 0.01*84.78=0,8478.

La catena percorrerà dunque 0.8478 metri al minuto.Per passare da metri al minuto a centimetri al minuto occore moltiplicare per 100. Quindi 0.8478 * 100=84.78 cm/min che non rispecchiano i 20 cm/min detti dall'lcd sul motore.

Quella "sorta di frizione" e' probabilmente una dinamo tachimetrica (dubito che sia un resolver), quindi dara' una tensione proporzionale al numero dei giri ... ma e' connessa all'uscita del riduttore, o all'albero del motore ? ... sei sicuro che quei 20 siano cm/minuto e non giri del motore ?

0.01RPM sono circa mezzo giro al secondo (0.6 giri al secondo, per la precisione), quindi dovresti vedere anche ad occhio se la velocita' corrisponde ...

Etemenanki:
. ad esempio, una ruota con un diametro di 1 metro a 10 RPM percorre dieci metri al minuto, una ruota con un diametro di 10cm, a 10RPM percorre un metro al minuto ... e cosi via

La distanza percorsa in un minuto è data da diametro * 3.14 * rpm, una ruota con un diametro di un metro a 10 rpm in un minuto percorre : 13.1410 = 31.4 metri :slight_smile:

francescoprisco:
io ho trovato una formula per il calcolo del perimetro di una corona che è così
2pi(R+r)

Non devi usare il perimetro della corona, devi usare la sua circonferenza massima, ovvero 2piR.

astrobeed:

Etemenanki:
. ad esempio, una ruota con un diametro di 1 metro a 10 RPM percorre dieci metri al minuto, una ruota con un diametro di 10cm, a 10RPM percorre un metro al minuto ... e cosi via

La distanza percorsa in un minuto è data da diametro * 3.14 * rpm, una ruota con un diametro di un metro a 10 rpm in un minuto percorre : 13.1410 = 31.4 metri :slight_smile:

Scusa, errore mio, volevo dire circonferenza e mi sono confuso :stuck_out_tongue:

quindi dovresti vedere anche ad occhio se la velocita' corrisponde ...

La velocità corrisponde più o meno. un giro intero dura circa 6 minuti , la ruota ha 26 tick ( 13 high e 13 low) e ogni tick è largo 0.5, e ogni tick impiega 14 secondi. dividendo 6 minuti per 26 tick indica 13.86 secondi, quindi si trova.

ragazzi allora?

francescoprisco:
ragazzi allora?

Se fai una domanda magari ti rispondiamo ahaha
Io sono rimasto che la velocità più o meno torna :slight_smile:

l'lcd sul motore è collegato ad un sensore posto nel motoriduttore ( una sorta di frizione) e da li calcola la velocità in cm/m ( non so come).L'arduino che sto configurando è collegato ad un encoder fatto da me posto al centro della puleggia.

Quando il motore va a 20 cm/min (letto dall'lcd) arduino mi conta l'intervallo tra i due interrupt e mi restituisce 12 secondi.Lo spazio percorso è 0.5 gradi misurato con goniometro e mi restituisce come rpm 0.01. La circonferenza della corona è 23.1413.5. la velocità sarà quindi 0.01*(23.1415.5) = 0.01*84.78=0,8478.

La catena percorrerà dunque 0.8478 metri al minuto.Per passare da metri al minuto a centimetri al minuto occore moltiplicare per 100. Quindi 0.8478 * 100=84.78 cm/min che non rispecchiano i 20 cm/min detti dall'lcd sul motore.

Beh intanto come abbiamo detto i 20cm al minuto sono un dato.tutto particolare visto che non si.sa su che ruota.e preso
In ogni caso sicuro 0.01 rpm????
Farebbe un giro.in un'ora e quaranta... (100 minuti)
Attenzione poi che mi sa che hai sbagliato il calcolo
Quando calcoli la circonferenza la ottieni in centimetri che moltiplicati per rpm sono gia centimetri al minuto e non metri...

Un tick di 0.5 gradi impiega 6 minuti a fare un giro completo.Ogni tick impiega 12 o 14 secondi andando a 20 cm/min a npassare da high a low

20 cm/min è un dato senza senso per noi al pc
Parliamo di rpm, la velocità lineare si ottiene semplicemente da rpm in base alla ruota
Se fai un giro ogni 6 minuti fai 0.17 rpm non 0.01!!
Poi se fai 0.5 gradi in 14 secondi a me risulta che fa un giro in 168 minuti e non in 6...
Verifica bene dati e calcoli io cosi non capisco che sta succedendo :)i

Allora la lunetta che passa sotto al sensore è di 0.5 gradi. Arduino mi dice che tra un interrupt (quello di attivazione) e e l'altro ( quello di disattivazione) son passati 14 secondi. io ho contato a cronometro e il giro completo lo fa in poco meno di 6 minuti.

Probabilmente il dente misura ben più di 0.5 gradi allora...

il dente della puleggia si è piu grande di quello del sensore. Devo inserire quello come angolo?