2020年6月19日金曜日

ラズパイで PlatformIO でコマンドラインで M5StickC を Lチカ

ラズパイのコマンドラインで PlatformIO を使って M5StickC を Lチカしてみました。


環境

  • Raspberry Pi 4 model B
  • Raspbian GNU/Linux 10 (buster)
  • M5StickC

pipenv プロジェクト作成

pipenv プロジェクトのディレクトリを作成して移動

$ mkdir /some/where/m5stickc-lflash
$ cd /some/where/m5stickc-lflash/

pipenv プロジェクト作成

$ pipenv --python $(which python3)

pipenv shell 起動

$ pipenv shell

以下、全て pipenv シェルで実行


Platformio インストール

インストール

$ pipenv install platformio

バージョン確認

$ platformio --version
PlatformIO, version 4.3.4

M5StickC のボード ID を確認

PlatformIO での M5StickC のボード ID を確認しました。

$ platformio boards
--- 省略 ---
Platform: espressif32
================================================================================
ID                               MCU    Frequency    Flash    RAM     Name
-------------------------------  -----  -----------  -------  ------  --------------------------------
--- 省略 ---
m5stack-core-esp32               ESP32  240MHz       4MB      320KB   M5Stack Core ESP32
m5stack-fire                     ESP32  240MHz       16MB     6.25MB  M5Stack FIRE
m5stack-grey                     ESP32  240MHz       16MB     520KB   M5Stack GREY ESP32
m5stick-c                        ESP32  240MHz       4MB      320KB   M5Stick-C
--- 省略 ---

ボード ID は m5stick-c でよさそうです。


PlatformIO プロジェクト作成

プロジェクトのディレクトリを作成して移動

$ mkdir pio_project
$ cd pio_project/

プロジェクト初期化

$ platformio init --board=m5stick-c
  • 上で調べてた M5StickC のボード ID を指定しました。

シリアルポートデバイスを確認

M5StickC を USB 接続したラズパイのシリアルポートデバイスを確認しました。

M5StickC をラズパイの USB に接続する時の /var/log/messages で確認することもできますが、PlatformIO をインストールしたのでこれで確認してみました。

M5StickC をラズパイの USB に接続している状態で以下のコマンドを打ちました。

$ platformio device list
/dev/ttyUSB0
------------
Hardware ID: USB VID:PID=0403:6001 SER=7552CE3E93 LOCATION=1-1.3
Description: M5 Serial Converter

/dev/ttyAMA0
------------
Hardware ID: fe201000.serial
Description: ttyAMA0

/dev/ttyUSB0 で良いようです。


Lチカプログラムを用意

led-flash.ino ファイルを src/ に置きました。

$ cat src/led-flash.ino

#define LED_PIN 10

#define LED_ON  LOW
#define LED_OFF HIGH


void setup() {
    pinMode(LED_PIN, OUTPUT);
}

void loop() {
    digitalWrite(LED_PIN, LED_ON);
    delay(100);

    digitalWrite(LED_PIN, LED_OFF);
    delay(900);
}
  • M5StickC の LED は LOW が ON、HIGH が OFF とのことです。

プログラムをビルド

以下のコマンドでビルド

$ platformio run

エラー無くビルドできました。ターゲットに upload を指定していないのでビルドされただけで M5SticC には書き込まれていません。

.pio/ 配下にビルドされたファイルが出来ていました。

$ ls -la .pio/build/m5stick-c/
合計 28712
drwxr-xr-x 4 pi pi     4096  6月 19 21:38 .
drwxr-xr-x 3 pi pi     4096  6月 19 21:32 ..
-rw-r--r-- 1 pi pi   149000  6月 19 21:38 .sconsign37.db.dblite
drwxr-xr-x 3 pi pi     4096  6月 19 21:32 FrameworkArduino
-rw-r--r-- 1 pi pi   211040  6月 19 21:32 firmware.bin
-rwxr-xr-x 1 pi pi  4265992  6月 19 21:32 firmware.elf
-rw-r--r-- 1 pi pi 24743628  6月 19 21:32 libFrameworkArduino.a
-rw-r--r-- 1 pi pi        8  6月 19 21:32 libFrameworkArduinoVariant.a
-rw-r--r-- 1 pi pi     3072  6月 19 21:32 partitions.bin
drwxr-xr-x 2 pi pi     4096  6月 19 21:38 src

再度ビルドして M5StickC に書き込み

$ platformio run --upload-port /dev/ttyUSB0 --target upload
  • 上で確認したシリアルポートデバイスを指定しました。
  • --target upload によりビルド後 M5StickC に書き込まれました。

M5StickC で Lチカできました。


参考

ラズパイで esptool でコマンドラインで M5Stick のフラッシュをバックアップ&リストア

ラズパイのコマンドラインで esptool を使って M5StickC のフラッシュをバックアップ、リストアしてみました。

ほぼ https://lang-ship.com/blog/work/esp32-esptool-py/ に書かれていることをそのままやっています。

環境

  • Raspberry Pi 4 model B
  • Raspbian GNU/Linux 10 (buster)
  • M5StickC

M5StickC を接続したラズパイのシリアルポートデバイスを確認

ラズパイで $ tail -f /var/log/messages をしながら M5StickC に付属の USB ケーブルでラズパイの USB に接続すると以下のメッセージが出ました。

Jun 18 23:33:44 raspi4 kernel: [19742.992308] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB0

ttyUSB0 と出ているのでシリアルポートデバイスは /dev/ttyUSB0 であることがわかりました。

デバイスファイルも存在していました。

$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0  6月 18 23:33 /dev/ttyUSB0

pipenv プロジェクト作成

pipenv インストール

$ sudo apt install pipenv

pipenv プロジェクト用のディレクトリを作成して移動

$ mkdir /some/where/m5stickc
$ cd /some/where/m5stickc/

pipenv プロジェクト作成

$ pipenv --python $(which python3)

pipenv shell 起動

$ pipenv shell

以下、全て pipenv シェルで実行

M5StcikC のフラッシュをバックアップ

esptool をインストール

$ pipenv install esptool

esptool.py --help で確認すると出てくる flash_id : Read SPI flash manufacturer and device ID を実行。シリアルポートは上で確認した /dev/ttyUSB0 を指定しました。

$ esptool.py --port /dev/ttyUSB0 flash_id
esptool.py v2.8
Serial port /dev/ttyUSB0
Connecting......
Detecting chip type... ESP32
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
--- 省略 ---
Manufacturer: c8
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...

いろいろ情報が表示され、フラッシュのサイズが 4MB であることがわかりました。

フラッシュをバックアップ

$ esptool.py --port /dev/ttyUSB0 read_flash 0x00000 0x400000 ./image-factory-default-4M.bin
  • 先頭アドレス 0x00000 から上で確認したフラッシュのサイズ 0x400000 (10進数で ‭4,194,304‬) バイトを読み出して指定したファイルに保存しました。

保存したファイルのサイズはフラッシュのサイズと同じ 4MB でした。

$ ls -lh image-factory-default-4M.bin
-rw-r--r-- 1 pi pi 4.0M  6月 17 23:18 image-factory-default-4M.bin

バックアップしたフラッシュをベリファイ

$ esptool.py --port /dev/ttyUSB0 verify_flash --diff yes 0x0000 ./image-factory-default-4M.bin
--- 省略 ---
Auto-detected Flash size: 4MB
Verifying 0x400000 (4194304) bytes @ 0x00000000 in flash against ./image-factory-default-4M.bin...
-- verify FAILED: 279 differences, first @ 0x0000b02b
   0000b02b 00 a8
   0000b02c 00 aa
   0000b02d a0 fa
   --- 省略 ---
   0000b81b 00 ff
   0000b81c 01 ff
   0000b81d 00 ff

A fatal error occurred: Verify failed.

ベリファイがエラーになりました。。。

「起動するたびにデータを書き換えているプログラムが存在しており、その場合にはベリファイチェックがNG」とのことで、工場出荷時のフラッシュだったのですがこれに該当しているのかもしれません。

フラッシュをリストア

ベリファイはエラーになりましたが、このバックアップからリストアしてみました。

まずはフラッシュを消去

$ esptool.py --port /dev/ttyUSB0 erase_flash

バックアップしたフラッシュをリストア

$ esptool.py --port /dev/ttyUSB0 write_flash 0x0000 ./image-factory-default-4M.bin
  • 先頭アドレス 0x0000 を指定すると良いようです

うまくリストアできていました。