Pages: [1]   Go Down
Author Topic: Contagiri per Encoder Arduino Uno  (Read 1213 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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
}
« Last Edit: October 16, 2012, 01:25:50 am by UweFederer » Logged

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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?
« Last Edit: October 16, 2012, 12:28:42 am by mancio » Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: October 16, 2012, 01:42:13 am by UweFederer » Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21502
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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!
Logged

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@Uwe

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 125
Posts: 9334
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: