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 è
Ciao,
essendo il tuo primo post, ti chiederei cortesemente di presentartiQUI (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.
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.
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).
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.