こんにちはマイコン(M5StickC Plus)
先日M5StickC Plusを購入した。マイコンを始める。
M5Stack系列の製品の一つであるM5StickC PlusはArduino IDEでもプログラミングできるということなので、まずはそれを使うことにする。Arduino IDEのインストールはhomebrewで、M5StickC Plus用の設定はマニュアル通りに行った。
brew install arduino
- Quick Start - Arduino IDE Development
- ホードマネージャからM5Stack 1.0.9をインストール
- ライブラリマネージャからM5Stack 0.3.6をインストール(※後でM5StickC Plusには必要ないことに気付いた)
- 同じくライブラリマネージャからM5StickCPlus 0.0.2をインストール
Arduinoといえば最初に動かすのは「Lチカ」だそうなので、まずはそこからやってみたところエラーが発生。
Lチカ動かず
/Applications/Arduino.app/Contents/Java/examples/01.Basics/Blink/Blink.ino: In function 'void setup()':
Blink:28:11: error: 'LED_BUILTIN' was not declared in this scope
pinMode(LED_BUILTIN, OUTPUT);
^
/Applications/Arduino.app/Contents/Java/examples/01.Basics/Blink/Blink.ino: In function 'void loop()':
Blink:33:16: error: 'LED_BUILTIN' was not declared in this scope
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
^
exit status 1
'LED_BUILTIN' was not declared in this scope
ハードウェアが違うからそういうこともあるかなと深くは考えず、それならもっと簡単なBareMinimumにトライした。これは中身が何もないので問題ないだろうと思いきや、またもエラーが発生すした。しかもさっきと違って意味が分からない。
空っぽでもエラー
fork/exec /Users/akira/Library/Arduino15/packages/m5stack/tools/esptool_py/3.0.0/esptool.py: no such file or directory
ボードM5Stick-C-Plusに対するコンパイル時にエラーが発生しました。
いや、本当に意味が分からない。エラーメッセージで検索してもぴったりマッチするような情報が見付からない。
ただ、Arduino IDEとかM5StickC Plusとかと関係なく、エラーメッセージの内容からesptool.py
が存在しないのだということは分かる。実際に表示されているパスが存在しないことを確認できる。(.py
が付かないesptool
ならあるのに。)
もしかしたらセットアップの途中で何か問題が生じていたのを見逃してしまったのかもしれない。そう思って~/Library/Arduino15
や~/Documents/Arduino/libraries
を削除してやり直してみたが状況に変化なし。
もしかしたらバージョンが新しすぎて何かミスマッチが発生しているとか? 3.0.0
っていうのがいかにもメジャーリリース直後っぽいし? なんて考えて各種バージョンを下げたり~/Library/Arduino15/package_m5stack_index.json
をながめてそれらしいzipファイルの中身を確認してみたりした。しかし状況は変わらず。
どうもどれを見ても3.0.0/esptool.py
なんてものがなさそうである。
ということで、こうなったら仕方ないとgrepをかけて、どうもそれらしいのはこれかと見当を付けたのが~/Library/Arduino15/packages/m5stack/hardware/esp32/1.0.9/platform.txt
である。
いや、実はその前にもう一手間あって、Arduino IDEの設定で「より詳細な情報を表示する」の「コンパイル」にチェックを入れた。こうしておくと裏側で実行されているコマンドが表示される。実は「エラーメッセージをコピーする」でコピーしてくると末尾に以下の記述があったのだが、気付いたのはだいぶ後だった。
「ファイル」メニューの「環境設定」から
「より詳細な情報を表示する:コンパイル」を有効にすると
より詳しい情報が表示されます。
ともあれ、実行されているコマンドの中の問題のエラーメッセージの直前に実行されているコマンドに注目した。長いので折り返しているのと一部パスを省略したがこんなコマンドラインであった。
/Users/akira/Library/Arduino15/packages/m5stack/tools/esptool_py/3.0.0/esptool.py \
--chip esp32 elf2image --flash_mode dio --flash_freq 80m --flash_size 4MB \
-o /.../arduino_build_169372/BareMinimum.ino.bin /.../arduino_build_169372/BareMinimum.ino.elf
これらのコマンド引数とともにesptool.pyをキーにして探したところ見付かったのがplatform.txtで、抜粋するとこんな内容だった。
tools.esptool_py.path={runtime.tools.esptool_py.path}
tools.esptool_py.cmd=esptool.py
tools.esptool_py.cmd.linux=esptool.py
tools.esptool_py.cmd.windows=esptool.exe
# ...(略)...
## Create hex
recipe.objcopy.hex.pattern="{tools.esptool_py.path}/{tools.esptool_py.cmd}" --chip esp32 elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.flash_freq}" --flash_size "{build.flash_size}" -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf"
recipe.objcopy.hex.pattern.linux=python "{tools.esptool_py.path}/{tools.esptool_py.cmd}" --chip esp32 elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.flash_freq}" --flash_size "{build.flash_size}" -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf"
ここでesptool.py
はないがesptool
ならあったことを思い出す。esptool
ならいけるのか?
実行されていたコマンドラインではpython 〜
となっていなかったので.linux
が付かないほうであろう。ということでplatform.txtのtools.esptool_py.cmd=esptool.py
をtools.esptool_py.cmd=esptool
に書き換えて(.py
を削除して)から「検証」してみたところエラーが出なくなった!
エラーが出なくなったのはうれしいが、これをM5StickC Plusに書き込んでも何ら動きは見られないはずである。
それでは仕方ないから何か別の動いていることが分かるサンプルを動かたい。でも「Lチカ」はダメだったし…… とサンプルをながめていたところ「M5Stack」という項目があるのに気付いた。そしてその中の「Basic」の中に「HelloWorld」といういかにもなものがあった。これでいこう。
(実はここまでにあれこれ調べては何も見付からなかったり、いろいろやっても状況が変わらなかったりのトライ&エラーをそれなりに繰り返していたために迷走を始めてしまっていて、「M5Stack」のすぐ下に「M5StickCPlus」という項目があることに気付けなかった。気付けていれば、この後は少しだけマシだったのだが。)
「HelloWorld」を開いて「検証」を実行。今度はすんなり完了。続いて「マイコンボードに書き込む」を実行する。
完了。エラーなし。
待てども何も起こらず。画面は黒いまま。あれ?
もしやおかしなことになってしまった? リセットは? 元に戻すのは? などと調べていたところ、ふとインクルードするのが違うんじゃないかというに気が付いた。
#include <M5Stack.h>
void setup(){
M5.begin();
M5.Power.begin();
M5.Lcd.print("Hello World");
}
void loop() {}
コメントを除くとHelloWorldはこんな内容である。一行目、M5StickCPlusなのではないか?
#include <M5StickCPlus.h>
に変更して「検証」するとエラーが出た。
HelloWorld:21:6: error: 'class M5StickCPlus' has no member named 'Power'
M5.Power.begin();
^
exit status 1
'class M5StickCPlus' has no member named 'Power'
Powerなんて無い。そういうことのようなのでその行を削除。再び「検証」を実行するとエラーが出なくなったのを確認。
今度こそとマイコンに書き込む。完了。どうかな。
どうかな?
Hello World
小っちゃい。けど表示された!
こうなったら「Lチカ」も済ませておきたい。少し検索してみたところM5StickCの内蔵LEDを使うに解答があった。ありがたい。
M5StickCは裏側を見ればわかるのですが、GPIO10に接続されています。また、LOWに落とすことでLEDが点灯しますので注意してください。
たしかに裏側に書いてあった。丸で囲んだ部分だ。
M5StickC Plusの裏側
まだぜんぜん分かってなくて「いろいろ付いてるんだなー」とか「端子もいっぱいだなー」とかぼんやりながめるだけだったが、ちゃんと情報が用意されているのだなと思いを新たにしつつ記事に従ってBlinkを手直し。「Lチカ」もできた。
#include <M5Stack.h>
void setup() {
M5.begin();
pinMode(GPIO_NUM_10, OUTPUT);
}
void loop() {
digitalWrite(GPIO_NUM_10, LOW);
delay(1000);
digitalWrite(GPIO_NUM_10, HIGH);
delay(1000);
}
ひとまずここまで。
(ちなみにサンプルの中のM5StickCPlus→Basic→Displayをそのまま使えばすんなり画面で動きを確認することができた。M5Stackライブラリをインストールしていなければもう少し……。)
これで「こんにちはマイコン」と思ったけど調べてみたらあちらは「マイクロコンピューター」か「マイコンピューター」だった。あてにならない記憶だなと書影をながめていたら「こんにちはパイソン」が出版されているのに気付いて少しおどいた。