GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
がじぇるね岡宮です。
情けない切り出しで申し訳ありません。
GR-LYCHEEにはESP32が搭載されており、Wi-FiとBLEができるのですが、プロデューサーミーティング時点ではまだその仕様を最大限に活用できるような準備ができていません。恐れ入りますが、集合ミーティング以降もプロデューサーの皆様と一緒に快適動作を目指して検討していくこととさせてください。・・・α版ではESP8266を乗せていて快調に動いていたのですけど、ESP32はちょっと時期尚早だったかもしれません。
デフォルトファーム(V0.1)ではWi-FiのATコマンドができず、SSCコマンドによってステーションモードの設定、スキャン、接続、IP取得まではできますが、その先のリードライトはEspressifの公開仕様を見る限りではできないように思えます。
以下、4/21までにこちらで試した内容について、記載したいと思います。
以下のプログラムによって、ESP32(UART)とPC(USB)をブリッジできます。US0ボタンでEN、US1ボタンでBOOTを操作できます。ボタンを押すとLOW、離すと HIGHです。
#include "mbed.h" #include "BufferedSerial.h" BufferedSerial pc(USBTX, USBRX, (1024 * 256), 1); BufferedSerial wifi_sirial(P3_15, P0_2, (1024 * 256), 1); InterruptIn button0(USER_BUTTON0); InterruptIn button1(USER_BUTTON1); DigitalOut wifi_en(P5_3); DigitalOut wifi_io0(P3_14); static void button0_fall(void) { wifi_en = 0; } static void button0_rise(void) { wifi_en = 1; } static void button1_fall(void) { wifi_io0 = 0; } static void button1_rise(void) { wifi_io0 = 1; } int main() { pc.baud(115200); wifi_sirial.baud(115200); // check ESP_IO0 if (button1 == 0) { wifi_io0 = 0; } else { wifi_io0 = 1; } // button setting button0.fall(&button0_fall); button0.rise(&button0_rise); button1.fall(&button1_fall); button1.rise(&button1_rise); // reset wifi_en = 0; Thread::wait(100); wifi_en = 1; while (1) { if (wifi_sirial.readable()) { pc.putc(wifi_sirial.getc()); } if (pc.readable()) { wifi_sirial.putc(pc.getc()); } } }
以下のブログ記事を参考にSSCコマンドを打つことで、Wi-Fi動作を確認できます。ただしアクセスポイントにつなぐところまでです。
http://ken5owata.hatenablog.com/entry/2017/02/05/211732
私はTeratermで試しましたが、設定は以下の通りです。シリアル接続後、ENボタンを押すとブートメッセージがわらわらと出てきます。
SSCではWi-Fiでリードライトできなかったので、せめてATコマンドで動くようにしたかったので、以下のマニュアルを参考にESP ATファームをmakeして、FLASH DOWNLOADツールで書き込みをしてみました。書き込みモードにするときはUS0、US1を同時に押して、US1は押したままUS0を離します。そのあとUS1を離します。
https://espressif.com/sites/default/files/documentation/esp32_at_instruction_set_and_examples_en.pdf
しかし、書き込みエラーになります。必ず0x00027400番地の書き込みでエラーになります。
この前段階でmake flashでも同様に書き込みができないことを確認していますが、肝心なところでつまづきました。本来は全数ATコマンド用のファームを書き込みしてライブラリと共にお送りしたかったのですが、無念です!
皆様のお知恵を拝借したいです。
いろいろとシリアルブリッジのプログラムをいじって試してみましたが、私のところでも同じ番地でエラーとなります。BufferdSerialをRawSerialにしても同じなので、ブリッジ経由だとうまく書き込みが出来ない感じです。
もう少し検証が必要ですが、とりあえず直結して書き込みました。
シリアルブリッジを利用してPCからコマンドを入力し、WiFi APに接続してDNSを引くことが出来る事までは確認しました。
ただし、ESP32-ATをそのままビルドすると、UART0がコンソール用、UART1(IO16,IO17)がATコマンド用になるので、
をしています。
これをしても、起動時に少々起動メッセージが出力されてしまうので捨てる必要がありますね。
ご参考まで。Linux(Ubuntu16系)でもダメでした。
Flashing binaries to serial port /dev/ttyACM0 (app at offset 0x10000)... esptool.py v2.0-beta3 Connecting........_____....._ Uploading stub... Running stub... Stub running... Configuring flash size... Auto-detected Flash size: 4MB Flash params set to 0x0220 Compressed 14512 bytes to 8146... Wrote 14512 bytes (8146 compressed) at 0x00001000 in 0.7 seconds (effective 161.0 kbit/s)... Hash of data verified. Compressed 144 bytes to 67... Wrote 144 bytes (67 compressed) at 0x0000f000 in 0.0 seconds (effective 105.1 kbit/s)... Hash of data verified. Compressed 790992 bytes to 461652... Writing at 0x00014000... (6 %) A fatal error occurred: Failed to write compressed data to flash after seq 1 (result was C100) /home/jun/esp/esp-idf/components/esptool_py/Makefile.projbuild:52: ターゲット 'flash' のレシピで失敗しました make: *** [flash] エラー 2
RZ-ESP32間のモニタをしてみたところ、RZ→ESP32で送信が途切れている感じでした。
それではと、
PC - FTDI - RZ UART4 - シリアルブリッジ - RZ UART - ESP32
と接続して試したら書き込みは成功しました。BufferedSerialを使うまでも無く、RawSerialで問題ありませんでした。
恐らく、LPC11U35(mbed I/F)経由だとうまくいかないのかなと思ってます。これなら無改造で書き込みができるので、当面はなんとかなりますね。
参考までに書き込み時に使用したプログラムはこちら
#include "mbed.h" //#include "BufferedSerial.h" //BufferedSerial pc(USBTX, USBRX, (1024 * 256), 1); //BufferedSerial wifi_serial(P3_15, P0_2, (1024 * 256), 1); RawSerial pc(P5_15, P5_14); RawSerial wifi_serial(P3_15, P0_2); InterruptIn button0(USER_BUTTON0); InterruptIn button1(USER_BUTTON1); DigitalOut wifi_en(P5_3); DigitalOut wifi_io0(P3_14); static void button0_fall(void) { wifi_en = 0; } static void button0_rise(void) { wifi_en = 1; } static void button1_fall(void) { wifi_io0 = 0; } static void button1_rise(void) { wifi_io0 = 1; } int main() { pc.baud(115200); wifi_serial.baud(115200); // check ESP_IO0 if (button1 == 0) { wifi_io0 = 0; } else { wifi_io0 = 1; } // button setting button0.fall(&button0_fall); button0.rise(&button0_rise); button1.fall(&button1_fall); button1.rise(&button1_rise); // reset wifi_en = 0; Thread::wait(100); wifi_en = 1; while (1) { if (wifi_serial.readable()) { pc.putc(wifi_serial.getc()); } if (pc.readable()) { wifi_serial.putc(pc.getc()); } } }
ESP32側は詳しい人にお任せします。
USB0で動きました!※なので、ゴミみたいなデバッグ日記の書き込みは消しました。
結論から言うと以下の2点が原因でした。
修正箇所は以下の通りです。
USBSerial.cpp
int USBSerial::_putc(int c) {// if (!terminal_connected)// return 0;bool USBSerial::EPBULK_OUT_callback() {// uint8_t c[65]; uint8_t c[513];//uint8_t USBSerial::available() {uint16_t USBSerial::available() {
USBSerial.h
// uint8_t available(); uint16_t available();// CircBuffer<uint8_t,256> buf; CircBuffer<uint8_t,1536> buf
フロー制御も殺しているので、一旦USBSerial2という名前で作りました。試してみてください(オフラインビルドでのみ確認)。CircBufferのサイズはテキトウです。書き込みツールは1024バイト+αの単位でデータを送信してきます。1100では足りない場合があったので1536としています。