0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AOA (android open accessory) を Rasberry Pi (zero w)で作った

0
Last updated at Posted at 2026-09-03

経緯

  • AOAデバイスと通信するAndroidアプリを作成しているが、実機になるAOAデバイスが手元にない。AOAの挙動も把握できない。
  • 実機と全く同じ動作ではないかもしれないが、粗々でもデバッグしたい。

リポジトリ

ソースコードや環境作成用のスクリプトなど、以下においてあります。

Python , PyUSB を使っています。AOAデバイス-Androidアプリのメッセージプロトコルはさまざまと思いますので、手軽に変更できそうな Python を使いました。

(おそらく Zero W 以外の Raspberry Pi など Linux 系なら動作するはず...)

機材と接続図

Raspberry Pi Zero W を使用しました。(Zero2 は売り切れ)

当初は以下のように接続させていましたが、Pi - Android 間の USB を差しなおしていると Pi が再起動することがありました。

image.png

どうも、Zero を使用する場合はセルフパワー方式のUSBハブを使用した方が良いようです。

USBハブを使用するようになってからは安定しています。以下のような接続です。
image.png

動作の流れ

フローチャートを示します。

image.png

"AOAモードの機器を検出"

AOAモードで接続している機器を探します。

具体的には PID が 0x2D00 か 0x2D01 の機器を探します。

python スクリプトを再起動した場合 (既に Android がアクセサリモードになっている) や後述の "AOAモードへ変更" を実施後、などが該当します。

"接続中の機器を検出"

USB接続中の機器を探します。ハブなど関連の無いデバイスはクラスやPIDを確認し除外します。

"アクセサリの情報を送信"

Android に対して、対応しているAOAのバージョンを問い合わせたり、manufacturer や model などの情報を送信します。

"AOAモードへ変更"

Android に対して、現在の接続からAOA モードへの接続へ切り替えるように要求を送信します。

これを行うと、Android の PID が 0x2D00 (または 0x2D01) に変わります。

"入出力のエンドポイントを取得"

データの送受信に使用するエンドポイントを探します。

データの送受信にはアドレスが必要になりますが、どうも機器によって異なることがあるようです。そのため、エンドポイントを探してアドレスを調べています。

"通信"

リポジトリ上ではループバックをさせていますが、メッセージプロトコルによって変更します。

イレギュラーな状況の試験として、あえて誤ったメッセージを送信してもいいでしょう。

設定ファイル

以下を設定ファイルで変更できるようにしています。

  • アクセサリの情報 (manufacturer , model , description , url , version , serial number)
  • "通信" に使用するスクリプト

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?