Drehzahlmessung mit Hallsensor H501

Hallo zusammen,

ich steh mal wieder vor einem Problerm.
Ich möchte mit dem o. a. unipolaren Hallsensor die Drehzahl eines Verbrennungsmotors erfassen. Dazu komt auf die Welle ein kleiner Magnet ( oder 2 ).
Ich habe nun im Testaufbau versucht, die 'Schaltzustände' des Sensors auszuwerten. Leider kommt auf dem digitalen Pin des Arduino nix oder nix richtiges an.
Ich versuche einfach ein HIGH oder LOW zu erkennen.

Am Sensor sind die 5V und Ground vom Board angelegt. Den Ausgang habe ich an einem digitalen Pin des Arduino angeschlossen. Da tut sich nichts.
Auch das einlöten eines 4,7K Widerstandes ( hat mir jemand empfohlen ) zwischen 5V ( Plus ) und dem Ausgang brachte keine Änderung.
Schalten tut der Sensor, denn eine LED zwischen 5V ( Plus ) und dem Ausgang geht, wenn ich einen Magneten benutze.

Die Sensoren haben einen Open Collector Ausgang. Ein Widerstand ist daher zwingend nötig.

Was hast du denn für eine Spannung? Die LED war schon gut, aber du solltest mal mit einem Multimeter messen

Zeig uns doch mal deinen Sketch. So können wir nur raten.

nettworker:
Ich habe nun im Testaufbau versucht, die 'Schaltzustände' des Sensors auszuwerten. Leider kommt auf dem digitalen Pin des Arduino nix oder nix richtiges an.
Ich versuche einfach ein HIGH oder LOW zu erkennen.

Dein Hallsensor wird wohl nur auf einen Magnetpol reagieren. Also ggf. mal den "Nordpol" am Sensor vorbeiführen, wenn er beim Vorbeiführen des "Südpols" nicht schaltet.

Und er schaltet natürlich mit "Open-Collector Ausgang" gegen Masse durch. Da muss die (von Dir nicht gezeigte) Schaltung natürlich auch stimmen, und nicht nur der Sketch und der richtige Pol am Sensor.

Hallo,

laut Infos reagiert er auf den Südpol senkrecht am Besten.

Der Code dazu:
int hallPin=3;
int statePin=LOW;

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

void loop()
{
statePin=digitalRead(hallPin);
if (Serial.available())
{
if( statePin==HIGH)
{
Serial.println("North");
}
else if(statePin==LOW)
{
Serial.println("South");
}
}
delay(500);
}

Die Schaltung sieht so aus, das der V und Masse mit 5V und GND vom Arduino beschickt werden.
Der Ausgang ist mit PIN 3 vom Arduino verbunden.
Beim 2. Versuch habe ich zwischen V und Ausgang einen 4,7k Widerstand eingelötet.

Schalten tut der Hallsensor ja, denn wenn ich zwischen V und Ausgang eine LED anschliesse, wird die ja geschaltet.

Wieso machst du Serial.available()? Das fragt ab ob ein Zeichen empfangen wurde.

... und das Ergebnis bleibt >0, bis du genügend oft  Serial.read();  gemacht hast

Wieso das: if (Serial.available())

damit blockierst du doch deine Abfrage.

Hallo,

so nebenbei. Bitte setz den Code in Code Tags. Der Button oben links. Wird übersichtlicher. Danke.

damit blockierst du doch deine Abfrage.

Nö, nur die Anzeige "North" / "South", bis zur ersten Eingabe eines Zeichens über Serial.
Danach wird alle 500 ms einmal gemessen und angezeigt.

P.S.
Schöner wäre, Beginn und Ende eines Signals anzuzeigen, und das ggfls. öfters (aber meistens seltener) als alle halbe Sekunde :wink:

"North" / "South" finde ich übrigens auch Unsinn, statt
"Magnet erkannt" / "kein Magnet richtig rum in der Nähe"

nettworker:
delay(500);

Also einmal in einer halben Sekunde liest Du den Zustand aus und gibst ihn auf Serial aus, und zwischendurch wird der Sketch immer für eine halbe Sekunde blockiert.

Mal angenommen, der Sensor wäre nun immer eine halbe Sekunde HIGH und eine halbe Sekunde LOW, dann würdest Du immer abwechselnd HIGH und LOW angezeigt bekommen.

Aber wenn der Sensor beispielsweise immer eine Viertelsekunde HIGH und eine Viertelsekunde LOW wäre, dann würdest Du nach jeweils einer halben Sekunde immer exakt wieder denselben Zustand haben und anzeigen wie eine halbe Sekunde vorher.

Was soll denn der Quatsch?

Warum blockierst Du den laufenden Sketch ständig für eine halbe Sekunde?

Und warum wertest Du nicht die Zustandswechsel aus, also wenn das Signal von HIGH auf LOW wechselt und umgekehrt?

michael_x:
Nö, nur die Anzeige "North" / "South", bis zur ersten Eingabe eines Zeichens über Serial.
Danach wird alle 500 ms einmal gemessen und angezeigt.

Solange kein Zeichen über Serial reinkommt, wird die Abfrage " if( statePin==HIGH)" nicht ausgeführt (blockiert).
Evtl. falsch ausgedrückt.

Hallo,

probiere das mal, müllt auch nicht den seriellen Monitor zu.

int hallPin=3;
byte statePin=LOW;
byte statePin_old=LOW;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  statePin = digitalRead(hallPin);
  
  if(statePin!= statePin_old)  {
    if(statePin == HIGH)  {
      Serial.println("HIGH");
    }  
    else  {
      Serial.println("LOW");  
    } 
  statePin_old = statePin;
  }
  
}

Eieieiei, da hab ich ja wieder nen Bock geschossen, wieder einfach was an Code kopiert ( aus einem ähnlichen Post ) ohne genau hinzuschaun und nachzuvollziehen. Echt dämlich.....

Stimmt das, das der Sensor nen Open Collector Ausgang hat, der zwingend einen Lastwiderstand zwischen 5V(+) und dem Ausgang benötigt? Wäre schön, wenn die Hardware keine Probleme machen würde.
Hab mir gestern schon bei der Messerei mit dem Multimeter und dem sonstigen Probieren 2 Arduinos abgeschossen. Vermutlich nen kurzen mit den Messspitzen am Sensor verursacht.

nettworker:
Stimmt das, das der Sensor nen Open Collector Ausgang hat, der zwingend einen Lastwiderstand zwischen 5V(+) und dem Ausgang benötigt? Wäre schön, wenn die Hardware keine Probleme machen würde.

Ja, das ist bei denen üblich. Egal welchen Typ man genau hat

Wieso schaust du nicht ins Datenblatt:
http://www.produktinfo.conrad.com/datenblaetter/175000-199999/185120-da-01-de-UNIPOLARER_HALLSCHALTER_H501.pdf
Sogar ausnahmsweise mal auf Deutsch. Auf Seite 2 wird es ganz deutlich

Hab mir gestern schon bei der Messerei mit dem Multimeter und dem sonstigen Probieren 2 Arduinos abgeschossen.

Lass den Arduino erst mal weg. Nur Sensor + Multimeter. Aber sowie es aussieht liegt dein Problem ja eher an der Software als der Hardware

Serenifly:
Wieso schaust du nicht ins Datenblatt:
Sogar ausnahmsweise mal auf Deutsch. Auf Seite 2 wird es ganz deutlich

Hab ich gesehen, ich war mir nur nicht sicher, ob der Widerstand wegen der LED drin war oder ob der generell da rein gehört.

Auf die Schnelle mal gezeichnet, hatte grad nix anderes :slight_smile:

Wichtiger ist das linke Bild. Da siehst du die übliche Anordnung: Messelement -> Schmitt-Trigger -> Transistor

Danke, aber das sind für mich böhmische Dörfer.....

Ich bin im Coden ( in anderen Programmiersprachen ) einigermassen bewandert, deshalb ärgert mich ja auch der blöde Fehle im Code. Aber bei den Elektronikgeschichten brauch ich halt immer etwas Hilfe....

Hab ich gesehen, ich war mir nur nicht sicher, ob der Widerstand wegen der LED drin war oder ob der generell da rein gehört.

Eigentlich generell. ( 280 Ohm bis 1k, damit die LED ein paar mA Strom kriegt. Nur zum Messen auch größer )

Geht aber stattdessen auch mit internem Input-Pullup (entspricht ca. 30k, da leuchtet dann keine LED)

// Einfach Sensor Ausgang an Pin 3 legen
void setup() {
   Serial.begin(9600);
   pinMode(3, INPUT_PULLUP);
}
void loop() {
   static bool oldstate; 
   bool state = digitalRead(3);
   if (oldstate != state) {
      oldstate = state;
      Serial.println(state? "HIGH" : "LOW"); // je nach state "HIGH" oder "LOW" ausgeben
   }
}

P.S.
Mit Mess-Spitzen sollte man eigentlich keinen Arduino kaputtkriegen, mit Kurzschlüssen, 5V oder mehr an den falschen Stellen evtl. schon. Aber ohne OUTPUT Pins und mit nur 5V auch eher seltsam ...