Как тарировать дешевые весы через Python HIDAPI?

Хорошей новостью является то, что это дешёвое зарядное устройство Xiamen ELANE.NET, подключенное к USB, в режиме Report 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]

Теперь самое интересное начинается, когда я пытаюсь отправить команды на весы. Команда обнуления текущего веса (Zero Weight, aka "tare") может быть 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 Решение будет работать отлично.

1 ответ

За последние недели я написал несколько небольших HID-программ на Python, но только с 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/

Другие вопросы по тегам