Ergodox
Ergodox EZに関する情報を未来の自分のためにまとめる。
これは何?
回路図とファームウェアが公開されているキーボード
Atmega32U4
右手と左手が別れていて、間の通信はI2C
物理的には4極ステレオケーブルで接続されている
先端を1として、4がGND。回路図的には1からSCL, SDA, VCCだと思うのだけど未検証
VCCは5V
I2Cエキスパンダが両側についている
ソース
code::
$ cd /home/nishio/ergodox/qmk_firmware/keyboards/ergodox
$ make nishio
!2C関連
keyboards/ergodox/ez/i2cmaster.h
keyboards/ergodox/ez/twimaster.c
回路図
僕が買ったErgodox EZの基板は2260
中を開けて確認した
中を開けるときは裏のシールを剥がす
ファーム読解
keyboard_task
code:c
/*
* Do keyboard routine jobs: scan mantrix, light LEDs, ...
* This is repeatedly called as fast as possible.
*/
void keyboard_task(void)
{...
中でmatrix_scan();を呼びまくっている
matrix_scan
左側のキーボードがつながってるかどうか接続を挑戦してみてる
code:c
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();
}
}
}
init_mcp23018
deleyのやりかた
code:c
_delay_ms(50);
デバッグコンソール
CDC
USBの上でR232Cが走る
デバッグコンソール
デバイスが見つからない
ソース読んだらhid = rawhid_open_only1(0, 0, 0xFF31, 0x0074);してreadしてる
これの実装はここにある
LEDデバッグ
ergodox_right_led_1_on();
ergodox_led_all_off();
ergodox_led_all_set(LED_BRIGHTNESS_HI);
右側のみ、通常接続では1が半分つく
ケーブルを抜くと1が消える
その後さしても戻らない
右側のみで起動して、ブレッドボードをさすと1が消える
code:c
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);
ロジアナ
1bitずれてる
ErgoDoxでマクロを使う - Qiita
💥🍣emojiキーを設定しよう🍣💥 - Qiita
I2C