みんな大好きVSCodeと組み込みソフトウェア開発環境PlatformIOでリモート開発をしてみる(Arduino編)

日本語|English|中国语
| 6 min read
Author: shuichi-takatsu shuichi-takatsuの画像

組み込みソフトウェア開発をするなら PlatformIO が大変便利です。
これまでも、以下の記事で PlatformIOを紹介してきました。

さて、今日のお題は「マイコンがネットワーク上の別PCに接続されていた場合、どうやってマイコンにプログラムを転送するか」です。

一つの方法としては、リモート側PC上に事前にマイコンの開発環境を作っておき、ホスト側PCのVSCodeからリモート側PCにSSHで接続して、リモート側PC上の開発環境を利用して開発を行うことができるとは思います。
ただ、リモート側PCに開発環境が用意できないとか、十分なリソースがない場合は利用できません。

今回は PlatformIO を使って、ネットワーク上のリモート側PCにUSB接続されているマイコンにLチカプログラム(LEDがチカチカするだけのプログラム)をUploadする方法をご紹介したいと思います。
プログラムの転送先マイコンには、みんな大好き Arduinoマイコン を使っていきます。

PlatformIOのインストール(ホスト側)

#

まず、PlatformIO を VSCode にインストールする方法は、こちらでも軽く紹介していますが、ざっとおさらいしておきます。
インストールは簡単です。
VSCodeの拡張機能マーケットプレースで「platformio」と検索します。
以下の拡張機能が見つかったら、拡張機能をインストールするだけです。

VSCodeの拡張機能に次のアイコンが表示されたら、インストールされています。

PlatformIO Core(CLI)のインストール(リモート側)

#

今回リモート側はIDEを用意する必要はないので Core(CLI)のみインストールします。

リモート側PCとして以下の2つを用意しました。

  • Windows 10 pro
  • Raspberry Pi 3B+

PlatformIO は Pythonを使用しますので、Pythonを事前にPCにインストールしておきます。
Pythonの準備方法については、ネット上にたくさん情報がありますので、ここでは割愛します。
(VSCodeの拡張機能でインストールした場合は、Platform IDE と一緒に仮想環境Pythonもインストールされます)

Core(CLI)のインストールはここで示されている手順でインストールします。

私はローカルに「get-platformio.py」ファイルをダウンロードする方法でインストールしました。

今後、pioコマンドを使っていきますので、PlatformIOがインストールされたパスを環境変数Pathに追加しておきます。

Windowsの場合はpath環境変数に以下を追加

C:\Users\<ユーザーID>\.platformio\penv\Scripts

Raspberry Piの場合は .bashrc の最後に以下を追加

export PATH=$PATH:$HOME/.platformio/penv/bin

99-platformio-udev.rules 設定(Raspberry Pi側のみ必要)

#

ここで Raspberry Pi側のみ以下の設定を実行しておきます。
これを実行しないと Raspberry Pi側に Arduinoマイコンを接続した時に Arduinoマイコン通信用COMポートが認識されず、後々ハマります。

設定方法はここの手順に従います。

shellに以下のコマンドを入力します。

curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules

その後、「udev」管理ツールを再起動します。

sudo service udev restart

PlatformIOアカウントに登録・ログインが必要(ホスト/リモート双方)

#

PlatformIOアカウント登録(1回だけ必要)

#

PlatformIOのリモート機能を使うには、PlatformIO アカウントへの登録とログインが必要です。
こちらからアカウント登録をします。

登録が終わったら、ホスト側、リモート側の両方でログインします。

ホスト側PlatformIOアカウントのログイン

#

VSCode上のPlatformIOで以下のように「PIO Account」をクリックします。
Username または メールアドレス と PASSWORD を入力します。

ログインできたことがわかります。

リモート側PlatformIOアカウントのログイン

#

コマンドラインで以下のコマンドを入力します。

pio account login

するとユーザIDとパスワードを聞かれるので、それらを入力します。
ログインに成功すると、「Successfully logged in!」とメッセージが表示されます。
(一番最初のログイン時には、いくつかのPythonモジュールがダウンロード/インストールされます)

Lチカプログラムを用意(ホスト側)

#

Lチカプログラムは何度も紹介してますし、ネットでググっても出てきますが、以下に載せておきます。
今回、このLチカプログラムをリモート側PCに接続した Arduinoマイコン にアップロードします。

#include <Arduino.h>

static int T_DELAY = 1000;

void setup()
{
  // initialize LED digital pin as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  // turn the LED on (HIGH is the voltage level)
  digitalWrite(LED_BUILTIN, HIGH);
  // wait for a second
  delay(T_DELAY);
  // turn the LED off by making the voltage LOW
  digitalWrite(LED_BUILTIN, LOW);
   // wait for a second
  delay(T_DELAY);
}

リモートエージェント起動(リモート側)

#

リモート開発をするためには「Agent」を起動しておく必要があります。
リモート側PCで、以下のコマンドを入力し、リモートエージェントを起動します。
(※注意:以下のコマンドは同時に2台のリモート側PCで実行しないでください。実行する場合は「name」の部分を別々の名称にしてください)

pio remote agent start --name slave

今回、リモート側の名前は「slave」としました。
この名前がリモート環境を区別する識別子になります。

起動が成功すると、つぎのようなメッセージが出ます。

リモート側COMポート確認(ホスト側)

#

では、ホスト側PCから リモートPC上のCOMポート(実際には Arduinoマイコン を接続したUSB-COMポート)を確認します。

Project Taskから「Remote Devices」をクリックすると、ターミナルに「pio remote device list」コマンドが発行され、出力が表示されます。

Windows側にArduinoマイコンを接続

#

Windows側に Arduinoマイコン を接続します。
今回、リモート側エージェント「slave」側に COM3 と COM5 ポートがあることがわかります。
COM5ポートが Arduinoマイコン を接続したCOMポートです。

Raspberry Pi側にArduinoマイコンを接続

#

先ほど「リモートコマンドは同時に2台のリモート側PCで実行しないでください」と言いましたが、リモート先の名称を変えて、ちょっとやってみましょう。
リモート名称を以下のようにします。

  • Windows側:slave-win
  • Raspberry Pi側:slave-pi

そして Raspberry Pi側に Arduinoマイコン を接続します。
今回、リモート側エージェント「slave-pi」側に /dev/ttyACM0, /dev/ttyAMA0 ポートがあることがわかります。
ディスクリプションから /dev/ttyACM0 側が Arduinoマイコン 側だと分かります。

リモート側にプログラムをアップロード(ホスト側)

#

ここまでくれば、リモート側に接続した Arduinoマイコンにプログラムをアップロードするのは簡単です。
「Rmote Upload」をクリックするだけです。
実行すると以下のようにプログラムがアップロードされます。

正しくプログラムがアップロードされた場合は、ArduinoのLEDが1秒間隔でチカチカと点滅しているはずです。

Arduinoマイコン にアップロードできないとき

#

PlatformIOは自動でアップロード対象のCOMポートを識別してプログラムを転送してくれますが、うまく転送先を認識できない時があります。
そういう時は、転送先のポート名を「platformio.ini」に記述します。

「/dev/ttyACM0」が転送先として認識されなかった場合は、次のように platformio.ini を「upload_port」を追記します。

[env:uno]
platform = atmelavr
framework = arduino
board = uno
upload_port = /dev/ttyACM0

特定のリモート先を指定する場合

#

「Remote Upload」をクリックすると、複数のリモート先を何度も検索してしまうので、コマンドラインから特定のリモート先を指定してプログラムのアップロードをしてみましょう。
以下のコマンドを入力します。(転送先は Raspberry Pi側の想定)

pio remote --agent slave-pi run --target upload

このようにすることで、特定のリモート先に対してプログラムのアップロードができるようになります。
agent指定は複数設定できるようです。
例えば以下のように書くこともできます。

pio remote --agent slave-pi --agent slave-win run --target upload

リモート側のエージェントのログを確認する(リモート側)

#

念のため、リモート側のエージェントのログも確認してみましょう。

このようにデバイスリストの要求とか、同期のログが表示されていれば成功です。

まとめ

#

いかがだったでしょうか。意外と簡単にリモートPCに接続されたマイコンにプログラムをアップロードできたかと思います。
今後は、他のマイコン(ESP32や Raspberry Pi Pico、STM)や WSL上のPlatformIO環境でのリモート開発なども執筆していきたいと思います。

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。