Arduino può leggere segnali sinusoidali con variazione di frequenza?

droidprova: In effetti è vero il - ha dato problemi. Eliminato l'IDE ha compilato senza problemi.

a me da ancore l' errore

sketch_mar08a.ino:20:29: error: too many decimal points in number

Ciao Uwe

Si si infatti ho corretto il codice eliminando il meno e i puntini nella cifra del fattore della moltiplicazione, dopo di che l'IDE ha compilato senza errori.

Quando ti chiedevo, e mi scuso se ti sei sentito offeso, se il codice fosse sbagliato o meno, non mi riferivo alla sintassi, ma al metodo che ho scelto x risolvere il quesito.

Cioè alla formula e all'uso del pulsein.

Mentre posto, cerco di imparare, sto leggendo un libro. Per cui non chiedo la pappa pronta, ma un aiuto, se puoi, nel imboccarmi verso la strada giusta.

Grazie

gpb01: @droidprova: Ti rammento che il cross-posting è proibito dal regolamento e tu stavi discutendo di questo argomento già in questo thread ... ... dato che uwe ti ha risposto NON ho chiuso il thread ed è stato fatto un "merge", ma in futuro, cortesemente, evita di aprire più thread relativi allo stesso argomento. Grazie.

Guglielmo

Scusami Guglielmo, pensavo che i codici si discutessero nella sezione dedicata.

Farò tesoro del consiglio.

Grazie

leggi questo: http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-frequency-counter-library/

potrebbe esserti utile! Io ho seguito questa guida e il contatore è preciso e semplice da costruire (io ho usato il circuito con il bjt). Nel tuo caso un problema piu' grosso è costituito dall'alimentazione: la batteria dello scooter è a 12 V esatto?

Ho letto, è molto interessante, ma qui si cambia metodo, non si legge il periodo (pulsein) ma direttamente la frequenza grazie ad una libreria.

Tu da dove hai prelevato il segnale? Dalla candela avvolgendo delle spire, o dal puck-up lato BT?

Grazie

Ciao,scusami ma mi sono spiegato male: ho usato questo metodo prelevando il segnale da un generatore di funzioni! Non ho quindi calcolato la frequenza dei giri di una vespa o di un motore! Rileggendo dietro,comunque dovresti prelevare il segnale dal pick up. Bisogna vedere però la tensione massima raggiunta da tale segnale in modo da costruire un circuito di preamplificazione adeguato.

Ragazzi complice la bella giornata, oggi, ho approfittato per fare manutenzione al mio scooter ed ho colto l’occasione per fare altre prove utili al mio progetto.

Come ricorderete, ho in mente di prelevare il segnale subito a valle del pick-up del motore e attraverso un comparatore far leggere e decifrare tale segnale ad Arduino allo scopo di mostrare su un display il numero dei giri.

Fin’ora mi ero concentrato solo su Arduino sia lato sw che hw tralasciando gli aspetti più pratici.

Ho costruito sulla breabord il circuito comparatore che trovate qualche post in alto, ed collegato tutto ad arduino il quale attraverso la funz. pulsein avrebbe dovuto leggere il numero di giri. Fallimento totale. Non rileva nulla. Ho misurato col tester e ho rilevato che in uscita al pick-up ho un segnale molto piccolo che oscilla tra 0.4 a 0.9 V. Lo sketch è corretto e i cablaggi sono giusti in quanto usando un altro Arduino Uno come generatore di segnale, la funz. pulsein va alla grande. Per cui l’inghippo penso sia sulla qualità del segnale che prelevo. Forse ho bisogno di amplificarlo prima di mandarlo al comparatore? Che ne pensate?

Grazie

Il tester non può rilevare la forma e il corretto valore di picco del segnale perchè effettua un integrale del segnale, quindi è corretto che segni poco, hai bisogno di un oscilloscopio

Capisco, però resta il fatto che Arduino non riesce a rilevare il segnale. A banco funzia e in campo no...

Se può aiutare aggiungo un'altra prova che ho fatto. Tempo fa ho costruito un circuito contagiri a 10 led con un LM2917N (8 pin) e un L3914. Bene anche questo circuito a banco funziona (usando Arduino come generatore di segnale) e a bordo dello scooter no.

Grazie

Riflettevo, volendo usare un OP-AMP per ampilificare il mio segnale, so che questi componenti funzionano con alimentazione duale, specie se bisogna amplificare un segnale sinusoidale. Però, visto che comunque devo squadrare e raddrizzare il segnale con un comparatore, per darlo in pasto ad Arduino, se usassi lo stesso un OP-AMP con l'alimentazione della moto otterrei in uscita un segnale amplificato della sola componente positiva, vero?

Ciao, l'operazionale può anche funzionare a tensione singola e gli crei poi il riferimento con due resistenze, ma non ti conviene stare a fare troppe prove "a lume di candela": prova a cercare lo stadio di ingresso di un contagiri e collegarlo ad arduino..... purtoppo senza oscilloscopio rischi di provare e riprovare senza venire a capo di nulla. Questo ad esempio potrebbe essere un buono spunto: http://s7.postimg.org/9egopyhzv/sparklpe8.jpg

Mi sa tanto di Nuova Elettronica :)

Stefano

Buongiorno a tutti,

dopo la batosta registrata in seguito al tentativo (fallito) di prelevare e condizionare il segnale direttamente dal pick-up, ho tentato un'altra strada (attinta qui sul forum). In pratica avvolgendo uno spezzone di filo attorno al cavo della candela:

|500x375

filtrando e amplificando il segnale con questo circuito:

collegando il tutto così:

|500x375

e usando questo programma:

int pin = 7;
unsigned long durationhigh;
unsigned long durationlow;
unsigned long durationgiro;
unsigned long giri;

void setup()
{
  pinMode(pin, INPUT);
  Serial.begin(9600);
}

void loop()
{
  durationhigh = pulseIn(pin, HIGH);
durationlow = pulseIn(pin, LOW);
durationgiro=durationhigh+durationlow;
  giri = 60000000/durationgiro;
  Serial.print(giri);
  Serial.print("\n");
  
}

finalmente Arduino legge il segnale. Ma qualcosa non mi torna. Perchè a motore in moto e provando ad accelerare, Arduino giustamente stampa dei numeri che crescono e poi se spengo invece che stampare zero mi stampa un numero grandissimo e apparentemente senza senso?

Allego uno screenshot della stampa seriale in questione:

|500x266

Mi date una dritta?

Grazie 1000

Presumibilmente il problema sta nel fatto che non azzeri mai la variabile durationgiro e le pulsein avranno comunque un valore (che penso sia lunghissimo quando non c’è segnale).
Secondo me dovresti condizionare il calcolo e la stampa dei giri al fatto che durationhigh abbia un minimo di valore reale, altrimenti salti la riga e non stampi nulla.

forse ho capito, cioè ad esempio con un if potrei dire che quando pulsein è = 0 non stampare nulla. Che ne dici?

sì è un tentativo possibile, magari manda sulla seriale anche i valori di pulsein per vedere come si comporta a motore spento.

altrimenti tu come avresti fatto?

no no mi sono spiegato male, l'if è esattamente ciò a cui pensavo, però non so che valori dà la pulsein "a vuoto" e quindi io prima li verificherei e poi inserirei un if settato correttamente, tutto qui.

A vuoto per cui in assenza di segnale elettrico, quindi nel caso del contagiri a motore spento, la pulsein da sempre e solo questo valore: 4294967295 (in loop).

grazie

Allora semplicemente crei una if con la quale effettui il conteggio dei giri solo se la pulsein ha un valore inferiore a 4000000000

Oppure puoi fare una cosa più elegante, vedi che range di valori ti dà la pulsein al minimo ed al massimo dei giri e poi inserisci una if con la quale NON calcoli i giri al di sotto e al di sopra di tale range, ovviamente considera tranquillamente circa un 20% di tolleranza (p.es. se hai 6000 e 120000 prevedi 4500 e 150000)

Scusa Michele, quando dici di non far calcolare i giri sopra a 4000000000 oppure entro un range x–>y tu intendi semplicemente non far stampare il risultato, vero? o esiste qualche altro comando?

no perchè con questo codice

void loop()
{
  durationhigh = pulseIn(pin, HIGH);
  durationlow = pulseIn(pin, LOW);
  durationgiro=durationhigh+durationlow;
  giri = 60000000/durationgiro;
  if (giri < 4000000000){ 
  Serial.print(giri);
  Serial.print("\n");                                 
  }
}

appena non c’è più il segnale sul pin, Arduino stampa sempre il numero 4294967295