【问题标题】:Interfacing Load Cell and HX711 with Raspberry Pi 3 using Python 3使用 Python 3 将称重传感器和 HX711 与 Raspberry Pi 3 连接
【发布时间】:2021-12-02 22:03:53
【问题描述】:

我目前正在从事一个物联网项目,我正在尝试将我的 Raspberry Pi 3 连接到 HX711,以便我可以读取来自 200 公斤范围的称重传感器的重量读数。

对于 Python 代码,我尝试了this Python library from github

根据这个存储库的描述,我首先使用 5 公斤的已知重量校准了 HX711 (calibration.py),给出了偏移量和比例。之后我将它们复制并在example_python3.py 中使用。

但我不断从称重传感器获得可变读数,如以下来自 Raspberry Pi 窗口的屏幕截图所示:

我通过放置 5 公斤负载来获得此输出。我尝试了这个校准循环并多次检查输出,但我的输出仍然是可变的。

这是我使用的代码:

import RPi.GPIO as GPIO
import time
import sys
from hx711 import HX711

# Force Python 3 ###########################################################

if sys.version_info[0] != 3:
    raise Exception("Python 3 is required.")

############################################################################
GPIO.setwarnings(False)

hx = HX711(5, 6)


def cleanAndExit():
    print("Cleaning...")
    GPIO.cleanup()
    print("Bye!")
    sys.exit()


def setup():
    """
    code run once
    """
    #Pasted Offset and Scale I got from calibration..
    hx.set_offset(8608276.3125)
    hx.set_scale(19.828315054835493)


def loop():
    """
    code run continuosly
    """
   
    try:

        val = hx.get_grams()
        print(val)
        hx.power_down()
        time.sleep(0.001)
        hx.power_up()


    except (KeyboardInterrupt, SystemExit):
        cleanAndExit()


##################################

if __name__ == "__main__":

    setup()
    while True:
        loop()

【问题讨论】:

标签: python raspberry-pi3 sensors


【解决方案1】:

很遗憾,我没有 HX711,因此无法测试您的代码。但我可以提供一些可能会有所帮助的建议。

  1. 我的主要问题是:为什么你的代码包含

    hx.power_down()
    time.sleep(0.001)
    hx.power_up()
    

    在循环中?根据datasheet,输出稳定时间(即从上电、复位、输入通道变化和增益变化到有效稳定输出数据的时间)为400 ms。所以如果每次读数后给HX711断电,每次读数都会不稳定!

  2. 此外,您预计读数之间的偏差有多大?您的值目前在大约 4990 和 5040 之间波动,相差 50,因此只有 1% 的差异。这还不错。不幸的是,HX711 的精度并没有在数据表中指定,所以我无法确定这是“正确”还是“错误”。但是,在假设有问题之前,您应该检查一下您可以期待什么。数据表提到输入失调漂移为 0.2 mV,而满量程差分输入电压(增益为 128)为 20 mV。那也是1%。 (这可能是巧合,但如果你想确定的话,你可能应该深入研究它。)

  3. 您是否检查了串行通信的时序?该代码只是在没有任何特定时序的情况下切换 IO 引脚,而数据表中提到 PD_SCK 必须为高电平至少 0.2 us 和最多 50 us。快速切换可能会导致读数不正确,而缓慢切换可能会导致设备复位(因为将 PD_SCK 保持高电平超过 60 us 会导致其进入断电模式)。例如,请参阅 this C implementation,其中包含对快速 CPU 的修复。您的 Python 库不包含此修复程序。

    不过,我不确定您将如何使用 Raspberry Pi 来执行此操作。如果您在 Raspberry Pi(或任何其他非实时平台)上可靠地工作,您似乎很幸运,因为如果您的代码在错误的时间中断,读取可能会失败(请参阅this comment例如)。

  4. 我在网上看过一些人的报道,称 HX711 需要“预热” 2-3 分钟,因此在那之后读数会变得更加稳定。

  5. 最后,问题也可能与硬件有关。似乎有很多低质量的板子。例如,this known design fault 可能是相关的。

注意: 另请注意,您的偏移量 (8,608,276.3125) 不正确。 HX711 返回一个 24 位 2 的补码值。这意味着介于 -8,388,607 和 +8,388,608 之间的值。你的价值超出了这个范围。您获得此值的原因是您使用的库没有正确考虑数据编码。见this discussion。已修复此问题的存储库有多个分支,例如this one。如果正确读取,该值将是 -8,168,939.6875。此错误不会影响准确性,但可能会导致某些权重的结果不正确。

对于所有认为精度是 24 位的人来说最后一点,因此它应该返回非常可靠的读数:精度与精度不同。仅仅因为设备返回 24 位并不意味着这些位是正确的。该值与实际值(实际重量)的接近程度取决于许多其他因素。请注意,您默认使用的库读取权重 16 次并对结果取平均值。如果设备如此准确,那根本就没有必要!

我的建议:

  • 从环路中移除电源(不过,您可能希望在设置中使用一次)。
  • 第一次读取前至少等待 400 毫秒。
  • 如果要使用完整范围,请修复 2 的补码逻辑的数据转换。
  • 不要期望设备精确到 24 位。
  • 如果您仍想提高读数的准确性,您可能需要深入研究与硬件或时序相关的问题(数据表和 these github issues 包含大量信息)。

【讨论】:

  • 嗨,首先感谢您提供如此详细的解释。您知道我可以用 HX711(或更稳定的 HX711 型号或版本)替换的任何其他硬件,以及适合我的问题的新硬件的代码(如果有的话)。
  • @Rbogtx_0705,我不熟悉称重传感器放大器,而 Stack Overflow 不适合寻求此类建议。你的问题是关于一个特定的问题,我试图尽可能地回答这个问题。如果您认为它对您有帮助或回答了问题,请投票和/或接受。如果您决定使用其他组件,我建议使用 Google 或其他电子/arduino/爱好论坛来搜索替代品。
猜你喜欢
  • 2017-11-07
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
相关资源
最近更新 更多