Androidスマートフォン、タブレットでUSBシリアル通信を行う方法についてです。AndroidでのUSBシリアル通信の方法は何通りかあると思いますが、今回はAndroidのUSBホスト機能とオープンソースのドライバと通信のライブラリを利用します。
私事でかつ宣伝のようで恐縮ですが、以前のサイトでiOSでのシリアル通信の記事を見て頂いた企業からiOSでの開発依頼を頂きました。その際にAndroid版の依頼も頂いたのでAndroid版の開発も行いました。その際に今回の方法を使いました。
(※2014年8月14日追記 iPhoneでの開発にはRedpark社のケーブルを使いました。旧サイトですが、ここのページから書きました。)
(※2021年1月10日追記 現時点での最新版のライブラリについては以下で書きました。
AndroidでUSBシリアル通信(2021/01/09版)ライブラリ最新版での動作確認
2021年1月10日追記ここまで)
本題に入ります。1回目は、ハードウェア構成、ソフトウェア構成等全体的な内容についてです。
PC以外に以下のハードウェアを使用します。
Androidスマートフォン(AU SHARP製 SHL23、Android4.2.2)
Android USBホストケーブル
Arduino UNO
Arduino RS232cシールド
USBシリアル変換ケーブル
開発環境、ライブラリは以下です。
Eclipse (Android Developer Tools)
Arduino IDE
USB Serial ドライバ、通信ライブラリ
技術的な要素についてです。より詳細は関連サイトのリンクを参照して下さい。
AndroidのUSBホスト機能
Androidの場合(Android 3.1以降)は、以下の2種類の接続方法があります。
1.USBホストモード
2.USBアクセサリモード(こちらは、Android2.3.4以降でも対応されている)
これらの大きな違いは、Androidとデバイスのどちらが電源を供給して、データ転送を制御しているかです。USBホストモードでは、Android側です。一方、USBアクセサリモードでは、デバイス側です。ここではUSBホストモードを使います。このホストモードですが、一般的なPCとマウス、キーボードや外付けハードディスクの関係と同じように考えればいいと思います。このホストモードをAndroidマシンで利用する際にはUSBホストケーブルが必要になります。(最近のAndroidタブレットにはタブレット本体にUSBホストのコネクタが搭載されている機種もあります。)試しに、私のSHARP製スマホ SHL23にUSBホストケーブルを接続してパソコンのマウスを接続したところ、画面上にマウスカーソルが表示されました。それではデバイスを何でもこのUSBホストに接続すれば利用出来るかというとそうではありません。そのデバイスのデバイスドライバが必要になります。ここでは、AndroidとArduinoを接続するケーブルのドライバが必要になります。
USB Host and Accessory
USB HOST
USBシリアル変換(ケーブル)
以上のUSBホスト機能を使って通信を行う訳ですが実際の通信仕様としてはシリアル通信です。このあたりを何とか書いてみます。
まずシリアル通信とはということでは、1本のデータ線に逐次的にデータを送るという意味になるかと思います。これに対応する通信方法としてはパラレル通信という方法があります。
そのシリアル通信ですが、通信機器、制御機器、マイコン関係等で伝統的によく利用されている通信仕様は以下があると思います。
RS-232C
UART
細かいことを書くと長くなりますし私でも理解していないことも多いのでここでは省略します。必要な場合は以下の関連サイト等を参照して下さい。
シリアル通信でセンサー値をPCのモニターに出力しよう!
ソフテックだより 第5号 技術レポート「USBとRS232C・RS422との比較」
「USB-RS232C変換」 と 「純正RS232C」の違い
エレラボドットコムUART その1 基本
ここではケーブル接続について簡単に触れます。RS-232CのケーブルにはDサブ9ピンとDサブ25ピンがあります。最近でも見るのはDサブ9ピンの方です。私が開発の仕事を始めた当時のパソコンにはこのコネクタがパソコン本体に搭載されていた記憶があります。Dサブ25ピンもよく見かけたと思います。主にモデムを接続していたと記憶しています。一方のUARTですが、接続が少なくて済むのでコネクタは使わずに直接配線することがほとんどだと思います。UARTはRS-232Cのコネクタに変換して接続することも出来ます。パソコン側ではCOMポートとして認識されます。
ここでなぜケーブルについて書いたかといいますと今のパソコン、タブレット、スマートフォン(ホスト側)にはRS-232Cのコネクタはないので(タブレット、スマートフォンにはないのが当然だと思いますが。)最終的にはUSBに変換して通信を行います。但しホスト側では従来と同様に(仮想)COMポートとして認識されシリアル通信を行います。(※USB自体もシリアル通信の一種と言えますがどう考えても仕様が複雑です。)
ここで必要となってくるのが、USBシリアル変換ケーブルです。このUSBシリアル変換ケーブルで通信を行うにはそのケーブルのデバイスドライバが必要となります。今回はオープンソースのライブラリで何種類か用意されているのでそれを利用します。詳細は次回以降に書きます。
今回はここまでです。次回は、Androidの通信相手となるArduinoのスケッチの動作確認を行ってみます。
※補足
一般に普及しているシリアル通信の仕様は以下のようなものもあります。
I2C
SPI
エレキジャック (連載)シリアル・インターフェース