AndroidAutoを使ってカーナビを作る!その8~専用キーボード作成

前回の振り返り

AndroidAutoが車のライトに合わせて暗くなります! これでトンネルなのに画面が明るい現象とはおさらば!! yonoity.hatenablog.com

キーボード入力が便利

AndroidAutoにはキーボード入力の機能が付いているのですが,これが便利! 基本は1と2でハイライトを移動させてEnterで決定. あとはマップやGoogleアシスタントのショートカットなど16キーが使用できる. どうしても画面が遠くになってしまう私の環境だったらなおさら助かる.

f:id:yonoity:20210527215703j:plain
代用で使っていた即興キーボード
さすがにこのキーボードを車内で使うわけにも… ということで専用キーボードを作ります👍

専用キーボードづくり

マイコン

Arudino Microと互換があるしコンパクトなのでこの子を採用.

f:id:yonoity:20210619092230j:plain
Arudino Microと互換のあるこのマイコンを使います

amzn.to

回路設計

マトリックス型と呼ばれる方式で出力の4ピンに1つずつ電圧をかけ,スイッチを押された部分は入力のピンに電圧が検知される仕組みになっています. コンピュータの世界だと電圧を印加するのがとても速いのでそれぞれ1つずつ電圧をかけても指がその前に離れることはないということですね~なるほど. ちなみにスイッチが押されていない入力ピンはOPEN(電圧がHiかLoかわからない状態)になってしまうので抵抗を噛ませてからGND接続します. これがないと勝手にキーが押されることが何度かww これで入力4ピン,出力4ピンで4*4=16キーのスイッチを識別することが可能になりました. ちなみに今回使った抵抗は220Ω.

f:id:yonoity:20210620000235p:plain
キーボードの回路

マイコンのプログラム

ファームウェアのプログラムはこちら↓ 面倒になったので詳しい説明は省きますw

見てわかる方→好きに使ってください

見てわからない方→そのままコピペor質問ください

#include <Keyboard.h>
// キーボード マトリックス

//const int keyNum = 3;
const int inputNum = 4;
const int outputNum = 4;

const int inputPin[inputNum] = {0,1,2,3};//あと3も
const int outputPin[outputNum] = {10,11,14,15};
const byte keyMap[inputNum][outputNum] = 
{{0x6E,0x6D,0x62,0x0A},
{0x78,0x6F,0x66,0x32},
{0x63,0x70,0x68,0x31},
{0x76,0xDA,0xD9,0xB1}};
//縦の並びが横  

bool currentState[inputNum][outputNum];
bool beforeState[inputNum][outputNum];

int line;
int row;

void setup() {
  for( row = 0; row < outputNum; row++){
    pinMode(outputPin[row],OUTPUT);
    digitalWrite(outputPin[row],LOW);
    for( line = 0; line < inputNum; line++){
      pinMode(inputPin[line],INPUT);
      currentState[line][row] = LOW;
      beforeState[line][row] = LOW;
    }
  }
  Serial.begin(9600);
  Keyboard.begin();
}

void loop() {
    for( row = 0; row < outputNum; row++){
      digitalWrite(outputPin[row],HIGH);
      for( line = 0; line < inputNum; line++){
        currentState[line][row] = digitalRead(inputPin[line]);
        
        if ( currentState[line][row] != beforeState[line][row] ){
          Serial.print("key");
          Serial.print(row);
          Serial.print(line);
          if ( currentState[line][row] == HIGH){
            Serial.println(" Push!");
            Keyboard.press( keyMap[line][row] );
          } else {
            Serial.println(" Release!");
            Keyboard.release( keyMap[line][row] );
          }
        beforeState[line][row] = currentState[line][row];
        }
      }
      digitalWrite(outputPin[row],LOW);
    }
}

参考にさせていただいたサイトはこちらです↓ 分かりやすくてとても助かりました. eucalyn.hatenadiary.jp

下準備

まずはブレッドボードで動作確認

f:id:yonoity:20210619092257j:plain
1列分の動作テスト

動作確認は以前買ったこのセットで amzn.to

回路作成!

とりあえずパーツを購入

f:id:yonoity:20210619092307j:plain
基盤だけ買おうとしたけどこっちのがお得だったので…
amzn.to このパーツセットすごいわくわくできるのでおすすめです👍

f:id:yonoity:20210619092223j:plain
スイッチを基盤に並べ…

はんだづけを駆使して頑張った… 配線技術は素人です…すいません… ちなみに誤配線を2回もしてしまいました. しっかり確認していたつもりだったのにそれでもだめでした…

f:id:yonoity:20210619092159j:plain
裏側に配線

まとめ

いい感じの特注キーボードが完成しました!!! 初めはキットを買おうかと思ったのですが,自作できてよかったです!!! これで反応の悪い&遠いタッチパネルを使わずに済みます!

自作キーボードもこうやって作ってるって考えると面白いですねー 今度デスクトップ用を作ってみようかな?