Conteggio segnali photo interrupter

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.

sketch_apr05a.ino (8.96 KB)

mgrb74:
Perché non posso usare serial.print?

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

Guglielmo

Ok grazie Guglielmo! E per verificare il funzionamento come potrei fare? Passandolo sul Display Lcd o e la stessa cosa?

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 :slight_smile:

Ricorda comunque che tutte le operazioni di scrittura (seriale, LCD, ecc.) sono LENTE e rallentano l'esecuzione del programma.

Guglielmo

Ok! grazie... ci provo :smiley: