車に Ottocast P3 Pro という Android ボックスを積んでいて、そこに 8BitDo Micro というゲームパッドをつないで使っている。

この組み合わせの情報が、日本語ではほぼ見つからない。Ottocast の記事も 8BitDo の記事もそれぞれ大量にあるのに、繋いだ話だけが無い。自分が調べたときに困ったので、前提のところから書いておく。

シエンタの運転席から見たダッシュボード。中央の画面が Ottocast で、Bluetooth の設定を開いている 車の画面がそのまま Android になる。ハンドル左下に見える青いのが 8BitDo Micro

できるようになること

先に、何ができるかを書いておく。

ボタンひとつでアプリが開く。 ひとつ押せば Google マップ、別のボタンで Spotify、別のボタンで Gemini。運転中に別のアプリを見ていても、一瞬で地図に戻れる。ホームに戻ってアイコンを探す、という手順がまるごと消える。

アシスタントは音声入力の起動ごと割り当てられる。 Gemini のようなアプリは、開くだけでなく音声入力そのものを1ボタンにできる。押して、そのまま話しかければいい。

戻るも割り当てられる。 画面の端をなぞるより確実だ。

地図の拡大縮小もボタンでできる。 うちの車は CarPlay 経由だと2本指のピンチが効かないので、ここは特に助かっている。1本指での代替操作を持つ地図アプリなら指でもできるが、ボタンのほうが速い。

8BitDo Micro のボタンは十数個ある。あとは工夫次第になる。

何と何をつなぐのか

graph LR
  P["8BitDo Micro<br>K モード"] -->|"Bluetooth<br>キーボードに見える"| O["Ottocast P3 Pro<br>中身は Android 13"]
  O -->|"USB<br>CarPlay の iPhone に見える"| C["車の<br>ディスプレイオーディオ"]

どちらの接続も「別のものに化けている」。車から見た Ottocast は iPhone で、Ottocast から見た 8BitDo はキーボード

Ottocast P3 Pro

いわゆる CarPlay AI BOX。車の通信用 USB ポートに挿すと、車のディスプレイオーディオからは「CarPlay 対応の iPhone が繋がった」ように見える。実体は Android 13 が動く 80×80×20.5mm・約200g の小さな箱で、車の画面がそのまま Android 端末の画面になる。

OttoAibox P3 Pro の本体裏面。手のひらに収まる円盤型 これが本体。円盤型の小さな筐体で、中身は Android 13

助手席足元の USB ポートに Ottocast のケーブルを挿したところ 挿すのは車の通信用 USB ポート。手前にあるのは給電用の充電器

Google Play が使えるので、YouTube も Netflix も Spotify も Google マップも、車の純正ディスプレイで動く。自分は Google Earth も入れている。

主なスペックは Snapdragon 6225 / RAM 8GB / ROM 128GB / Android 13 / nanoSIM スロット / Wi-Fi 2.4・5GHz / Bluetooth / Mini HDMI 出力。技適認証番号 201-250143 を取得していて、国内正規流通がある1。

この記事の話は P3 Pro 固有ではない。Android が載っている AI BOX なら考え方は同じはず。

8BitDo Micro

手のひらに収まるサイズの Bluetooth ゲームパッド。24.8g、180mAh のバッテリーで最大 10 時間駆動、充電は USB-C で1〜2時間2。

重要なのは、裏面のスライドスイッチで S / D / K の3モードを切り替えられることだ。

モード用途
SNintendo Switch
DAndroid(ゲームパッドとして接続)
Kキーボード

K モードにすると、接続先からはゲームパッドではなく Bluetooth のキーボードに見える。市販の Bluetooth キーボードと同じ方式(HID)で繋がるので、ボタンを押すと文字が飛んでくる。公式 FAQ によれば、Windows・macOS・Android・iOS/iPadOS・Raspberry Pi と、Bluetooth をサポートする機器なら何にでも繋がる。

この「本物のキーボードとして見える」という性質が、後々とても効いてくる。

なぜつなぐのか

理由は3つある。

1. ノールックで押せる

これが一番大きい。物理ボタンは指の感触で位置が分かるので、画面を見ずに操作できる。タッチパネルはそうはいかない。押す前に必ず一度、画面のどこを押すかを目で確認する必要がある。

運転中は画面を注視できない。つまりタッチ操作は、原理的に走行中に向いていない。手元に物理ボタンがあるかどうかで、走りながら触れるかどうかが決まる。

シエンタの中央コンソール。シフトレバーの右横にマジックテープで固定した 8BitDo Micro。下に車の USB ポートがある 置き場所はシフトレバーの横。裏にマジックテープを貼って留めてある。ハンドルから左手を下ろした位置にあるので、見ずに押せる

2. 操作をショートカットにまとめられる

数回タップしないとたどり着けない操作を、1ボタンに割り当てられる。冒頭に挙げたアプリの切り替えや音声入力の起動がそうだ。

画面を見られる時間が短いほど、1操作あたりの手数を減らす価値が上がる。停車中なら数タップでも困らないが、走行中は1アクションで終わらせたい。

3. 車載ディスプレイのタッチには制約がある

自分の車(トヨタ シエンタ)の場合、ディスプレイから CarPlay プロトコル経由で Ottocast に届くタッチ座標は1点だけだった。開発者オプションの「ポインタの位置を表示」で確認すると、何本指で触ってもポインタが1つしか出ない。

つまりピンチイン/ピンチアウトが成立しない。地図アプリの拡大縮小が指でできない。

なお Ottocast 公式は入力デバイスとして「純正 Bluetooth リモコン」を案内している。ベンツ・マツダ・一部レクサスなど、そもそもナビがタッチパネルでない車向けの位置づけだ。用途は近いが、ゲームパッドのほうがボタン数が多く、任意のキーを割り当てられて、しかも安い。

用意するもの

  • Ottocast P3 Pro(Android 搭載の AI BOX なら可)
  • 8BitDo Micro
  • 用途に応じて Key Mapper か 8BitDo Ultimate Software(後述)

接続する

1. K モードにしてペアリング

公式マニュアルの手順どおり。

8BitDo Micro の裏面。S・D・K と刻印されたスライドスイッチと、その右にペアリングボタン。黒いマジックテープが 2 枚貼ってある 裏面。スライドスイッチが S・D・K のモード切り替えで、右の丸いボタンがペアリング用。黒いのは車に留めるために貼ったマジックテープ

  1. 裏面のモードスイッチを K に合わせる
  2. Start(+)ボタンを押して電源を入れる
  3. モードスイッチの隣にあるペアリングボタンを1秒長押しする。LED が速く点滅すればペアリングモード(初回のみ必要)
  4. Ottocast 側で 設定 → ネットワークと接続 → Bluetooth を開く
  5. 8BitDo Micro gamepad が見えるので選ぶ

Ottocast の設定画面。ネットワークと接続の下に「キーボード/マウス/リモコンのBluetoothを接続」がある 手順 4 の画面。Bluetooth の項目は「キーボード/マウス/リモコンのBluetoothを接続」という名前になっている

K モードでもデバイス名は gamepad のままなので、これで合っている。LED が点滅から点灯に変われば接続完了。自分の場合はここまでで特につまずくところはなかった。

2. 何が飛んでいるか確認する

繋いだだけでは、見た目には何も起きない。でも実際にはキーが飛んでいる。

確認したいなら、メモアプリかブラウザの検索欄にフォーカスを当ててボタンを押してみるといい。文字が入力される。

ここで注意したい話がひとつある。 英語圏のレビュー記事には「初期状態では十字キーは矢印キーにマッピングされている」と書かれているものがあるが、実機(K モード・工場出荷状態)では全ボタンが英字だった。

ボタン既定キーボタン既定キー
L2LR2R
LKRM
−(Select)N+(Start)O
十字 ↑CXH
十字 ←EAG
十字 →FYI
十字 ↓DBJ
★(Star)T⁂(Heart)S

ファームウェアのバージョンによる違いかもしれないが、少なくとも「十字キー=矢印キー」を前提に設計すると動かない。矢印キーを使いたいなら remap(ボタンに送らせるキーの変更)が必要、と考えておいたほうがいい。

なお ★(Star)ボタンの Turbo 機能は、K モードと S モードでは働かない。D モードで Android に直接繋いだときだけの機能。

3. ここから道が2つに分かれる

繋がった。では、ボタンを押したら Google マップを開く、といったことをどうやるか。

Android の標準設定には「キーが押されたらアプリを起動する」に当たるものが見当たらなかった。 だから何かを間に挟むことになり、選択肢は2つある。

graph LR
  A1["道A: Key Mapper<br>8BitDo は既定の英字キー"] -->|"英字キー"| A2["Ottocast の Key Mapper<br>ここに対応表"]
  B1["道B: 8BitDo 本体に焼く<br>ここに対応表"] -->|"割り当て済みのキー"| B2["Ottocast<br>来たキーをそのまま使う"]

違いは対応表をどちら側に置くか。道B は Ottocast が何も知らないので、アプリごとの切り分けができない


道A: Key Mapper で Android 側に解釈させる

Key Mapper(io.github.sds100.keymapper)は無料・OSS のキーマッピングアプリ。「このキーが来たらこの動作をする」という対応表を Android 側に持たせる。Play ストアと F-Droid の両方にある。

手順はこう。

  1. Ottocast に Key Mapper をインストール
  2. ユーザー補助(アクセシビリティ。他のアプリの画面や入力に割り込むための許可)を許可
  3. 「キーを記録」でボタンのキーコード(Android がキーを区別するための番号)を確認
  4. アクションを割り当てる

Key Mapper の初期画面。警告が 3 つ表示されている 入れた直後は警告が 3 つ出る。ユーザー補助の許可とバッテリー最適化の解除は、ここの Fix から片付けられる

割り当てられるアクションが幅広いのが利点で、アプリ起動・音声アシスタント呼び出し・メディア操作のほか、画面の特定座標をタップ/スワイプするジェスチャーまで作れる。冒頭に挙げたアプリの起動、アシスタント、戻るは、すべてこちら側の担当になる。

Key Mapper の Choose an action 画面。Input・Apps・Navigation・Volume のカテゴリにアクションが並ぶ アクションの一覧。Apps に Launch app や Launch voice assistant、Navigation に Go back がある

アプリごとに条件を変えられる(per-app constraint。「Google マップが前面のときだけ」のような指定)のも Key Mapper だけの強み。

ピンチの合成は期待しないほうがいい

マルチタッチが届かないなら Android 側でピンチを合成すればいい、と考えるのが自然だが、自分の環境では動かなかった。Pinch screen のアクションを割り当てると、画面上のポインタは確かに 2 点出て広がる。合成はできている。それでも Google マップも Google Earth も反応しなかった。理由は分からない。

Google マップについては、1本指でズームする操作(2回タップして、2回目で指を離さずに上下に動かす)を合成することで回避できた。地図アプリ側にマルチタッチを使わない代替操作があるかどうか、が分かれ目になる。

座標の調べ方

タップやスワイプのアクションは画面座標で指定する。自分は**開発者オプションの「ポインタの位置を表示」**を使った。画面上部に X / Y が常時出るので、実際に触りながら数値を読める。届いているタッチが何点なのかも、ついでに分かる。

Ottocast の開発者向けオプション。「ポインタの位置」が ON になっている 「ポインタの位置」を ON にすると、画面上部に現在のタッチ座標が出る

Key Mapper 側にも、座標を設定するときにスクリーンショットを読み込んで画像の上をタップする機能がある。こちらは使っていない。

座標は解像度に依存するので、画面サイズや表示設定が変わると全部ずれる。

キーコードを送るには IME が要る

ひとつ落とし穴がある。「キーコードを送る」系のアクションは、ユーザー補助の許可だけでは送れない。 Key Mapper 内蔵の入力方法「Key Mapper input method」を IME(文字入力アプリ。Gboard のようなキーボードアプリのこと)として有効化し、かつ選択中にしておく必要がある。公式ドキュメントには「Shizuku を入れないなら、Key Mapper のキーボードか Basic Input Method を使う必要がある」と書かれている3。

つまり Shizuku を入れれば IME は要らなくなる。その経路(Expert Mode)を車で使おうとして何が起きたかは応用編に書いた。なお、IME が必要な理由そのものは公式ドキュメントに書かれていない。

Key Mapper には、指定した入力デバイスが接続されたら自動で自分の入力方法に切り替える設定がある。8BitDo Micro を指定しておけば、起動のたびに手で選び直さずに済む。なおジェスチャー系のアクションは IME を使わないので、この設定とは無関係だ。

あわせて、Key Mapper をバッテリー最適化の対象外にしておくこと。 対象のままだと OS にスリープさせられて、ボタンが効かなくなることがある。


道B: 8BitDo Ultimate Software でコントローラー本体に焼く

もうひとつは、ボタンが送るキーそのものを変えてしまう方法。8BitDo 公式アプリ「8BitDo Ultimate Software」で設定すると、コントローラーのファームウェアに保存される。

こちらのクセ。

  • 起動には対応コントローラーを K モードで Bluetooth 接続している必要がある。繋がっていないと起動画面から先に進めない
  • 編集したら画面下の Sync to device を押さないと本体に書き込まれない。これを忘れがち
  • 本体に保存できるプロファイルは1つだけ。公式サポートにも明記されている。切り替えたければアプリ側で別プロファイルを選んで sync し直す

この最後の点が、道A との一番大きな違いになる。焼いたキーを送っているのはコントローラー自身だからだ。Ottocast 側は「キーボードから文字が来た」としか思っていないので、どのアプリが前面にあっても同じキーが飛ぶ。

たとえば Google Earth のズーム用に L2 を PageUp にしたなら、YouTube を見ているときも L2 は PageUp を送る。そのキーを無視するか何かに使うかは、受け取ったアプリ次第になる。「Google Earth のときだけ」という切り分けができるのは道A(per-app constraint)だけで、こちらにその機能はない。

Ultimate Software の Android 版は Ottocast 本体にインストールしておける。そうすれば設定変更のたびにスマホへ繋ぎ直す必要がなく、車内で完結する。


どちらを選ぶか

やりたいこと向いている道
アプリ起動、音声アシスタント、メディア操作A(Key Mapper)
アプリごとに挙動を変えたいA
タップやスワイプを合成したいA
特定のキーを「本物のキー」として送りたいB(Ultimate Software)

併用もできる。 一部のボタンだけ B で焼いて、残りは既定の英字のまま A に拾わせる、というハイブリッドが成立する。

つまずいたところ

  • ソフトキーボードが出なくなる。物理キーボードとして認識されるため。設定 → システム → 言語と入力 → 物理キーボード の「画面キーボードの使用」を ON にすれば戻る
  • 夏の車内は高温になる。リチウムイオンバッテリー入りなので、気になるなら降りるときに持ち出す。自分は車に置いたままにしている

Ottocast の「物理キーボード」設定画面。8BitDo Micro gamepad Keyboard がデフォルトとして並び、「画面キーボードの使用」のトグルが ON 「物理キーボード」に 8BitDo Micro gamepad Keyboard が並ぶ。ここの「画面キーボードの使用」を ON にすると、ソフトキーボードが戻る

で、実際どうだったか

繋ぐこと自体はここまでで終わり。難しいのはその先で、繋いだあとに何をさせるかのところで Android の入力の仕組みに正面からぶつかることになる。

実際、Google Earth を操作しようとしたら合成ジェスチャーがどれも効かなかった。ピンチは動かず、Google マップで通用した1本指ズームの模倣も駄目だった。行き着いた先はタッチを完全に捨てる方法だった。

その顛末は応用編(Google Earth をコントローラーで操作する)に書いた。


参考リンク


  1. OTTOAIBOX P3 Pro | OTTOCAST 公式。Snapdragon 6225 / 8GB / 128GB / Android 13 / nano SIM / 技適認証番号 201-250143 はここで確認できる。一方、Bluetooth のバージョン、Wi-Fi の対応帯、本体の寸法と重量、HDMI の端子形状は公式ページに記載が無い。それらは製品表示によるもので、公式ページでは裏が取れていない。 ↩︎

  2. 8BitDo Micro 製品ページより。24.8g、180mAh、Play time: up to 10 hrs、Charging time: 1-2 hrs。 ↩︎

  3. Key Mapper のドキュメントより: “If you don’t want to install Shizuku then you must be using the Key Mapper GUI Keyboard or the Key Mapper Basic Input Method for this to work.” ↩︎