Come misuro l'RPM di una ruota?


15

Sto cercando di creare un sistema di bordo per la mia bici usando un Arduino o forse le schede Lilypad.

Penso che dovrei usare un sensore ad effetto Hall, ma anche qualsiasi alternativa è buona.

Voglio trasmettere la mia velocità a un display LCD e mi chiedo il modo migliore per farlo.

Risposte:


12

Usare un sensore ad effetto hall come suggerito da Starliner sarà un modo per interfacciarsi con la ruota. Il suggerimento di Achim e Shutterdrone di usare un interruttore reed ha tuttavia più senso, dato l'hardware di supporto che un sensore ad effetto hall richiede per ottenere un segnale digitale pulito.

Potresti essere in grado di prelevare un magnete e un sensore da un ciclocomputer rotto, ma se non puoi, un negozio di componenti locale dovrebbe avere uno di ciascuno in stock. Il vantaggio di un sensore e un magnete riciclati è che avrai già l'hardware di montaggio.

C'è una pagina sul wiki di Arduino su ReadingRPM segnali di . Per calcolare la velocità, moltiplicare il valore RPM per la circonferenza della ruota (raggio 2 * pi * [in metri]). Il risultato sarà in metri al minuto.

Modifica: ho notato che il codice collegato è per sistemi con due impulsi per giro. Un magnete è sufficiente per il tuo compito. Inoltre, per un ciclocomputer probabilmente vorrai che il risultato sia in KPH (o MPH se vivi da qualche parte che pensa ancora che sia civilizzato). Ho apportato alcune modifiche (non testate) al codice sul wiki per stampare KPH e incollarle qui sotto.

volatile byte revolutions;

unsigned int rpmilli;
float speed;


unsigned long timeold;

void setup()
{
  Serial.begin(9600);
  attachInterrupt(0, rpm_fun, RISING);

  revolutions = 0;
  rpmilli = 0;
  timeold = 0;
}

void loop()
{
  if (revolutions >= 20) { 
    //Update RPM every 20 counts, increase this for better RPM resolution,
    //decrease for faster update

    // calculate the revolutions per milli(second)
    **rpmilli = (millis() - timeold)/revolutions;** EDIT: it should be revolutions/(millis()-timeold)

    timeold = millis();
    **rpmcount = 0;** (EDIT: revolutions = 0;)

    // WHEELCIRC = 2 * PI * radius (in meters)
    // speed = rpmilli * WHEELCIRC * "milliseconds per hour" / "meters per kilometer"

    // simplify the equation to reduce the number of floating point operations
    // speed = rpmilli * WHEELCIRC * 3600000 / 1000
    // speed = rpmilli * WHEELCIRC * 3600

    speed = rpmilli * WHEELCIRC * 3600;

    Serial.print("RPM:");
    Serial.print(rpmilli * 60000,DEC);
    Serial.print(" Speed:");
    Serial.print(speed,DEC);
    Serial.println(" kph");
  }
}

void rpm_fun()
{
  revolutions++;
}

Inoltre, ho abilitato 'wiki della community' su questo, che penso significhi che altri utenti possono modificarlo. Se la mia matematica è sbagliata (e puoi dimostrarlo!), Saltaci dentro e risolvilo per me. :)


10

In realtà, Achim ha fatto un'ottima osservazione qui.

C'è una grande differenza tra un relè Reed (magnetico) (interruttore) e un sensore ad effetto Hall.

Principalmente, un relè Reed collegherà un interruttore ogni volta che una forza magnetica sufficiente agisce su di esso, dandoti un segnale on / off. Un sensore ad effetto Hall fornisce un livello di tensione che indica quanta forza magnetica viene applicata ad esso.

Il codice mostrato sopra funzionerebbe solo "direttamente" con un relè Reed, il che non significa che non funzionerà affatto per un sensore ad effetto hall, ma che fornirebbe ulteriori sfide usando un sensore ad effetto hall.

La sfida principale sarà che stai trattando un dispositivo analogico come uno digitale, aspettandoti di innescare al sorgere di un impulso. Ora, il segnale non sarà pulsato - sarà generalmente come una curva a campana, con tutti i tipi di fluttuazioni. Potresti inciampare oltre la minima tensione per un segnale alto (circa 3,5 V, IIRC?) Più volte mentre il magnete passa attraverso il sensore ad effetto hall.

Ovviamente, il nostro primo istinto quando si usa qualcosa come un sensore ad effetto hall è usare l'ADC e leggere il livello di tensione su un pin analogico. Tuttavia, hai un limite di 10.000 letture, all'incirca, al secondo su un pin analogico (ogni lettura richiede 100 uS). Ciò presuppone anche che tutto ciò che fai sia ciclo e leggere valori - non ti lascia molto altro tempo per aggiornare un display, calcolare, ecc. Per non parlare del fatto che, se leggi nel momento sbagliato, hai perso il segnale!

Sono sicuro che è possibile utilizzare gli interrupt in qualche modo collegati all'ADC, ma non ho tale conoscenza a portata di mano.

Invece, se si desidera utilizzare un sensore a effetto Hall reale , suggerirei di inserirlo in un trigger Schmitt per convertirlo in un segnale digitale (on / off) a un livello calibrato che indica "direttamente sotto il magnete". Inoltre, a seconda del livello di isteresi implementato nel trigger di Schmitt, potrebbe essere necessario eseguire un de-rimbalzo che cambierebbe la velocità di de-rimbalzo in base alla velocità corrente. Quindi potresti trattarlo come un normale relè Reed.

! c


1
Puoi ottenere il meglio da entrambi i mondi. I componenti ATMega8 possono essere configurati per fornire l'accesso al comparatore interno. Con un riferimento di tensione adatto (regolabile, ad esempio, un trimpot), è possibile avere interruzioni sul fronte di salita (o discesa o entrambi) del segnale analogico. link all'argomento del forum che spiega proprio questo: arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1163394545
SingleNegationElimination

Esistono dispositivi ad effetto hall con uscita a soglia innescata da schmitt. Sono abbastanza comuni. Inoltre, con un interruttore reed, dovrai comunque rimandare l'output.
Connor Wolf,

7

I sensori ad effetto hall e gli interruttori reed sono i più citati qui e sono la soluzione migliore.

L' interruttore reed sarà più economico, ma potrebbe darti falsi impulsi quando la bici subisce una scarica. Se questo è solo uno dei passaggi del marciapiede, il software potrebbe facilmente filtrarlo, ma è diverso quando si pedala su ciottoli, il che può darti falsi impulsi in ogni momento. Interruttori reed più resistenti agli urti richiedono un campo magnetico più forte per l'attivazione, ma un magnete al neodimio lo risolverà.



77

L' interruttore dell'effetto Hall non presenta questi svantaggi, ma è leggermente più costoso.


T

v=πDT

DT

S=conteggio delle pulsazioni×π×D

D


5

Un magnete può essere montato sul bordo del cerchione della ruota e il sensore ad effetto Hall è montato molto vicino (ma senza contatto) al magnete. Quando la ruota gira e il magnete passa attraverso il sensore, il sensore rileva la variazione del campo magnetico.


3

Se vuoi ancora passare allo stato solido, sono molti "interruttori ad effetto Hall" che includono il sensore di effetto Hall e il trigger Schmitt con isteresi per fornire un'uscita digitale pulita senza rimbalzo. Commutano ogni volta che viene raggiunta una certa densità di flusso di soglia (fornita nella scheda tecnica). Puoi calcolare una buona combinazione di magnete e interruttore o semplicemente sperimentare.

Questo sito ti dirà molto di più.


2

Le parti nei ciclocomputer sono contatti reed non sensori ad effetto hall. Sono completamente diversi. Ma penso che tutti voi parliate dei contatti con la canna.


1

Il magnete può essere montato su un raggio e il sensore su una delle tue forcelle o sul fodero orizzontale.

Anziché moltiplicare per pi ecc., Il metodo suggerito dal mio ultimo computer per bici era misurare la distanza lineare di un giro (gesso sulla gomma, misurare tra i due segni di gesso), quindi è possibile moltiplicare i giri per la circonferenza diretta.

[EDIT] Ho appena trovato questa guida sul sito del ciclista per l'implementazione di un ciclocomputer utilizzando un PIC, forse alcune delle informazioni potrebbero esserti utili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.