首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python3与覆盆子Pi 3接口加载单元和HX711

用Python3与覆盆子Pi 3接口加载单元和HX711
EN

Stack Overflow用户
提问于 2021-10-14 14:08:49
回答 1查看 3.4K关注 0票数 1

我目前正在做一个IoT项目,在这个项目中,我尝试将我的Raspberry 3与HX711接口,这样我就可以从我的负载传感器读取200公斤的重量读数。

对于Python代码,我尝试了来自github的Python库

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

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

我是通过投入5公斤的负荷来获得这个产量的。我多次尝试过这个校准和检查输出的循环,但是输出仍然是可变的。

这是我使用的代码:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-16 09:24:22

不幸的是,我没有HX711,所以我不能测试您的代码。但我可以给出一些可能有帮助的建议。

  1. 我的主要问题是:为什么您的代码包含 hx.power_down() time.sleep(0.001) hx.power_up() 在圈子里?根据数据表,输出稳定时间(即从电源启动、复位、输入信道变化和增益变化到有效稳定输出数据的时间)为400 ms。因此,如果你在每次阅读后关闭HX711,每一次阅读都将是不稳定的!
  2. 此外,你预计读数之间会有多大偏差?您的值目前波动在大约4990到5040之间,这是一个50的差异,所以只有1%的差异。这也不算太糟。不幸的是,HX711的准确性没有在数据表中指定,所以我无法确定这是“正确的”还是“错误的”。但是,在假设某件事出了问题之前,你应该检查一下你能预料到什么。数据表提到输入偏移量为0.2 mV,而全尺寸差分输入电压(在增益128处)为20 mV。那也是1%。(这可能是巧合,但如果你想确定的话,你可能应该投入其中。)
  3. 你查过串口通讯的时间了吗?代码只是在没有任何特定定时的情况下切换IO引脚,而数据表则提到,对于至少0.2 us和最多50 us,PD_SCK必须是高的。切换速度更快可能导致不正确的读数,而切换慢则可能导致设备重置(因为将PD_SCK保持在60 us以上会导致其进入断电模式)。例如,请参见这个C实现,它包括一个用于快速CPU的修复程序。您的Python库没有包含此修复程序。 不过,我不知道你会如何使用Raspberry Pi来执行这个任务。如果您能在Raspberry Pi (或任何其他非实时平台)上可靠地工作,那么您似乎就很幸运了,因为如果您的代码在不方便的时候被中断,那么读取可能会失败(例如,请参见这句话 )。
  4. 我在互联网上读到了一些报告,说HX711需要“热身”2-3分钟,所以读数在那之后变得更稳定了。
  5. 最后,这个问题也可能与硬件有关。似乎有许多低质量的董事会。例如,有可能是相关的这个已知的设计错误

注:还注意到您的偏移量(8,608,276.3125)不能正确。HX711返回24位2的补码值.这意味着-8,388,607和+8,388,608之间的值。你的价值超出了这个范围。获得此值的原因是您使用的库没有正确地考虑数据编码。见这一讨论。存储库中有几个分支对此进行了修复,例如这一个。如果正确读取,该值将为-8 168 939.6875。此错误不会影响准确度,但可能导致某些权重的结果不正确。

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

我的建议:

  • 从你的循环中删除电源(你可能想在你的设置中使用它一次)。
  • 在你第一次阅读之前,至少要等400 ms。
  • 如果您想要使用整个范围,则修复2的补码逻辑的数据转换。
  • 不要期望设备精确到24位。
  • 如果您仍然希望提高读数的准确性,您可能需要深入研究与硬件或时间相关的问题(数据表和这些github问题包含了大量信息)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69572201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档