Rework example code, fix bugs and get to compiling state. Also introduce missing logic for the Matrix code to keep track of what column is active.

This commit is contained in:
Anna Rose Wiggins 2021-11-22 20:10:08 +00:00
parent 8ebc1a5523
commit 690afdbce5
18 changed files with 194 additions and 26 deletions

8
example/Makefile Normal file
View file

@ -0,0 +1,8 @@
TARGET_BOARD=arduino:avr:uno
COM_PORT=/dev/ttyACM0
build:
arduino-cli compile -b ${TARGET_BOARD}
upload:
arduino-cli upload -b ${TARGET_BOARD} -p ${COM_PORT}

97
example/example.ino Normal file
View file

@ -0,0 +1,97 @@
// An example sketch using the joystick library, demonstrating recommended usage
// of all features.
#include <Joystick.h>
#include <Matrix.h>
#include <Mux.h>
using namespace admux;
// Always use defines to match your pins to their logical wiring
// pins 2 and 3 are attached to a rotary encoder
#define ENCODER 2,3
// these buttons are attached directly to Arduino input pins
#define BTN1 4
#define BTN2 5
#define BTN3 6
#define BTN4 7
// pins 8-13 are attached to a 3x3 scanning input matrix. Pins 8-10 are the row pins, 11-13 are the column pins
// However, note that the column pins are 0-indexed; the actual pins are defined in the Matrix object later.
#define MATRIX1 8,0
#define MATRIX2 9,0
#define MATRIX3 10,0
#define MATRIX4 8,1
#define MATRIX5 9,1
#define MATRIX6 10,1
#define MATRIX7 8,2
#define MATRIX8 9,2
#define MATRIX9 10,2
// A multiplexer is attached to pins A1-A5
#define MUX_SIG A1 // the multiplexer's signal pin is on Analog 1
#define MUX_ADDR A2,A3,A4,A5 // the multiplexer's address pins are A2-A5, in that order
// These are 3 buttons attached to the multiplexer channels
#define MUX_BTN1 0
#define MUX_BTN2 1
#define MUX_BTN3 2
bool debug = false;
Joystick js(debug);
void setup() {
js.AddEncoder(ENCODER, ENCODER_PULSED_SPLIT);
// Different types of button programming are available. BUTTON_PASSTHRU simply passes on the button's
// real state, and will be the most common, but you can also change how the button works in software like so...
// With BUTTON_PULSED, no matter how long the button stays held down, it will only send a button press for 250ms
// then deactivate until pressed again.
js.AddButton(BTN1, BUTTON_PULSED);
// BUTTON_PULSED_DOUBLE_ACTION does the same thing, but sends a *second* 250ms press when the button is deactivated
// This is great for an on-off toggle switch that should send an "event" in both directions.
js.AddButton(BTN2, BUTTON_PULSED_DOUBLE_ACTION);
// BUTTON_PULSED_DOUBLE_ACTION_SPLIT is just like the above, but it sends *different* button presses for the "on"
// and "off" states.
js.AddButton(BTN3, BUTTON_PULSED_DOUBLE_ACTION_SPLIT);
// BUTTON_LATCHED_MOMENTARY lets you turn a momentary pushbutton into a toggle switch.
// One press will "press and hold" the button. The next press releases the button.
js.AddButton(BTN4, BUTTON_LATCHED_MOMENTARY);
// One way to get more room for inputs is to use a scan matrix.
// See http://blog.komar.be/how-to-make-a-keyboard-the-matrix/ for a very detailed discussion of how these work.
// This is a 3x3 example, so we can get 9 buttons out of 6 inputs.
// For faster read results, always add buttons so that buttons with the same *column* are grouped together.
uint8_t cols[] = {11, 12, 13};
Matrix* matrix = new Matrix(cols);
js.AddMatrixButton(MATRIX1, matrix, BUTTON_PASSTHRU);
js.AddMatrixButton(MATRIX2, matrix, BUTTON_PASSTHRU);
js.AddMatrixButton(MATRIX3, matrix, BUTTON_PASSTHRU);
js.AddMatrixButton(MATRIX4, matrix, BUTTON_PASSTHRU);
js.AddMatrixButton(MATRIX5, matrix, BUTTON_PASSTHRU);
js.AddMatrixButton(MATRIX6, matrix, BUTTON_PASSTHRU);
js.AddMatrixButton(MATRIX7, matrix, BUTTON_PASSTHRU);
js.AddMatrixButton(MATRIX8, matrix, BUTTON_PASSTHRU);
js.AddMatrixButton(MATRIX9, matrix, BUTTON_PASSTHRU);
// another way to get more room for our inputs, this code adds a 16-channel multiplexer.
// It only attaches 3 buttons, but could attach up to channel 15.
Mux* mux = new Mux(Pin(MUX_SIG, INPUT_PULLUP, PinType::Digital), Pinset(MUX_ADDR));
js.AddMuxButton(MUX_BTN1, mux, BUTTON_PASSTHRU);
js.AddMuxButton(MUX_BTN2, mux, BUTTON_PASSTHRU);
js.AddMuxButton(MUX_BTN3, mux, BUTTON_PASSTHRU);
js.Init();
}
void loop() {
// check all the button states and send any changes
js.Update();
}

View file

@ -0,0 +1,8 @@
TARGET_BOARD=arduino:avr:uno
COM_PORT=/dev/ttyACM0
build:
arduino-cli compile -b ${TARGET_BOARD}
upload:
arduino-cli upload -b ${TARGET_BOARD} -p ${COM_PORT}

View file

@ -0,0 +1,34 @@
// An example sketch using the joystick library.
// In this example, we have 3 toggle switches and 2 momentary pushbuttons.
// Each button is configured in a different one of the available behaviors.
#include <Joystick.h>
bool debug = false;
Joystick joystick(debug);
void setup() {
// momentary pushbutton #1
joystick.AddButton(9, BUTTON_PASSTHRU);
// momentary pushbutton #2 - this one will toggle on or off each time it is pushed
joystick.AddButton(10, BUTTON_LATCHED_MOMENTARY);
// a toggle switch that acts like a momentary button - every time it's toggled 'on' it briefly sends
// a keypresss
joystick.AddButton(11, BUTTON_PULSED);
// like the above, but it sends its button press when toggled on *and* when toggled off
joystick.AddButton(12, BUTTON_PULSED_DOUBLE_ACTION);
// again, similar to the above, but it sends two *different* button presses - 'on' will be one button, 'off' another.
joystick.AddButton(13, BUTTON_PULSED_DOUBLE_ACTION_SPLIT);
// start up serial communication
joystick.Init();
}
void loop() {
// check all the button states and send any changes
joystick.Update();
}

View file

@ -0,0 +1,31 @@
// A button box example using all of the button types.
// This is the code used in the Black Box project.
// TODO: add link to blog post, once it exists.
#include <Bounce2.h>
#include <Joystick.h>
Joystick joystick;
void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
joystick.Init();
// 3 toggle switches that emit a press every time they are toggled.
// (in either direction)
joystick.AddButton(2, BUTTON_PULSED_DOUBLE_ACTION);
joystick.AddButton(3, BUTTON_PULSED_DOUBLE_ACTION);
joystick.AddButton(4, BUTTON_PULSED_DOUBLE_ACTION);
// This button will stay 'held down' as long as the switch is on.
joystick.AddButton(6, BUTTON_LATCHED);
// This button will emit a short press every time it is pushed, but
// only one per push.
joystick.AddButton(8, BUTTON_PULSED);
}
void loop () {
joystick.Update();
}

View file

@ -0,0 +1,8 @@
TARGET_BOARD=arduino:avr:uno
COM_PORT=/dev/ttyACM0
build:
arduino-cli compile -b ${TARGET_BOARD}
upload:
arduino-cli upload -b ${TARGET_BOARD} -p ${COM_PORT}

View file

@ -0,0 +1,40 @@
// An example sketch using the joystick library.
// This example includes every possible feature of the library.
// It assumes an Arduino Nano and a 16-channel multiplexer.
#include <Joystick.h>
#include <Mux.h>
using namespace admux;
bool debug = false;
Joystick joystick(debug);
void setup() {
joystick.AddButton(2, BUTTON_PASSTHRU); // this button will always transfer its current literal state to the computer
joystick.AddButton(3, BUTTON_LATCHED_MOMENTARY); // this button will start sending a buttonpress on one push, and keep it "held down" until it is pushed again.
joystick.AddButton(4, BUTTON_PULSED); // this button will send a buttonpress very briefly every time it is activated. Good for a toggle switch that shouldn't be "latched" in practice.
joystick.AddButton(5, BUTTON_PULSED_DOUBLE_ACTION); // like the above, but it sends its button press when toggled on *and* when toggled off
joystick.AddButton(6, BUTTON_PULSED_DOUBLE_ACTION_SPLIT); // again, similar to the above, but it sends two *different* button presses - 'on' will be one button, 'off' another.
joystick.AddEncoder(7, 8, ENCODER_PULSED_SPLIT); // a rotary encoder that will send 2 different buttonpresses - one when the encoder is turned clockwise, another when it is turned counterclockwise.
Pinset addr_pins = Pinset(10, 11, 12, 13);
uint8_t mux_id = joystick.AddMux(9, addr_pins);
Mux* mux = new Mux(Pin(9, INPUT_PULLUP, PinType::Digital), Pinset(10, 11, 12, 13));
joystick.AddButton(0, BUTTON_PASSTHRU, true, mux);
// start up serial communication
joystick.Init();
}
void loop() {
// check all the button states and send any changes
joystick.Update();
}

View file

@ -0,0 +1,8 @@
TARGET_BOARD=arduino:avr:uno
COM_PORT=/dev/ttyACM0
build:
arduino-cli compile -b ${TARGET_BOARD}
upload:
arduino-cli upload -b ${TARGET_BOARD} -p ${COM_PORT}

View file

@ -0,0 +1,52 @@
// An example sketch using the joystick library, demonstrating multiplexer support
// In this example, we have 21 buttons we want to attach.
// Unfortunately, the Arduino Uno only has 17 pins we can use!
// So we've added an 8-channel multiplexer, connected to pins A1-A5.
//
// Note: this may not be the best approach for this many simple buttons. Using an input matrix
// would require as few as 10 inputs in this scenario, for example. This is just a demo :)
#include <Joystick.h>
#include <Mux.h>
using namespace admux;
bool debug = false;
Joystick joystick(debug);
void setup() {
// All of our digital pins and A0 are taken up with pushbuttons
joystick.AddButton(2, BUTTON_PASSTHRU);
joystick.AddButton(3, BUTTON_PASSTHRU);
joystick.AddButton(4, BUTTON_PASSTHRU);
joystick.AddButton(5, BUTTON_PASSTHRU);
joystick.AddButton(6, BUTTON_PASSTHRU);
joystick.AddButton(7, BUTTON_PASSTHRU);
joystick.AddButton(8, BUTTON_PASSTHRU);
joystick.AddButton(9, BUTTON_PASSTHRU);
joystick.AddButton(10, BUTTON_PASSTHRU);
joystick.AddButton(11, BUTTON_PASSTHRU);
joystick.AddButton(12, BUTTON_PASSTHRU);
joystick.AddButton(13, BUTTON_PASSTHRU);
joystick.AddButton(A0, BUTTON_PASSTHRU);
// to get more room for our inputs, we add an 8-bit multiplexer
Mux* mux = new Mux(Pin(A1, INPUT_PULLUP, PinType::Digital), Pinset(A2, A3, A4, A5));
// now we can add the rest of the buttons
joystick.AddButton(0, BUTTON_PASSTHRU, true, mux);
joystick.AddButton(1, BUTTON_PASSTHRU, true, mux);
joystick.AddButton(2, BUTTON_PASSTHRU, true, mux);
joystick.AddButton(3, BUTTON_PASSTHRU, true, mux);
joystick.AddButton(4, BUTTON_PASSTHRU, true, mux);
joystick.AddButton(5, BUTTON_PASSTHRU, true, mux);
joystick.AddButton(6, BUTTON_PASSTHRU, true, mux);
joystick.AddButton(7, BUTTON_PASSTHRU, true, mux);
joystick.Init();
}
void loop() {
// check all the button states and send any changes
joystick.Update();
}

View file

@ -0,0 +1,59 @@
// An example sketch using the joystick library.
// In this example, we have 5 toggle switches that are configured
// as double-action pulsed buttons - that is, whenever they are toggled, they
// emit a short button press.
//
// This example uses the *old* Joystick API. You should strongly prefer the
// other, better examples in this directory!
#include <Bounce2.h>
#include <Joystick.h>
bool debug = false;
Joystick joystick(debug);
// Number of connected buttons.
int num_buttons = 5;
// Last known state of each pin.
int states[10] = {-1, -1, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};
void parsePins(bool init=false) {
// Input: figure out which pins have changed.
bool something_pressed = false;
for (int i = 2; i < 2 + num_buttons; i++) {
int newstate = digitalRead(i);
if (newstate != states[i]) {
states[i] = newstate;
if (!init) {
joystick.PressButton(i-2);
something_pressed = true;
}
}
}
// Output: Actually press the appropriate buttons, wait, then clear them all.
if (something_pressed) {
joystick.Write();
joystick.ReleaseAllButtons();
joystick.Write();
}
}
void InitInputs() {
for (int i = 2; i < 2 + num_buttons; i++) {
pinMode(i, INPUT_PULLUP);
}
parsePins(true);
}
void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
joystick.Init();
InitInputs();
}
void loop() {
parsePins();
if (debug) delay(900);
}

View file

@ -0,0 +1,23 @@
// This is the same 5-toggle-switch example from switch_panel.ino, using the
// new API. So much easier!
#include <Bounce2.h>
#include <Joystick.h>
Joystick joystick;
void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
joystick.Init();
joystick.AddButton(2, BUTTON_PULSED_DOUBLE_ACTION, true);
joystick.AddButton(3, BUTTON_PULSED_DOUBLE_ACTION, true);
joystick.AddButton(4, BUTTON_PULSED_DOUBLE_ACTION, true);
joystick.AddButton(5, BUTTON_PULSED_DOUBLE_ACTION, true);
joystick.AddButton(6, BUTTON_PULSED_DOUBLE_ACTION, true);
}
void loop () {
joystick.Update();
}