Reading the HX711 from MicroPython

Einleitung

Es gibt ein paar MicroPython-Treiber für den HX711. @RalfL hat bei GitHub - walterheisenberg/hivewatch_esp32 bereits den kanonischen Treiber von David Gerber und Robert Hammelrath ausgewählt. Dem schließen wir uns an.

Pycom Forum

MicroPython Forum

Treiber

Also interesting:

1 Like

2 posts were merged into an existing topic: Reading the HX711 using SPI

Zwischenbericht

Mit dem ursprünglich von David Gerber und Robert Hammelrath stammenden MicroPython-Treiber [1] und den Erweiterungen von Ralf Lindlein [2] haben wir nun gute Erfahrungen gemacht, nachdem wir in manchen Bereichen noch ein wenig nachgelegt haben [3] und den Auslesevorgang nur vornehmen, während der Garbage-Collector vorher abgeschaltet wurde [4].


  1. hiveeyes-micropython-firmware/hx711.py at 3b978cb2f4bf05385c749f3eb26e72df48792d12 · hiveeyes/hiveeyes-micropython-firmware · GitHub ↩︎

  2. hiveeyes-micropython-firmware/hx711_heisenberg.py at 3b978cb2f4bf05385c749f3eb26e72df48792d12 · hiveeyes/hiveeyes-micropython-firmware · GitHub ↩︎

  3. disable_irq()/enable_irq() nun auch bei power_up() und power_down() ↩︎

  4. hiveeyes-micropython-firmware/datalogger.py at 3b978cb2f4bf05385c749f3eb26e72df48792d12 · hiveeyes/hiveeyes-micropython-firmware · GitHub ↩︎

1 Like

A post was merged into an existing topic: Ausreißer bei den Gewichtswerten

Kann man den Kanal B aus dem HX711 mit uPy auslesen? Irgendwie habe ich da aktuell nix gefunden, nur so ein altes Projekt:

Um meine Frage zu beantworten: ja, kann man. Setzt man den Gain auf 128 oder 64 wird Kanal A gelesen, bei Gain 32 Kanal B. Im Terkin ist das aber (noch) nicht drin (das Setzen des Gain aber schon).

Ich hab gerade auch ein wenig mit dem Clock Signal und wie das produziert wird rumgespielt. Nicht viel dabei herausgekommen, außer das man das disable_irq() weglassen kann. Das Signal ist immer (zumindest bei meinen Messungen) 15,6us lang - ob mit oder ohne IRQ. Also falls das Abschalten des IRQs zu irgendwelchen Problem führen sollte, könnte man es hier weg lassen.

Ausprobiert haben wir es soweit ich weiß hauptsächlich deshalb nicht, da er durch den geringeren Verstärkungsfaktor ungenauer ist.

Probiert habe ich allerdings schon 3 Hx711 an einem WiPy. Das läuft auf Terkin Datalogger Firmware aus dem Stand Problemlos.

3 Likes

Ich hab die Unterstützung für Kanal B im Terkin drin. Das funktioniert auch schon ‘in echt’. Ich hab mir nur noch nicht angeschaut, wie die Daten in Grafana ankommen.
Zu sehen hier:

Hintergrund ist, das ich zwei Waagen jwd installieren will. Ich benutze den Beelogger Waagentyp mit zwei Zellen pro Waage und will nur 1 MCU verwenden. 4 HX711 wären mir dann einfach zu viel und die Genauigkeit wird nicht ins unbenutzbare sinken.

P.S.: wenn wir eine Sammelbestellung von >50€ bei Digikey zusammen bekommen, dann häng ich mich auch in den NAU7802 rein. Die Schnittstelle zum HX711 geht mir nämlich ziemlich auf den Keks.

2 Likes

Super würde mich bei einer Sammelbestellung beteiligen. Für 50€ müssten wir 31 Stück NAU7802KGI abnehmen. 5 bis max. 10 Stück würde ich nehmen.

1 Like

Wenn man die Lese-Routinen der HX711-Bibliothek für Arduino bei [1] mit der MicroPython-Implementierung bei [2] vergleicht, fällt auf, dass bei ersterer erst gelesen wird und dann erst channel und gain für die nächste Lesung gesetzt werden, während bei zweiterer scheinbar beides auf einmal passiert.


Siehe auch:


  1. HX711/HX711.cpp at 0.7.4 · bogde/HX711 · GitHub ↩︎

  2. hx711-lopy/hx711.py at 9cc6de8d878abfe3be6a3fb43e4b341f816a4952 · geda/hx711-lopy · GitHub ↩︎

Kleine Präzisierung: die Einstellung des Gains bestimmt den Kanal. Bischen seltsam aber ist halt so. Gain 128 & 64 = Kanal A. Gain 32 = Kanal B.

Was tatsächlich etwas seltsam an der uPy Implementierung ist, das der Gain mit einem read() gesetzt wird (und damit mit jedem read() auch der Gain nochmal). Nicht optimal, funktioniert aber.

In der Beschreibung des C++ Treibers steht auch nochmal explizit drin, wie wichtig es ist, das Schreiben des Clock Signals vor Interrupts zu schützen. Ich ziehe daher meine Bemerkung zurück, das disableirq() unnütz ist (nehme ich auch noch aus dem PR raus).