以下から始まる一連の記事でAndroidでのUSBシリアル通信について書きました。実際に開発案件につながったり、お問い合わせを頂いたりしているテーマです。
AndroidでUSBシリアル通信(その1)ハードウェア・ソフトウェア構成等
ここで利用しているドライバ・ライブラリはありがたいことに今現在(2021/01/09)まで更新されてきたようです。そこで最新版でのドライバ・ライブラリで動作確認してみました。
今回利用する開発環境
Windows10 ProのPC
Android Studio 4.1.1
Arduino IDE 1.8.13
実行環境
解約して使っていないAndroid スマートフォン(Android 6.0)
Arduino MEGA2560 R3 互換ボード(ここからはArduino MEGA互換機と表記します)
USB OTG(USB On-The-Go)ケーブル(以前の呼び方だとUSBホストケーブル)
前提条件
ここでは既にスマートフォン実機用の開発環境の準備が完了しているものとします。
(つまり、Android Studioがインストール出来ていて、対象のAndroidバージョンのSDKのインストール等が出来ているということです。)
今回やってみること
使っていない格安スマートフォンを使います。
接続にはUSB OTGケーブルを経由してUSBケーブルで接続します。
おおまかには以下のような手順です。
(開発環境は構築出来ているとして)
最新のライブラリ・ドライバ一式を取得
Android Studioでビルドでして実機へインストール・起動確認
Arduino MEGA互換機のスケッチを作成して書き込む
スマートフォンとArduino MEGA互換機を接続して通信を確認する(受信だけです。)
順番に書いていきます。
ライブラリ一式の取得から
早速実際に作業を進めます。
いつも書いているようなことですが、作業の手順については唯一の正解、正しい方法ということではないです。ご自分のやり方をお持ちの方はぜひいろいろとやってみて下さい。
まず以下からライブラリ一式をダウンロードします。
usb-serial-for-android
以下のように緑色のCodeのボタンからzip形式でダウンロードします。
ダウンロード出来たzipファイルを解凍して以下のように実際に作業しやすい場所に移動します。フォルダ名も分かりやすいように変えてもいいです。
Android Studioで取り込んでビルドする
Android Studioからダウンロードしたサンプルプロジェクトを取り込みます。
Android Studioの起動時のメニューからはプロジェクトのインポートを選択して下さい。
何か別のプロジェクトを開いている場合は、以下のようにメニューから、ファイル => 新規 => プロジェクトのインポートを選択して下さい。
いずれの場合でも、以下のインポート画面が表示されると思いますので、ダウンロードして解凍した場所から以下のように全体を取り込みます。
問題なくインポートが完了すれば以下のようなプロジェクトの構成になると思います。この構成が確認出来たら、メニューの、ビルド => プロジェクトの再ビルドでビルドします。
しばらく時間がかかる場合もあるかもしれませんが、ビルド出力画面の経過やイベントログの画面で正常にビルド出来たかどうか確認します。
以下では、BUILD SUCCESSFUL in 18s というメッセージがビルド出力画面で確認出来ます。
以上でビルドまで完了です。
実機スマートフォンでの実行確認まで
スマートフォンをPCに接続します。そしてAndroid Studioのメニューの、実行 => Select Device を選択します。そこで正常に接続出来ていれば実機が選択出来ると思います。ここでは以下のように実機が選択出来ました。
ここで表示されないようであれば、スマートフォン接続用のドライバやケーブル(通信出来るものか)を見直す必要があると思います。
実機が問題なく選択出来たとして、Android Studioのメニューから、実行 => 実行を選択します。そうするとインストールが始まって問題がなければ実行出来ます。ここでは以下のように実機で起動しました。
Android Studioでの作業は一旦ここまでです。
Arduino MEGA互換機でのスケッチ書き込みから動作確認まで
Androidスマートフォンとシリアル通信するためのArduino MEGA互換機側での作業です。ここではArduino IDEが使えるとして進めます。Arduino IDEの操作方法等に関して必要な場合は以下等を参照して下さい。
Arduino IDEのWindows10でのインストール(2020/05/04版)
Arduino IDEのUNOボードでの動作確認(2020/05/04版)
以下のような簡単なArduino MEGA互換機から送信のみのシリアル通信のためのスケッチを用意しました。単純に1秒ごとに”hi”と送信します。ここで大事なのは、通信速度を19200にすることです。スマートフォン側のサンプルプログラムがそのように設定されていたので合わせるためです。
void setup() { // put your setup code here, to run once: Serial.begin(19200); } void loop() { // put your main code here, to run repeatedly: Serial.println("hi"); delay(1000); }
これをArduino IDEからArduino MEGA互換機に書き込みます。問題なく書き込みが完了したら動作確認としてシリアルモニタで送信されているか確認します。
Arduino IDEのメニューから、ツール => シリアルモニタでシリアルモニタを起動して通信速度19200に設定してモニターします。以下のように確認出来ました。
AndroidスマートフォンとArduino MEGA互換機を接続して通信を確認する
いよいよAndroidスマートフォンとArduino MEGA互換機を接続して動作確認します。USB OTGを使って接続します。
このデバイスを選択します。以下のように通信が確認出来ました。
以上で一連の流れでの動作確認作業が完了です。
ここからは補足的な内容について書きます。
サポートされているメーカー
今回のサンプルプログラムのdevice_filter.xmlは以下です。
つまりこれらのUSBシリアルケーブル(内蔵されているチップ)には対応出来ているであろうということです。(※但し、実際に動作確認しないと何とも言えないです。)
私のArduino MEGA互換機では、Arduino(vendor-id=0x2341)のCDC driverと認識してそのドライバが有効になりました。
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 0x0403 / 0x60??: FTDI --> <usb-device vendor-id="1027" product-id="24577" /> <!-- 0x6001: FT232R --> <usb-device vendor-id="1027" product-id="24592" /> <!-- 0x6010: FT2232H --> <usb-device vendor-id="1027" product-id="24593" /> <!-- 0x6011: FT4232H --> <usb-device vendor-id="1027" product-id="24596" /> <!-- 0x6014: FT232H --> <usb-device vendor-id="1027" product-id="24597" /> <!-- 0x6015: FT230X, FT231X, FT234XD --> <!-- 0x10C4 / 0xEA??: Silabs CP210x --> <usb-device vendor-id="4292" product-id="60000" /> <!-- 0xea60: CP2102 and other CP210x single port devices --> <usb-device vendor-id="4292" product-id="60016" /> <!-- 0xea70: CP2105 --> <usb-device vendor-id="4292" product-id="60017" /> <!-- 0xea71: CP2108 --> <!-- 0x067B / 0x2303: Prolific PL2303 --> <usb-device vendor-id="1659" product-id="8963" /> <!-- 0x1a86 / 0x?523: Qinheng CH34x --> <usb-device vendor-id="6790" product-id="21795" /> <!-- 0x5523: CH341A --> <usb-device vendor-id="6790" product-id="29987" /> <!-- 0x7523: CH340 --> <!-- CDC driver --> <usb-device vendor-id="9025" /> <!-- 0x2341 / ......: Arduino --> <usb-device vendor-id="5824" product-id="1155" /> <!-- 0x16C0 / 0x0483: Teensyduino --> <usb-device vendor-id="1003" product-id="8260" /> <!-- 0x03EB / 0x2044: Atmel Lufa --> <usb-device vendor-id="7855" product-id="4" /> <!-- 0x1eaf / 0x0004: Leaflabs Maple --> <usb-device vendor-id="3368" product-id="516" /> <!-- 0x0d28 / 0x0204: ARM mbed --> </resources>
古い時期に製造されたArduino Unoは認識されませんでした
Arduino UNOは、Arduinoの中でも最も代表的な機種の一つと言えます。 Arduino MEGAはArduino UNOの上位互換(単純に言うとピンの数がUNOより多い)ですので今回のバージョンでもArduino MEGA互換機と同様に通信出来るかと思ったら出来ませんでした。Arduino UNOとしての動作は今でも問題ありません。
理由は私のArduino UNOは買ってから結構年数経ったようで、vendor-idが既に変わっているようです。もし、私と同様に古いArduino UNO の場合ではドライバが未対応となり通信が出来ないと思います。その場合は最新のArduino UNOなり別のデバイスで試してみてください。
まとめ的に
このような組み合わせで何が出来るのかということですが、もし、電話として使っていないスマートフォン(もちろんタブレットでもいいですが)であればアプリの開発は必要ですが以下のような用途に利用出来ると思います。
・IoTのゲートウェイ的に利用する
IoTデバイス(エッジデバイス)のデータを中継してインターネット上のサーバーへ転送したり、管理や制御が出来る。
・幅広いデバイス類(製造用の機械、通信機器類)でのメンテナンス用に利用する
従来はPCを接続して行っていた作業でも簡単な内容であれば、スマートフォンで置き換えることが出来る。
・センサー類のGUIとして利用する
その場でモニターしたいセンサー情報があった場合、スマートフォン接続してGUIとして利用することが出来る。そうすればセンサー自体には簡単なGUIだけがあればいい。
これら以外でもいろいろと考えられると思います。
最後に営業させて下さい
関連する内容での開発案件や技術サポートのご相談がございましたら是非ご連絡下さい。以下のスクリーンショットのような独自の簡単なワンタイムURL、ワンタイムパスワードでの1対1やグループでのWeb会議システムの用意もございますので、リモートでの打ち合わせも可能です。よろしくお願いいたします。
今回はここまでです。また書きたいと思います。