デスクトップツールチェーンなしでAndroid用Arduino IDEを使用する

フィールドエンジニアや組み込み開発者は、デスクトップから離れた場所で作業する際に、Androidデバイスからファームウェアのフラッシュ、スケッチのイテレーション、またはハードウェアのコミッショニングを行う必要性が増しています。ワークフローは紙面上では単純に見えます。実際には、Androidのプロセスモデル、ストレージ制限、USB権限システムがそれぞれ、Linuxデスクトップには存在しない障害モードをもたらします。この記事では、AndroidでArduino IDEワークフローを実行する際に固有の制約と実装手順について説明します。ArduinoとAndroidの通信アーキテクチャのより広範なトピックについては、 ArduinoとAndroidの統合アーキテクチャ概要を参照してください。

エンジニアリングの原則:Android環境がArduino IDEの動作を変える理由

Androidのプロセス分離モデルとシリアルポートアクセスへの影響

Linuxデスクトップでは、Arduino IDEはTTYデバイスノードを介して接続されたボードにアクセスします。通常は /dev/ttyUSB0 または /dev/ttyACM0です。ユーザー空間アクセスはグループメンバーシップによって制限されますが、パスは直接的です。Androidは厳格なプロセスサンドボックスを強制します。どのアプリも、Android USB Host APIを経由せずに /dev/ttyUSB* または /dev/ttyACM* にアクセスすることはできません。このAPIは、特定のUSBデバイスに紐付けられた明示的な実行時パーミッションの付与を必要とします。

USB Host APIは、インテントベースのダイアログを介してデバイス列挙を仲介します。USBデバイスが接続されると、システムはパーミッションプロンプトを表示します。アプリはマニフェストで <uses-feature android:name="android.hardware.usb.host"/> を宣言する必要があり、ユーザーはデータ転送が可能になる前にアクセスを許可する必要があります。パーミッションが無効になった場合(再起動後またはアプリの再インストール後)、IDEはサイレントにボードを検出できなくなります。これはデスクトップでのドライバー不足と全く同じように見えるため、エンジニアは誤った診断パスに進んでしまいます。

USB Host APIの本当のコストは、パーミッションダイアログではなく、ファームウェアアップロード中の信頼性の高いボーレートタイミングのためにavrdudeが依存する低遅延TTYパスの喪失にあります。

デスクトップLinuxでは、avrdudeはTTYを直接開き、OSレベルで回線設定を制御します。Android USB Host APIを介して、シリアルパスはJavaレイヤーを通過します。往復レイテンシが増加します。115200 bps以上のアップロードボーレートでは、UnoのDTRリセットシーケンスなど、タイトなリセット・接続タイミングに依存するボードで、断続的なアップロード失敗を引き起こす可能性があります。エンジニアは、リトライ試行を考慮に入れ、本番フィールドプログラミングでこのパスに依存する前に、アップロードの信頼性をテストする必要があります。

Javaランタイム対ネイティブツールチェーン:コンパイルチェーンが実際に実行される場所

デスクトップでは、Arduino IDEは avr-gcc または arm-none-eabi-gcc を子プロセスとして起動します。Androidのアプリケーションサンドボックスでは、標準的なアプリインストールでその単純なプロセスモデルは不可能です。コンパイルチェーンはどこかで実行されなければなりませんが、どの「どこか」で実行されるかによって、ネットワークアクセスなしでワークフローが維持されるかが決まります。

実際には3つのパターンが存在します。ArduinoDroidのような専用モバイルアプリは、アプリのサンドボックス内でローカルにコンパイルするネイティブバイナリレイヤーをバンドルしています。Arduino Createモバイルクライアントは、コンパイルをArduinoのクラウドビルドサーバーにオフロードします。Termuxベースのセットアップは、 avr-gcc および arduino-cli を、Linux互換ユーザー空間で実行されるネイティブARMバイナリとしてインストールし、クラウド依存なしで完全なローカルコンパイルを可能にします。

クラウドコンパイルは、ローカルツールチェーンの負担を軽減します。トレードオフは現実的です。ネットワーク遅延が各ビルドサイクルに数秒を追加し、あらゆる独自のファームウェアソースがコンパイル中にデバイスから離れます。IP機密性を持つ産業用ファームウェアを構築するチームにとって、クラウドコンパイルは、技術評価が始まる前にポリシーレベルで除外されることがよくあります。公開スケッチを使ったホビイストやプロトタイプ作業では、クラウドパスがセットアップが最も速いです。

エンジニアは、コミットする前に、選択したツールがどのモデルを使用しているかを確認する必要があります。アプリサンドボックス内でローカルにコンパイルするツールでも、カスタムまたは産業用ターゲットを除外するキュレートされたボードサポートリストを持っている場合があります。

Androidにおけるファイルシステム権限とスケッチストレージの制約

Android 10以降で施行されているAndroidのスコープストレージモデルは、アプリがファイルを読み書きできる場所を制限します。IDEアプリは、独自の内部ストレージディレクトリに自由にアクセスできます。共有外部ストレージへのアクセスには明示的な権限の付与が必要であり、それらの権限が付与されていても、アクセス可能なパスはOSによって制約されます。

これにより発生する障害モードは微妙です。アプリが読み取れないライブラリをスケッチが参照すると(ライブラリアーカイブがアプリの許可されたストレージ境界外にあるため)、IDEはライブラリが見つからないというエラーを報告します。このエラーメッセージは、ライブラリが一度もインストールされなかった場合に表示されるメッセージと同じです。Androidでトラブルシューティングを行うエンジニアは、すでに存在しているが単にアクセスできないライブラリを再インストールするのに時間を浪費します。

アプリの内部ストレージディレクトリを使用すると、このクラスのエラーを完全に回避できます。トレードオフは、内部ストレージはファイルマネージャーからは見えず、rootアクセスなしではUSBマスストレージ経由でアクセスできないことです。スケッチの共有は、アプリ独自の共有メカニズムまたはクラウド同期パスを通じて明示的にエクスポートする必要があります。単独のフィールド使用では、内部ストレージが適切な選択です。スケッチがエンジニア間で移動するチーム環境では、展開前にファイル共有ワークフローを計画してください。

実装ガイド:AndroidでのArduino IDEのセットアップと使用方法

適切なインストールパスの選択:ネイティブアプリ、Termuxツールチェーン、リモートIDE

Android上でArduino IDEワークフローを実行するには、3つの実行可能なアプローチがあります。それぞれに明確な能力の限界があります。

  • 専用モバイルアプリ (ArduinoDroidなど):セットアップが最も速く、GUI主導のワークフローですが、ボードサポートが限定的で、ツールチェーンのバージョンやカスタムボードパッケージを制御することはできません。
  • Termux + arduino-cli + avr-gcc:Linux互換ユーザー空間でネイティブARMバイナリとして実行される完全なCLIツールチェーン。カスタムボードパッケージ、オフラインコンパイル、スクリプト化されたアップロードワークフローをサポートします。ターミナルベースの操作に慣れている必要があります。
  • ブラウザベースのArduino Cloud Editor モバイルChromeまたはFirefox経由:ローカルインストールは不要で、クラウドコンパイルを通じて完全なボードサポートを提供しますが、永続的なインターネット接続が必要です。また、モバイルブラウザからのすべてのUSB OTGアップロードパスを確実にサポートするわけではありません。

生産現場でのプログラミング(工場のフロアでのファームウェアのフラッシュ、信頼性の高い接続がない建物のパネルのコミッショニング、またはリモートの設置場所にあるデバイスの更新)においては、Termux + arduino-cliパスのみが、クラウドに依存せずにデスクトップIDEの機能性を再現できる唯一のオプションです。セットアップ時間はより長く、通常はツールチェーンのインストールと設定に1時間以上かかりますが、その結果としてオフラインで動作する自己完結型環境が得られ、デスクトップ開発環境で使用されるのと同じボードパッケージとライブラリバージョンをサポートします。

USB OTGアップロードの設定:ボード検出、ドライバーバインディング、および権限ワークフロー

USB OTG adapter linking Arduino Uno to Android smartphone on a development bench

物理的な接続にはUSB OTGアダプターが必要です。Androidデバイスに応じて、USB-Aメス-USB-CオスまたはマイクロUSBオスアダプターを使用します。OTGハードウェアが存在する場合でも、すべてのAndroidデバイスがUSBホストモードを公開しているわけではありません。まずホストモードの利用可能性を確認してください。Termuxで実行するか、USBホストチェッカーアプリを使用します。既知のUSB周辺機器を接続してもデバイスが表示されない場合は、そのデバイスはUSBホストをサポートしておらず、アップロードパスは利用できません。 lsusb Termuxで実行するか、USBホストチェッカーアプリを使用します。既知のUSB周辺機器を接続してもデバイスが表示されない場合は、そのデバイスはUSBホストをサポートしておらず、アップロードパスは利用できません。

ハードウェアが確認されたら、権限ワークフローは次のシーケンスに従います:

  • OTGアダプター経由でArduinoボードを接続します。
  • Androidは、アクセスを要求しているアプリに対してUSBデバイスの権限ダイアログを表示します。
  • 権限を付与し、「このデバイスでは常に許可する」を選択して、すべてのアップロードサイクルで再プロンプトされないようにします。
  • Termuxでは、デバイスノードが以下に表示されることを確認します /dev/bus/usb/ かつ、VID/PIDが期待されるボードと一致すること。
  • 正しいポートパスを指定してavrdudeを実行します。例: /dev/bus/usb/001/002TTYパスではなく。

CH340およびCH341 UARTブリッジチップ(安価なArduinoクローンに多く見られる)は、AndroidのUSBシリアルスタックによってネイティブに列挙されません。Androidカーネルには、標準ビルドにCH34xドライバーが含まれていません。エンジニアは、FTDIまたはCP210x USBブリッジを備えたボードを使用するか、Termux環境内にCH34xユーザースペースドライバーを次のようなライブラリを使用してインストールする必要があります。 usb-serial-for-android カスタムアップロードスクリプトでラップします。

ファームウェアのアップロードだけでなく、Androidホストからシリアルフィールドデバイスをコミッショニング(産業用長距離通信の拡張)するエンジニアにとって、 RS-485信号の整合性と距離制限 を理解することが、AndroidからボードへのUSBパスが確実に機能するようになると重要になります。

ライブラリ管理、ボードパッケージのインストール、オフライン依存関係の解決

Termux terminal on Android showing arduino-cli core install output in a field cabinet

Termuxベースのarduino-cliセットアップでは、オフラインになる前にボードインデックスファイルとライブラリアーカイブを取得してキャッシュする必要があります。標準コマンドはデスクトップの場合と全く同じように動作します。

# Update board index and install AVR core
arduino-cli core update-index
arduino-cli core install arduino:avr
# Install a library by name
arduino-cli lib install "Adafruit BME280 Library"

フィールドに出る前に、ネットワークに接続されている間にこれらを実行してください。ダウンロードされたパッケージはTermuxのホームディレクトリ内にキャッシュされます。 ~/.arduino15典型的なAVRまたはARMコアと、動作中のライブラリセットに少なくとも500MBのストレージを割り当ててください。Termuxストレージはアプリのプライベートディレクトリ内に存在するため、特別な権限を付与しなくてもAndroidのScoped Storageの制限を回避できます。

ArduinoDroidのような専用アプリは、Arduinoライブラリマネージャのカタログのキュレーションされたサブセットを持つアプリ内マネージャを通じてライブラリを管理します。産業用センサー、カスタムHMIペリフェラル、またはあまり一般的でない通信スタックを扱うエンジニアは、必要なライブラリがフルレジストリに存在していても、モバイルアプリのミラーに存在しないことがよくあります。

回避策は手動インストールです。ライブラリをアプリ指定のライブラリフォルダにアーカイブとして配置します。正確なパスはアプリによって異なります。設定画面で設定されているライブラリディレクトリを確認してください。パスは、Android 10以降のアプリの許可されたストレージ境界内に収まる必要があります。これは通常、共有外部ストレージではなく、アプリの内部ストレージ内に配置することを意味します。 .zip アーカイブをアプリ指定のライブラリフォルダに配置します。正確なパスはアプリによって異なります。設定画面で設定されているライブラリディレクトリを確認してください。パスは、Android 10以降のアプリの許可されたストレージ境界内に収まる必要があります。これは通常、共有外部ストレージではなく、アプリの内部ストレージ内に配置することを意味します。

ライブラリをインストールしたら、フルプロジェクトビルドを試す前に、ドライコンパイルで解決を確認してください。ターゲットライブラリヘッダーのみを含む最小限のスケッチを作成し、コンパイルします。クリーンな結果は、ライブラリがツールチェーンから認識されていることを確認します。このステップは、大規模プロジェクトでビルド中に問題が発生する前に、Scoped Storageのアクセス失敗とパスの不一致を検出します。

モバイルArduino IDEワークフローは、本格的なフィールドユースに耐えうるほど成熟しましたが、デスクトップの動作を前提とするのではなく、意図的なセットアップが必要です。Termux環境を事前設定し、必要なボードパッケージとライブラリをすべてキャッシュし、使用予定のAndroidデバイスでUSB OTGアップロードパスを検証したチームは、信頼性の高いワークフローを見つけるでしょう。その検証をスキップしたチームは、CH340ドライバーの失敗、デバイス再起動後の権限再プロンプト、ライブラリ解決エラーに定期的に遭遇し、フィールドでの時間を浪費しています。セットアップへの投資は通常2〜3時間ですが、その見返りはポケットに収まる自己完結型プログラミング環境です。

大量に出荷されるファームウェアや、安全性に関わるシステムに組み込まれるファームウェアを構築する組織にとって、ツールの再現性に関するプロセス規律は、Android上でもデスクトップ上でも同様に重要です。STONE HMIエンジニアリングチームは、IEC 61508に準拠したプラクティスに従っています。ツールの検証とビルドトレーサビリティに対するそのような構造化されたアプローチは、開発環境がワークステーションで実行されるかモバイルデバイスで実行されるかにかかわらず、デリバリーリスクを低減します。