見出し画像

M5Stackの開発環境にPlatformIOを使ってみたメモ

M5Stack(ESP32)の開発環境としてArduino IDEを使っていると,どうにもビルドが遅くて困ることがあります.Googleで検索してみると,どうやらVSCode(Visual Studio Code)とPlatformIOを使った開発環境だとビルドが速いらしいということで,試してみました.
結果,ビルドはずいぶん早くなりました.大変ありがたい.開発環境構築方法は多くの方が詳しく紹介されていてその通りにインストールすれば使えるようになります.今回は実際に使うところでちょっとつまづいた部分について紹介します.

M5Stackのサンプルスケッチのヘッダファイルをインクルードしたい

自作のスケッチ(プログラム)に,M5Stackのサンプルスケッチのヘッダファイルをインクルードして,その関数をそのまま利用したいことが良くあります.例えば,M5StickC PlusとJoyC Hatを組み合わせて使うような場合では,Windowsのドキュメントフォルダ内にあるサンプルスケッチフォルダ Arduino\libraries\M5StickC\examples\Hat\JoyCにあるファイルJoyC.hやJoyC.cppです.
Arduino IDEでは,単純に自作スケッチの中に

#include "JoyC.h"

と書けばよいのですが,VSCode+PlatformIOでは使えませんでした.
VSCode+PlatformIOでは,サンプルスケッチフォルダはプロジェクト毎に作成され,Windowsのドキュメントフォルダ内の
PlatformIO\Projects\プロジェクト名\.pio\libdeps\m5stick-c\M5StickC\examples\Hat\JoyC
に保存されています.だったら,

#include "../.pio/libdeps/m5stick-c/M5StickC/examples/Hat/JoyC/JoyC.h"

と書いたらいけるのでは?と思ったのですが,ビルドが最後までは進みませんでした.(リンクのあたりでエラーになる?)
仕方ないので,JoyCフォルダをフォルダPlatformIO\プロジェクト名\libにコピーして,

#include "JoyC.h

と書いたら無事ビルドが通るようになりました.

シリアルポートの設定

PlatformIOはシリアルモニタの機能も持っています.ウィンドウの下の方にあるコネクタっぽいマークをクリックすると起動できますが,やってみたら文字化けしているようでした.
プロジェクトのフォルダPlatformIO\プロジェクト名にあるplatformio.iniに

monitor_speed = 115200
upload_port = COM3
monitor_port = COM3

のように書き足すことで,通信速度とCOMポート番号を指定すると良いようです(COMポート番号はデバイスマネージャなどで確認して入力します).プロジェクト毎にCOMポート番号を設定できるので,例えば2台のM5Stackのプログラムを一緒に作る場合などは,いちいち手動でCOMポート番号を切り替える必要がなくとても便利です.

ESP-NOWのサンプルプログラムが動かない

今回,M5StickC PlusとM5Stack FIREをESP-NOWで通信させようとしたのですが,ネットで紹介されているサンプルプログラムそのままでは動かず悩みました.
送信側のプログラムは下記のような感じになるのですが,

#include <Arduino.h>
#include <M5StickCPlus.h>
#include <esp_now.h>
#include <WiFi.h>
#include "Joy.C"

JoyC joyc;

uint8_t data[6];
const uint8_t slvAddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 送信先のMACアドレス

void setup() {
  M5.begin();
  Wire.begin(0, 26, 400000UL);
  WiFi.mode(WIFI.STA);
  WiFi.disconnect();
  if (esp_now_init() == ESP_OK) {
    Serial.println("ESPNow Init Success");
  }
  esp_now_peer_info_t peerInfo;
  memcpy(peerInfo.peer_addr, slvAddr, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;
  if (esp_now_add_peer(&peerInfo) != ESP_OK) { // ←これがESP_OKにならない
    Serial.println("Failed to add peer");
    return;
  }
  esp_now_register_send_cb(onSend);
}

void loop() {
  M5.update();
  ・・・
  esp_err_t result = esp_now_send(slvAddr, data, sizeof(data));
  delay(30);
}

真ん中あたりのesp_now_add_peerの戻り値がESP_OKになりません.
じゃあ何か戻っているのだろうか?と表示させてみるとESP_ERR_ESPNOW_ARG(引数が無効です)でした.しばらくいろいろ試した結果,ピア情報peerInfoに値を入れる前にゼロで埋めるようにしたらうまくいき,ESP-NOWで通信ができるようになりました.

memset(&peerInfo, 0, sizeof(peerInfo)); // ←これを追加
memcpy(peerInfo.peer_addr, slvAddr, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;

変数を作ったときに初期値が何になるかみたいな挙動がArduino IDEとPlatformIOで違ったりするのかもしれません.

ウィルスバスターが邪魔をする

Arduino IDEでは特に問題なかったのですが,VSCode+PlatformIOでビルドを実行するとセキュリティソフトのウィルスバスターが反応してしまい,ビルドが先に進みませんでした.
いちいちウィルスバスターを止めるのも面倒だなぁ.と思ったのですが,ちょうどESETも持っていたのでウィルスバスターをアンインストールしてESETに入れ替えてみたところ,邪魔されることはなくなりました.


いいなと思ったら応援しよう!