我目前正在从事一个物联网项目,在该项目中,我试图将我的Raspberry Pi 3连接到HX711,以便我可以从200 kg范围的称重传感器读取重量读数
对于Python代码,我尝试了this Python library from github
根据该存储库的描述,我首先使用5 kg的已知重量校准了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()
不幸的是,我没有HX711,因此无法测试您的代码。但我可以给出一些可能有用的建议
我的主要问题是:为什么您的代码包含
在循环中?根据datasheet,输出稳定时间(即从通电、复位、输入通道变化和增益变化到有效稳定输出数据的时间)为400 ms。因此,如果在每次读取后关闭HX711,则每次读取都将不稳定
此外,您预计读数之间的偏差有多大?您的值当前在大约4990和5040之间波动,相差50,因此只有1%的差异。那还不错。不幸的是,数据表中没有规定HX711的精度,因此我无法确定这是“正确”还是“错误”。然而,在假设某件事出错之前,你应该检查一下你能预期到什么。数据表中提到输入偏移漂移为0.2 mV,而满标度差分输入电压(增益128)为20 mV。那也是1%。(这可能是巧合,但如果你想确定的话,你可能应该深入其中。)
你有没有检查串行通信的时间?代码只是切换IO引脚,没有任何特定的定时,而数据表中提到PD_SCK必须高达至少0.2 us,最多50 us。快速切换可能会导致错误读数,而慢速切换可能会导致设备复位(因为将PD_SCK保持在高位超过60 us会导致设备进入断电模式)。例如,请参见this C implementation,其中包括一个针对快速CPU的修复程序。您的Python库未包含此修复程序
不过,我不确定您将如何使用树莓圆周率强制执行此操作。如果您能在Raspberry Pi(或任何其他非实时平台)上可靠地工作,那么您似乎是幸运的,因为如果您的代码在不好的时间被中断,读取可能会失败(例如,请参见this comment)
我在互联网上读到一些报道,称HX711需要“预热”2-3分钟,因此此后读数会变得更稳定
最后,这个问题也可能与硬件有关。似乎有许多低质量的电路板。例如,有this known design fault可能是相关的
NB:还要注意,您的偏移量(8608276.3125)可能不正确。HX711返回24位2的补码值。这意味着一个介于-8388607和+8388608之间的值。您的值超出该范围。获得此值的原因是您使用的库没有正确考虑数据编码。见this discussion。在存储库中有几个分支可以解决这个问题,例如this one。如果正确读取,则该值应为-8168939.6875。此错误不会影响精度,但可能会导致某些权重的结果不正确
对于所有认为精度为24位的人来说,这只是最后一个提示,因此它应该返回非常可靠的读数:精度与精度不同。仅仅因为设备返回24位并不意味着这些位是正确的。该值与实际值(实际重量)的接近程度取决于许多其他因素。请注意,默认情况下使用的库读取权重16次,并对结果求平均值。如果设备是如此精确,那就根本不需要了
我的建议:
不幸的是,我没有HX711,因此无法测试您的代码。但我可以给出一些可能有用的建议
我的主要问题是:为什么您的代码包含
在循环中?根据datasheet,输出稳定时间(即从通电、复位、输入通道变化和增益变化到有效稳定输出数据的时间)为400 ms。因此,如果在每次读取后关闭HX711,则每次读取都将不稳定
此外,您预计读数之间的偏差有多大?您的值当前在大约4990和5040之间波动,相差50,因此只有1%的差异。那还不错。不幸的是,数据表中没有规定HX711的精度,因此我无法确定这是“正确”还是“错误”。然而,在假设某件事出错之前,你应该检查一下你能预期到什么。数据表中提到输入偏移漂移为0.2 mV,而满标度差分输入电压(增益128)为20 mV。那也是1%。(这可能是巧合,但如果你想确定的话,你可能应该深入其中。)
你有没有检查串行通信的时间?代码只是切换IO引脚,没有任何特定的定时,而数据表中提到PD_SCK必须高达至少0.2 us,最多50 us。快速切换可能会导致错误读数,而慢速切换可能会导致设备复位(因为将PD_SCK保持在高位超过60 us会导致设备进入断电模式)。例如,请参见this C implementation,其中包括一个针对快速CPU的修复程序。您的Python库未包含此修复程序
不过,我不确定您将如何使用树莓圆周率强制执行此操作。如果您能在Raspberry Pi(或任何其他非实时平台)上可靠地工作,那么您似乎是幸运的,因为如果您的代码在不好的时间被中断,读取可能会失败(例如,请参见this comment)
我在互联网上读到一些报道,称HX711需要“预热”2-3分钟,因此此后读数会变得更稳定
最后,这个问题也可能与硬件有关。似乎有许多低质量的电路板。例如,有this known design fault可能是相关的
NB:还要注意,您的偏移量(8608276.3125)可能不正确。HX711返回24位2的补码值。这意味着一个介于-8388607和+8388608之间的值。您的值超出该范围。获得此值的原因是您使用的库没有正确考虑数据编码。见this discussion。在存储库中有几个分支可以解决这个问题,例如this one。如果正确读取,则该值应为-8168939.6875。此错误不会影响精度,但可能会导致某些权重的结果不正确
对于所有认为精度为24位的人来说,这只是最后一个提示,因此它应该返回非常可靠的读数:精度与精度不同。仅仅因为设备返回24位并不意味着这些位是正确的。该值与实际值(实际重量)的接近程度取决于许多其他因素。请注意,默认情况下使用的库读取权重16次,并对结果求平均值。如果设备是如此精确,那就根本不需要了
我的建议:
相关问题 更多 >
编程相关推荐