The libraries are located at our github repository https://github.com/adafruit/Adafruit-Trinket-USB/ , this particular project is the example project under TrinketHidCombo, named TrinketVolumeKnob.
Install these as ordinary Arduino libraries, via the Arduino Library Manager (see http://arduino.cc/en/Guide/Libraries or our tutorial on Arduino libraries). Keep in mind that this library is designed specifically for Trinket. (although they can be modified to work with other platforms).
Open up the Arduino Library Manager:
Search for the Trinket USB Keyboard library and install it
Pins are first setup, and USB library is initialized. If a rotation is detected, then the USB library sends out a keystroke.
#include "TrinketHidCombo.h" #define PIN_ENCODER_A 0 #define PIN_ENCODER_B 2 #define TRINKET_PINx PINB static uint8_t enc_prev_pos = 0; static uint8_t enc_flags = 0; void setup() { // set pins as input with internal pull-up resistors enabled pinMode(PIN_ENCODER_A, INPUT); pinMode(PIN_ENCODER_B, INPUT); digitalWrite(PIN_ENCODER_A, HIGH); digitalWrite(PIN_ENCODER_B, HIGH); TrinketHidCombo.begin(); // start the USB device engine and enumerate // get an initial reading on the encoder pins if (digitalRead(PIN_ENCODER_A) == LOW) { enc_prev_pos |= (1 << 0); } if (digitalRead(PIN_ENCODER_B) == LOW) { enc_prev_pos |= (1 << 1); } } void loop() { int8_t enc_action = 0; // 1 or -1 if moved, sign is direction // note: for better performance, the code will now use // direct port access techniques // http://www.arduino.cc/en/Reference/PortManipulation uint8_t enc_cur_pos = 0; // read in the encoder state first if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_A)) { enc_cur_pos |= (1 << 0); } if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_B)) { enc_cur_pos |= (1 << 1); } // if any rotation at all if (enc_cur_pos != enc_prev_pos) { if (enc_prev_pos == 0x00) { // this is the first edge if (enc_cur_pos == 0x01) { enc_flags |= (1 << 0); } else if (enc_cur_pos == 0x02) { enc_flags |= (1 << 1); } } if (enc_cur_pos == 0x03) { // this is when the encoder is in the middle of a "step" enc_flags |= (1 << 4); } else if (enc_cur_pos == 0x00) { // this is the final edge if (enc_prev_pos == 0x02) { enc_flags |= (1 << 2); } else if (enc_prev_pos == 0x01) { enc_flags |= (1 << 3); } // check the first and last edge // or maybe one edge is missing, if missing then require the middle state // this will reject bounces and false movements if (bit_is_set(enc_flags, 0) && (bit_is_set(enc_flags, 2) || bit_is_set(enc_flags, 4))) { enc_action = 1; } else if (bit_is_set(enc_flags, 2) && (bit_is_set(enc_flags, 0) || bit_is_set(enc_flags, 4))) { enc_action = 1; } else if (bit_is_set(enc_flags, 1) && (bit_is_set(enc_flags, 3) || bit_is_set(enc_flags, 4))) { enc_action = -1; } else if (bit_is_set(enc_flags, 3) && (bit_is_set(enc_flags, 1) || bit_is_set(enc_flags, 4))) { enc_action = -1; } enc_flags = 0; // reset for next time } } enc_prev_pos = enc_cur_pos; if (enc_action > 0) { TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP); } else if (enc_action < 0) { TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN); } else { TrinketHidCombo.poll(); // do nothing, check if USB needs anything done } }
Text editor powered by tinymce.