Go Down

Topic: Contagiri per Encoder Arduino Uno (Read 1 time) previous topic - next topic

Luigi89

Oct 16, 2012, 03:34 am Last Edit: Oct 16, 2012, 08:25 am by UweFederer Reason: 1
Ciao a tutti, io ho un problema. Vorrei sapere quanti giri fa al minuto il mio encoder da mouse (quello dello scroll) collegato ai pin digitali dell'arduino, tutto funziona a meraviglia solo che non riesco a capire che script comporre per avere questa mia delucidazione! Ah premetto che i valori crescenti e decrescenti mi vengono visualizzti correttamente sul monitor seriale quando utilizzo l' encoder.
ecco il codice voi cosa mi consigliereste di fare?:

Code: [Select]
#define encoder0PinA  2
#define encoder0PinB  4
#define ledPin 12  
volatile unsigned int encoder0Pos = 0;

void setup() {

 pinMode(ledPin, OUTPUT);
 pinMode(encoder0PinA, INPUT);
 digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
 pinMode(encoder0PinB, INPUT);
 digitalWrite(encoder0PinB, HIGH);       // turn on pullup resistor

 attachInterrupt(0, doEncoder, CHANGE);  // encoder pin on interrupt 0 - pin 2
 Serial.begin (9600);
 Serial.println("start");                // a personal quirk

}

void loop(){
// do some stuff here - the joy of interrupts is that they take care of themselves
}


void doEncoder(){
 if (digitalRead(encoder0PinA) == HIGH) {   // found a low-to-high on channel A
   if (digitalRead(encoder0PinB) == LOW) {  // check channel B to see which way
                                            // encoder is turning
     encoder0Pos = encoder0Pos - 1;         // CCW
   }
   else {
     encoder0Pos = encoder0Pos + 1;         // CW
   }
 }
 else                                        // found a high-to-low on channel A
 {
   if (digitalRead(encoder0PinB) == LOW) {   // check channel B to see which way
                                             // encoder is turning  
     encoder0Pos = encoder0Pos + 1;          // CW
   }
   else {
     encoder0Pos = encoder0Pos - 1;          // CCW
   }
   if (digitalRead(encoder0PinA) == HIGH) {
     
     encoder0Pos = encoder0Pos - 1;
     
    }
 }
     Serial.println (encoder0Pos);          // debug - remember to comment out
                                             // before final program run
 // you don't want serial slowing down your program if not needed
}

mancio

#1
Oct 16, 2012, 07:26 am Last Edit: Oct 16, 2012, 07:28 am by mancio Reason: 1
nel loop potresti mettere che ogni minuto si calcola quanti giri ha fatto e poi fare vedere questo risultato.

Code: [Select]

unsigned int passatoMinuto;
unsigned int time;
unsigned int minuto = 60000; //equivale ad un minuto, espresso in millisecondi
unsigned int giri = 0;

void loop(){
  time=millis()
  if(time+minuto>passatoMinuto){
     passatoMinuto=millis();
     Serial.print("Giri/min = ");
     Serial.print(giri);
     giri=0;
  }
}

ogni volta che gira la rotella avanti incrementi di uno giri! chiaro?

gingardu

#2
Oct 16, 2012, 08:32 am Last Edit: Oct 16, 2012, 08:42 am by UweFederer Reason: 1

Ciao a tutti, io ho un problema. Vorrei sapere quanti giri fa al minuto il mio encoder da mouse (quello
}


sembrtaun controsenso quello che vuoi sapere

un conto e avere qualcosa che gira sempre   (anche se piano)  ma la rotellina del mouse fa 3/4  di giro poi torna indietro   :smiley-eek-blue:
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

uwefed

@mancio
le variabili passatoMinuto e time devono essere del tipo unsigned long.
Ciao Uwe

Luigi89


nel loop potresti mettere che ogni minuto si calcola quanti giri ha fatto e poi fare vedere questo risultato.

Code: [Select]

unsigned int passatoMinuto;
unsigned int time;
unsigned int minuto = 60000; //equivale ad un minuto, espresso in millisecondi
unsigned int giri = 0;

void loop(){
  time=millis()
  if(time+minuto>passatoMinuto){
     passatoMinuto=millis();
     Serial.print("Giri/min = ");
     Serial.print(giri);
     giri=0;
  }
}

ogni volta che gira la rotella avanti incrementi di uno giri! chiaro?
io non so come ringraziarti, veramente gentili ragazzi, più tardi quando arrivo a casa provo e vi faccio sapere grazie ancora!

mancio

@Uwe

Si hai ragione. ho scritto di fretta lo sketch. però è il concetto ke conta!!  :smiley-mr-green:

astrobeed


un conto e avere qualcosa che gira sempre   (anche se piano)  ma la rotellina del mouse fa 3/4  di giro poi torna indietro   :smiley-eek-blue:


Non so che mouse hai tu, però su tutti quelli che ho usato la rotellina gira libera, sia avanti che indietro, quanto ti pare ed è abbinata ad un encoder incrementale, può essere sia di tipo ottico che capacitivo.
Diciamo pure che il concetto di velocità angolare, indipendentemente dall'unità di misura utilizzata, si applica anche a spostamenti minimi, non è indispensabile fare un giro completo, posso benissimo misurarla anche per spostamenti angolari minori di 360°.
Il modo più semplice per misurare la velocità angolare, sopratutto se è bassa, è misurare il tempo che trascorre tra due impulsi successivi, solo stesso canale, dell'encoder, si moltiplica per il numero di fori della ruota dentata e si ottiene il periodo di una singola rotazione, facendo l'inverso si ottiene la frequenza in hertz che può essere convertita in una qualunque unità di misura per la velocità angolare, p.e. basta dividerla per 60 per ottenere gli rpm.

Go Up