Progetto cronometro per kart

Un saluto a tutti.

Sto realizzando un cronometro per dei kart prendendo spunto da quelli attualmente in commercio esempio Alfano, che sfruttano le bande magnetiche presenti sulle piste. Possono essercene 1 o 2 o 3 a seconda della pista.
Ho utilizzato quindi un Arduino Nano 5v, un display Hitaci (16x2) e un sensore reed (provato sia con ampolla diretta o ampolla su supporto come quello dei sensori di allarme) collegato come INPUT_PULLUP tra pin 3 e GND. Il risultato finale è quello in foto allegata (è solo un prototipo quindi va sicuramente migliorato :P). Facendo dei test in casa con una calamita tutto ok, il sistema conteggia 2 bande magnetiche (sono 2 nella pista in cui vado di solito) e al passaggio della seconda tiene il tempo visualizzato sul display, se questo è anche il miglior tempo della sessione lo scrive sulla seconda riga, fin qui tutto ok, funziona alla perfezione.

Il problema nasce quando l'ho testato direttamente in pista sul kart. Passando il kart (anche con motore in moto) sulle bande il sistema funziona perfettamente, anche in un giro è andato bene, mentre nel resto delle prove sia passando a bassa velocità che alta velocità il sistema sembra impazzisca, ovvero segna tipo 190 giri oppure il timer non va avanti ma oscilla tra 0.2 e 0.3 secondi senza proseguire o azzerarsi.

Ho quindi pensato fosse un problema di vibrazioni, ma mi pare strano che in certi passaggi i giri rimanessero a 0 quando il timer non proseguiva.

La domanda che mi pongo è se possano essere delle masse sul telaio (il filo del sensore è stato fascettato sul telaio) oppure un problema di alimentazione, ho utilizzato una battery pack usb, oppure qualcos'altro...

Qualche suggerimento?

Grazieee :slight_smile:

Di seguito anche il codice, sicuramente è da migliorare, ma almeno su banco funziona bene

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <neotimer.h>

Neotimer mytimer = Neotimer(10000); // 10 second timer

LiquidCrystal_I2C lcd(0x3F,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

#define REEDPIN 3
#define LEDPIN  13
#define DEBOUNCE 2000
#define MAX_SECTORS 2



volatile int newlap = 0;
volatile long reedready;
long lasttime = 0;
long besttime = 0;
long curtime = 0;
long laptime = 0;
int  sectors;
int  cursector;
int  lastsector;
int  curlap;
int  state;


void setup()
{
  lcd.init();                      // initialize the lcd 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.print("Scuderia xxxxx");
  lcd.setCursor(0,1);
  lcd.print("READY TO GO!");
  pinMode(REEDPIN , INPUT_PULLUP);
  pinMode(LEDPIN, OUTPUT);
  digitalWrite(LEDPIN,HIGH);
  delay(1000);
  digitalWrite(LEDPIN,LOW);
  
  delay(2000);
  lcd.clear();
  lcd.print("LAP:0");
  Serial.begin(9600);  

  sectors  = MAX_SECTORS;
//  attachInterrupt(0, magnet_detect, RISING);//Initialize the intterrupt pin (Arduino digital pin 2)
}



 
void loop()
{

  
  for (int i=0; i <= 1024; i++) {
    
    if (digitalRead(REEDPIN)==0) {

      if( millis() > reedready + DEBOUNCE){
        
        if (--sectors == 0) {
          newlap++;
          sectors = MAX_SECTORS;
          curtime = millis();
         
          lasttime = (curtime - lasttime);
          display_last(lasttime);
          if (lasttime < besttime || besttime == 0)
            besttime = lasttime;
          display_best(besttime);
          lasttime = curtime;
          laptime = 1;
          mytimer.start();
         
        }
        reedready = millis();
        digitalWrite(LEDPIN,HIGH);
        
        break;
      } 
      else {
        reedready = millis();
      }
    }
  } 

  if (laptime==0)  {
    display();
  }
  if (mytimer.done()) {
    laptime = 0;
  }

  
}

void last_time() {
  
}
void display_last(long time) {
  char buff[16]; 
  lcd.setCursor(0,0);
  lcd.print("LAST:  ");
  lcd.print(ftime(time,buff)); 
}
void display_best(long time) {
  char buff[16]; 
  lcd.setCursor(0,1);
  lcd.print("BEST:  ");
  lcd.print(ftime(time,buff));
}

void display() {
  char buff[16]; 
  lcd.setCursor(0,0);
  lcd.print("LAP:");
  lcd.setCursor(4,0);
  lcd.print(newlap);

  lcd.setCursor(7,0);
  lcd.print(ftime( (millis()-curtime) ,buff));
  
  
}


char* ftime(long time, char* buf) {
  
  unsigned int m,s,ms;
  //time=time%3600000;
  ms=(time % 1000);
  
  m=(time/60000L);
  s=(time/1000L);
  if (m>0) s=s-(60*m);
  
  sprintf(buf, "%2u.%02d.%03u",m,s,ms); 
  return(buf);   
}

Riesco ad immaginare un paio di motivi, il piu probabile dei quali e' che tu non abbia messo i necessari filtri sugli ingressi, quindi i disturbi del motore e delle spazzole vengono letti come impulsi multipli ... (sarebbe sempre meglio allegare uno schema elettrico completo, e non semplicemente una foto del display ;))

Poi personalmente userei fotodiodi, piu veloci e quasi esenti da disturbi ...

Puoi provare a isolare il difetto, cominciando dal reed. Carica sull'Arduino un programma semplicissimo che conteggia SOLTANTO le chiusure del reed, fai qualche giro e guarda cosa segna il contatore.

Da questa prova puoi capire se l'inconveniente è dovuto ANCHE all'ampolla reed.

Ciao,
P.

Ringrazio per le risposte.

pgiagno:
Puoi provare a isolare il difetto, cominciando dal reed. Carica sull'Arduino un programma semplicissimo che conteggia SOLTANTO le chiusure del reed, fai qualche giro e guarda cosa segna il contatore.

Da questa prova puoi capire se l'inconveniente è dovuto ANCHE all'ampolla reed.

Ciao,
P.

Proverò cominciando da questa soluzione, anche se il contatore di chiusura del reed c'è (sarebbe proprio il conteggio dei passaggi sulla banda magnetica) e come dicevo ogni tanto dava valori tipo 190 in un unico giro.

Etemenanki:
Riesco ad immaginare un paio di motivi, il piu probabile dei quali e' che tu non abbia messo i necessari filtri sugli ingressi, quindi i disturbi del motore e delle spazzole vengono letti come impulsi multipli ... (sarebbe sempre meglio allegare uno schema elettrico completo, e non semplicemente una foto del display ;))

Poi personalmente userei fotodiodi, piu veloci e quasi esenti da disturbi ...

Non ho un vero e proprio schema elettrico, diciamo che non saprei come realizzarlo :stuck_out_tongue: Comunque come dicevo il reed è collegato direttamente al pin 3 e massa. Il display invece usa i pin SDL SCA +5v GND di Arduino. Non c'è altro. C'è collegato solo uno step-up perché avevo in mente di usare una batteria LIPO da 3.7V, ma non l'ho usata alla fine. Cosa intendi per collegare dei fotodiodi? Al posto del reed?

cesco:
... il reed è collegato direttamente al pin 3 e massa.

Appunto ... supponendo che tu usi la pullup interna, quindi non hai una resistenza esterna fra il pin e VCC, prova a mettere un condensatore da 47nanofarad o valore simile (massimo 100n) fra il pin e massa, ed una resistenza da pochi ohm (fra 47 e 100 ohm massimi) in serie al reed(cioe' fra il reed ed il pin), e vedere se la cosa migliora ... condensatore e resistenza sarebbe megli oche fossero il piu vicino possibile ad arduino, cosi filtrano anche i possibili disturbi captati dal cavo ...

Per usare i fotodiodi intendevo proprio sostituire il reed con un traguardo fatto con un fotodiodo ed un led IR, con relativi componenti, perche' il reed, per quanto sia un tipo di contatto molto veloce, e' pur sempre meccanico, quindi a velocita' molto alte potrebbe non riuscire a scattare correttamente ... ma li devi vedere tu se scatta o no al masimo della velocita', per ora prova con la rete RC di debounce e vediamo se migliora il problema ...

Il display invece usa i pin SDL SCA +5v GND di Arduino. Non c'è altro. C'è collegato solo uno step-up perché avevo in mente di usare una batteria LIPO da 3.7V, ma non l'ho usata alla fine. Cosa intendi per collegare dei fotodiodi? Al posto del reed?
[/quote]

Mi scuso per la risposta ritardata ma sono riuscito a provarlo solo oggi.
Ho messo un condensatore ceramico da 100n (avevo solo quello in casa) e una resistenza da 89 ohm. Sembra funzioni molto meglio, nel senso che non ho più il timer che si resetta più volte, tutto funziona più regolare, solo che adesso sembra che non rilevi sempre la banda magnetica... può essere che la resistenza abbia "attenuato" la sensibilità del reed ? (scusate i termini poco tecnici)

La soluzione con infrarosso non la userei perché mi imporrebbe di mettere a inizio sessione un trasmettitore a bordo pista, cosa un po' scomoda e non so se funzionerebbe bene in caso di 2 kart affiancati.

La banda magnetica (che poi possono essercene anche 2 o 3 dipende dalla pista) è in tutti i principali circuiti e anche i cronometri professionali usano lo stesso sistema, con ampolla reed.

Io ho 2 versioni di ampolle, una più grossa e una più piccola, secondo te qual'è la più sensibile?

Grazie in anticipo per la risposta.

Etemenanki:
Appunto ... supponendo che tu usi la pullup interna, quindi non hai una resistenza esterna fra il pin e VCC, prova a mettere un condensatore da 47nanofarad o valore simile (massimo 100n) fra il pin e massa, ed una resistenza da pochi ohm (fra 47 e 100 ohm massimi) in serie al reed(cioe' fra il reed ed il pin), e vedere se la cosa migliora ... condensatore e resistenza sarebbe megli oche fossero il piu vicino possibile ad arduino, cosi filtrano anche i possibili disturbi captati dal cavo ...

Per usare i fotodiodi intendevo proprio sostituire il reed con un traguardo fatto con un fotodiodo ed un led IR, con relativi componenti, perche' il reed, per quanto sia un tipo di contatto molto veloce, e' pur sempre meccanico, quindi a velocita' molto alte potrebbe non riuscire a scattare correttamente ... ma li devi vedere tu se scatta o no al masimo della velocita', per ora prova con la rete RC di debounce e vediamo se migliora il problema ...

Il display invece usa i pin SDL SCA +5v GND di Arduino. Non c'è altro. C'è collegato solo uno step-up perché avevo in mente di usare una batteria LIPO da 3.7V, ma non l'ho usata alla fine. Cosa intendi per collegare dei fotodiodi? Al posto del reed?

cesco:
... solo che adesso sembra che non rilevi sempre la banda magnetica...

Potrebbe essere l'impulso troppo stretto, che con 100n si attenua troppo ... prova 47n o valori simili ... solo che piu si riduce il valore, maggiore e' la possibilita' che riaumentino i disturbi ...

L'unico tipo di sensore magnetico piu veloce del reed, ed abbastanza economico, e' un sensore di Hall, ma bisognerebbe sapere com'e' la banda magnetica (poli ed orientamento, oltre che possibilmente l'intensita' ...)

A proposito, hai qualche immagine di come hai fissato i reed ? ... magari influisce anche quello ...

Purtroppo non ho scattato foto comunque è messo perpendicolare rispetto alla banda magnetica, messo in verticale mentre la banda naturalmente è orizzontale. E' fissato sul pianale del kart che è in alluminio. anche se l'ho fissato sul bordo del pianale (quelli professionali sono fissati nel centro del pianale nella stessa posizione).
Ho pensato di utilizzare un sensore hall (l'ho anche acquistato per quello) ma dalle prove che ho fatto sul tavolo sembra avere meno "sensibilità".

Ti faccio una domanda probabilmente stupida, il condensatore non fa lo stesso effetto di un debounce lato software ? Attualmente l'ho impostato a 1000ms

Etemenanki:
Potrebbe essere l'impulso troppo stretto, che con 100n si attenua troppo ... prova 47n o valori simili ... solo che piu si riduce il valore, maggiore e' la possibilita' che riaumentino i disturbi ...

L'unico tipo di sensore magnetico piu veloce del reed, ed abbastanza economico, e' un sensore di Hall, ma bisognerebbe sapere com'e' la banda magnetica (poli ed orientamento, oltre che possibilmente l'intensita' ...)

A proposito, hai qualche immagine di come hai fissato i reed ? ... magari influisce anche quello ...

Se usi il condensatore, il debounce software andrebbe eliminato ... e si, serve come debounce e per filtrare gli eventuali disturbi raccolti dai cavi ...

Ok intanto ti ringrazio proverò come dici tu.

Nel frattempo ho trovato anche questo progettino http://www.forumgsxr.com/forum/construction-d-un-bipfano-un-alfano-a-30-t4614.html.

L'idea di mettere più reed in varie posizioni potrebbe essere interessante, anche se li si parla di moto che potrebbe avere un'inclinazione diversa sul traguardo. Ho notato che nel progetto mettono la resistenza in serie con il condensatore tra PIN e massa... che differenza c'è ?

La prossima settimana, meteo permettendo, faccio ulteriori prove e scrivo i risultati... speriamo.

Etemenanki:
Se usi il condensatore, il debounce software andrebbe eliminato ... e si, serve come debounce e per filtrare gli eventuali disturbi raccolti dai cavi ...

Praticamente, ha messo una serie RC in parallelo ai contatti ... personalmente preferisco il classico debounce, ma potrebbe funzionare anche in quel modo ... ed i reed sono semplicemente collegati in parallelo, del tipo "se non scatta uno, magari scatta un'altro" ... praticamente solo per aumentare le possibilita' di rilevare il magnete ...

Poi quello che conta di piu e' la distanza fra i reed ed il magnete, e la polarita' del magnete stesso ... il reed chiude molto meglio se i due poli sono ai due lati dell'ampolla, oppure se non e' possibile, se un solo lato del reed e' rivolto verso un polo del magnete ... e dato che il campo si attenua con il quadrato della distanza, anche riuscire ad avvicinarlo di poco potrebbe aumentare le probabilita' di scatto di molto ... inoltre nessuno ti impedisce di saldare insieme 2 o 3 reed in parallelo, per la stessa ragione che hanno usato loro (piu probabilita' che se uno non scatta, scatti l'altro) ...

A proposito dei reed e dell'orientamento del magnete ...

Grazie delle info, l'idea di mettere più reed in parallelo potrebbe aiutare, il reed è posizionato a circa 3-4 cm da terra, sopra un pianale in alluminio. L'ho posizionato come in figura qui sotto, nella direzione di marcia. La banda magnetica è Nord Sud in linea con il sensore.

Ho trovato un link dove un tipo ha riparato un sensore professionale, alla fine è un semplice reed http://www.kartbook.net/forum/topics/alfano-magnetic-track-pickup-sensor-repair

Il cavo che utilizzo attualmente è un cavo a 2 fili, meglio usare un cavo tipo antenna tv con maglia esterna ?

Etemenanki:
Praticamente, ha messo una serie RC in parallelo ai contatti ... personalmente preferisco il classico debounce, ma potrebbe funzionare anche in quel modo ... ed i reed sono semplicemente collegati in parallelo, del tipo "se non scatta uno, magari scatta un'altro" ... praticamente solo per aumentare le possibilita' di rilevare il magnete ...

Poi quello che conta di piu e' la distanza fra i reed ed il magnete, e la polarita' del magnete stesso ... il reed chiude molto meglio se i due poli sono ai due lati dell'ampolla, oppure se non e' possibile, se un solo lato del reed e' rivolto verso un polo del magnete ... e dato che il campo si attenua con il quadrato della distanza, anche riuscire ad avvicinarlo di poco potrebbe aumentare le probabilita' di scatto di molto ... inoltre nessuno ti impedisce di saldare insieme 2 o 3 reed in parallelo, per la stessa ragione che hanno usato loro (piu probabilita' che se uno non scatta, scatti l'altro) ...

A proposito dei reed e dell'orientamento del magnete ...

Se lo usi che chiude verso massa, con la calza del cavo schermato collegata a massa. un cavo schermato va meglio (uno qualunque, non necessariamente da antenna) ... il pianale di alluminio potrebbe ridurre la sensibilita', se si potesse montarlo sotto invece che sopra sarebbe meglio ... ma bisogna vedere quanto spazio c'e' sotto, e se rischia di essere "grattuggiato via" dal contatto con l'asfalto in caso di abbassamento del telaio ... tutte cose da provare ...

Il fatto che lo montino in quel modo e che i poli del magnete siano messi cosi ... se fosse troppo sensibile potrebbe causare due o tre chiusure velocissime ... ma tutto dipende dall'intensita' del campo, non sapendolo bisogna andare per tentativi ...

REGOLAMENTO, punto 16.9 ... NON si riaprono thread più vecchi di 9/12 mesi!.

Chi ha qualche cosa da dire, apre un nuovo thread ed, eventualmente, come riferimento, mette un link al vecchio thread.

Come da regolamento ... post accodati a vecchi thread verrano cancellati senza alcun preavviso e, con l'occasione, il vecchio thread verrà bloccato.

Guglielmo