【问题标题】:how to tare a cheap load cell scale thru Python HIDAPI?如何通过 Python HIDAPI 去皮便宜的称重传感器秤?
【发布时间】:2015-04-25 16:19:48
【问题描述】:

好消息是这款便宜的厦门 ELANE.NET 称重传感器通过 USB 通电进入报告 3 模式;不断地以克为单位吐出它当前的重量。

这是它的数据表:

http://www.elane.net/USBscales/List_USB_Digital_Load_Cell_Commands_and_Data_Format_User.pdf

我可以通过标准的pyusb 调用来阅读它。这个样本可以读取刻度...

http://www.orangecoat.com/how-to/read-and-decode-data-from-your-mouse-using-this-pyusb-hack

...如果您将设备查找替换为usb.core.find(idVendor=0x7b7c, idProduct=0x301)

(我还滥用sudo 来运行我的程序,因为我拒绝使用设备权限,而sudo 在Raspberry Pi 上很容易。)

使用标准的pyusb 调用,我可以像这样读取我的体重秤的喷射:

device.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize)

返回一个 6 字节数组:

 +--------------------- Report type
 |  +------------------ Weight Stable (tray not moving)
 |  |  +--------------- grams (not pounds)
 |  |  |  +------------ whatever
 |  |  |  |  +--------- 2 grams
 |  |  |  |  |  +------ 0 x 256 grams
 |  |  |  |  |  |
 V  V  V  V  V  V
[3, 4, 2, 0, 2, 0]

现在,当我尝试向体重秤发送命令时,乐趣就开始了。将当前重量(零重量,又名“去皮”)归零的命令可能是 7 4 2 0 0 0

如果我使用像 https://github.com/walac/pyusb/blob/master/docs/tutorial.rst 这样的示例代码来查找 ENDPOINT_OUT 端点,并使用这些行中的任何一行写入它,我就无法去皮:

# ep_out.write('\x07\x04\x02\x00\x00\x00', 6)
ep_out.write([0x07, 0x04, 0x02, 0x00, 0x00, 0x00], 6)

(症状是,我可以在我的称重传感器上放一个负载,用上面的.read()线称重,然后去皮,然后当我再次.read()时不会得到零。)

好吧,我们还没死。我们还没有尝试过任何 HIDAPI。所以我apt-get我一些libusbhid-common,一些cython-dev,一些libusb-dev,一些libusb-1.0.0-dev,还有一些libudev-dev,我升级了HIDAPI C示例代码来尝试去皮重:

handle = hid_open(0x7b7c, 0x301, NULL);
buf[0] = 0x07; 
buf[1] = 0x04;
buf[2] = 0x02;
res = hid_write(handle, buf, 3);

那是稗子。

为了复制我在 Python 中的一次成功(尽管用 C++ 重写我的应用程序的一小层是多么诱人!),我推出了一些 Cython-hidapi(大概来自 git://github.com/signal11/hidapi.git),并升级了他们的 try.py 示例代码:

h = hid.device()
h.open(0x7b7c, 0x301)

print("Manufacturer: %s" % h.get_manufacturer_string())
print("Product: %s" % h.get_product_string())
print("Serial No: %s" % h.get_serial_number_string())

res = h.write([0x07, 0x04, 0x02, 0,0,0])

你猜怎么着?最后一行不去皮。但是如果我运行它 3 次,它确实会去皮!

res = h.write([0x07, 0x04, 0x02, 0,0,0])
res = h.write([0x07, 0x04, 0x02, 0,0,0])
res = h.write([0x07, 0x04, 0x02, 0,0,0])

所以,在我编写一个循环调用皮重线直到读取返回零级之前,有人可以检查我的数学并建议一个捷径吗?原始的 pyusb 解决方案也可以很好地工作。

【问题讨论】:

    标签: python hid pyusb hidapi


    【解决方案1】:

    在过去的几周里,我用 Python 做了一些小的 HID 程序,只用了 pyusb,它们似乎工作得非常可靠。

    您是否检查了您发出的写入命令是否提示回复?在这种情况下,您必须阅读该内容。这是初始化代码:

    def claimed(self):
        self.hdev = ucore.find(idVendor = VID, idProduct = PID)
    
        #pdb.set_trace()
        if self.hdev.is_kernel_driver_active(0):
            print "Kernel driver is active."
            self.hdev.detach_kernel_driver(0)
            print self.hdev
    
        self.hdev.set_configuration()
        print "config set"
        self.cfg = self.hdev.get_active_configuration()
    
        return True
    

    之后就是

    self.hdev.write(endpoint.bEndpointAddress, self.data)
    

    self.data = self.hdev.read(endpoint.bEndpointAddress, 64, 64)
    

    根据需要。 selfs 存在是因为函数和语句是处理外围设备的类的一部分,并共享 hdev 变量。

    编辑:您引用的 PDF 仅下载一页,并且其中没有记录命令 7,4,2,0,0,0。是否有更完整的信息可用?

    另外,我发现了一些可能对您有用的迹象。根据这篇文章,没有必要连续询问天平:

    http://www.elane.net/UserManuals/USB%20Interface%20Protocol%20%285-kg%20Model%29.pdf

    并且根据下面的文章,似乎需要多次询问(最多10次),我怀疑这可能与AD的转换时间有关。这篇文章是关于 Dymo 量表的,但协议似乎有些相似:

    http://steventsnyder.com/reading-a-dymo-usb-scale-using-python/

    【讨论】:

    • 虽然您是正确的,我和我链接的“读取...您的鼠标”页面都称为 set_configuration(),但添加您的 claimed() 例程并没有修复错误。我投票赞成它告诉社区它已确认不会让事情变得更糟。我还根据sourceforge.net/p/pyusb/mailman/message/26198542 添加了对usb.util.find_descriptor() 的调用,以挖掘输出端点并写入该端点。错误仍然存​​在,我必须写 3 次才能取去皮重。我想这是可以接受的损失,很高兴知道我可以绕过 HID 堆栈来处理这些轻量级的东西。
    • Philip,我在回复中添加了一个编辑,还有一些建议。
    • 我有一份厦门PDF的硬拷贝,我用电子搜索了大约一个小时,点击了elane.net上的每个PDF,但没有找到。关于“协议似乎有些相似”,是的,我认为每个人都只是封装了相同的芯片组(并假设其他人记录了它!)
    • 如果我成功地将读数从克更改为磅,我会在这里报告。 (除了我担心低字节会是盎司!!)关于命令下沉的时间;当我去皮 3 倍时,在正确的皮重出现之前,我可以看到一些带有错误皮重的“剩余”读数。当我只去皮一次时,错误的皮重几乎总是会继续。
    猜你喜欢
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2023-04-11
    • 2018-09-21
    相关资源
    最近更新 更多