M5STACK(書き込みできない問題)

先日発生したM5Stackの書き込みエラー、再度発生して未だに直せない。

途中経過というか、調べてみたことをメモ。

 

Arduino IDEでのエラーは下記。

(簡単なスケッチだとエラーが出ないこともある。動かないけど)

 

 Writing at 0x00001000... (100 %)
 Wrote 12304 bytes (8126 compressed) at 0x00001000 in 0.1 seconds (effective 912.4 kbit/s)...
 File  md5: c9eef0ea20f73dd01d9d11b993a7f5b0
 Flash md5: a5d27405f560aff71439fc146d13d59f
 MD5 of 0xFF is 2036f3103f5c9c65c80411e064d4c928

 A fatal error occurred: MD5 of file does not match data in flash!
 A fatal error occurred: MD5 of file does not match data in flash!

 

対策として、何度もリトライすることとアップロードのスピードを変えること。

それで一度は治ったんだけど、また同じ症状が出まくって現在に至る。

 

実はダメ元で、ファームウェアも書き換えてみようとした。

(それでesptoolを最新にしたくて、Pythonのバージョンアップまで飛び火した)

 https://github.com/m5stack/M5Cloud/tree/master/firmwares/OFF-LINE

からbinファイルを落としてきて、firmware.binと名称を変えて、

 $ esptool.py --chip esp32 --port (接続したポート名) erase_flash

 $ esptool.py --chip esp32 --port (接続したポート名) write_flash --flash_mode dio -z 0x1000 firmware.bin

としたところ、同じようにエラーが出た。文面も同じ。

どうしてもMD5チェックで引っかかるらしい。

 

原因は、どうやら書き込み時にGPIOピンに何か繋げてあるとまずい…ことがあるらしい。

これは心当たりありまくり。

Lチカしようと、本体に直接LEDと抵抗を挿していた。

最初は問題なかったんだけど、だんだんおかしくなった感じ。

書き込み時にはよけいなものは外しておいたほうがいいらしい。

(今まで結構大丈夫だったんだけどなあ)

でも一応、RSTとGNDにコンデンサを入れて書き込みしてみるヤツもやるだけやってみた。ダメだったけど。

 http://forum.m5stack.com/topic/55/simple-fix-when-upload-fails

 

現在LCDにも電源が行ってない感じでバックライトも付かず、ますますマズイ。

ただ、中身のESP32は生きているようで、接続したままリセットするとArduino IDEのシリアルモニタには

 

 rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
 configsip: 0, SPIWP:0xee
 clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
 mode:DIO, clock div:1
 load:0x3fff0018,len:4
 load:0x3fff001c,len:956
 load:0x40078000,len:0
 load:0x40078000,len:13076
 entry 0x40078ad0
 user code done

 

と、反応はある。

なので放置しちゃうのはもったいなくて、なんとかしようといじり倒してます。

 

他にもM5Stackは持ってるので遊ぶのは問題ないんだけど、中途半端に治らないのが気に入らない。

それとやっぱり一番シンプルなM5Stack Basicは手元に持っておきたい。

手持ちのを修理しつつ、いずれまた買おうかな。

Sponsered Link

M5STACK(その10)

実は昨日の問題がまた発生したんだけど、何度も書き込みするのが面倒になったので別のM5Stackを引っ張り出した。

たくさん買っておいてよかった。(と、前向きな考え方をしておく)

 

接続したかったのは先日スイッチサイエンスで購入した、M5Stack用USBホストシールド。

 https://www.switch-science.com/catalog/3919/

9/8時点で既に在庫なしになってる。早めに買っておいてよかった。

ときどきM5StackをUSB機器と接続して使ってみたいことがあるので、ブレッドボード上でなんとかしようとしてたんだけど(実際、やってる人がいた)、やっぱコンパクトにまとめられてるのが欲しかった。
機能は言わずもがな、M5Stackの小さいサイズの良さが生かされてるのがいい。

 

今回の動作確認に使ったのは、よくあるBluetoothのドングル。

ESP32ってBluetooth(BLEか?)搭載だったような気がするので実際には使わないかもだけど、何がいいってお手軽に接続できるところ。

何よりドングルも小さいので邪魔にならないし。

 

事前準備として、USBホストシールドのライブラリをダウンロードして追加。

 https://github.com/felis/USB_Host_Shield_2.0

この中にあるサンプルスケッチの、Bluetooth/SPP.inoを使用。

中を見るとわかるけど、Bluetoothで送られたデータをシリアルモニタにエコーバックするだけの単純なスケッチ。

これをちょびっと書き換えて、M5Stack用にした。

ライブラリのSPP.hもいじって、69行目の

        SPP(BTD *p, const char *name = "Arduino", const char *pin = "0000");

を、

        SPP(BTD *p, const char *name = "M5Stack", const char *pin = "0000");

にし、ペアリングの時にM5Stackが出てくるようにした。

スマホから見るとこんな感じ。なんか嬉しい。

スケッチもシリアルモニタに表示させるところをM5Stackの画面に出るように書き換えて、コンパイルして転送。

お手軽にスマホからデータを送りたいので、「S2 Terminal Bluetooth Free」をインストールした。

アプリを起動し、ペアリング済みのデバイスからM5Stackを選択。

M5Stackと接続できた状態。

試しに「test」と書いて送ってみると…

なんだこりゃ。

と思ったけど、そうかASCIIコードになっちゃうのか。そこまで考えてなかった。

 

でも一応動作確認はできたのと、意外と簡単だったのでとても楽しい。

やりたいことはたくさんあるんだけど、自分の知識が追いついてないので、今回のようにサンプルスケッチをカスタムして実験しつつ欲しいものを作っていこうと思う。

Sponsered Link

M5STACK(というかESP32の問題)

M5Stackの新しいボードが届いたのでそれについて書こうと思ったのに、全然別件のトラブルが起きてビビったのでそっちを先にメモしておく。

(もう出ないことを祈るけど…)

 

久々にM5Stackを接続して、スケッチをコンパイルして書き込みしたところ、見たこともないエラーが出た。

ご丁寧に、

 A fatal error occurred: MD5 of file does not match data in flash!

 A fatal error occurred: MD5 of file does not match data in flash!

と、ムカつくことに二行も出て来てくれた。

もちろん書き込みはできてないようで、シリアルポートにも何も出てこない。

コンパイルまではできているので、ハード側の問題だとわかる。

 

このエラーメッセージでそのまま検索したところ、どうやらM5Stackの問題ではなくてESP32の問題らしく、いろんなところで見つかった。

でも具体的な対処方法が書かれているところが見当たらない。

どこかにはあったかもだけど、その時自分がざっと見た感じでは見つからなかった。

ESP32のフォーラムでも同じエラーをちょこちょこ見かけたけど、どうもはっきりしない。

 https://www.esp32.com/index.php

 

ただ、Nefry BTというESP32を使ったボードの解説サイトに、それっぽい話が書いてあった。

 https://dotstud.io/docs/nefrybt-error-handling-2/

単純に、

  • 何度も書き込みをしてみる
  • Arduino IDEのUpload Speedを遅くする

で、治ることがある…らしい。

 

スケッチを簡単なものに変えて、記載されている通りスピードを921600から460800にし、5,6回書き込みしてはリセットしてみたけど治らない。

なんかもう最後はめんどくさくなって、スピードを元通り921600にしてみたところ、あっさり治ってしまった。

 

元に戻したのがよかったのか、何度も繰り返したのがよかったのかわからず、なんか納得できない。

でももしM5Stackに限らずESP32が載ったボードで同じエラーが出たら、諦めずに書き込みを繰り返してみるといいかもしれない。

Sponsered Link

M5STACK(その9)

ちょっとだけM5Stackにねこあつめの猫っぽいイラストを表示させようと思ったら、えらい時間がかかってしまった。

わざわざBMPにコンバートしたもんだから、しなくていい苦労をした。

(あいかわらず懲りてない)

 

イラストを準備し、以前OELDに表示させた時に使ったコンバータ(の、ホームページ)でやってみたんだけど、やっぱりうまく行かなかった。

なんかそんな気がしてたので、M5StackでBMPを表示させるための方法を検索。

知りたいのは画像をコンバートするためのツール。

 

しかし調べたらフォーラムにそのまんまの問い合わせが載っていて、すぐに判明。

 https://github.com/m5stack/M5Stack/issues/28

さっそくLCD image converterをダウンロード。でもWindows用だったので、わざわざ仮想環境からコンバートした。

その前に設定には注意、

Optionから、Imageのタブのとこ。書き込み通りにカスタム。

できたcファイルをテキストエディタで開いて編集。これがまた何度か引っかかった。

 

  • #include <stdint.h>は残しておく
  • 「Static」という単語は削除
  • コード内の画像の名前が「image_data_(画像の名前)」になっているので、必要なら修正
  • 一番下の方にある「const tImage」で始まる行は削除

 

自分はコメント部分は邪魔なので削除してました。

これでArduino IDEで画像表示させるプログラムと同じフォルダに入れておけばOK。

(もちろん画像を呼び出さないといけない)

ちょっと違う画像をもう一枚作って、左端のボタンを押したらちょっとこっちを向く(ような感じがする)ようにしました。

カスタムして、もっとねこあつめらしくできる…かも。

#include  <m5stack.h>

extern const unsigned char neko1[];
extern const unsigned char neko2[];

void setup() {
  M5.begin();
  M5.Lcd.drawBitmap(0, 0, 320, 240, (uint16_t *)neko1);
}

void mikaeri_neko() {
  if(M5.BtnA.wasPressed()) {
  M5.Lcd.drawBitmap(0, 0, 320, 240, (uint16_t *)neko2);
  delay(1000);
  M5.Lcd.drawBitmap(0, 0, 320, 240, (uint16_t *)neko1);
  }
}

void loop(){
  mikaeri_neko();
  M5.update();
}
Sponsered Link

M5STACK(赤外線受信の余談)

またM5Stackの話になるけど、ついでなんでやったことメモ。

 

先日の赤外線が出てるかどうかのチェックをArduino Nanoでやったけど、M5Stackでやれば持ち運びがちょっと便利。

受光素子をそのまま接続して、IRrecvDemo.inoのスケッチはちょっとカスタムして転送すれば、LCDにシリアルモニタの表示を出して使える。

接続はGNDとVCC(3.3V)、データの入力は今回は5pinにした。

見ての通り、フォントのサイズはいじってないので文字が小さい。老眼にはキツイ…。

でもわざわざ別の部屋にあるリモコンを取りに行かなくても、これ持って行けばいいのは便利だったぞ。

 

シリアルモニタの表示をLCDに出力するのは結構簡単で、スケッチのSerial.printlnのところをM5.Lcd.printlnにすればいいだけ。

もちろんM5Stack用のスケッチにするためには「#include <M5Stack.h>」と「M5.begin();」の追加は必要だけど、プログラムのことを良く知らない自分でもこのぐらいの移植はできる。

でも当初M5.Lcd.printlnとM5.Lcd.printの違いを知らなくて改行されなくて悩んだのは内緒。

(Serial.printlnとかM5.Lcd.printlnって改行コード含んでたんだな)

 

Arduinoにわざわざ外付けのLCDを接続してということをしなくても、そのまま使えるのはとても楽。

コマンドの意味とかライブラリの中身とか気にせず、実用的なものをさくさく作って使えるってこういうことなのか〜と納得。

勉強用に使うのもいいけど、これだと便利すぎるだろうか。

ファームウェア書き換えて、MicroPythonの勉強で使うならいいかもしれない。(個人的感想)

 

Sponsered Link