「ここからはじめる自作キーボード」で脱線してLチカをしてみた

## はじめに

自作キーボードおもしろそうだなと思い「ここからはじめる自作キーボード」を買ったんですが、はや1年経ってしまっていたので、最近つくりはじめました。

https://shop.yushakobo.jp/products/a0900kj-00-1

付属の本を見ながら進めていたところ、「第2章 環境構築」の「試しにファームウェアを書き込んでみましょう」のところで楽しくなってしまい、脱線してLチカをしてみました。

この記事では環境構築からLチカできたところまでを記事にします。

## 環境構築

- 環境
    - Arch Linux（EndeavourOS）
    - qmk-cli 1.1.2

付属の本では [qmk_firmware](https://github.com/qmk/qmk_firmware) リポジトリをクローンしてきてましたが、QMKの公式ドキュメントを眺めたりして、 [qmk_cli](https://github.com/qmk/qmk_cli) を使って進めることにしました。

https://docs.qmk.fm/#/newbs_getting_started

```
$ sudo pacman --needed --noconfirm -S git python-pip libffi
$ sudo pacman -S qmk
```

付属の本に記載されてる、

```
$ make hifumi:test
$ make hifumi:test:avrdude
```

はqmk_cliでは以下のようになります。

```
$ qmk compile --keyboard hifumi --keymap test
$ qmk flash --keyboard hifumi --keymap test
```

ファームウェアを書き込んだら、`lsusb`してどんな表示になってるか確認しました。

```
$ lsusb --verbose
(snip)
Bus 001 Device 011: ID feed:3060 riconken hifumi
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
(snip)
```

うおおおーーー、アツいですね

## Lチカもしてみたくなってやってみた

これだけじゃもの足りず、Lチカもやってみようと思い調べながらやってみました。（脱線しだした）

とりあえず、新しくキーマップを用意して、test用のキーマップファイルをコピーしました。

```
$ qmk new-keymap --keyboard hifumi --keymap led-flash-test
$ cp ~/qmk_firmware/keyboards/hifumi/keymaps/test/keymap.c ~/qmk_firmware/keyboards/hifumi/keymaps/led-flash-test/keymap.c
```

そして、Lチカをするために調べた感じ、

- `RX`, `TX`のLEDを制御できると良さそう
    - `B0`, `D5`のポート（？）をLow/Highにするとオンオフできる
- `matrix_init_user`, `matrix_scan_user`関数でLow/Highを書き込めると良さそう
    - キーが押されているかの状態確認をループしており、その確認のタイミングに任意のコードを書ける

ができると良さそうでした。
それをもとに実装したのが以下です。

```c:~/qmk_firmware/keyboards/hifumi/keymaps/led-flash-test/keymap.c
// (snip)

#define RX_LED B0
#define TX_LED D5

static void control_led(int pin, bool turn_on) {
    setPinOutput(pin);
    if (turn_on) {
        writePinLow(pin);
    } else {
        writePinHigh(pin);
    }
}

void matrix_init_user(void) {
    control_led(RX_LED, false);
    control_led(TX_LED, false);
}
void matrix_scan_user(void) {
    static int counter = 0;
    static bool turn_on = false;
    counter++;

    if (counter > 5000) {
        counter = 0;

        if (turn_on) {
            control_led(RX_LED, false);
            control_led(TX_LED, false);
            turn_on = false;
        } else {
            control_led(RX_LED, true);
            control_led(TX_LED, true);
            turn_on = true;
        }
    }
}
```

これでファームウェアを書き込むと...

https://twitter.com/ohakutsu/status/1647198545328623616?s=20

Lチカできました！！

## さいごに

はんだ付けをしたのが中学生のころが最後で不安しかないですが、がんばります。

## Refs

- [Pro Micro - Self-Made Keyboards in  Japan | Scrapbox](https://scrapbox.io/self-made-kbds-ja/Pro_Micro)
- [Understanding QMK | QMK Firmware](https://docs.qmk.fm/#/understanding_qmk)
- [Customizing Functionality | QMK Firmware](https://docs.qmk.fm/#/custom_quantum_functions)
- [QMK use TX/RX led as Layer indicator? : r/olkb | reddit](https://www.reddit.com/r/olkb/comments/ftwnio/qmk_use_txrx_led_as_layer_indicator/)
- [試行錯誤な日々: ProMicroでLチカする方法](https://asukiaaa.blogspot.com/2019/05/promicrol.html)
- [マイコンモジュール 「PM32U4」(Pro Micro クローン，ATmega32U4) を使う](https://make.kosakalab.com/make/electronic-work/aitendo-pm32u4/)
- [ErgoDoxにLCDをつけてみた話 | PICMAN::Blog](https://picman.dev/blog/2018/11/19/ergodox_attached_lcd/)