如何通过Python HIDAPI来计算便宜的称重传感器秤?



好消息是,这款便宜的厦门 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来运行我的程序,bc 我拒绝使用设备权限,sudo在树莓派上很容易。

使用标准的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('x07x04x02x00x00x00', 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,它们似乎工作得非常可靠。

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

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)

必要时。之所以存在self,是因为函数和语句是处理外设并共享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/

相关内容

  • 没有找到相关文章

最新更新