@ -0,0 +1,6 @@ | |||||
// Copyright 2023 Jesse Leventhal (@The=Mad-Noodle) | |||||
// SPDX-License-Identifier: GPL-2.0-or-later | |||||
#pragma once | |||||
#define RGBLIGHT_DEFAULT_MODE RGBLIGHT_MODE_RAINBOW_SWIRL + 5 |
@ -0,0 +1,75 @@ | |||||
{ | |||||
"manufacturer": "The Mad Noodle", | |||||
"keyboard_name": "Udon13", | |||||
"maintainer": "The-Mad-Noodle", | |||||
"url": "https://www.madnoodleprototypes.com/", | |||||
"bootloader": "atmel-dfu", | |||||
"diode_direction": "ROW2COL", | |||||
"features": { | |||||
"bootmagic": true, | |||||
"command": false, | |||||
"console": false, | |||||
"extrakey": true, | |||||
"encoder": true, | |||||
"mousekey": true, | |||||
"nkro": true, | |||||
"rgblight": true, | |||||
"oled": true | |||||
}, | |||||
"rgblight": { | |||||
"hue_steps": 10, | |||||
"led_count": 6, | |||||
"sleep": true, | |||||
"animations": { | |||||
"breathing": true, | |||||
"rainbow_mood": true, | |||||
"rainbow_swirl": true, | |||||
"snake": true, | |||||
"knight": true, | |||||
"christmas": true, | |||||
"static_gradient": true, | |||||
"rgb_test": true, | |||||
"alternating": true, | |||||
"twinkle": true | |||||
} | |||||
}, | |||||
"ws2812": { | |||||
"pin": "B7" | |||||
}, | |||||
"matrix_pins": { | |||||
"cols": ["F0", "F5", "F4", "F6"], | |||||
"rows": ["F7", "F1", "D6", "D7"] | |||||
}, | |||||
"processor": "atmega32u4", | |||||
"usb": { | |||||
"device_version": "1.0.0", | |||||
"pid": "0x0012", | |||||
"vid": "0x6A6C" | |||||
}, | |||||
"layouts": { | |||||
"LAYOUT": { | |||||
"layout": [ | |||||
{"label":"Encoder", "x":3, "y":0, "matrix": [0,3]}, | |||||
{"x":0, "y":1, "matrix": [1,0]}, | |||||
{"x":1, "y":1, "matrix": [1,1]}, | |||||
{"x":2, "y":1, "matrix": [1,2]}, | |||||
{"x":3, "y":1, "matrix": [1,3]}, | |||||
{"x":0, "y":2, "matrix": [2,0]}, | |||||
{"x":1, "y":2, "matrix": [2,1]}, | |||||
{"x":2, "y":2, "matrix": [2,2]}, | |||||
{"x":3, "y":2, "matrix": [2,3]}, | |||||
{"x":0, "y":3, "matrix": [3,0]}, | |||||
{"x":1, "y":3, "matrix": [3,1]}, | |||||
{"x":2, "y":3, "matrix": [3,2]}, | |||||
{"x":3, "y":3, "matrix": [3,3]} | |||||
] | |||||
} | |||||
}, | |||||
"encoder": { | |||||
"rotary": [ | |||||
{ "pin_a": "B6", "pin_b": "B5" } | |||||
] | |||||
} | |||||
} |
@ -0,0 +1,52 @@ | |||||
// Copyright 2023 The Mad Noodle(@the_mad_noodle) | |||||
// SPDX-License-Identifier: GPL-2.0-or-later | |||||
#include QMK_KEYBOARD_H | |||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||||
/*Layer 0*/ | |||||
[0] = LAYOUT( | |||||
KC_MUTE, | |||||
KC_MPLY, KC_MPRV, KC_MNXT, KC_MSEL, | |||||
KC_UNDO, KC_CALC, KC_MAIL, KC_MYCM, | |||||
KC_COPY, KC_CUT, KC_PSTE, TO(3) | |||||
), | |||||
/*Layer 1*/ | |||||
[1] = LAYOUT( | |||||
RGB_TOG, | |||||
RGB_SAD, RGB_SAI, RGB_HUD, RGB_HUI, | |||||
RGB_MOD, RGB_RMOD, RGB_M_P, RGB_M_B, | |||||
RGB_M_SW, RGB_SPD, RGB_SPI, TO(0) | |||||
), | |||||
/*Layer 2*/ | |||||
[2] = LAYOUT( | |||||
KC_NO, | |||||
KC_NO, KC_NO, KC_NO, KC_NO, | |||||
KC_NO, KC_NO, KC_NO, KC_NO, | |||||
KC_NO, KC_NO, KC_NO, TO(0) | |||||
), | |||||
/*Layer 3*/ | |||||
[3] = LAYOUT( | |||||
KC_NO, | |||||
TO(1), TO(2), KC_NO, KC_NO, | |||||
KC_NO, KC_NO, KC_NO, KC_NO, | |||||
KC_NO, KC_NO, KC_NO, TO(0) | |||||
), | |||||
}; | |||||
/*Encoder Mapping*/ | |||||
#if defined(ENCODER_MAP_ENABLE) | |||||
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { | |||||
[0] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, | |||||
[1] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, | |||||
[2] = { ENCODER_CCW_CW(KC_LEFT, KC_RGHT)}, | |||||
[3] = { ENCODER_CCW_CW(KC_DOWN, KC_UP)}, | |||||
}; | |||||
#endif |
@ -0,0 +1,2 @@ | |||||
ENCODER_MAP_ENABLE = yes | |||||
LTO_ENABLE = yes |
@ -0,0 +1,52 @@ | |||||
// Copyright 2023 The Mad Noodle(@the_mad_noodle) | |||||
// SPDX-License-Identifier: GPL-2.0-or-later | |||||
#include QMK_KEYBOARD_H | |||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||||
/*Layer 0*/ | |||||
[0] = LAYOUT( | |||||
KC_MUTE, | |||||
KC_MPLY, KC_MPRV, KC_MNXT, KC_MSEL, | |||||
KC_UNDO, KC_CALC, KC_MAIL, KC_MYCM, | |||||
KC_COPY, KC_CUT, KC_PSTE, TO(3) | |||||
), | |||||
/*Layer 1*/ | |||||
[1] = LAYOUT( | |||||
RGB_TOG, | |||||
RGB_SAD, RGB_SAI, RGB_HUD, RGB_HUI, | |||||
RGB_MOD, RGB_RMOD, RGB_M_P, RGB_M_B, | |||||
RGB_M_SW, RGB_SPD, RGB_SPI, TO(0) | |||||
), | |||||
/*Layer 2*/ | |||||
[2] = LAYOUT( | |||||
KC_NO, | |||||
KC_NO, KC_NO, KC_NO, KC_NO, | |||||
KC_NO, KC_NO, KC_NO, KC_NO, | |||||
KC_NO, KC_NO, KC_NO, TO(0) | |||||
), | |||||
/*Layer 3*/ | |||||
[3] = LAYOUT( | |||||
KC_NO, | |||||
TO(1), TO(2), KC_NO, KC_NO, | |||||
KC_NO, KC_NO, KC_NO, KC_NO, | |||||
KC_NO, KC_NO, KC_NO, TO(0) | |||||
), | |||||
}; | |||||
/*Encoder Mapping*/ | |||||
#if defined(ENCODER_MAP_ENABLE) | |||||
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { | |||||
[0] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, | |||||
[1] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, | |||||
[2] = { ENCODER_CCW_CW(KC_LEFT, KC_RGHT)}, | |||||
[3] = { ENCODER_CCW_CW(KC_DOWN, KC_UP)}, | |||||
}; | |||||
#endif |
@ -0,0 +1,3 @@ | |||||
ENCODER_MAP_ENABLE = yes | |||||
LTO_ENABLE = yes | |||||
VIA_ENABLE = yes |
@ -0,0 +1,27 @@ | |||||
# Udon:13 | |||||
![Udon13](https://i.imgur.com/DppYeTCh.jpg) | |||||
*The Udon:13 is a 12 hotswap key macro keypad with a push button encoder knob and 128x32 OLED display* | |||||
* Keyboard Maintainer: [The Mad Noodle](https://github.com/The-Mad-Noodle) | |||||
* Hardware Supported: Udon:13 PCB | |||||
* Hardware Availability: https://www.madnoodleprototypes.com/shop | |||||
Compile example for this keyboard (after setting up your build environment): | |||||
qmk compile -kb themadnoodle/udon13 -km default | |||||
Flashing example for this keyboard: | |||||
qmk flash -kb themadnoodle/udon13 -km default | |||||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). | |||||
## Bootloader & Flashing | |||||
**Physical reset button**: | |||||
* Press the physical button located on the top left of the back of the PCB (Labeled RST) to enter Bootloader Mode |
@ -0,0 +1 @@ | |||||
# This file intentionally left blank |
@ -0,0 +1,76 @@ | |||||
// Copyright 2023 The Mad Noodle(@the_mad_noodle) | |||||
// SPDX-License-Identifier: GPL-2.0-or-later | |||||
#include "quantum.h" | |||||
#ifdef OLED_ENABLE | |||||
/* OLED Settings */ | |||||
//------------------------------------------------------------------------------------------------ | |||||
static void render_logo(void) { // Render Mad Noodle logo | |||||
static const char PROGMEM logo_1[] = {0x00, 0x00, 0x80, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x04, 0x06, 0x82, 0xc3, 0x43, 0x61, 0xa1, 0xa1, 0xa1, 0xa1, 0x61, 0x43, 0xc3, 0x82, 0x06, 0x04, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00}; | |||||
static const char PROGMEM logo_2[] = {0xf8, 0x1e, 0xc3, 0xf8, 0x5c, 0x76, 0x7b, 0x6d, 0x75, 0x55, 0x55, 0x75, 0x6d, 0x7b, 0x76, 0x5e, 0x7e, 0x77, 0x5b, 0x6d, 0x75, 0x55, 0x55, 0x75, 0x4d, 0x7b, 0x66, 0x5c, 0xf0, 0xc3, 0x3e, 0xf0}; | |||||
static const char PROGMEM logo_3[] = {0x1f, 0x78, 0xc1, 0x0f, 0x38, 0xe0, 0xc0, 0x00, 0x00, 0x02, 0x0e, 0x0e, 0x8e, 0xc6, 0xc0, 0x40, 0x40, 0xc0, 0xc6, 0x8e, 0x0e, 0x0e, 0x02, 0x00, 0x80, 0xc0, 0x60, 0x38, 0x0f, 0xc0, 0x7c, 0x0f}; | |||||
static const char PROGMEM logo_4[] = {0x00, 0x00, 0x01, 0x03, 0x06, 0x0c, 0x18, 0x31, 0x23, 0x66, 0x44, 0x44, 0xc4, 0xc4, 0x84, 0x84, 0x84, 0x84, 0xc4, 0xc4, 0x44, 0x46, 0x66, 0x23, 0x11, 0x18, 0x0c, 0x06, 0x03, 0x00, 0x00, 0x00}; | |||||
oled_set_cursor(0, 0); | |||||
oled_write_raw_P(logo_1, sizeof(logo_1)); | |||||
oled_set_cursor(0, 1); | |||||
oled_write_raw_P(logo_2, sizeof(logo_2)); | |||||
oled_set_cursor(0, 2); | |||||
oled_write_raw_P(logo_3, sizeof(logo_3)); | |||||
oled_set_cursor(0, 3); | |||||
oled_write_raw_P(logo_4, sizeof(logo_4)); | |||||
} | |||||
//----------- | |||||
bool oled_task_kb(void) { | |||||
if (!oled_task_user()) { return false; } | |||||
render_logo(); | |||||
oled_set_cursor(7, 0); | |||||
oled_write_P(PSTR("The Mad Noodle"), false); | |||||
oled_set_cursor(7, 1); | |||||
oled_write_P(PSTR("Layer: "), false); | |||||
/* | |||||
To change LAYER NAMES displayed on the OLED ensure they are a total of 6 characters, including spaces. | |||||
Example: | |||||
--------------------------------------------------- | |||||
case 0: | |||||
oled_write_P(PSTR("Base "), false); | |||||
break; | |||||
--------------------------------------------------- | |||||
"B A S E *SPACE* *SPACE*" = 6 characters | |||||
This would change layer 0 to Base on the OLED | |||||
*/ | |||||
switch (get_highest_layer(layer_state)) { | |||||
case 0: | |||||
oled_write_P(PSTR("Zero "), false); | |||||
break; | |||||
case 1: | |||||
oled_write_P(PSTR("One "), false); | |||||
break; | |||||
case 2: | |||||
oled_write_P(PSTR("Two "), false); | |||||
break; | |||||
case 3: | |||||
oled_write_P(PSTR("Three "), false); | |||||
break; | |||||
default: | |||||
oled_write_P(PSTR("N/A "), false); | |||||
} | |||||
oled_set_cursor(7, 2); | |||||
oled_write_P(PSTR("Status: "), false); | |||||
oled_set_cursor(7, 3); | |||||
led_t led_state = host_keyboard_led_state(); | |||||
oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false); | |||||
oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false); | |||||
oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false); | |||||
return false; | |||||
} | |||||
#endif |