しっぽをくるん

ぺらねこのにっき

QMKでロータリーエンコーダを利用する手順がわからない件が解決した件!!

すいません。

初っ端からアレですが自作キーボードのファームウエアを自力で書く記事です。

 

QMKの説明は省きます。

今回作成するキーボードの名前はTONE(トーンor利根)です。

 

本題です。

キーボードの論理レイアウトなのですが、こんなかんじです。

tone.hから引用

#define LAYOUT( \
    K00,K01,K02,K03,K04,K05,K06,K07,K08,K09 \
) \
{ \
    { K00,K01,K02,K03,K04,K05,K06,K07,K08,K09 }, \
}


上段 

 K00,K01,K02,K03,

下段

 K04,K05,K06,K07,

ロータリーエンコーダ

 K08,K09

定義したつもりです。

 

f:id:peraneko:20190428213931j:plain

keymap.cには下記のように定義しており、キースイッチは正常に入力できています。

const uint16_t PROGMEM keymaps[MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT(
    KC_A, KC_B, KC_C, KC_B,\
    KC_E, KC_F, KC_G, KC_H,\
    KC_0, KC_1 \
  ),
};

 

 

問題点

ロータリーエンコーダを回すと、KC_0, KC_1 が入力される。
KC_UP,KC_DOWNが入力したいのにできたりできなかったりする。無念。悲しい。

  

QMK Firmware
コレがオフィシャルのロータリーエンコーダを使う場合の説明なんですけど、この通りにしているつもりが、動かないのです。

 

ロータリーエンコーダを使うために変更した場所
rules.mkに下記の記述を追加

#define ENCODER_RESOLUTION 4
ENCODER_ENABLE = yes 

 

config.hにはこのように記述しています。

#define MATRIX_ROW_PINS { NO_PIN }
#define MATRIX_COL_PINS { F6,F7,B1,B3,D4,C6,D7,E6,B4,B5 }
/*#define UNUSED_PINS*/

/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW

#define NUMBER_OF_ENCODERS 1
#define ENCODERS_PAD_A { B4 }
#define ENCODERS_PAD_B { B5 }

 

B4とB5がロータリーエンコーダにつながっているのがわかるかと思います。

f:id:peraneko:20190428221318p:plain

f:id:peraneko:20190428221525p:plain

基板上も問題ないはず……。

 

 

keymap.cは下記のとおりです。

const uint16_t PROGMEM keymaps[MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT(
    KC_A, KC_B, KC_C, KC_B,\
    KC_E, KC_F, KC_G, KC_H,\
    KC_0, KC_1 \
  ),
};

void encoder_update_user(uint16_t index, bool clockwise) {
  if (index == 0) {
    if (clockwise) {
      tap_code(KC_UP);
    } else {
      tap_code(KC_DOWN);
    }
  }
  else if (index == 1){
    if (clockwise) {
      tap_code(KC_UP); 
    } else
    {
      tap_code(KC_DOWN);
    }
  }
}

 indexの値は(暗黙に)0しか入らないと思うのですが、BDN9のkeymap.c参照した結果今現在はこう書いています。
indexが漏れた場合の処理も書いてないので不安なのですが、BDN9は動いてるしとりあえず動いているものを尊重する構えでこうなっています。

 

下記のように簡略化しても(乂'ω')でした。せつない。

void encoder_update_user(uint16_t index, bool clockwise) {
  if (clockwise) {
    tap_code(KC_UP);
  } else {
    tap_code(KC_DOWN);
  }
}

 

どなたか、ロータリエンコーダーを実装した方がいらっしゃいましたら、問題点や確認するべき点を教えていただけませんでしょうか。

教えていただいて、期待通りの挙動をするようになりました。
原因はconfig.hのMATRIX_COL_PINSと、ロータリーエンコーダのピンが二重に設定されていたためでした。
赤線+訂正線の部分をコメントアウトすることで正常に動きます。

 

みなさま、ご指摘ありがとうございました。


それはそれとして、DIRECT_PINSで設定したいけど何故かうまく行かぬので続きもあります。

とりあえず自作基板で自作キーボードうごいたから今日は寝る! もうだめだー。