これまで何回かの投稿で、ESP32をJavascriptで動かしていましたが、そろそろ最終系にしようと思います。
前回からの違いは、JavascriptをESP32にあるEEPROMに保存するところです。
Javascriptの更新は、HTTP Postのファイル添付で行います。アップロードするWebページも用意します。
ソースコードもろもろは、以下のGitHubに上げておきました。
poruruba/QuickJS_ESP32
#準備
以下のGitHubからZIPでダウロードして、Visual Studio CodeのPlatformIOから書き込むだけです。
ただし、以下の追加の作業が必要です。
①M5StickCかM5Core2か選択します。
Visual Studio Codeの一番下のところをクリックして、選択します。
②platformio.iniのCOMポート番号をESP32デバイスに合わせて変更します。
M5StickC用とM5Core2用の2か所がありますので、使う方を変更します。
upload_port = COM4
monitor_port = COM4
③EEPROMをErase+書き込みします。
dataフォルダに、ブラウザから表示するWebページがあります。それをEEPROMに書き込みます。以下の順番に実行します。
・Erase Flash
・Build Filesystem Image
・Upload Filesystem Image
④プログラムを書き込みます。
いつもの通り、下の方にある「→」をクリックします。
#ESP32起動直後
事前に、TeraTermなどのターミナルをCOMポートにつないでおくととよいです。
ESP32をリセットして起動します。
ESP32の初回起動直後は、WiFiアクセスポイントのSSIDやパスワードが設定されていません。
WiFi接続に失敗した後、COMポートにつないだコンソール(TeraTermなど)からSSIDとパスワードを聞かれるので入力します。
接続が完了すると、ESP32のIPアドレスが表示されます。次回からは入力不要です。
#Javascriptプログラムの書き込み
ブラウザから、ESP32のIPアドレスを開きます。
http://[ESP32のIPアドレス]
テキストエリアに以下を入力して、アップロードボタンを押します。
import * as gpio from "gpio";
var led = gpio.LOW;
var counter = 0;
async function setup(){
var ipaddress = esp32.getIpAddress();
console.log("ipaddress=" + ((ipaddress >> 24) & 0xff) + "." + ((ipaddress >> 16) & 0xff) + "." + ((ipaddress >> 8) & 0xff) + "." + (ipaddress & 0xff));
gpio.pinMode(10, gpio.OUTPUT);
gpio.digitalWrite(10, led);
}
async function loop(){
console.warn('hello ' + counter++);
led = (led == gpio.LOW) ? gpio.HIGH : gpio.LOW;
gpio.digitalWrite(10, led);
delay(1000);
}
そうすると、プログラムが書き込まれ、LEDがちかちかするはずです。
EEPROMに保存しているので、電源Off/Onした後も継続します。
M5StickCを想定し、LEDがGPIO 10にある前提です。
もし、CLIで更新したい場合は、ファイルにJavascriptを書き込み、Curlで送ってあげるとよいです。
> curl -X POST -F upfile=@main.js http://[ESP32のIPアドレス]/upload_js
どんなJavascriptのAPIがあるかは以下を参照してください。
以上