QMKファームウェア書き込み時にリセットボタン2連打が必要なProMicroの挙動

Detecting USB port, reset your controller now......... と表示されたときにリセットボタンを1回押すと

Device /dev/ttyACM0 has appeared; assuming it is the controller.
Waiting for /dev/ttyACM0 to become writable.

と表示される。リセットボタンを2連打すると通常通り書き込みが走る。

一度書き込んだあとはリセットボタンは1回押しで書き込めるようになる。

aptでインストールしたPythonでvirtualenvwrapperを使う

virtualenvwrapper.shがない

$HOME/.local/bin/virtualenvwrapper.shにある

source $HOME/.local/bin/virtualenvwrapper.shするとエラーメッセージが出る

sourceする前に以下を実行

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel

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

  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 ってのがあるらしくて, こっちで実装するといいかも。

いいところ

悪いところ