|
|
|
|
REMAPファームウェア | キー定義に Remap や VIA が使える。 |
Full版ファームウェア | キー定義に専用の Keyboard Quantizer Config Generator を使用する。REMAPや VIAには非対応。 |
機能 | GPIO | 備考 | |
USB HOST | D+=GPIO 10、 D-=GPIO 11 | Pico-PIO-USB | USB A Female |
I2C OLED | SDA=GPIO 28、 SCL=GPIO 29 | I2C0 | I2C SSD1306 72x40 0.42' |
Audio Piezo Buzzer | GPIO 17 | PWM0 B | SMD Piezo Buzzer |
WS2812 RGB LED | GPIO 16 | PIO、RP2040-Zeroに実装済み | RGB LED |
![]() Waveshare RP2040-Zero 高性能ピコライクMCUボード Raspberry PiマイクロコントローラーRP2040 カステレーションモジュールでキャリアボードに直接はんだ付け可能 - 2個 ASIN: B0B2Z3YWB9 |
![]() Seeed Studio XIAO RP2040 マイクロコントローラー デュアルコア ARM Cortex M0+ プロセッサ Arduino、MicroPython、サーキットパイソンをサポートし、豊富なインターフェースを備えています。 ASIN: B09NNVNW7M |
![]() usb タイプb 変換 夏の楽しみUSBメスボード、ミニUSBタイプAメスソケットボード2.54mmピッチアダプタコネクタDIP 10個、電源用 ASIN: B0891125C6 |
![]() 660点 0603 SMD抵抗器キット 公差1% 1/10W 33値 1Ω~1MΩ SMDチップ抵抗器 抵抗セット 高精度 安定性能 ASIN: B0B5LVNSXV ※ 22Ωの抵抗が必要だから |
![]() GAOHOU 5個 0.42インチ 4ピン OLEDディスプレイ SSD1306 LCD IICインタフェースモジュール 白表示 ASIN: B0CDC6VSKC ※ I2C OLED SSD1306 |
Raspberry Pi Pico ラズベリーパイピコ
|
RP2040マイコンボードキット
|
USBコネクタDIP化キット (Aメス)
|
ムラタ表面実装圧電サウンダ(トランスデューサ/圧電スピーカ)
|
WaveShare RP2040-Zero-M
|
金属被膜抵抗器(小型品) 1/4W 22Ω±1%
|
1608(0603)チップ抵抗 22Ω
|
超小型 金属皮膜抵抗 1W22Ω (100本入)
|
cd git clone https://github.com/sekigon-gonnoc/qmk_firmware.git quantizer_mini --depth 1 -b quantizer_mini # Cloning into 'quantizer_mini/lib/Pico-PIO-USB'... # git@github.com: Permission denied (publickey). # fatal: Could not read from remote repository. # Please make sure you have the correct access rights and the repository exists. # fatal: clone of 'git@github.com:sekigon-gonnoc/Pico-PIO-USB.git' into submodule path 'quantizer_mini/lib/Pico-PIO-USB' failed # Failed to clone 'lib/Pico-PIO-USB' a second time, aborting # make: *** [Makefile:525: git-submodule] Error 1 # tmk_core/pico.mk:22: *** pico-sdk does not found at PICO_SDK_PATH. Please setup pico-sdk by `make git-submodule`.. Stop. # Failed to cloneのエラーになるので Pico-PIO-USBライブラリを手動で更新する cd cd quantizer_mini cd ./lib/ git clone https://github.com/sekigon-gonnoc/Pico-PIO-USB -b for-keyboard-quantizer cd .. # QMK Firmwareの初期設定 sudo ./util/qmk_install.sh qmk -V # if [ $? -ne 0 ]; then python3 -m pip install qmk PATH="$HOME/.local/bin:$PATH" # fi make git-submodule
pio_cfg.pin_dp = 4; を pio_cfg.pin_dp = 10; に書き換える。コマンドラインでサクッと書き換えたい場合は下記のコマンドを実行する。
sed -e "s/pio_cfg.pin_dp = 4;/pio_cfg.pin_dp = 10;/" -i keyboards/keyboard_quantizer/mini/mini.c grep pin_dp keyboards/keyboard_quantizer/mini/mini.c # pio_cfg.pin_dp = 10;
PICO_FLASH_SPI_CLKDIV = 8
# ファームウェアのビルド make keyboard_quantizer/mini:default:uf2 # fatal: No names found, cannot describe anything. が沢山出るが、無視して大丈夫。 気になる場合は git fetch --prune --unshallow を実行する。 もしくは git clone時の --depth 1を削除する。 # QMK Firmware kqrp-0.1.4 # Making keyboard_quantizer/mini with keymap default and target uf2 ... # Compiling: tmk_core/protocol/pico/usbd.c [OK] # Linking: .build/keyboard_quantizer_mini_default.elf [WARNINGS] # | # | Memory region Used Size Region Size %age Used # | FLASH: 89284 B 2 MB 4.26% # | RAM: 34056 B 256 KB 12.99% # | SCRATCH_X: 2 KB 4 KB 50.00% # | SCRATCH_Y: 0 GB 4 KB 0.00% # | # Creating binary load file for flashing: .build/keyboard_quantizer_mini_default.bin [OK] # Creating load file for flashing: .build/keyboard_quantizer_mini_default.hex [OK] # Creating UF2 file for deployment: .build/keyboard_quantizer_mini_default.uf2 [OK] # Converting to uf2, output size: 178688, start address: 0x10000000 # Wrote 178688 bytes to keyboard_quantizer_mini_default.uf2. ls -l *.uf2 # -rw-r--r-- 1 user user 178688 Aug 7 20:53 keyboard_quantizer_mini_default.uf2
# ファームウェアのビルド qmk compile -kb keyboard_quantizer/mini -km default qmk compileコマンドの場合、RP2040への書き込みに必要な uf2ファイルが生成されません。
"vendorId": "0xfeed", "productId": "0x9999", を "vendorId": "feed", "productId": "0x999B", に書き換える。config.h
/* key matrix size */ #define MATRIX_ROWS 24 #define MATRIX_COLS 8なので
"matrix": { "rows": 24, "cols": 8 },
LTO_ENABLE無し keyboard_quantizer_mini_default.uf2 194048 bytes LTO_ENABLE = yes # LINK_TIME_OPTIMIZATION_ENABLE = yes LTO_ENABLE = yes # Config Option Link Time Optimization keyboard_quantizer_mini_default.uf2 194048 bytes 194048 bytesで変化無し
OLED_ENABLE = yes # Display Feature OLED_DRIVER = SSD1306 # OLED SSD1306 128x32 #ifeq ($(strip $(OLED_ENABLE)), yes) # OLED_DRIVER_ENABLE = yes #endifkeyboards/keyboard_quantizer/mini/config.h
#pragma once /* * Display OLED SSD1306 */ #define OLED_DISPLAY_ADDRESS 0x3C #define OLED_BRIGHTNESS 128 #define OLED_IC OLED_IC_SSD1306 #define OLED_TIMEOUT 31000 // settings for the oled 72x40 0.42 #define OLED_DISPLAY_128X64 #define REAL_OLED_DISPLAY_WIDTH 72 #define REAL_OLED_DISPLAY_HEIGHT 40 #define REAL_OLED_COLUMN_OFFSET (28 - OLED_COLUMN_OFFSET) #define REAL_OLED_CURSOL_COL_OFFSET (REAL_OLED_COLUMN_OFFSET / OLED_FONT_WIDTH) #define OLED_UPDATE_INTERVAL 100 // RP2040 I2C I2C0 // settings for the oled keyboard demo with Adafruit 0.91" OLED display on the Stemma QT port #define I2C_DRIVER i2c0 #define I2C1_SDA 28 #define I2C1_SCL 29
#ifdef OLED_ENABLE static int iii = 0; static void test_logo(void) { uint8_t lines = oled_max_lines(); if (lines > 3) { lines = 3; } uint8_t chars = oled_max_chars(); if (chars > 21) { chars = 21; } for (uint8_t row = 0; row < lines; ++row) { oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, row); for (uint8_t col = 0; col < chars; ++col) { oled_write_char(0x80 + 0x20 * row + col, false); } } } oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_0; } void oled_task_user(void) { if (iii == 0) { oled_clear(); } if (iii == 10) { oled_clear(); test_logo(); oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 3); oled_write_P(PSTR("OLED 0.42'.."), false); oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 4); oled_write_P(PSTR(".......72x40"), false); } if (iii == 20) { oled_clear(); for (uint8_t y = 0; y < REAL_OLED_DISPLAY_HEIGHT; ++y) { for (uint8_t x = 0; x < REAL_OLED_DISPLAY_WIDTH; ++x) { oled_write_pixel(x + REAL_OLED_COLUMN_OFFSET, y, ((x/2 + y/2) & 1)); } } } if (iii == 30) { for (uint8_t y = 0; y < REAL_OLED_DISPLAY_HEIGHT; ++y) { for (uint8_t x = 0; x < REAL_OLED_DISPLAY_WIDTH; ++x) { oled_write_pixel(x + REAL_OLED_COLUMN_OFFSET, y, !((x/2 + y/2) & 1)); } } } if (iii == 40) { oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 0); oled_write_P(PSTR("QMK RP2040 !"), false); oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 1); oled_write_P(PSTR("FREE WING !!"), false); oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 2); oled_write_P(PSTR("123456789012"), false); oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 3); oled_write_P(PSTR("ABCDEFGHIJKL"), false); oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 4); oled_write_P(PSTR("#$%&'()=~|{}"), false); // Host Keyboard LED Status oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 4); led_t led_state = host_keyboard_led_state(); oled_write_P(led_state.num_lock ? PSTR("[Nm]") : PSTR("[ ]"), led_state.num_lock); oled_write_P(led_state.caps_lock ? PSTR("[Cp]") : PSTR("[ ]"), led_state.caps_lock); oled_write_P(led_state.scroll_lock ? PSTR("[Sc]") : PSTR("[ ]"), led_state.scroll_lock); } if (++iii > 50) iii = 10; return; } #endif※ QMKのファームウェアが古いので OLEDの関数が void oled_task_user(void)になっています。(最新の QMKのファームウェアは bool oled_task_user(void))
void oled_set_cursor(uint8_t col, uint8_t line) { uint16_t index = line * oled_rotation_width + col * OLED_FONT_WIDTH; を void oled_set_cursor(uint8_t col, uint8_t line) { line += 3; uint16_t index = line * oled_rotation_width + col * OLED_FONT_WIDTH; index += 4; に書き換える。drivers/oled/ssd1306_sh1106.c
void oled_write_pixel(uint8_t x, uint8_t y, bool on) { if (x >= oled_rotation_width) { return; } uint16_t index = x + (y / 8) * oled_rotation_width; を void oled_write_pixel(uint8_t x, uint8_t y, bool on) { if (x >= oled_rotation_width) { return; } y += 24; uint16_t index = x + (y / 8) * oled_rotation_width; に書き換える。
# Audio AUDIO_ENABLE = yes AUDIO_DRIVER = pwm_hardwareconfig.h
/* Audio support */ // https://github.com/qmk/qmk_firmware/blob/master/docs/feature_audio.md #ifdef AUDIO_ENABLE #define AUDIO_PIN 17 #define AUDIO_PWM_DRIVER PWMD0 #define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_B #define AUDIO_INIT_DELAY #define STARTUP_SONG SONG(M__NOTE(_C6, 30), M__NOTE(_D6, 30), M__NOTE(_E6, 30), M__NOTE(_F6, 30), M__NOTE(_G6, 30), M__NOTE(_A6, 30), M__NOTE(_B6, 30), M__NOTE(_C7, 30)) #define NO_MUSIC_MODE // ARM Audio Volume #define AUDIO_DAC_SAMPLE_MAX 4095U #endif
cd git clone https://github.com/sekigon-gonnoc/qmk_firmware.git quantizer_mini_full --depth 1 -b keyboard/sekigon/keyboard_quantizer/mini-full cd cd quantizer_mini_full # QMK Firmwareの初期設定 sudo ./util/qmk_install.sh qmk -V # if [ $? -ne 0 ]; then python3 -m pip install qmk PATH="$HOME/.local/bin:$PATH" # fi make git-submodule
pio_cfg.pin_dp = 4; を pio_cfg.pin_dp = 10; に書き換える。コマンドラインでサクッと書き換えたい場合は下記のコマンドを実行する。
sed -e "s/pio_cfg.pin_dp[ ]*= 4;/pio_cfg.pin_dp = 10;/" -i keyboards/sekigon/keyboard_quantizer/mini/c1_usbh.c grep pin_dp keyboards/sekigon/keyboard_quantizer/mini/c1_usbh.c # pio_cfg.pin_dp = 10;
# ファームウェアのビルド qmk compile -kb sekigon/keyboard_quantizer/mini -km full # Ψ Compiling keymap with make --jobs=1 sekigon/keyboard_quantizer/mini:full # Making sekigon/keyboard_quantizer/mini with keymap full ... # Linking: .build/sekigon_keyboard_quantizer_mini_full.elf [OK] # Creating UF2 file for deployment: .build/sekigon_keyboard_quantizer_mini_full.uf2 [OK] # Copying sekigon_keyboard_quantizer_mini_full.uf2 to qmk_firmware folder [OK] # (Firmware size check does not yet support RP2040; skipping) ls -l *.uf2 # -rw-r--r-- 1 user user 188928 Aug 14 13:31 sekigon_keyboard_quantizer_mini_full.uf2
# ファームウェアのビルド その2 make sekigon/keyboard_quantizer/mini:full:uf2 # Making sekigon/keyboard_quantizer/mini with keymap full and target uf2 ... # Linking: .build/sekigon_keyboard_quantizer_mini_full.elf [OK] # Creating UF2 file for deployment: .build/sekigon_keyboard_quantizer_mini_full.uf2 [OK]
# defaultのキーマップを元に VIA対応を作成する cd keyboards/sekigon/keyboard_quantizer/mini/keymaps/ cp -r default via ls -l # drwxr-xr-x 1 user user 4096 Aug 10 17:44 default # drwxr-xr-x 1 user user 4096 Aug 10 17:44 full # drwxr-xr-x 1 user user 4096 Aug 10 17:57 via cd ../../../../.. # VIAを有効にした rules.mkファイルを keyboards/sekigon/keyboard_quantizer/mini/keymaps/via/に作る echo "VIA_ENABLE = yes"> keyboards/sekigon/keyboard_quantizer/mini/keymaps/via/rules.mk rules.mk VIA_ENABLE = yes # -km viaで keymaps viaを指定してファームウェアをビルドする qmk compile -kb sekigon/keyboard_quantizer/mini -km via ls -l *.uf2 # -rw-r--r-- 1 user user 118272 Aug 14 18:02 sekigon_keyboard_quantizer_mini_via.uf2 # sekigon_keyboard_quantizer_mini_via.uf2ファイルを RP2040に書き込む 動作 OK!
"vendorId": "0xfeed", "productId": "0x9999", "lighting": "none", を "vendorId": "feed", "productId": "0x999B", に書き換える。で、「Use V2 definitions (deprecated)」をオフで VIA v3として読み込む事で VIA機能を使う事ができました。(同様に VIA.exe 3.0.0でも使用できました)
This firmware version is not supported
# keymaps viaに OLEDの定義を追加する cd keyboards/sekigon/keyboard_quantizer/mini/keymaps/via/rules.mk
# OLED SSD1306 OLED_ENABLE = yes OLED_DRIVER = SSD1306 OPT_DEFS += -DHAL_USE_I2C=TRUEmcuconf.h
#pragma once #include_next <mcuconf.h> #undef RP_I2C_USE_I2C0 #define RP_I2C_USE_I2C0 TRUE #undef RP_I2C_USE_I2C1 #define RP_I2C_USE_I2C1 FALSEconfig.h
#pragma once // https://github.com/qmk/qmk_firmware/blob/master/docs/feature_oled_driver.md // RP2040 I2C #define I2C_DRIVER I2CD0 #define I2C1_SDA_PIN GP28 #define I2C1_SCL_PIN GP29 // settings for the oled 72x40 0.42 #define OLED_DISPLAY_128X64 #define REAL_OLED_DISPLAY_WIDTH 72 #define REAL_OLED_DISPLAY_HEIGHT 40 // #define OLED_DISPLAY_WIDTH 72 // #define OLED_DISPLAY_HEIGHT 40 // #define OLED_COLUMN_OFFSET 4 #define REAL_OLED_COLUMN_OFFSET (28 - OLED_COLUMN_OFFSET) #define REAL_OLED_CURSOL_COL_OFFSET (REAL_OLED_COLUMN_OFFSET / OLED_FONT_WIDTH) #define OLED_UPDATE_INTERVAL 100keymap.c
#ifdef OLED_ENABLE // OLED RP2040 // Draw the QMK logo at the top left corner, clipping if it does not fit. static void test_logo(void) { uint8_t lines = oled_max_lines(); if (lines > 3) { lines = 3; } uint8_t chars = oled_max_chars(); if (chars > 21) { chars = 21; } for (uint8_t row = 0; row < lines; ++row) { oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, row); for (uint8_t col = 0; col < chars; ++col) { oled_write_char(0x80 + 0x20 * row + col, false); } } } oled_rotation_t oled_init_user(oled_rotation_t rotation) { // oled_scroll_set_area(0, 0); // oled_scroll_set_speed(scrolling_speed); return OLED_ROTATION_0; } //------------------------------------------------------------------------------ /** Set Lower Column Start Address for Page Addressing Mode. */ #define SSD1306_SETLOWCOLUMN 0x00 /** Set Higher Column Start Address for Page Addressing Mode. */ #define SSD1306_SETHIGHCOLUMN 0x10 /** Set Memory Addressing Mode. */ #define SSD1306_MEMORYMODE 0x20 /** Set display RAM display start line register from 0 - 63. */ #define SSD1306_SETSTARTLINE 0x40 /** Set Display Contrast to one of 256 steps. */ #define SSD1306_SETCONTRAST 0x81 /** Enable or disable charge pump. Follow with 0X14 enable, 0X10 disable. */ #define SSD1306_CHARGEPUMP 0x8D /** Set Segment Re-map between data column and the segment driver. */ #define SSD1306_SEGREMAP 0xA0 /** Resume display from GRAM content. */ #define SSD1306_DISPLAYALLON_RESUME 0xA4 /** Force display on regardless of GRAM content. */ #define SSD1306_DISPLAYALLON 0xA5 /** Set Normal Display. */ #define SSD1306_NORMALDISPLAY 0xA6 /** Set Inverse Display. */ #define SSD1306_INVERTDISPLAY 0xA7 /** Set Multiplex Ratio from 16 to 63. */ #define SSD1306_SETMULTIPLEX 0xA8 /** Set Display off. */ #define SSD1306_DISPLAYOFF 0xAE /** Set Display on. */ #define SSD1306_DISPLAYON 0xAF /**Set GDDRAM Page Start Address. */ #define SSD1306_SETSTARTPAGE 0XB0 /** Set COM output scan direction normal. */ #define SSD1306_COMSCANINC 0xC0 /** Set COM output scan direction reversed. */ #define SSD1306_COMSCANDEC 0xC8 /** Set Display Offset. */ #define SSD1306_SETDISPLAYOFFSET 0xD3 /** Sets COM signals pin configuration to match the OLED panel layout. */ #define SSD1306_SETCOMPINS 0xDA /** This command adjusts the VCOMH regulator output. */ #define SSD1306_SETVCOMDETECT 0xDB /** Set Display Clock Divide Ratio/ Oscillator Frequency. */ #define SSD1306_SETDISPLAYCLOCKDIV 0xD5 /** Set Pre-charge Period */ #define SSD1306_SETPRECHARGE 0xD9 /** Deactivate scroll */ #define SSD1306_DEACTIVATE_SCROLL 0x2E /** No Operation Command. */ #define SSD1306_NOP 0XE3 //------------------------------------------------------------------------------ /** Set Pump voltage value: (30H~33H) 6.4, 7.4, 8.0 (POR), 9.0. */ #define SH1106_SET_PUMP_VOLTAGE 0X30 /** First byte of set charge pump mode */ #define SH1106_SET_PUMP_MODE 0XAD /** Second byte charge pump on. */ #define SH1106_PUMP_ON 0X8B /** Second byte charge pump off. */ #define SH1106_PUMP_OFF 0X8A static int iii = 0; bool oled_task_user(void) { if (iii == 0) { // OLED SSD1306 72x40 0.42" static const uint8_t PROGMEM display_setup1[] = { 0x00, // I2C_CMD // SSD1306 SSD1306_DISPLAYOFF, SSD1306_SETDISPLAYCLOCKDIV, 0x80, // the suggested ratio 0x80 SSD1306_SETMULTIPLEX, 0x27, // (DISPLAYHEIGHT - 1) SSD1306_SETDISPLAYOFFSET, 0x0, // no offset 0x0ad, 0x010, /* Internal IREF Setting for the 0.42 OLED, see also issue https://github.com/olikraus/u8g2/issues/1047 */ SSD1306_CHARGEPUMP, 0x14, // internal vcc SSD1306_SETSTARTLINE, // line #0 SSD1306_NORMALDISPLAY, SSD1306_DISPLAYALLON_RESUME, SSD1306_MEMORYMODE, 0x00, SSD1306_SEGREMAP | 0x1, // column 127 mapped to SEG0 SSD1306_COMSCANDEC, // column scan direction reversed SSD1306_SETCOMPINS, 0x12, // 0x12 if height > 32 else 0x02 SSD1306_SETCONTRAST, 0x5F, // contrast level 127 SSD1306_SETPRECHARGE, 0x22, // pre-charge period (1, 15) SSD1306_SETVCOMDETECT, 0x20, // vcomh regulator level SSD1306_DISPLAYON }; if (!oled_send_cmd_P(display_setup1, ARRAY_SIZE(display_setup1))) { print("oled_init cmd set 1 failed\n"); return false; } oled_clear(); } if (iii == 10) { oled_clear(); test_logo(); oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 3); oled_write_P(PSTR("OLED 0.42'.."), false); oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 4); oled_write_P(PSTR(".......72x40"), false); } if (iii == 20) { oled_clear(); for (uint8_t y = 0; y < REAL_OLED_DISPLAY_HEIGHT; ++y) { for (uint8_t x = 0; x < REAL_OLED_DISPLAY_WIDTH; ++x) { oled_write_pixel(x + REAL_OLED_COLUMN_OFFSET, y, ((x/2 + y/2) & 1)); } } } if (iii == 30) { for (uint8_t y = 0; y < REAL_OLED_DISPLAY_HEIGHT; ++y) { for (uint8_t x = 0; x < REAL_OLED_DISPLAY_WIDTH; ++x) { oled_write_pixel(x + REAL_OLED_COLUMN_OFFSET, y, !((x/2 + y/2) & 1)); } } } if (iii == 40) { oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 0); oled_write_P(PSTR("QMK RP2040 !"), false); oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 1); oled_write_P(PSTR("FREE WING !!"), false); oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 2); oled_write_P(PSTR("123456789012"), false); oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 3); oled_write_P(PSTR("ABCDEFGHIJKL"), false); oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 4); oled_write_P(PSTR("#$%&'()=~|{}"), false); // Host Keyboard LED Status oled_set_cursor(0 + REAL_OLED_CURSOL_COL_OFFSET, 4); led_t led_state = host_keyboard_led_state(); oled_write_P(led_state.num_lock ? PSTR("[Nm]") : PSTR("[ ]"), led_state.num_lock); oled_write_P(led_state.caps_lock ? PSTR("[Cp]") : PSTR("[ ]"), led_state.caps_lock); oled_write_P(led_state.scroll_lock ? PSTR("[Sc]") : PSTR("[ ]"), led_state.scroll_lock); } if (++iii > 50) iii = 10; return false; } #endif
void oled_set_cursor(uint8_t col, uint8_t line) { uint16_t index = line * oled_rotation_width + col * OLED_FONT_WIDTH; を void oled_set_cursor(uint8_t col, uint8_t line) { uint16_t index = line * oled_rotation_width + col * OLED_FONT_WIDTH; index += 4; に書き換える。
# Audio AUDIO_ENABLE = yes AUDIO_DRIVER = pwm_hardwaremcuconf.h
#pragma once #include_next <mcuconf.h> #undef RP_PWM_USE_PWM0 #define RP_PWM_USE_PWM0 TRUEhalconf.h
#pragma once #define HAL_USE_PWM TRUE #include_next <halconf.h>config.h
#pragma once /* Audio support */ // https://github.com/qmk/qmk_firmware/blob/master/docs/feature_audio.md #ifdef AUDIO_ENABLE #define AUDIO_PIN GP17 #define AUDIO_PWM_DRIVER PWMD0 #define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_B #define AUDIO_INIT_DELAY #define STARTUP_SONG SONG(M__NOTE(_C6, 30), M__NOTE(_D6, 30), M__NOTE(_E6, 30), M__NOTE(_F6, 30), M__NOTE(_G6, 30), M__NOTE(_A6, 30), M__NOTE(_B6, 30), M__NOTE(_C7, 30)) #define NO_MUSIC_MODE // ARM Audio Volume #define AUDIO_DAC_SAMPLE_MAX 4095U #endif
# Audio AUDIO_ENABLE = yes AUDIO_DRIVER = pwm_hardware OPT_DEFS += -DHAL_USE_PWM=TRUE※ この場合、halconf.hは不要
# WS2812 RGB LED WS2812_DRIVER = vendor RGBLIGHT_ENABLE = yesmcuconf.h
#pragma once #include_next <mcuconf.h>config.h
#define WS2812_DI_PIN GP16 #ifdef WS2812_DI_PIN # define RGBLED_NUM 1 # define RGBLIGHT_HUE_STEP 8 # define RGBLIGHT_SAT_STEP 8 # define RGBLIGHT_VAL_STEP 8 # define RGBLIGHT_LIMIT_VAL 255 # define RGBLIGHT_SLEEP /*== all animations enable ==*/ # define RGBLIGHT_ANIMATIONS #endif #define RGBLIGHT_EFFECT_BREATHING #define RGBLIGHT_EFFECT_RAINBOW_MOOD #define RGBLIGHT_EFFECT_RAINBOW_SWIRL #define RGBLIGHT_EFFECT_SNAKE #define RGBLIGHT_EFFECT_KNIGHT #define RGBLIGHT_EFFECT_CHRISTMAS #define RGBLIGHT_EFFECT_STATIC_GRADIENT #define RGBLIGHT_EFFECT_RGB_TEST #define RGBLIGHT_EFFECT_ALTERNATING #define RGBLIGHT_EFFECT_TWINKLEkeymap.c
// https://github.com/qmk/qmk_firmware/blob/master/docs/feature_rgblight.md void keyboard_post_init_user(void) { rgblight_enable_noeeprom(); rgblight_sethsv_noeeprom(HSV_CYAN); // rgblight_mode_noeeprom(RGBLIGHT_MODE_RAINBOW_SWIRL); rgblight_mode_noeeprom(RGBLIGHT_MODE_RGB_TEST); }
error: 'WS2812_DI_PIN' undeclared error: 'RGB_DI_PIN' undeclared platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c:188:20: error: 'RGB_DI_PIN' undeclared (first use in this function); did you mean 'RGB_M_SN'? 188 | palSetLineMode(RGB_DI_PIN, rgb_pin_mode); チョイ前の QMKは RGB_DI_PINを使用する。 現在の QMKは WS2812_DI_PIN(or APA102_DI_PINや APA102_CI_PIN)を使用する。 #define WS2812_DI_PIN GP16 #define RGB_DI_PIN WS2812_DI_PINRGB Lighting
* POINTING_DEVICE_DRIVER= is not a valid pointing device type [ERRORS] POINTING_DEVICE_DRIVER = custom
fatal error: config_common.h: No such file or directory #include "config_common.h" ↓ #include "matrix.h" ./quantum/config_common.h ↓ ./quantum/matrix.h
users/sekigon/jp_us_overrides/jp_key_on_us_os_overrides.c fatal error: usb_host_os_identifier.h: No such file or directory #include "usb_host_os_identifier.h" ↓ #include "os_detection.h" ./quantum/usb_host_os_identifier.h ↓ ./quantum/os_detection.h rules.mk OS_DETECTION_ENABLE = yes #define OS_TYPE os_variant_t #define OS_TYPE_UNKNOWN OS_UNSURE #define OS_TYPE_WIN OS_WINDOWS #define OS_TYPE_MAC OS_MACOS #define OS_TYPE_LINUX OS_LINUX #define OS_TYPE_MAX OS_IOS
fatal error: keymap_jp.h: No such file or directory #include "keymap_jp.h" ↓ #include "keymap_japanese.h" ./quantum/keymap_extras/keymap_jp.h ↓ ./quantum/keymap_extras/keymap_japanese.h
quantum/keymap_extras/keymap_japanese.h:94:17: error: implicit declaration of function 'S' [-Werror=implicit-function-declaration] #define JP_EXLM S(JP_1) // ! #include "keymap_japanese.h" ↓ #include "quantum.h" #include "keymap_japanese.h"
error: 'KC_FN0' undeclared here (not in a function); did you mean 'KC_F20'? keycode.h /* Media and Function keys */ enum internal_special_keycodes { /* Fn keys */ KC_FN0 = 0xC0,
note: #pragma message: 'keymap.h' should no longer be included! #pragma message("'keymap.h' should no longer be included!") #include "keymap.h" ↓ #include "keycode_config.h" ./quantum/keymap.h ↓ ./quantum/keycode_config.h
error: 'keymap_config' undeclared (first use in this function) #include "keymap.h" ↓ #include "keycode_config.h"
error: implicit declaration of function 'get_usb_host_os_type'; did you mean 'pio_usb_host_stop'? get_usb_host_os_type() declares `os_variant_t detected_host_os(void);`
void pointing_device_task(void) { ... } ↓ bool pointing_device_task(void) { ... return false; }
error: 'KC_LCTRL' undeclared (first use in this function); did you mean 'KC_LCTL'? error: 'KEY_OVERRIDE_OFF' undeclared (first use in this function); did you mean 'QK_KEY_OVERRIDE_OFF'? error: 'CMB_ON' undeclared (first use in this function); did you mean 'CM_ON'? error: 'CMB_OFF' undeclared (first use in this function); did you mean 'CM_OFF'? error: 'CMB_TOG' undeclared (first use in this function); did you mean 'CM_TOGG'? KC_LCTRL -> KC_LEFT_CTRL KC_LCTL KEY_OVERRIDE_OFF -> QK_KEY_OVERRIDE_OFF CMB_ON -> CM_ON CMB_OFF -> CM_OFF CMB_TOG -> CM_TOGGkeycodes_basic.md
error: 'QK_BOOTLOADER' undeclared (first use in this function) error: 'QK_CLEAR_EEPROM' undeclared (first use in this function) error: 'MO_LAYER1' undeclared (first use in this function); QK_BOOTLOADER QK_BOOT QK_RESET QK_CLEAR_EEPROM EE_CLRquantum_keycodes.md
quantum/bitwise.h uint8_t biton(uint8_t bits); uint8_t biton16(uint16_t bits); uint8_t biton32(uint32_t bits); quantum/action_layer.h # define get_highest_layer(state) biton(state) # define get_highest_layer(state) biton16(state) # define get_highest_layer(state) biton32(state)
quantum/quantum_keycodes.h // Momentary switch layer - 256 layer max #define MO(layer) (QK_MOMENTARY | ((layer)&0xFF)) QK_MOMENTARY = 0x5100, QK_MOMENTARY_MAX = 0x51FF, // L-ayer, T-ap - 256 keycode max, 16 layer max #define LT(layer, kc) (QK_LAYER_TAP | (((layer)&0xF) << 8) | ((kc)&0xFF)) QK_LAYER_TAP = 0x4000, QK_LAYER_TAP_MAX = 0x4FFF,LT with Mod,Key #1730