Ergodox EZに関する情報を未来の自分のためにまとめる。

  • これは何?
    • 回路図とファームウェアが公開されているキーボード
    • Teensy USB Development Board
    • Atmega32U4
    • 右手と左手が別れていて、間の通信はI2C
      • 物理的には4極ステレオケーブルで接続されている
      • 先端を1として、4がGND。回路図的には1からSCL, SDA, VCCだと思うのだけど未検証
      • VCCは5V
    • I2Cエキスパンダが両側についている

ソース

ビルドガイド https://github.com/qmk/qmk_firmware/blob/master/docs/BUILD_GUIDE.md :

$ cd /home/nishio/ergodox/qmk_firmware/keyboards/ergodox
$ make nishio

!2C関連 - keyboards/ergodox/ez/i2cmaster.h - keyboards/ergodox/ez/twimaster.c

回路図

ファーム読解

/*
 * Do keyboard routine jobs: scan mantrix, light LEDs, ...
 * This is repeatedly called as fast as possible.
 */
void keyboard_task(void)
{...
- 中で`matrix_scan();`を呼びまくっている
uint8_t matrix_scan(void)
{
    if (mcp23018_status) { // if there was an error
        if (++mcp23018_reset_loop == 0) {
            // since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
            // this will be approx bit more frequent than once per second
            print("trying to reset mcp23018\n");
            mcp23018_status = init_mcp23018();
            if (mcp23018_status) {
                print("left side not responding\n");
            } else {
                print("left side attached\n");
                ergodox_blink_all_leds();
            }
        }
    }
_delay_ms(50);
void init_7seg(void)
{
  ergodox_led_all_off();
  ergodox_led_all_set(LED_BRIGHTNESS_HI);
  i2c_init();
  ergodox_right_led_2_on();
  i2c_start(0x70);
  ergodox_right_led_3_on();
 
  i2c_write(0x21);
  i2c_stop();
  _delay_ms(10);
 
  i2c_start(0x70);
  i2c_write(0x81);
  i2c_stop();
  _delay_ms(10);
 
  i2c_start(0x70);
  i2c_write(0xEF);
  i2c_stop();
  _delay_ms(10);
  ergodox_right_led_1_on();
}
 
  • TRRS
    • グランドは正しそう
    • 枝付きバスは4つが4つに正しく導通していることを確認済み
      • TRRS順で緑黒緑黒、1と2にシールを貼って置いた
    • VCCとGNDだけLEDにつないだ状態でI2Cバスとして機能しなくなる
    • GNDは正しそう
      • VCCを3に指すとバスが機能しなくなる
      • 抜くと戻る
      • 2に指すと機能しなくなり、抜いても復活しない
      • 1に指すとバスが機能する
        • 一歩進んだ!
    • Raspiから蹴ってみて7セグは生きてることを確認済み
    • Raspiを左手キーボードに接続してi2cdetect -y 1して0x20にいることを確認済み
      • この時SDAが2である
      • それに合わせて配線して、i2cdetectで0x20と0x70が見つかることを確認済み

レジスタで直接LEDを操作

  • LED 1 ON
    • inline void ergodox_right_led_1_on(void) { DDRB |= (1<<5); PORTB |= (1<<5); }
  • LED 2
    • DDRB |= (1<<6); PORTB |= (1<<6);
  • LED 3
    • DDRB |= (1<<7); PORTB |= (1<<7);

ロジアナ