Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
66812c1
Create a KiCad project for the StenoPad
ApolloFops Sep 22, 2024
02b6f10
Add symbols for the MCU
ApolloFops Sep 22, 2024
bc2b672
Add the left side key matrix
ApolloFops Sep 22, 2024
fecf34b
Merge branch 'hackclub:main' into main
ApolloFops Oct 20, 2024
48afacf
Split the StenoPad into two halves and finish more of the board
ApolloFops Oct 20, 2024
d81d28f
Add a gitignore for the StenoPad
ApolloFops Oct 21, 2024
2954b9a
Add most of the wiring for the StenoPad coprocessor to the schematic
ApolloFops Oct 21, 2024
1b89ff2
Route traces for the StenoPad coprocessor
ApolloFops Oct 21, 2024
cea5e67
Merge branch 'hackclub:main' into main
ApolloFops Oct 22, 2024
1a04332
Merge branch 'main' into main
ApolloFops Feb 16, 2025
4e63e84
Rename StenoPad to DawPad and remove all the PCB stuff from it
ApolloFops Feb 16, 2025
ffae998
Add missing submodules to .gitmodules
ApolloFops Feb 16, 2025
8beb3ec
Merge branch 'fix-gitmodules' into dawpad
ApolloFops Feb 16, 2025
675287d
Add a blank PCB for the DawPad
ApolloFops Feb 16, 2025
4d55f2b
Switch to Seeed Studio OPL KiCad Library for DawPad
ApolloFops Feb 18, 2025
f17547f
Connect inputs on the DawPad schematic and lay things out on the PCB
ApolloFops Feb 19, 2025
9e91216
Add LEDs to and finish PCB for DawPad
ApolloFops Feb 24, 2025
2e6ce5b
Fix up some things on the DawPad PCB
ApolloFops Feb 25, 2025
619e244
Add firmware for the DawPad
ApolloFops Feb 25, 2025
6e9d0a5
Add some production files to DawPad
ApolloFops Feb 25, 2025
b63696f
Add README files to DawPad
ApolloFops Feb 25, 2025
c22bb75
Add images to the DawPad README
ApolloFops Feb 25, 2025
bb38480
Merge branch 'main' into dawpad
qcoral Mar 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,21 @@
path = hackpads/Ambrylight/firmware
url = https://github.com/pmnlla/zmk-board-cfg
branch = ambrylight
[submodule "hackpads/bongopad/pcb/KiCad-SSD1306-128x64"]
path = hackpads/bongopad/pcb/KiCad-SSD1306-128x64
url = https://github.com/pforrmi/KiCad-SSD1306-128x64
[submodule "hackpads/dawpad/pcb/libraries/MX_V2"]
path = hackpads/dawpad/pcb/libraries/MX_V2
url = https://github.com/ai03-2725/MX_V2
[submodule "hackpads/dawpad/pcb/libraries/OPL_Kicad_Library"]
path = hackpads/dawpad/pcb/libraries/OPL_Kicad_Library
url = https://github.com/Seeed-Studio/OPL_Kicad_Library.git
[submodule "hackpads/tabbyhack_k4/pcb/libraries/MX_V2"]
path = hackpads/tabbyhack_k4/pcb/libraries/MX_V2
url = https://github.com/ai03-2725/MX_V2
[submodule "hackpads/tabbyhack_k4/pcb/libraries/OPL_Kicad_Library"]
path = hackpads/tabbyhack_k4/pcb/libraries/OPL_Kicad_Library
url = https://github.com/Seeed-Studio/OPL_Kicad_Library
[submodule "hackpads/n16-remote"]
path = hackpads/n16-remote
url = https://github.com/DJ-Laser/n16-remot
Expand Down
2 changes: 2 additions & 0 deletions hackpads/dawpad/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
StenoPad-backups
*.lck
36 changes: 36 additions & 0 deletions hackpads/dawpad/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# DawPad

![PCB Render](https://github.com/user-attachments/assets/7b59db36-3e2d-4628-bedd-b27dfa3b1bc2)

This is a small MIDI controller designed to make it a bit easier to control a DAW. It won't really do anything on its own, but with a good input map it will be a nice extenison of the DAW interface (I can see it being used as a controller for a few audio channels - the knobs could be used for gains, and the buttons could be channel parameters like mute, as well as a couple other things like playback controls).

## PCB

I'm pretty happy with how the PCB turned out for this. This is the first PCB that I'm actually getting made, and it's also the most complicated one that I've designed by far. I tried to keep things pretty neat, and I managed to keep everything reasonably compact while still keeping pretty much everything I could through-hole, which I'm much more comfortable with soldering.

![PCB Schematic](https://github.com/user-attachments/assets/5df3af07-ee74-4963-803d-1f5e063a1c76)

![PCB Layout](https://github.com/user-attachments/assets/08c3af90-4070-4fa1-94d4-e2376163b0e2)

## Firmware

The firmware for the DawPad is built in Arduino, using the [Control-Surface](https://tttapa.github.io/Control-Surface/Doxygen/index.html) library for MIDI functionality. At the moment, it likely doesn't really work at all, but a lot of the (likely) broken stuff is related to the I/O expander, which I can't really debug without the actual hardware. Some more detailed information about building this can be found in the firmware README.

## Case

The case for the DawPad is designed in Onshape (you can find a link to the document in the CAD README). I don't really know what I'm doing when it comes to CAD, so it's definitely a bit messy, but it should work. The case is designed to be 3D printed, and is bolted together with a couple M3 screws.

![image](https://github.com/user-attachments/assets/a7793793-4ef6-4b50-baef-528941c3cd3b)

## BOM

Here's the components needed to make this.

* 1x XIAO RP2040
* 1x MCP23017
* 12x 1N4148 DO-35 Diodes
* 2x 4.7k THT Resistor
* 12x Cherry MX switches
* 4x EC11 Rotary Encoder (preferably one without detents and with a reasonably high resolution)
* 4x SK6812 MINI (regular mount)
* 12x SK6812 MINI-E (reverse mount)
3 changes: 3 additions & 0 deletions hackpads/dawpad/cad/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# DawPad CAD

I designed the case for the DawPad in Onshape, which you can find [here](https://cad.onshape.com/documents/c7175c5f1a4ca0cb72624a5c/w/6e2b9db7ac4b4769267f0874/e/2397240a351e4ca483ae7554?renderMode=0&uiState=67bdc28b9c552b495ee51c69).
10,831 changes: 10,831 additions & 0 deletions hackpads/dawpad/cad/components/pcb.step

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions hackpads/dawpad/firmware/Control-Surface/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# EditorConfig is awesome: https://EditorConfig.org

# top-most EditorConfig file
root = true

[*.ino]
indent_style = space
indent_size = 2
140 changes: 140 additions & 0 deletions hackpads/dawpad/firmware/Control-Surface/Control-Surface.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
#include <Control_Surface.h>
#include <AH/Arduino-Wrapper.h>
#include <AH/Hardware/ExtendedInputOutput/ExtendedInputOutput.hpp>
#include <AH/Hardware/RegisterEncoders.hpp>
#include <Adafruit_MCP23X17.h>
#include <Adafruit_NeoPixel.h>

// MCP configuration
const int MCP_PIN_INTA = 7;
const int MCP_PIN_INTB = 7;

// Encoder pins [A, B]
const int ENCODER_COUNT = 4;
const int ENCODER_PINS[ENCODER_COUNT][2] = {
{0, 1},
{2, 3},
{4, 5},
{6, 7},
};

// Key matrix
const int MATRIX_ROW_COUNT = 3;
const int MATRIX_COL_COUNT = 4;
const int MATRIX_ROWS[MATRIX_ROW_COUNT] = {
8,
9,
10,
};
const int MATRIX_COLS[MATRIX_COL_COUNT] = {
11,
12,
13,
14,
};
const MIDIAddress BUTTON_ADDRESSES[3][4] {
{
{MIDI_Notes::A[0], Channel_1},
{MIDI_Notes::B[0], Channel_1},
{MIDI_Notes::C[0], Channel_1},
{MIDI_Notes::D[0], Channel_1},
},
{
{MIDI_Notes::E[0], Channel_1},
{MIDI_Notes::F[0], Channel_1},
{MIDI_Notes::G[0], Channel_1},
{MIDI_Notes::A[1], Channel_1},
},
{
{MIDI_Notes::B[1], Channel_1},
{MIDI_Notes::C[1], Channel_1},
{MIDI_Notes::D[1], Channel_1},
{MIDI_Notes::E[1], Channel_1},
},
};

// Encoder switch pins
const int ENCODER_SW_PINS[4] = {
0,
1,
2,
3,
};

// LED configuration
const int LED_COUNT = 16;
const int LED_PIN = 6;

//////////

// MIDI interface
USBMIDI_Interface midi;

// Hardware objects
Adafruit_MCP23X17 mcp;
Adafruit_NeoPixel pixels(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

// Encoders
using RegisterEncoderType = RegisterEncoders<uint16_t, 4, int32_t, false>;

RegisterEncoderType encs;

void setup() {
// Set up LEDs
pixels.begin();

// Set up the MCP
if (!mcp.begin_I2C()) {
// If I2C setup failed, flash the first knob red forever.
while (true) {
pixels.setPixelColor(0, pixels.Color(255, 0, 0));
pixels.show();
delay(1000);

pixels.setPixelColor(0, pixels.Color(0, 0, 0));
pixels.show();
delay(1000);
}
}

mcp.setupInterrupts(false, false, LOW);

// Set up the MCP interrupt pins
pinMode(MCP_PIN_INTA, INPUT);
pinMode(MCP_PIN_INTB, INPUT);

// Set up the encoder pins
for (int encoderIndex = 0; encoderIndex < ENCODER_COUNT; encoderIndex++) {
for (int pinIndex = 0; pinIndex <= 1; pinIndex++) {
int pin = ENCODER_PINS[encoderIndex][pinIndex];
mcp.pinMode(pin, INPUT_PULLUP);
mcp.setupInterruptPin(pin, CHANGE);
}
}
}

void loop() {
// Read from encoders
if (!digitalRead(MCP_PIN_INTA)) {
encs.update(mcp.getCapturedInterrupt());
delay(100); // Debounce
mcp.clearInterrupts();
}

for (uint8_t row = 0; row < MATRIX_ROW_COUNT; row++) {
mcp.digitalWrite(MATRIX_ROWS[row], HIGH);

if (!digitalRead(MCP_PIN_INTB)) {
uint16_t pins = mcp.getCapturedInterrupt();

for (uint8_t col = 0; col < MATRIX_COL_COUNT; col++) {
if (pins & (1 << MATRIX_COLS[col])) {
midi.sendNoteOn(BUTTON_ADDRESSES[row][col], 0x7F);
}
}
}

mcp.digitalWrite(row, LOW);
mcp.clearInterrupts();
}
}
9 changes: 9 additions & 0 deletions hackpads/dawpad/firmware/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# DawPad Firmware

The firmware for the DawPad is built in Arduino, using the [Control-Surface](https://tttapa.github.io/Control-Surface/Doxygen/index.html) library for MIDI functionality.

Dependencies

* [Control-Surface](https://tttapa.github.io/Control-Surface/Doxygen/index.html)
* [Adafruit Neopixel](https://github.com/adafruit/Adafruit_NeoPixel)
* [Adafruit MCP23017](https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library)
Loading