Problema con PulseIn

Ciao a tutti.

Sto costruendo un contagiri a led per la mia moto e quindi devo usare pulseIn.
Ho preso questo codice dal sito di esempio:

int pin = 7;
unsigned long duration;

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

void loop()
{
  duration = pulseIn(pin, HIGH);
  Serial.println(duration);
}

Per provarlo l'ho caricato su Arduino e a mano con un cavetto ho fornito i 5v al piedino 7, anche con una frequenza di 2/3 volte al secondo.

Il problema è che nella seriale la scheda mi restituisce costantemente il valore 0.
E' forse un problema della scheda? E' normale? E' un problema di codice?

Grazie a quelli che mi vorranno aiutare :slight_smile:

Cosa dovresti leggere dal pin 7?

Devo contare degli impulsi in un determinato lasso di tempo, a questo serve pulsein :slight_smile:

Sbagliato
Pulsein restituisce la durata di un impulso
Per risalire a rpm devi sapere a quanto quell’impulso corrisponde sul giro
Quindi
Cosa devi misurare? :grin:

Il tempo :sweat_smile:

Ma anche così non dovrebbe restituirmi comunque i microsecondi passati tra un impulso (che do io manualmente) e l'altro?

si ma avresti un dato di cui poi non ti fai nulla praticamente...
ti conviene per esempio contare quante volte va da low a high (o viceversa) in un secondo (supponendo che tu abbia un impulso ogni giro) e moltiplicare per 60 ottenendo rpm (impulsi al secondo *60)

per vedere se hai un problema di hardware metti una resistenza di pulldown tra il pin 7 e gnd da 1k
dopo prova a dare gli impulsi e se il codice va dovresti leggere i tempi

Con la resistenza ha iniziato a darmi valori.

Così ho pensato come avrei potuto avere i giri al minuto e mi sono inventato questo codice:

int pin = 7;
unsigned long duration;
unsigned long giri;

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

void loop()
{
  duration = pulseIn(pin, HIGH);
  giri = 60000/duration;
  Serial.print(giri);
  Serial.print("\n");
  
}

La logica è che i giri al minuto si ottengono dividento 60 secondi per gli intervalli di tempo dati da pulsein.

Posso chiedeLe un parere sul codice? :grin:

ma non mi dare del lei che sono troppo piccolo ahah

il rpblema è proprio che quel codice te lo sei inventato ahaha
la logica è sbagliata
come ti dicevo la durata dell’impulso è inutile se non sai a “quanto giro” corrisponde quell’impulso

metti caso che il tuo impulso dura mezzo diro
puoi fare
duratagiro=duration*2
rpm=60000000/duratagiro

attenzione che pulsein da un valore in micros e non in millis quindi un secondo sarà 60.000.000 micros

di conseguenza ti risuggersico di contare QUANTI IMPULSI hai in un secondo moltiplicando per 60 ottenendo rpm (supponendo un impulso al giro)
puoi farlo tramite interrupt e non ti interessa la durata dell’impulso ma solo la frequenza

con che genere di sensore intendi acquisire l’impulso dalla moto??

Sono piú grande ma dammi neanca a me del Lei.

Non neccessariamente serve misurare il numero di impulsi al secndo. puoi misurare anche il periodo dela alternata che ricevi dal sennsore dei giri. Ovviamente devi sapere quanti impulsi fa per un giro intero.

Il Tuo codice misura il tempo del impulso positivo dell'onda. Devi misurare anche la durata della parte LOW perché il periodo dell'oscillazione é la loro somma.
Ciao Uwe

vero anche così funziona
bloocchi il codice per tutto il giro che misuri però

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");
  
}

stefanolavori:
Sto costruendo un contagiri a led per la mia moto e quindi devo usare pulseIn.

La tua affermazione non è completamente corretta.
Puoi calcolare i giri anche con altri metodi che non blocchino l'elaborazione del micro.

Esempio --> Arduino Playground - ReadingRPM
oppure --> Arduino Tachometer - Software | PyroElectro - News, Projects & Tutorials
o anche --> precise RPM counter - micros()/interrupt/serial problem? - Science and Measurement - Arduino Forum

Scusate l'attesa e grazie infinite dell'aiuto :smiley:

PaoloP:

stefanolavori:
Sto costruendo un contagiri a led per la mia moto e quindi devo usare pulseIn.

La tua affermazione non è completamente corretta.
Puoi calcolare i giri anche con altri metodi che non blocchino l'elaborazione del micro.

Esempio --> Arduino Playground - ReadingRPM
oppure --> Arduino Tachometer - Software | PyroElectro - News, Projects & Tutorials
o anche --> precise RPM counter - micros()/interrupt/serial problem? - Science and Measurement - Arduino Forum

Interessantissimo, ora guardo tutti i link :slight_smile:

Essenzialmente a me non interessa che si blocchi il micro. Infatti deve solo accendere un tot di led in base ai giri del motore.

Per prelevare l'impulso ho due possibilità. La prima è quella del cavo avvolto attorno al cavo della candela che va ad Arduino dopo una resistenza.
Per la seconda, ho visto che sul volano c'è un magnete esterno che ad ogni giro passa davanti ad un sensore. Pensavo che potrei prelevare l'impulso da lì, ma non so se la corrente che dà quel sensore potrebbe bruciare arduino.
Che ne pensate?

Grazie ancora dell'aiuto :*

Penso che puoi misurare con un tester la tensione di lavoro del sensore.

Oggi vado in negozio a pregare di prestarmi un tester :grin:

:astonished:

Se sei appassionato di elettronica & Arduino, un minimo di strumentazione dovresti averla... e un buon tester è già il minimo indispensabile.
Comunque sarà difficile misurarla a motore acceso, l'impulso potrebbe essere troppo breve perché il tester riesca a visualizzare la tensione corretta.
Controlla se c'è qualche sigla sul sensore, oppure vedi se è collegato direttamente all'impianto 12V del motore.

A 17 anni purtoppo non posso permettermi sia la passione della moto sia quella dell'elettronica, devo decidermi :).

Ora controllo sul sensore e faccio qualche foto XD.

Allora, questo è il volano che funge anche da rotore.
Come potete vedere c'è un magnete sulla campana del volano che passa sopra un sensore. Questo dovrebbe ricevere gli impulsi e "consegnarli" alla centralina.
Mi rendo conto che le foto contano poco. Cercherò di misurare col tester la tensione XD

Edit:

Uploaded with ImageShack.us

quel genere di pick up quasi sicuramente genera tensioni molto alte (sopra i 50/60 volt)
quindi occhio all'arduino perchè lo fotti che è un piacere :slight_smile:
prendi il segnale dal filo della candela, è più semplice e più sicuro

dopo quando sono a casa ti metto uno schema del circuitino per farlo

EDIT

vedo che ha un husky eh :slight_smile:
125??

cmq questo schema l'ho trovato qualche tempo fa su internet e funziona
L1 è il filo avvolto intorno al cavo candela
una decina di spire vanno bene (io avevo usato un filo recuperato da un trasformatore da circa mezzo millimetro di sezione mi sembra)

Yep, Huskyno, 125 :grin:

Se mi dici che il circuito va bene me lo costruisco a breve. Mi mancano un paio di componenti come il transistor ed il condensatore. Spero di trovarli in zona :sweat_smile:.

Se posso chiederti, il circuito cosa fa di preciso? perchè non posso mettere un cavo attorno alla pipetta con una resistenza che va direttamente all'arduino?

Grazie :grin:

Amplifica la debolissima corrente indotta dalla scintilla in un bel segnale forte
Il transistor.lo trovi anche dentro qualche radio o roba simile e anche il c
E uno di quelli a disco.con scritto 104 sopra