Buona sera,
Sto costruendo un orologio in legno pilotato da:
2 Ruote forate: 1° con 60 fori a 6 gradi ( fa da conteggio ), 2° con 1 foro ( fa da reset)
Arduino Mega
Motore passo-passo Nema 17 200 steps 1.8°
Motor/Stepper/Servo Shield
2 Photo Interrupter Sensori
RTC-DS3231
Display
ho un "piccolo" problema con il conteggio della ruota a 60 fori, se lo eseguo velocemente il conteggio è giusto, mentre se lo eseguo a velocità che dovrebbe funzionare mi conteggia non 60 ma 64/65, quindi mi dà risultati sbagliati, ho notato che in certi fori conteggia 2 volte e non 1, sto usando degli ingranaggi 3 a 1 per avere 600 step/giro minuto per un angolo di 6° al secondo. Cosa posso fare? Grazie in anticipo
// Pin assegnati a gli interrupts
#define ResetPin 18
#define CountPin 19
// Variabile all'interno del gestore interrupts
volatile int PosizioneLanc;
void setup() {
///// Imposta e inializza pin digitali /////
pinMode(ResetPin, OUTPUT);
pinMode(CountPin, OUTPUT);
digitalWrite(ResetPin, HIGH);
digitalWrite(CountPin, HIGH);
///// Gestori di interruzioni //////
attachInterrupt(digitalPinToInterrupt(ResetPin),PositionReset,RISING);
attachInterrupt(digitalPinToInterrupt(CountPin),PositionAdvance,RISING);
}
void loop() {
// put your main code here, to run repeatedly:
}
// Reset del conteggio quando
void PositionReset()
{
PosizioneLanc = 0;
//Serial.print("Reset: ");
//Serial.println(PosizioneLanc);
}
///// Conteggio dell'avanzamento /////
void PositionAdvance()
{
PosizioneLanc ++;
//Serial.println("Avanzamento: ");
//Serial.println(PosizioneLanc);
}
Posso solo darti una risposta sincera ma che non Ti aiuterá.
non so che problema hai.
Potrebbe essere che il motore passopasso oscilli un po e percui qualche buco viene contato doppio, oppure potrebbe essere qualcosa di quello che non hai fatto vedere o che non hai detto.
Nella funzione di interrupt non puoi usare Serial.print.
Ciao Uwe
Ciao Uwe, grazie per aver risposto.
Perché non posso usare serial.print? Nel monitor seriale vedo i passaggi su i fori e controllo visivamente, come ho scritto prima, ho notato che su alcuni fori conteggia 2 volte anziché 1 e lo riscontro sul monitor oltre al led sul interrupter.
Lo sketch che ho fatto di sicuro ha degli errori, scusatemi ma sono all'inizio( è il primo che faccio, guardando video e leggendo parecchi forum, sono riuscito a compilarlo), funziona tutto tranne questo piccolo particolare del conteggio.
... per un'infinità di motivi, ma fondamentalmente perché una ISR DEVE essere la più breve possibile (... set di qualche flag, incremento di qualche contatore e basta) e, fondamentalmente, perché in una ISR gli interrupt sono disabilitati e quindi, tutto quello che basa il funzionamento sugli interrupt, NON funziona ad esempio, in una ISR, non funziona delay(), millis(), ecc. ecc.
Semplicemente nella ISR ti segni, ad esempio con una flag, che devi visualizzare qualche cosa (nel modo che ritieni più semplice) e nel loop() controlli se tale flag è attiva; se SI, visualizzi i dati, ma fuori della ISR
Ricorda comunque che tutte le operazioni di scrittura (seriale, LCD, ecc.) sono LENTE e rallentano l'esecuzione del programma.