arduino e motori a encoder

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

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

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

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

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

calzand: 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.

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.

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.

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

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.

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

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

qsecofr: 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.

Ciao ragazzi, io mi sono imbattuto tempo fa nello stesso problema, su questo sito troverete le informazioni che (spero :D ) state cercando: www.freakontrol.com

Thomax: Ciao ragazzi, io mi sono imbattuto tempo fa nello stesso problema, su questo sito troverete le informazioni che (spero :D ) state cercando: www.freakontrol.com

Io invece spererei che le avessero trovate... Visto che l'ultimo post è del 2012...

Thomax: ... su questo sito troverete le informazioni che (spero :D ) state cercando: www.freakontrol.com

Sul sito mancano: -il file EasyTransfer.h -il file EncoderCounter.h -il programma robot simu -lo schema della scheda

Qualcosa ho già caricato, scusate se mancano i codici di Processing, ma il sito è in costruzione e presto sarà tutto online. Se qualcosa non è chiaro chedemi pure!!! (tra poco sarà disponibile anche il datasheet della scheda)

Il EasyTransfer lo ho trovato su github ma EncoderCounter non c'è, dovo lo trovo?

Lo trovi qui .

grazie, appena posso lo provo