LUFA MassStorage Bootloaderを使う

環境

開発者がすること

  1. ProMicroをArduino as ISPに繋ぐ

  2. cd qmk_firmware/lib/lufa/Bootloaders/MassStorage

  3. 40% Keyboards: Self Flashing Planck に沿ってmakefileを書き換える
MCU          = atmega32u4
ARCH         = AVR8
BOARD        = LEONARDO
F_CPU        = 16000000

FLASH_SIZE_KB         = 32
BOOT_SECTION_SIZE_KB  = 4
  1. BootloaderMassStorage.c を適切に書き換える
    • #if (BOARD == BOARD_LEONARDO) から#elif ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))までの間に書く
    • PORT がプルアップ, DDRが出力, PINが入力値を表す?(わかってないけど雰囲気で書き換えたら動いた)
    • 適当にビット演算して代入してください

col0がF4, row0がB1であり, ダイオードがcol2rowのときの例:

    #if (BOARD == BOARD_LEONARDO)
        PORTF |= (1 << 4); //F4を入力にしてプルアップ
        DDRB  |= (1 << 1); // Set pin B1 as low B1をGNDに
        PORTB &= ~(1 << 1);
        Delay_MS(25);

    JumpToApplication = ((PINF & (1 << 4)) != 0); //F4がfalseならブートローダーを起動
    /* Disable pull-up after the check has completed */
    PORTF &= ~(1 << 4);
  1. make
  2. Arduino as ISPでフューズビットを書き込み

Arduino as ISP/dev/ttyACM0 のとき

avrdude -p m32u4 -c avrisp -P /dev/ttyACM0 -b 19200 -e -v
avrdude -p m32u4 -c avrisp -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xff:m -U hfuse:w:0xd8:m -U efuse:w:0xc9:m -v
  1. Arduino as ISPブートローダーを転送
avrdude -p m32u4 -c avrisp -P comXXX -b 19200 -B 4 -U flash:w:"BootloaderMassStorage.hex" -v
  1. qmk_firmwaremake keyboard:keymap:flashbinとしてmake
    • FLASH.binができる
  2. ユーザーにFLASH.binを渡す

ユーザーがすること

  1. FLASH.binを受け取る
  2. 指定されたキーを押しながらキーボードを接続
    • LUFA BOOT として認識される

Ubuntu

  1. FLASH.binsudo dd if=FLASH.bin of=/dev/sdb seek=4 で転送(LUFA BOOT/dev/sdb1のとき)
  2. LUFA BOOT をアンマウントする

Windows

  1. FLASH.bin をドラッグ&ドロップする
  2. LUFA BOOT を「安全に取り外し」
  3. キーボードを抜いて再度接続する

まとめ

Ubuntuドラッグ&ドロップで転送する方法を見つけられなかったのが悔しい。

ツールをインストールすることなくOS標準のコマンドで転送できるだけで価値があると思う。

.binを作るWebアプリを誰か作ってください(他力本願)

参考

Ubuntuでmbedファームウェアを更新する方法 | Mbed

キーボードファームウェアのCircuitPythonによる実装の進捗

  • M0機ではI2Cライブラリを導入すると40キー分の配列を持つことすらできないことが判明した
    • この容量で一体何をプログラミングできるのか……
  • M4機(ItsyBitsy M4)の見積もりを依頼した

ところで

MakeCode ってのがあるらしくて, こっちで実装するといいかも。

いいところ

悪いところ

CircuitPythonでキーボードのファームウェアを書く問題点

机上の空論だが

  • インタプリタ言語である
    • サイズが大きくなる
      • Expressでないボードは記憶領域が100kBもない
      • コメントを書くことが制限されるかもしれない
      • 自力で必要なモジュールを選びとる必要がある
    • コンパイル時にエラーを発見することができない
      • エラー内容を見るにはシリアルコンソールが必要
      • RGB LEDを見ればエラーのタイプはわかるが……
  • CircuitPythonのライブラリに依存する
    • 音量調整キーなどの特殊なキーに対応していないかもしれない(未確認)

案ずるより生むが易し!!!

CircuitPythonで制御するキーボードを作りたい

なぜ

  • 接続するとストレージとして認識されるからコードをドラッグ&ドロップするだけで動作させられる
    • 環境構築が不要
    • キーマップの変更がとても簡単になる

実験に必要なもの

本番に必要なもの

  • 基板×2
  • ICソケット×2
  • TRRSジャック×4
  • TRRSケーブル×2
  • Kailhスイッチソケット×40
  • スイッチ×40

まとめ

  • とりあえず一体型キーボードでファームウェアを開発すればいいのでは
  • IOエクスパンダを買ってきてくれると喜びます

追記(2019/02/05)

Trinket M0でLSFT_T, LCTL_Tを実装したあとTAP_DANCEを実装しようとしたらメモリ不足でエラーになった。M4機が必要である。

キーボード部品のコスト

キーボードを自作するときに何に金がかかっているのか気になったので

市販品との違い

  • 基板が剥き出し
  • 光らない
  • 小指外側のキーがない

キーボードのスペック

  • 分割型
  • 40キー
  • 基板サイズ100mm×100mm
  • トッププレート・ボトムプレートなし
  • Kailh Lowprofileスイッチ
  • ソケット使用

コスト(送料含まず)

品名 単価 数量 価格 店名
基板 220 2 440 FusionPCB
キースイッチ 48 40 1920 遊舎工房
キーキャップ 30 40 1200 遊舎工房
ソケット 15 40 600 遊舎工房
ProMicro・スプリングピンヘッダ 1000 2 2000 遊舎工房
リセットスイッチ 10 2 20 秋月
TRRSジャック 50 2 100 秋月
ダイオード 2 40 80 秋月
TRSケーブル 108 1 108 100均
ゴム足 8 23 183 Amazon
合計 6651
  • キースイッチとProMicroにお金がかかることがわかった
  • MX互換スイッチだとキーキャップがもっと高くなりそう