Drehzahlmesser mit Reed Kontakt und Multi Function Shield

Das Multi Function Shield, das ich ja bereits vorgestellt habe und das mittlerweile ja auch um einen Drehgeber erweitert wurde, bietet mit der Möglichkeit zur einfachen Anzeige von Daten auf seinem 4-fach-7-Segment-Display und den freien Anschlusspins eine gute Grundlage, Sensoren ausprobieren.

Heute geht es um Reed Kontakte / Sensoren. Davon finden sich gleich zwei Bauteile in meiner 37-in-one-Sensoren-Bulk-Sammlung.

Hardware: Reed-Sensoren


Reed Sensoren sind kleine, meist in Glas eingeschmolzene Metallstreifen, die sich verbiegen, wenn ein Magnet in dessen Nähe gebracht wird und so die beiden Anschlussenden kurzschließen.

Die einfachste Bauform ist die rechts auf dem Foto: ein einfacher Reed-Kontakt, den man so für kleines Geld bekommt.

Dann gibt es das KY-021 Mini Magnet Reed Modul (auf dem Foto in der Mitte), welches so ein Reed Kontakt auf einer Platine verlötet hat und die drei Anschlüsse (von oben nach unten, Vorderseite oben, Pins rechts): zwischen +5V und Signal ist zudem ein 10 kΩ Widerstand verbaut. Das Signal geht auf HIGH, sobald der Reed Kontakt geschlossen wird, sprich ein Magnet in dessen Nähe gebracht wird.

Zu guter Letzt gibt es noch das KY-025 Reed Modul (im Bild links), welches zusätzlich noch einen analogen Ausgang bietet. Der Analog-Ausgang liefert kleine Werte bei Kontakt bis hin zu 0 bei Kurzschluss / Berührung. Mit einem Potentiometer soll die Empfindlichkeit eingestellt werden können, ab welcher der digitale Ausgang geschaltet werden soll. Rechtsherum gedreht, wird die Empfindlichkeit erhöht, links herum verringert. Eine LED zeigt gleichzeitig die Durchschaltung des Digitalausganges an.

Die Anschlussbelegung des KY-025 ist (von oben nach unten, Vorderseite oben, Pins rechts): Einen Mehrwert habe ich nicht feststellen können. Der ausgelesene Analogwert war entweder Null oder irgendetwas zwischen 1020 und 1023. Wo soll auch ein abgestufter Wert herkommen? Schließlich ist das aktive Bauteil ein Reed-Schalter, der entweder durchschaltet (0) oder eben nicht (1023). So ganz erschließt sich mir deshalb die Sinnhaftigkeit dieses Moduls nicht.

Fidget Spinner mit Multimeter

Dieser Versuchsaufbau benötigt keinen Arduino. Es reicht ein Multimeter, dass über eine Durchgangsprüf-Funktion verfügt, also bei Kurzschluss piept; und dies möglichst flink.

Der Reed-Kontakt wird einfach an das Multimeter angeschlossen. Immer wenn der Reed durchschaltet - also wenn ein Magnet in die Nähe gebracht wird, wird ein Signalton ertönen.

Ich habe einen Magneten in ein Loch von einem Fidget Spinner gepresst. Jedesmal wenn dieser gedreht wird und der Magnet am Reed Kontakt vorbeigeführt wird, sollte es piepen.



Wie wir sehen, funktioniert das sehr gut. Wir müssen nur auf die richtige Position des Reed-Kontaktes bzw. Magneten achten, damit keine doppelten Töne entstehen. Auch wenn wir den Fidget-Spinner ordentlich anschubsen, bekommt der Reed-Kontakt das noch mit. Die Kontaktzeiten dürfen also kürzer sein, denn der Reed-Kontakt ist ziemlich flink.

Fidget Spinner mit Arduino

Nun möchte ich den Arduino zum Einsatz bringen und die Zeiten zwischen den Signalen vom Reed-Kontakt messen, um so die Zeit pro voller Umdrehung zu messen und daraus die Umdrehungsgeschwidigkeit in Umdrehungen pro Minute auszurechnen.

Der Reed-Kontakt wird über Female-To-Male-Dupnt-Kabel und Krokodilklemmen an die beiden Ende des Reed-Sensors angeschlossen und an GND und Pin 5 des Multi Function Shield.

Mit dem weiter unten beschriebenen Programm komme ich zu folgendem Ergebnis:



Hier ein weiteres Video von dem Versuchsaufbau mit schnellerem Fidget-Spinner

Den Fidget Spinner bringen wir auf gut 1100 UPM und da kommt der Reed-Kontakt noch gut mit, kann also die Zustände "Magnet da" und "Magnet weg" auseinanderhalten.

Source-Code

Hier der Source-Code für den Umdrehungsmesser:

//////////////////////////////////////////////////////// // (C) 2018 by Oliver Kuhlemann // // Bei Verwendung freue ich mich über Namensnennung, // // Quellenangabe und Verlinkung // // Quelle: http://cool-web.de/arduino/ // //////////////////////////////////////////////////////// #include <TimerOne.h> // für Timings und Interrupts #include <MultiFuncShield.h> // API für das Multi Function Shield #define PinData 5 // wo ist Data angeschlossen? void setup() { Timer1.initialize(); MFS.initialize(&Timer1); // initialize multi-function shield library pinMode (PinData, INPUT_PULLUP); } void loop() { MFS.beep(1, 5, 2); // bereit long mic=0; long micBef=micros(); long micDelta=0; byte stateBef=HIGH; byte state=HIGH; float upm=0; while (1) { state=digitalRead(PinData); // Pin 5 == low (Kurschluss) -> piepen, Beeper ist Pin 3 digitalWrite(3, state); MFS.writeLeds(LED_1, !state); // wenn Statusänderung if (state != stateBef) { // Zählbeginn, wenn Flanke auf LOW (=geschlossen) wechselt if (state == LOW) { mic=micros(); micDelta=mic-micBef; micBef=mic; upm=1./(micDelta/1000000.)*60.; MFS.write( (int) upm); } } stateBef=state; } } Um immer verlässliche Werte am Signaleingang zu haben, aktiviere ich den Pullup-Widerstand an Input-Pin 5. Wenn der Reed-Kontakt also schließt, wird der Eingang LOW und ist normalerweise HIGH.

Für die Signaltöne ist die MFS-API zu langsam, also schreibe ich direkt auf Pin 3, um Pieptöne auszugeben. Und auch auf einen Delay zwischen den Loop-Durchgängen verzichte ich, um einen möglichst genauen und hohen UPM-Wert möglich zu machen.

Festplatte mit Arduino

Erstaunt, wie flink der Reed-Kontakt doch bisher ist, wo er doch zum Teil aus mechanischen Komponenten besteht, habe ich mich an etwas noch schnelleres gewagt, die Messung der Drehzahl einer Festplatte. Ob er da auch noch mithält?



Ich war von 5400 UPM ausgegangen, was ich so als allgemeine Umdrehungsgeschwindigkeiten für Festplatte im Hinterkopf hatte. Doch die Caviar hat schon ein paar Jährchen auf dem Buckel, sonst hätte ich sie auch nicht durch aufschrauben zerstört. Auf die 341 Megabyte, die sie hat, kann ich grad so eben verzichten.

In Wahrheit hat die 2340 (nicht "3240" wie im Video, sorry) aber 3322 UPM laut Datenblatt. Das passt gut zu den von mir gemessenen 3329 UPM, womit auch gleichzeitig bewiesen wäre, dass mein Programm anständig misst.

Hier noch einmal das Datenblatt der angestaubten Festplatte zum Vergleich:

Hard Drive: WESTERN DIGITAL: AC-2340 341MB 3.5"/SL IDE / AT A C - 2 3 4 0 WESTERN DIGITAL NO MORE PRODUCED Native| Translation ------+-----+-----+----- Form 3.5"/SLIMLINE Cylinders 2233| 1010| | Capacity form/unform 341/ MB Heads 4| 12| | Seek time / track 13.0/ 4.0 ms Sector/track | 55| | Controller IDE / AT Precompensation Cache/Buffer 64 KB Landing Zone Data transfer rate 1.250 MB/S int Bytes/Sector 512 5.750 MB/S ext Recording method RLL 1/7 operating | non-operating -------------+-------------- Supply voltage 5/12 V Temperature *C 5 55 | -40 60 Power: sleep 0.3 W Humidity % 8 80 | 5 95 standby 0.3 W Altitude km -0.305 3.048| -0.305 12.200 idle 1.5 W Shock g 10 | 70 seek W Rotation RPM 3322 read/write 3.0 W Acoustic dBA 36 spin-up 12.0 W ECC Bit REED SOLOMON MTBF h 250000 Warranty Month 24 Lift/Lock/Park YES Certificates CSA,SDA,FCC,IEC950,TUV,UL1950
Ich bin positiv überrascht, dass der Read Switch auch eine Frequenz von 3300 UPM (55 Hertz) schafft. Ich hatte da bisher immer mehr den Einsatzzweck Fenstersicherung für Alarmanlagen vor Augen, wo es ja nun gar nicht auf Schnelligkeit ankommt, sondern mehr auf das Prinzip "Magnet weg -> Alarm auslösen".

Bisher dachte ich, für schnellere Wechsel / höhere Frequenzen bräuchte ich einen Hall Sensor (wird Thema eines der nächsten Blogs sein) und bin erfreut, für die allermeisten Anwendungen den günstigen Reed-Kontakt nutzen zu können.

Die Schließ- und Öffnungszeiten von einem gewöhnlichen Reedschalter liegen bei je rund 100 Mikrosekunden. Ein kompletter Schaltvorgang dauert also etwa 200 µs, d. h. ein Reed sollte etwa 5000 Schaltvorgänge pro Sekunde verarbeiten können, was einen Drehzahl von 300'000 UPM entspricht. Das sollte für die allermeisten Fälle reichen.