Add The Mad Noodle Udon13 (#22704)
Co-authored-by: Joel Challis <git@zvecr.com> Co-authored-by: jack <0x6a73@protonmail.com> Co-authored-by: Sergey Vlasov <sigprof@gmail.com>master
parent
33c5a64b5a
commit
114a43e1ea
|
@ -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
|
Loading…
Reference in New Issue