Fahrrad-Computer (Hallsensor auslesen)

Hallo zusammen..

In Kombination mit einem OLED versuche ich mir einen Fahrrad-Computer zusammenzubasteln. Mittlerweile bin ich soweit, dass ich den Timer, der die Fahrzeit angibt programmiert habe und ich die Positionen der einzelnen Infos auf dem Display angeordnet habe..
Nun versuche ich mithilfe eines Hallsensors die Geschwindigkeit zu bestimmen.
Das Problem ist hier, dass der Hallsensor beim vorbeiführen eines Magnetes nicht einen Wert, sondern gleich unzählige Werte liefert. Dementsprechend habe ich Komplikationen bei meinen if-Abfragen.
Da ich ein delay() vermeiden möchte, habe ich mit millis() experimentiert - allerdings ohne richtigen Erfolg.
Hat jemand schon Erfahrungen mit diesem Problem gemacht oder eine Idee dieses zu lösen ?

Über eine Rückmeldung wäre ich dankbar:)

Gruß
Reuter328

Es gibt viele digitale Hallsensoren.
z.B. A3144

Da ich ein delay() vermeiden möchte, habe ich mit millis() experimentiert - allerdings ohne richtigen Erfolg.
Hat jemand schon Erfahrungen

Ja!
Welche Probleme plagen dich?

reuter328:
Da ich ein delay() vermeiden möchte, habe ich mit millis() experimentiert - allerdings ohne richtigen Erfolg.

Wenn Du den Kontakt entprellen (was das Problem sein dürfte) möchtest, führt kaum ein Weg an delay() vorbei. Das ist meiner Erfahrung nach aber nicht problematisch, weil es dabei um sehr kurze Pausen geht.

Gruß

Gregor

Ist jetzt zwar keine direkte Antwort aber:
Manche “Bordcomputer” die mit einem Magneten die Rotation eines Rades detektieren (Fahrrad, Heimtrainer etc.) verwenden keinen Hallsensor, sondern einfach einen Reedkontakt. Das ist billiger und möglicherweise einfacher auszuwerten und scheint auch zu reichen.

Anregung: http://forum.arduino.cc/index.php?topic=415781.msg2872140#msg2872140

Hallo,

jetzt wird es spannend. Zeig mir mal den Hallsensor der prellen kann ... :slight_smile:

Doc_Arduino:
jetzt wird es spannend. Zeig mir mal den Hallsensor der prellen kann ... :slight_smile:

Ja, hmpf, dass es nicht um ein Reed-Relais sondern um einen Hallsensor geht, ist mir ganz kurz nach dem Posten meiner Antwort aufgefallen. Ich habe hier halt so ein Ding eines Fahrradcomputer herumliegen.

Gruß

Gregor

Hallo,

das war eher auf den TO bezogen. Aber gut ... :slight_smile:

Vielen Dank für die vielen Rückmeldungen!:slight_smile:

..habe gerade noch einmal an dem Sketch getüftelt.
glücklicherweise klappt zumindest schon einmal die Simulation mit zwei LEDs!:wink:

const int hallPin = 10;
const int ledPin =  12;

int hallState = 0;

unsigned long tasterZeit = 0;
int tasterGedrueckt = 0;
int e = 80;
int ledState = LOW;
int anz;
void setup() {

  pinMode(ledPin, OUTPUT);
  pinMode(11, OUTPUT);

  pinMode(hallPin, INPUT);
}

void loop() {

  hallState = digitalRead(hallPin);

  if (hallState == LOW)
  {
    tasterZeit = millis();
    tasterGedrueckt = 1;
  }

  if ((millis() - tasterZeit > e) && tasterGedrueckt == 1)
  {
    tasterGedrueckt = 0;
    anz++;

    if (anz % 2 == 0 && anz != 0)
    {
      digitalWrite(ledPin, HIGH);
    }
    else
    {
      digitalWrite(11, HIGH);
    }
  }
  digitalWrite(11, LOW);
  digitalWrite(ledPin, LOW);
}

Gibt es noch Verbesserungsvorschläge?
(bis jetzt hat es noch nicht viel mit einem Tacho o.ä. zu tun; die Grundidee müsste aber soweit passen..)

..als nächstes baue ich dann die Berechnungen für die Umdrehungen pro Zeit ein.

Gruß
Reuter328

reuter328:
Gibt es noch Verbesserungsvorschläge?

Nur einen ganz harmlosen: wenn Du die Abfrage des Status' des Hall-Sensors in das if schreibst, kannst Du Dir die Variable hallState sparen.

so:

if (digitalRead(hallPin)==LOW) ...

Gruß

Gregor

Hallo,

wenn ich du wäre würde ich dem Problem nachgehen.

reuter328:
Das Problem ist hier, dass der Hallsensor beim vorbeiführen eines Magnetes nicht einen Wert, sondern gleich unzählige Werte liefert.

combie hatte schon gefragt und ich auch. Welchen Hallsensor hast du?
Die können eigentlich nicht prellen oder wie du es beschreibst unzählige Werte liefern.
Oder haste doch “nur” einen Reedkontakt?
Die Frage sollte erstmal geklärt werden. Dann kannste den Code dafür schreiben.

@ gregorss: Stimmt, hätte ich auch selber drauf kommen können.. :wink:

@ Doc_Arduino: ich nutze folgenden Hallsensor: TLE 4905L: Hallsensor, digital, uni- - bipolar, 3,8 - 24 V bei reichelt elektronik

Dank und Gruß
Reuter328

Hallo,

TLE4905L, aha. Dazu kann ich ganz sicher sagen, dass Ding prellt nicht, kann nicht prellen und wird nie prellen. :slight_smile: Jetzt müßte man wissen, warum du beim Magneten vorbeiführen mehrere Impulse bekommst. Eine Vermutung wäre der mechanische Aufbau. Du mußt schon dicht vorbeigehen am TLE mit einem kleinen starken Magneten. Vielleicht zittert dein Magnet im Abstand gesehen im Hysteresebereich des TLE vorbei oder sowas ähnliches. Momentan kann ich mir dein "prellen" nicht erklären. Stützkondensatoren sind dran?

reuter328:
@ gregorss: Stimmt, hätte ich auch selber drauf kommen können.. :wink:

Ich wundere mich immer wieder darüber, was für Fehler sich in meinem Geschreibsel befinden. Manche Sachen bügelt das Hirn, das sich etwas ausgedacht hat, einfach weg. Deshalb frage ich immer ein paar andere Leute, ob sie sich meine Textereien an- und auf Fehler durchsehen könnten.

Man selbst sieht Fehler oder kleine Verbesserungsmöglichkeiten oft erst mit etwas zeitlichem Abstand.

Gruß

Gregor

@Doc_Arduino:
Mit Stützkondensatoren habe ich bis jetzt bei Hallsensoren noch keine Erfahrungen gemacht..
Welche Kapazität wäre denn sinnvoll?
Würde er zwischen Hallpin und Masse gesetzt werden?

Gruß
Reuter328

Hallo,

ein Tipp zu gleich. Nachdem man sich im weltweiten Internet irgendeine Schaltung angeschaut hat die einem gefällt, sollte man sich angewöhnen sich das Datenblatt dazu selbst anzuschauen. In 99,9% der Fälle sind darin Testschaltungen oder Applikation Schaltungen abgebildet die zu 100% funktionieren und bestimmte Mindestbeschaltungen beinhalten. In dem Fall Seite 13.
http://www.infineon.com/cms/de/product/sensor/magnetic-position-sensor/hall-switch/TLE4905L/productType.html?productType=db3a30441355314b0113624892b70052
Nimmste 2x Keramik wie abgebildet und als PullUp kannste gleich eine LED mit Vorwiderstand verwenden. Damit haste gleich eine optische Detektanzeige. Low Current LED (4mA) mit Vorwiderstand 750 Ohm für 5V.

@Doc_Arduino: Vielen Dank für den Tipp!
..nun funktioniert die Geschwindigkeitsanzeige einwandfrei!:slight_smile:

freut mich. :slight_smile:

Hi,
Finde den Code etwas umständlich, bzw unverständlich.

Hall Sensoren prellen nicht, das wurde hier schon erleutert.
Trotzdem "wartet" er 80ms, warum ?

Wäre es kein besserer Ansatz mit einem externen Interrupt zu arbeiten ?
z.b bei steigender Flanke eine variable hochzählen.

In der Loop mit den millis() eine Abfrage (z.b jede Sekunde) einbauen.
Dort die Variable auf 0 setzen. So hätte man die Impule/s

Oder andersrum die Zeit zwischen zwei Interrups messen, so hätte man die Zeit einer Periode.

Nur so eine Idee....

Hallo,

den Entprellcode wird er ja hoffentlich rausgenommen haben. :slight_smile:
Hab mal hin und her gerechnet. Wenn man annimmt, dass der Erfassungsbereich des Magneten 5mm beträgt,
dann dauert das vorbeihuschen der 5mm bei 60km/ an meinem 26" MTB kurze 300µs.
Demzufolge ist ein Interrupt wirklich notwendig. Guter Einwand rudirabbit.
Hatte wirklich noch gedacht das geht mit pollen. :slight_smile:

Dann weiß er ja was er zu tun hat. Außer er rollt mit 10km/h durch die Kante. :slight_smile: