0

良いニュースは、この安価な Xiamen 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]

体重計にコマンドを送信しようとすると、楽しみが始まります。現在の重量をゼロにするコマンド (Zero Weight、別名「風袋」) は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私は some libusbhid-common、 some cython-dev、 some libusb-dev、 some libusb-1.0.0-dev、および somelibudev-devと、風袋引きを試みるために HIDAPI C のサンプル コードをアップグレードします。

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

そして、それは風袋です。

私の 1 つの成功を Python で再現するために (私のアプリの 1 つの小さなレイヤーを 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])

それで、読み取りがレベル 0 を返すまで何度も風袋行を呼び出すループを書く前に、誰かが私の数学をチェックして近道を提案してくれませんか? 生のpyusbソリューションもうまく機能します。

4

1 に答える 1

1

ここ数週間、pyusb だけを使って Python でいくつかの小さな HID プログラムを実行しましたが、それらは非常に確実に動作するようです。

発行した書き込みコマンドが応答を求めるかどうかを確認しましたか? その場合はそれを読む必要があります。これは初期化コードです:

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は1ページだけをダウンロードし、コマンド 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/

于 2015-04-25T21:33:44.923 に答える