Overview

The Pro Trinket's USB connector is used for uploading sketches, but the connector is not a full USB port due to lack of dedicated hardware.  You can, though, use the connection to emulate some basic USB 1.1 devices via an Arduino software library presented in this tutorial. For example, via the USB 1.1 protocol, you can build low speed USB Human Interface Devices (or HID). Examples of HIDs are keyboards, mice, joysticks, gamepads, etc.

Previous Pro Trinket HID tutorials:

Pro Trinket can emulate a both a computer mouse and keyboard at the same time. The code is a bit larger but adds the functionality of the previous two libraries.

This tutorial will show use of the library using a rotary encoder switch as a digital volume knob and mute switch for multimedia PCs.

Software Library

The Pro Trinket HID library is available on GitHub. You can download the code from the link below.  See the tutorial All About Arduino Libraries on installing the code into your Arduino Integrated Development Environment (IDE) for your use.

The functions available in the library are shown below.  All of the definitions are in the ProTrinketHidCombo.h file in the library.  There are definitions for the common PC keyboard keys including control and shift variants.  Special to this library are multimedia and special keys.

The mouse part of the library differs from the Pro Trinket HID mouse library in the moveMouse function provides movement and mouse clicks but does not emulate the scroll wheel.  The arguments are the x and y values to move the mouse and whether the buttons are to be pressed - the predefined values for mouse presses are also in the .h file.

// Starts the USB driver, place in the Arduino IDE setup routine:
void TrinketHidCombo.begin(); // start the USB device engine and enumerate

TrinketHidCombo.isConnected(); // checks if USB is connected, 0 if not connected
 
// this (or "press" something) must be called at least once every 10ms
TrinketHidCombo.poll();  // this (or "press" something) must be called at least once every 10ms
 
// presses up to 6 keys, and modifiers (modifiers are keys like shift, CTRL, etc)
TrinketHidCombo.pressKey(uint8_t modifiers, uint8_t keycode1, uint8_t keycode2, uint8_t keycode3, uint8_t keycode4, uint8_t keycode5, uint8_t keycode6);
TrinketHidCombo.pressKey(uint8_t modifiers, uint8_t keycode1, uint8_t keycode2, uint8_t keycode3, uint8_t keycode4, uint8_t keycode5);
TrinketHidCombo.pressKey(uint8_t modifiers, uint8_t keycode1, uint8_t keycode2, uint8_t keycode3, uint8_t keycode4);
TrinketHidCombo.pressKey(uint8_t modifiers, uint8_t keycode1, uint8_t keycode2, uint8_t keycode3);
TrinketHidCombo.pressKey(uint8_t modifiers, uint8_t keycode1, uint8_t keycode2);
TrinketHidCombo.pressKey(uint8_t modifiers, uint8_t keycode1);
 
// presses a list of keys
TrinketHidCombo.pressKeys(uint8_t modifiers, uint8_t* keycodes, uint8_t sz);
 
// type out a single ASCII character
TrinketHidCombo.typeChar(uint8_t ascii);

// Press special keyboard key types
TrinketHidCombo.pressMultimediaKey(uint8_t key);
TrinketHidCombo.pressSystemCtrlKey(uint8_t key);
 
// returns the state of the three LEDs on a keyboard (caps/num/scroll lock)
TrinketHidCombo.getLEDstate();
 
// inherit from "Print", these two write functions are implemented
size_t val = TrinketHidCombo.write(uint8_t);
using Print::write;
// other "print" and "println" functions are automatically available
using Print::print;
using Print::println;
 
// helps translate ASCII characters into keycode and modifier combinations, 
// while taking into account whether or not caps lock is on
ASCII_to_keycode(uint8_t ascii, uint8_t ledState, uint8_t* modifier, uint8_t* keycode);

// Here is the mouse function. This is a bit different from the Pro Trinket mouse library 
//     as this does not have the scroll wheel argument.
//  Pass the following values:
//  x - the number of pixels to move in the horizontal direction (-127 to 127)
//      Note: this is in relation to the current mouse position, not absolute 
//      screen location
//  y - the pixels to move in the vertical direction (-127 to 127)
//  buttonMask - the following values may be ANDed to press mouse buttons:
//      MOUSEBTN_LEFT_MASK		0x01  // Left button
//      MOUSEBTN_RIGHT_MASK		0x02  // Right buttom
//      MOUSEBTN_MIDDLE_MASK    0x04  // Middle Button
void TrinketHidCombo.mouseMove(signed char x, signed char y, uint8_t buttonMask); // makes a mouse movement, must be called at least once every 10ms, even if no movement
// Examples: 
TrinketHidCombo.mouseMove(5,-5,0);  // Move 5 pixels up, 5 left from current location
TrinketHidCombo.move(0,0,MOUSEBTN_LEFT_MASK); // Click left mouse button

// See the file ProTrinketHidCombo.h in the library for all the possible
//    predefined key codes.  Some special codes available:
//
// multimedia keys
// MMKEY_VOL_UP			    0xE9
// MMKEY_VOL_DOWN			0xEA
// MMKEY_SCAN_NEXT_TRACK	0xB5
// MMKEY_SCAN_PREV_TRACK	0xB6
// MMKEY_STOP				0xB7
// MMKEY_PLAYPAUSE			0xCD
// MMKEY_MUTE				0xE2
// MMKEY_BASSBOOST			0xE5
// MMKEY_LOUDNESS			0xE7
// MMKEY_KB_EXECUTE		    0x74
// MMKEY_KB_HELP			0x75
// MMKEY_KB_MENU			0x76
// MMKEY_KB_SELECT			0x77
// MMKEY_KB_STOP			0x78
// MMKEY_KB_AGAIN			0x79
// MMKEY_KB_UNDO			0x7A
// MMKEY_KB_CUT			    0x7B
// MMKEY_KB_COPY			0x7C
// MMKEY_KB_PASTE			0x7D
// MMKEY_KB_FIND			0x7E
//
// system control keys
// SYSCTRLKEY_POWER		    0x01
// SYSCTRLKEY_SLEEP		    0x02
// SYSCTRLKEY_WAKE			0x03
Last updated on 2015-05-04 at 04.27.32 PM Published on 2015-01-28 at 03.29.46 PM