USB HID mode

Is it possible to use USB HID mode with OpenMV? It’s mentioned on this page, but I can’t seem to get it to work

http://docs.openmv.io/library/pyb.USB_HID.html

Here’s the code I’m using

import sensor, image, time, math
import pyb

# I've tried both modes here but neither works, so moved it to a separate boot.py script
#pyb.usb_mode('VCP+HID', hid=pyb.hid_keyboard)
#pyb.usb_mode('CDC+HID', hid=pyb.hid_keyboard)
hid = pyb.USB_HID()

red_led = pyb.LED(1)
green_led = pyb.LED(2)
blue_led = pyb.LED(3)
ir_leds = pyb.LED(4)
red_led.off();
green_led.off();
blue_led.off();
ir_leds.off();

sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.VGA) # High Res!
sensor.set_windowing((640, 10)) # V Res of 80 == less work (40 for 2X the speed).
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)  # must turn this off to prevent image washout...
sensor.set_auto_whitebal(False)  # must turn this off to prevent image washout...
clock = time.clock()

while(True):
    clock.tick()
    img = sensor.snapshot()
    codes = img.find_barcodes()
    for code in codes:
        img.draw_rectangle(code.rect())
        print_args = (code.type(), code.payload(), (180 * code.rotation()) / math.pi, code.quality(), clock.fps())
        print("Barcode {}, Payload \"{}\", rotation {} (degrees), quality {}, FPS {}".format(*print_args))
        green_led.on()
        for c in code.payload():
            buf = bytearray(8)
            buf[0] = 0x00 # no modifier keys
            buf[2] = 0x17 # just send char 'T' for now
            hid.send(buf)
            pyb.delay(5)
            buf[0] = 0x00 # no modifier keys
            buf[2] = 0x00 # release key
            hid.send(buf)
            pyb.delay(5)
    if not codes:
        green_led.off()

And I’ve also tried it in boot.py

import pyb
#pyb.usb_mode('HID', hid=pyb.hid_keyboard)
pyb.usb_mode('VCP+HID', hid=pyb.hid_keyboard)
#pyb.usb_mode('CDC+HID', hid=pyb.hid_keyboard)

I’ve got both of these files on an SD card with the thinking that I’d need to remove it to get back access to the internal flash.

The green light flashes when a barcode is detected, so the script seems to run fine without errors (although I’m not sure if boot.py is running beforehand), but it’s not passing an HID data to my laptop (Mac OS)

Thanks

HID mode is not enabled, I’ll see if I can enable it before the next release.

Note: main.py and boot.py can run from SD or Flash the same, but we don’t use boot.py so it’s ignored.

Thanks that would be awesome!

Mmm, the documentation generator included that file in the doc tree even though there are no links to it.

Not sure how to hide these files. I disabled them in the index but they still show up.

I re-enabled boot.py, you’ll be able to use it as usual (note only VCP+MSC and VCP+HID are tested and working, I wouldn’t try anything else).

Thanks iabdalkader, do I need to update firmware for this to take effect?

Yes from github if u don’t want to wait for the next release.

Hello i’m French
do you have an example to send data using the mouse mode?

Thank you

https://docs.micropython.org/en/latest/pyboard/pyboard/tutorial/usb_mouse.html?highlight=hid

Hello,

  • i’m use google translate

I add in my file (boot.txt) this program:

Boot.py

import pyb
pyb.main ('main.py') # main script to run after this one
# pyb.usb_mode ('VCP + MSC')
pyb.usb_mode ('VCP + HID')

then I renamed my file (boot.txt) => (boot.py)

then I add in my OpenMV IDE this program:

OpenMV IDE

import pyb
hid = pyb.USB_HID ()

while (true):
     hid.send ((0, 10, 0, 0))

No other result … the mouse does not move …

Can you tell me what I’m doing wrong?

We honestly don’t support HID mode. Ibrahim however, added it I think to the firmware but it’s not something I believe if operational or tested or that we care even to add… Ibrahim, can you expand on this? Is this feature in the firmware, does it work?

Hi, no I didn’t test it I just enabled it. I’ll test it and get back to you.

Hi I just test HID and it’s working. The problem is with your script, you’re sending bytes in the wrong order. This script works:

import pyb, time

kb = pyb.USB_HID()
buf = bytearray(8)

while(True):# Sending T
    # key down
    buf[0] = 0x02 # LEFT_SHIFT
    buf[2] = 0x17 # keycode for 't/T'
    kb.send(buf)
    time.sleep(10)
    # key up
    buf[0] = 0x00
    buf[2] = 0x00
    kb.send(buf)
    time.sleep(1000)

Please read MicroPython’s tutorial first to understand how HID works:

http://wiki.micropython.org/USB-HID-Keyboard-mode-example-a-password-dongle

Hello,

I’m coming back to you because it still does not work …
I use win 7 and win10 and do not work either.

can you tell me step by step what to do. because I’m leaving an open MV cam V7 empty

I tested in the boot.py:

#boot.py
import machine
import pyb
pyb.main('main.py') # main script to run after this one
#pyb.usb_mode('VCP+MSC') # act as a serial and a storage device
pyb.usb_mode('HID')

and

#boot.py
import machine
import pyb
pyb.main('main.py') # main script to run after this one
#pyb.usb_mode('VCP+MSC') # act as a serial and a storage device
pyb.usb_mode('VCP+HID')

and

#boot.py
import machine
import pyb
pyb.main('main.py') # main script to run after this one
#pyb.usb_mode('VCP+MSC') # act as a serial and a storage device
pyb.usb_mode('VCP+HID'), hid=pyb.hid_keyboard)

and

#boot.py
import machine
import pyb
pyb.main('main.py') # main script to run after this one
#pyb.usb_mode('CDC+MSC') # act as a serial and a storage device
pyb.usb_mode('CDC+HID'), hid=pyb.hid_keyboard)

and

#boot.py
import machine
import pyb
pyb.main('main.py') # main script to run after this one
#pyb.usb_mode('CDC+MSC') # act as a serial and a storage device
pyb.usb_mode('CDC+HID')

main.py

import pyb, time

kb = pyb.USB_HID()
buf = bytearray(8)

while(True):# Sending T
    # key down
    buf[0] = 0x02 # LEFT_SHIFT
    buf[2] = 0x17 # keycode for 't/T'
    kb.send(buf)
    time.sleep(10)
    # key up
    buf[0] = 0x00
    buf[2] = 0x00
    kb.send(buf)
    time.sleep(1000)

but nothing works…

I am blocked

thank you verry much for help

Hi,

This works fine on Linux, however it may need an .inf file/driver on Windows. I’ll test it and get back to you. In the mean time you should check MicroPython’s documentation or search for their driver.

Hi,

Tested again on Windows 10, the keyboard works fine, and the mouse kinda works, scrolling works but I can’t move the cursor, not sure why maybe because I’m testing on a virtual machine.

Please follow this example:

https://github.com/openmv/openmv/blob/master/scripts/examples/02-Board-Control/hid.py

Make sure that you see a new HID mouse in the device manager:
Screenshot from 2018-08-21 16-49-54.png

Hi, I tested HID mode on Windows 7, and I can confirm it’s working. This is what I did:

1)First copy the following code to new file and name it boot.py

import pyb #(UNCOMMENT THIS LINE!)
pyb.usb_mode('VCP+HID') # serial device + mouse (UNCOMMENT THIS LINE!)
#pyb.usb_mode('VCP+MSC') # serial device + storage device (default)
#pyb.usb_mode('VCP+HID', hid=pyb.hid_keyboard) # serial device + keyboard

2)copy boot.py to SD card

3)wait until the file is copied and then restart the camera.

4)run the following code on the OpenMV IDE

import pyb, time

hid = pyb.USB_HID()

while(True):
    # x, y and scroll
    # move 10 pixels to the right
    hid.send((0, 10, 0, 0))
    time.sleep(500)

Check my video on youtube https://youtu.be/gUnpAMd1Dls

Hello
Thank you for such grate device.
Tested HID mode for windows 7 and it`s working with both mouse and keyboard but at a time only one HID device showing
How can we use HID mouse AND HID keyboard at same time :question: ?
Thanks

I don’t think that’s possible, mouse and keyboard have different USB descriptors you have to choose one before the camera runs.

Hello
Is It possible to write Custom USB descriptors for Device(openMV) to combine HID mouse and HID keyboard ???