encoder fishertechnik

Salve a tutti,sono nuovo nel forum,lavoro in un ufficio meccanico e mi sono ultimamente appassionato ad arduino.
Scusate se forse commetterò degli errori, ma purtroppo non sono ne un elettronico , ne un informatico.
Il mio progettto consiste nell’ utilizzare un motore fishertechnik con encoder hall incorporato ,che fa 3 impulsi a giro motore.
Siccome la riduzione è 25:1 , ad ogni giro del riduttore dovrebbe dare 75 impulsi.
Io utilizzo ARDUINO UNO e vorrei che a un tot di impulsi , il motore si fermasse in quella precisa posizione.
Ma purtroppo non è cosi,pensavo che fosse un problema di debounce, ma credo che gli encoder hall non abbiano questo problema.
Che sia un problema di inerzia del motore ? (ma questa è una mia supposizione) .
Non sapendo se la parte software e hardware è giusta, ho usato il forum generale.
Spero di non avere sbagliato,se così fosse vi chiedo scusa.
Il mio codice Arduino è

int encoder0PinA=  2;
const int motorPin =9;
volatile unsigned int encoder0Pos = 0;


void setup() { 

pinMode(motorPin, OUTPUT);
  pinMode(encoder0PinA, INPUT); 
  digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
  digitalWrite(motorPin, LOW); 

  attachInterrupt(0, doEncoder, CHANGE);  // encoder pin on interrupt 0 - pin 2
  Serial.begin (115200);
 

} 

void loop(){

  while(encoder0Pos < 75)
{ 
 
  
  digitalWrite(motorPin, HIGH); 
  


} 
digitalWrite(motorPin, LOW); 
}
void doEncoder() {
 
  if ((digitalRead(encoder0PinA) == HIGH) && ( encoder0Pos < 75 )){
    encoder0Pos++; Serial.println (encoder0Pos, DEC);
    
  } else  {noInterrupts();}

Vi inserisco anche delle foto.

Ciao,
essendo il tuo primo post, ti chiederei cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO … Grazie. :slight_smile:

Guglielmo

Così, ad un primo colpo d'occhio sul codice, ti ricordo che le ISR devono essere le più rapide possibili e quindi ... dimentica di fare tutte quelle cose dentro la ISR (... specialmente delle Serial.print()) ...

In una ISR al massimo incrementi una variabile o fai altre cose molto veloci, è poi il codice nel loop() che esamina le informazioni aggiornate dalla ISR e esegue ciò che c'è da eseguire.

Quindi, intanto ricomincia a pensare al tuo programma in questa ottica ... ... poi vediamo cosa si deve correggere e cosa ottimizzare.

Guglielmo

Salve,
Ho fatto la mia presentazione nel forum ,spero di non sbagliarmi più.
Io considero sempre che 75 impulsi corrispondono a un giro completo del riduttore, ma nel precedente sketch quando il serial monitor arriva a 75 ,il riduttore ha fatto di più di un giro e mezzo.
Ho provato a fare un’ altro sketch , cercando di toglier più cose dall’interrupt.
Ma il riduttore si ferma prima di arrivare al giro prestabilito.(anche se il serial monitor mi segna 75/76/77 impulsi).

int encoder0PinA=  2;
const int motorPin =9;
volatile unsigned int encoder0Pos = 0;
unsigned int tmp=0;

void setup() { 

pinMode(motorPin, OUTPUT);
  pinMode(encoder0PinA, INPUT); 
  digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
  digitalWrite(motorPin, LOW); 

  attachInterrupt(0, doEncoder, RISING);  // encoder pin on interrupt 0 - pin 2
  Serial.begin (115200);
 

} 

void loop(){

  while(tmp < 75)
{ 
  
  digitalWrite(motorPin, HIGH); 
  tmp=encoder0Pos;
  Serial.println (tmp, DEC);


} 
digitalWrite(motorPin, LOW); 
}
void doEncoder() {
 

    encoder0Pos++;
    
   

  

  
}

Se faccio girare il motore a mano ,quindi non tento di comandarlo con arduino.
L’encoder (che forse è più una conta impulsi perchè ha solo tre fili : uno per Vcc ,uno per Gnd,e uno per il segnale)
funziona bene, cioè ad ogni giro mi conta 75 impulsi.
Ed utilizzo questo codice:

int encoder0PinA=  2;


volatile unsigned int encoder0Pos = 0;

void setup() { 


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

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

} 

void loop(){

}

void doEncoder() {
  
  if (digitalRead(encoder0PinA) == HIGH) {
    encoder0Pos++;
    Serial.println (encoder0Pos, DEC);
  } else {
  Serial.println ("STOP");
  }

  
}

Attendo vostre risposte, grazie della disponibilità,scusate per le domande forse un po’ banali.