如何通过Python HIDAPI皮重一个便宜的称重传感器规模?

时间:2015-04-25 16:19:48

标签: python hid pyusb 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在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),并升级他们的{{1示例代码:

try.py
猜猜是什么?最后一行不是皮重的。但是,如果我运行它3次就会去皮了!

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])

所以,在我编写一个反复调用皮重线直到读取返回零级的循环之前,有人可以检查我的数学并建议一个快捷方式吗?原始的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]) 解决方案也很有用。

1 个答案:

答案 0 :(得分: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)
必要时。 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/