使用Python 3将称重传感器和HX711与Raspberry Pi 3接口

2024-06-16 14:45:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在从事一个物联网项目,在该项目中,我试图将我的Raspberry Pi 3连接到HX711,以便我可以从200 kg范围的称重传感器读取重量读数

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

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

但我一直从称重传感器获取可变读数,如Raspberry Pi窗口的以下屏幕截图所示:

Python Program Output

我通过施加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()

Tags: 项目fromimportgpiodefsyspi传感器
1条回答
网友
1楼 · 发布于 2024-06-16 14:45:22

不幸的是,我没有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(或任何其他非实时平台)上可靠地工作,那么您似乎是幸运的,因为如果您的代码在不好的时间被中断,读取可能会失败(例如,请参见this comment

  4. 我在互联网上读到一些报道,称HX711需要“预热”2-3分钟,因此此后读数会变得更稳定

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

NB:还要注意,您的偏移量(8608276.3125)可能不正确。HX711返回24位2的补码值。这意味着一个介于-8388607和+8388608之间的值。您的值超出该范围。获得此值的原因是您使用的库没有正确考虑数据编码。见this discussion。在存储库中有几个分支可以解决这个问题,例如this one。如果正确读取,则该值应为-8168939.6875。此错误不会影响精度,但可能会导致某些权重的结果不正确

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

我的建议:

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

不幸的是,我没有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(或任何其他非实时平台)上可靠地工作,那么您似乎是幸运的,因为如果您的代码在不好的时间被中断,读取可能会失败(例如,请参见this comment

  4. 我在互联网上读到一些报道,称HX711需要“预热”2-3分钟,因此此后读数会变得更稳定

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

NB:还要注意,您的偏移量(8608276.3125)可能不正确。HX711返回24位2的补码值。这意味着一个介于-8388607和+8388608之间的值。您的值超出该范围。获得此值的原因是您使用的库没有正确考虑数据编码。见this discussion。在存储库中有几个分支可以解决这个问题,例如this one。如果正确读取,则该值应为-8168939.6875。此错误不会影响精度,但可能会导致某些权重的结果不正确

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

我的建议:

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

相关问题 更多 >