AndroidでUSBシリアル通信の4回目です。今回は、前回動作確認をしたライブラリサンプルの内容、つまり設定ファイルやプログラムの構成、プログラムの仕様等を見ます。
ライブライは以下です。より詳細はこのページの説明も合わせて見て下さい。
(※2021年1月10日追記 現時点での最新版のライブラリについては以下で書きました。
AndroidでUSBシリアル通信(2021/01/09版)ライブラリ最新版での動作確認
2021年1月10日追記ここまで)
まずはデバイス関連からです。
デバイス(ケーブル)の認識
サンプルプログラムではArduinoに接続するとアプリの起動画面が表示されます。その設定部分についてです。マニュフェストファイルに以下の定義があります。ここでintent-filterを定義しています。また、USB デバイスのプロパティを指定したリソースファイル(”@xml/device_filter” )を指定しています。ここに対応しているデバイス(ケーブル)の一覧が指定されています。
一覧に指定されているデバイスが接続されると、ダイアログにそれらを表示してアプリケーションを開始するか確認します。開始した場合、アプリケーションは自動的にデバイスにアクセスする権限が与えられます。このあたりは実際に動作確認した通りです。
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />
デバイスリストの内容
今現在は以下の記述になっています。
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 0x0403 / 0x6001: FTDI FT232R UART --> <usb-device vendor-id="1027" product-id="24577" /> <!-- 0x0403 / 0x6015: FTDI FT231X --> <usb-device vendor-id="1027" product-id="24597" /> <!-- 0x2341 / Arduino --> <usb-device vendor-id="9025" /> <!-- 0x16C0 / 0x0483: Teensyduino --> <usb-device vendor-id="5824" product-id="1155" /> <!-- 0x10C4 / 0xEA60: CP210x UART Bridge --> <usb-device vendor-id="4292" product-id="60000" /> <!-- 0x067B / 0x2303: Prolific PL2303 --> <usb-device vendor-id="1659" product-id="8963" /> </resources>
とりあえず、ここに指定されているvendor-idとproduct-idであればドライバが対応していて通信が出来るということです。大きく分けてマイコンボード系とUSBシリアル(RS-232c)変換チップ(変換回路)に分かれます。
デバイスリスト マイコンボード系
Arduino ここでも使用したメジャーなプロトタイピングボードです。
Teensy(Teensyduino)私は知らなかったのですがARM系のマイコンボードでTeensyduinoというのはArduino IDEをベースにした開発環境のようです。
Teensy 3.1
デバイスリスト USBシリアル変換チップ系
こちらの方が少し複雑かと思います。もちろんよくこの変換ケーブルを利用されている方は理解されているかと思いますが、変換ケーブル自体は各社から販売されていますがその内部のUSBシリアル変換チップは代表的なメーカがあります。そのメーカの変換チップが上記のデバイスリストに指定されています。
その代表的なメーカは、FTDI、prolific、Silicon Labsです。私個人的には、FTDIとprolificをよく見かけます。
以下ではprolificのチップが内蔵されています。スケルトンなので何とか見えるかと思います。
USBシリアル変換チップ系での動作について
このデバイスリストに設定されている変換チップを内蔵したケーブルが全て正確にデータ送受信が出来るかというとそうでもないようです。実際に何種類か試したところ同じプログラムでも正常に送受信できる場合と出来ない場合がありました。このあたりは要注意です。
デバイスドライバの実装
ライブラリのUsbSerialLibraryフォルダ配下に上記リストのドライバの実装ファイルとユーティリティクラスがあります。アプリケーション側からはデバイスの種類は意識しないで同じインターフェースで利用出来ます。
デバイス関連は以上です。
続いてサンプルアプリについてです。ライブラリのUsbSerialExamplesフォルダ以下にソースがあります。
DeviceListActivity
SerialConsoleActivity
以上の2つのActivityがあります。DeviceListActivityの方が認識したデバイスリストを表示するActivityで、SerialConsoleActivityの方が実際にデータ受信を行うActivityです。実装としてはデバイスドライバのライブラリを利用してシリアル通信で一般的なインターフェースだと思われる、open、close、read、write等をスレッドと組み合わせて実装しています。実際にソースを見て頂く方が分かりやすいです。
DeviceListActivityの実行例(Arduino)
SerialConsoleActivityの実行例(Arduino)
最後にまとめ的にです。
今回の方法では、AndroidのUSBホスト機能を使い、ドライバもある程度汎用性があるので、マイコンボード、制御機器、通信機器等でパソコンから制御するアプリケーションがある場合は、場合によってはスマホやタブレットに置き換えられることもあると思います。また新規設計の場合は無線化という課題もあると思いますが始めからスマホやタブレットという仕様も考えられるかと思います。
(2014/07/07追記 以下からのシリーズの記事でArduinoに温度センサを接続してAndroidで取得する内容等を書きました。)
温度管理システム的なものを作ってみる(その1)システム概要