Spresenseで開発するために、Arduinoを利用していたが、もう、限界。

複数のプログラムを切り換えて使うたびに、そのWindowがどこにいったか探すのがめんどい。 Editorも気に入らない。 ここ何年かですごく進化したけど、元々ソフトやってたエンジニアにはきつい。

ということで、VSCode の PlatformIOを利用する。

以前の記事の続き。

あと、VSCodeでは、MultiCoreの開発ができないと思っていたけど、そんなことはない。 親切とはいえないけど、 出来る ということを教えてくれただけでも有り難いページ。

ということで、なるべく親切に解説する。

PlatformIO の準備

install

VSCodeに、PlatformIO Pluginをinstallする。

現時点で、 v3.3.1

正しくinstall すると、左のサイドメニューに虫みたいなアイコンが表示される。 これが、PlatformIO の起動ボタン。

一度PlatfromIOを起動するば、以降、下部メニューにも虫と同じ機能の家アイコンがある。 初期画面(HOME)に戻りたいときは、そっちをクリックしてもよい。

虫ボタンをクリックすると、右のペインにPlatfromIO のHOME画面が表示される。

Spresense のDevice情報取得

前述のページにもあるけど、再掲。 githubから有志の方が提供している情報をDownloadする。

まずは、QUICK ACCESS ペインの メニュー Miscellaneous - PlatfromIO Core CLI をクリック。

VSCode Windowsの右下部あたりに、 Terminal が開く。 pio コマンドのhelpが表示されるはず。

Terminal内で、以下のコマンドを実行。

pio pkg install -g -p https://github.com/maxgerhardt/platform-sonyspresense.git

これが、Arduino の 設定 で board managerのURLを足したのと同様になる。

新規プロジェクトの作成

mainCoreでLED0を、subCore1でLED1をLチカするプログラムを作ってみる。

Create New Project をクリックする。

すると、こんな感じのダイアログが表示されるので、

  • Name ... お好きなものを入力
  • Board .. Spresenseを選択

Finish するとちょっと時間がかかるけど、最終的に初期のtemplateが作成されて、以下のような画面になる。

platformio.ini の設定

platformio.ini は、ちょっと修正がいる。

SubCore1 を利用する場合、こんな感じ。

[env]
platform = sonyspresense
board = spresense
framework = arduino
monitor_speed = 115200
upload_port = /dev/cu.SLAB_USBtoUART
monitor_port = /dev/cu.SLAB_USBtoUART

[env:spresense_mainCore]
build_src_filter = +<main/>

[env:spresense_subCore1]
build_flags = -DPIO_FRAMEWORK_ARDUINO_CORE_SUB_CORE_1
build_src_filter = +<sub1/>

なんてことはない、SubCore用のMake&Uploadの場合、 PIO_FRAMEWORK_ARDUINO_CORE_SUB_CORE_1 をdefine しえやればいいらしい。

あとは、普通。

  • env セクションは、共通。
  • env:spresense_mainCore セクションは、MainCore用。ソースのディレクトリ(main.cpp)は、 src/main/ 配下とする。
  • env:spresense_sybCore1 セクションは、subCore1用。ソースのディレクトリ(main.cpp)は、 src/sub1/ 配下とする。

環境の切り換え

platformio.ini 上のどの env:xxxx を利用するかの選択は、下部のメニューから行うのがわかりやすい。

source code main.cpp

mainCore用のmain.cpp は、src 配下にフォルダ main を作成し、 src/main/main.cpp というファイル名にする。 subCore1 も同様に、 フォルダ sub1 を作成し、 src/sub1/main.cpp というファイル名にする。

main/main.cpp

setup() で、subCore1 の起動を行い、loop() で、LED0をチカチカする。

main.cpp · Gistcpp
#include <Arduino.h>
#include <MP.h>

/*
 * LED0 をチカチカする
 */
void setup()
{
  int ret;

  pinMode(LED0, OUTPUT);

  puts("initialization mainCore");

  /* Launch SubCore */
  printf("Kick SubCore\n");
  ret = MP.begin(1);
  if (ret < 0) {
    printf("MP.begin error = %d\n", ret);
  }
}

void loop()
{
  puts("mainCore loop!");

  digitalWrite(LED0, HIGH);
  delay(1000);

  digitalWrite(LED0, LOW);
  delay(500);
}

環境を切り換えて、compile&uploadする。

sub1/main.cpp

loop() で、LED1をチカチカする。

main.cpp · Gistcpp
#include <Arduino.h>
#include <MP.h>

/*
 * LED1 をチカチカする
 */
void setup()
{
  int ret;

  pinMode(LED1, OUTPUT);

  puts("initialization subCore1");
}

void loop()
{
  puts("subCore1 loop!");

  digitalWrite(LED1, HIGH);
  delay(1000);

  digitalWrite(LED1, LOW);
  delay(500);
}

環境を切り換えて、compile&uploadする。

Demo