Conta giri scooter

Ho in mente un progetto per il mio scooter... vorrei fare una strumentazione basata tutta su arduino... I sensori per la temperatura del motore e dell'acqua non ho avuto problemi a leggerli con e a riportare i loro valori sul LCD.

l'unico inghippo che ho trovato è stato il contagiri... quelli moderni vanno attaccati sulla candela e in base alla distanza di tempo tra una scintilla ed un'altra calcolano i giri. Come faccio con arduino a calcolare il tempo tra una scintilla ed un'altra per far calcolare i giri??

Grazie del vostro aiuto!!

prova a vedere con il multimetro la tensione d'uscita dell'alternatore uno dei fili che vanno alla bobina dell' at li ogni impulso è un giro....

albyy911: Ho in mente un progetto per il mio scooter... vorrei fare una strumentazione basata tutta su arduino... I sensori per la temperatura del motore e dell'acqua non ho avuto problemi a leggerli con e a riportare i loro valori sul LCD.

l'unico inghippo che ho trovato è stato il contagiri... quelli moderni vanno attaccati sulla candela e in base alla distanza di tempo tra una scintilla ed un'altra calcolano i giri. Come faccio con arduino a calcolare il tempo tra una scintilla ed un'altra per far calcolare i giri??

Grazie del vostro aiuto!!

..scusa ma non ho capito se hai problemi a "come rilevare la scintilla" oppure come calcolare i giri...

se fosse la seconda è banale: i giri sono definiti "giri al minuto", considerando che ad ogni scintilla della candela il pistone ha eseguito un giro, con arduino leggi le scintille in una tua base temporale e poi la multipli per raggiungere il minuto...

Ma il Tuo scooter ha un motore 4 tempi o 2 tempi? Ciao Uwe

presumo 2t : ) queste cose si fanno sugli scooter elaborati... ne so qualcosa:P

6/7 spire sul filo che va alla bobina, opampli, comparatore di tensione= segnale digitale. tari il tutto e via.

Piano ragazzi!! ho capito che avete capito il mio problema XD

Però non comprendo le soluzioni da voi poste... io ricevo nella mia scheda i dati ma come faccio ad interpretarli?? come faccio a calcolare il tempo tra un impulso ed un'altro?? Grazie delle risposte... come faccio a trovare la base temporale?? ci sono funzioni per calcolare il tempo??

millis(); cerca..

garinus: millis(); cerca..

ho provato a fare uno schetch ma usando mills mi da valori negativi!! che vuol dire??

ok penso di aver risolo!!

pensavo di attaccare un filo alla candela e mettere una resistenza da 500m/amp. Oppure sarebbe meglio un condesatore che fa passare la corrente quando c'è e buttare via quella in eccesso??.

Cmq datemi qualche consiglio anche perchè io vado avanti a tentativi XD.

ho scritto il seguente sketch di prova:

#define LED 13
#define SEN 7
int time = 0;
int val = 0;
int ptime = 0;
int calcolo = 0;
void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(SEN, INPUT);
}
void loop() {
  val = digitalRead(SEN);
  time = millis();
  
  if ( val == 500 ){
    
    calcolo = ptime - time;
    calcolo = abs(calcolo);
    Serial.println(calcolo);
    ptime = time;
    time = 0;
    delay(100);
  }

dove il sen 7 è dove arriva i dati per arduino!

led 13 ( è una cagata che ho scritto che neanche serve XD) e ptime sta per "valore del tempo precedente"

A me sembra che funzioni però ho alcuni dubbi... mills mi dava valori negativi xk??(e quindi ho messo tutto dentro al valore assoluto)

ho messo il delay perchè sto provando che un tasto e l'effetto bounch mi da problemi(quindi penso di toglierlo).

Cmq fatemi sapere non ho ancora provato niente...

Grazie di nuovo a tutti

millis() ti da numeri negativi per errori di overflow

se lavori con numeri con il segno, il primo bit se è a 1 vuol dire numero negativo. qualdo fai operazioni matematiche che superano il limite della variabile e modifichi quel bit (e nulla te lo impedisce/avvisa) ottieni risultati sballati.

Dato che perdi un bit, per lavorare solo con valori positivi la variabile si dischiara unsigned "tipo variabile"

Altro problema: la millis restituisce valori in unsigned long, quindi anche lavorando con usigned int hai errori di overflow (ovvero cerchi di salvare nell'int valori troppo grandi, e quindi si incasina il risultato)

Anche lavorando con le variabili unsigned long, devi fare attenzione: millis() può ritornare anche il valore massimo di unsigned long (dopo di che ritorna zero, altro particolare da gestire), quindi facendo operazioni matematiche come somma o sottrazione è facile andare in overflow. In particolare di solito dagli unsigned long si sottrae sempre il valore minore al maggiore, cos' si è sicuri di non aver un risultato che vada in overflow per risultato troppo grande o per risultato troppo piccolo (valori negativi)

comunque credo che più che millis() devi usare micros() (1000/4 volte più precisa, il /4 è dovuto dal fatto che millis() non aumenta di uno ma di 4 ogni volta)

e dato che perdere anche poche letture può dare risultati sfalsati, ti consiglio di usare gli interrupt. cerca nel reference attachInterrupt(), anche se per una versione beta puoi farne a meno (almeno per imparare come scrivere codice/avre qualcosa di funzionante)

Per la parte elettronica ti lascio nelle mani di qualcuno che la sa fare :)