パンダスルーホール ビルドガイド

  1. 抵抗とコンデンサを取り付ける
  2. TRRSジャックを取り付ける
  3. LEDを取り付ける
  4. スライドスイッチを取り付ける
  5. ICソケットを取り付ける
    • MCP23017を取り付けて全てのキーが反応するか動作確認する
  6. スイッチソケットを取り付ける
    • 片側に予備ハンダする
    • ソケットを乗せてはんだを温める
    • 反対側の端子を温めながら内側からハンダを流し込む
      • 十分にはんだを流し込むと基板上のパッドを伝ってこて先にはんだが付く
    • 動作確認する
  7. ゴム足を付ける

写真

f:id:y_sanagi:20190308151054j:plain
TRRSジャックとコンデンサ・抵抗を載せた状態

f:id:y_sanagi:20190308152600j:plain
スライドスイッチを付けた状態

f:id:y_sanagi:20190308152627j:plain

f:id:y_sanagi:20190308152722j:plain

f:id:y_sanagi:20190308164801j:plain
完成してしまったあと

知識ゼロでMCP23017を使う

動機

ライブラリを使うだけの空きメモリがなかった

方法

github.com

結果

  • レジスタIOCON.BANKの値によってレジスタのアドレスが変わるようだが, IOCON.BANKの初期値は0なのでそれで考えればいい
  • bufferにレジスタのアドレスと値を代入してwriteする
  • レジスタの値を読み出すときは, レジスタのアドレス(1バイト)をwriteしてからreadする
  • ピンの読み出しも「ピンの値を保持したレジスタを読み出す」形である。単にreadするだけではない。

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機が必要である。