Go Down

Topic: arduino e motori a encoder (Read 2637 times) previous topic - next topic

secondsky

Ciao a tutti, sto lavorando a un progetto per il quale mi farebbe comodo usare un paio di motori con riuduzione e encoder al posto degli stepper.
Ho trovato questo prodotto della pololu che potrebbe essere utile:

http://www.pololu.com/catalog/product/1107

E so che c'è una libreria apposita: PololuWheelEncoders.h, che può essere usata con arduino.
Avevo sempre pensato che gli arduino precedenti alla DUE non fossero adatti a lavorare con gli encoder, ma vorrei sapere se qualcuno con più esperienza in merito avesse qualche consiglio da darmi o qualche esperienza da condividere.
Grazie

qsecofr


Ciao a tutti, sto lavorando a un progetto per il quale mi farebbe comodo usare un paio di motori con riuduzione e encoder al posto degli stepper.
Ho trovato questo prodotto della pololu che potrebbe essere utile:

http://www.pololu.com/catalog/product/1107

E so che c'è una libreria apposita: PololuWheelEncoders.h, che può essere usata con arduino.
Avevo sempre pensato che gli arduino precedenti alla DUE non fossero adatti a lavorare con gli encoder, ma vorrei sapere se qualcuno con più esperienza in merito avesse qualche consiglio da darmi o qualche esperienza da condividere.
Grazie


io ho accaccato leonardo a encoder industriali: la limitazione è che il leonardo come l'uno ha solo due canali interrupt e quindi se vuoi la massima velocità puoi avere un solo encoder per arduino... su due canali di interrupt mi pare che il programmatore che ha realizzato la libreria sia andato oltre i 100khz. io avevo un encoder a 4000 impulsi giro in quadratura e non perdeva colpi.
non ho usato la libreria Pololu... ho usato le librerie del playgroung: ce n'era una con interrupt ottimizzata in assembler...

calzand

Con questo codice riesci a leggere un encoder in modo 2x con un Arduino UNO se metti RISING al posto di CHANGE leggi a 1x
la velocità di lettura dell'encoder dipende da quanto è "impegnato" Arduino

Code: [Select]

volatile int encoder0Pos = 0; // posizione attuale

void setup(){
  Serial.begin(57600);
  pinMode(2, INPUT);
  pinMode(4, INPUT);
  attachInterrupt(0, doEncoderA, CHANGE); // encoder A channel on interrupt 0 (arduino's pin 2)                       

}
void loop(){
  Serial.println(encoder0Pos);
  }

void doEncoderA() { // pin no 2
  digitalRead(2) ^ digitalRead(4) ? encoder0Pos -- :   encoder0Pos  ++ ; // se i due segnali sono uguali  decremente, altrimenti incrementa

qsecofr



la velocità di lettura dell'encoder dipende da quanto è "impegnato" Arduino


nel tuo caso hai attaccato un interrupt quindi l'impegno di arduino non centra nulla perchè qualsiasi cosa faccia il codice viene interrotto a favore dell'encoder.

secondsky

Scusatemi,in che senso la velocità massima?
Io pensavo di usare due di questi motori con encoder integrati:
http://www.pololu.com/catalog/product/1447

oppure uno di questi:
http://www.pololu.com/catalog/product/1217
montato su uno di uno di questi:
http://www.pololu.com/catalog/product/2213

Da quanto ho capito qui l'encoder manda due segnali, e quando si spegne uno e si accende l'altro c'è un "passo".
Non mi è molto chiaro come capire la direzione, dall'ordine di accensioni e spegnimenti?
Anche se immagino che di questo si occupi la libreria.
Sarebbero comodi dei drivers come gli a4988 che fanno il lavoro sugli stepper al posto di arduino.

qsecofr

#5
Dec 27, 2012, 05:14 pm Last Edit: Dec 27, 2012, 05:20 pm by qsecofr Reason: 1

Scusatemi,in che senso la velocità massima?
Io pensavo di usare due di questi motori con encoder integrati:
http://www.pololu.com/catalog/product/1447

oppure uno di questi:
http://www.pololu.com/catalog/product/1217
montato su uno di uno di questi:
http://www.pololu.com/catalog/product/2213

Da quanto ho capito qui l'encoder manda due segnali, e quando si spegne uno e si accende l'altro c'è un "passo".
Non mi è molto chiaro come capire la direzione, dall'ordine di accensioni e spegnimenti?
Anche se immagino che di questo si occupi la libreria.
Sarebbero comodi dei drivers come gli a4988 che fanno il lavoro sugli stepper al posto di arduino.



i segnali degli encoder sono disposti in quadratura: non sono che uno si accende QUANDO l'altro si spegne ma sono solo sfasati.... e quindi l'arduino (ma anche il vecchio mouse meccanico) capisce la direzione in base a questi due segnali.
per la velocità di campionamento del segnale degli encoder devi calcolare quanti impulsi a giro ti danno gli encoder e a quanti giri li fai girare... se superi i 100 khz non ce la fai (ma di solito gli encoder devono girare "piano" anche per motivi meccanici).
Comuque questi della Pololu sono roba per modellismo penso: sono già messi in condizione di non darti problemi... il motore ridotto fa 80RPM a 8400 impulsi per giro... è poco... circa 11.000 impulsi al secondo...



corradoz

Un sito interessante per trovare motoriduttori con encoder ad effetto Hall: http://www.micromotors.eu/. Sono a Verderio Inferiore, vicino a Milano.
Futura Elettronica ha in catalogo alcuni di questi motori. Mi sembrano molto simili ai Polulu.
Se non sbaglio la risoluzione max è 6 impulsi a giro. In compenso c'è molta scelta di rapporti sui riduttori epicicloidali forniti con i motori.

corradoz

mi sono accorto solo :) ora che la risoluzione degli encoder polulu è superiore...

uwefed

Dipendente dal riduttore e dal uso anche una bassa risoluzione del encoder puó essere funzionale o opportuno. Se hai una risoluzione alta del encoder e una riduzione alta ricevi una risoluzione troppo alta.
Ciao Uwe

astrobeed


Comuque questi della Pololu sono roba per modellismo penso: sono già messi in condizione di non darti problemi... il motore ridotto fa 80RPM a 8400 impulsi per giro... è poco... circa 11.000 impulsi al secondo...


Non sono per modellismo, sono per applicazioni dove serve un feedback di velocità e/o posizione, il che coinvolge l'utilizzo di software specifico come un controller pid.
11 kHz in uscita dall'encoder non è poco, sopratutto da gestire con Arduino, se poi applichiamo la quadratura 4x gli impulsi da gestire diventano 44kHz che sono completamente fuori portate per Arduino.
Per capirci vuol dire gestire fino 44000 interrupt al secondo (uno ogni 22.73 us) con tutti i relativi conti per determinare il verso di rotazione (si usa l'XOR) e incrementare/decrementare di conseguenza il relativo contatore, poi se c'è pure il calcolo della velocità la cosa si complica ulteriormente, in pratica Arduino riesce a stento a fare solo questa cosa e per un solo motore.

Go Up