macsbug

Archive for 6月 2022

Let’s revive the broken M5Stack

leave a comment »

壊れたM5Stackを復活しよう。           2022.06.08

M5Stackに ESP32 MiniKit, S2 mini , M5Stamp C3U を接続します。



修理費用: 640円です。
1. ESP32 MiniKit :640円。
2. ESP32 S2 mini:690円。
3. M5Stamp C3U:870円。

修理改造後の性能:
- ESP32 MiniIKit(MiniKIT_lgfx80M)は M5Stackより 2.6倍 高速です。
- ESP32 MiniKitとS2 miniは SPI 80MHz動作が可能です。
- M5Stamp C3Uは SPI 40MHz までです。

- Raytrace 速度比較:Minikit(M5MiniKit)は M5Stackの2.2〜2.4倍高速です。


.
経緯と故障状況:M5Stackを10台ほど購入。内3台が壊れました。
1. M5Stack Basic:Tip Partsを破損。
2. M5Stack Gray:MD5 error発生。原因は CP2104の不良。
3. M5Stack FIRE :MD5 error発生。原因は CP2104の不良。
-  


.
🟢 Sample Down Load:
3D_CUBE_M5MiniKit.zip , LVGL802_demo_M5MiniKit.zip , MovingCircles_M5MiniKIT.zip
Raytrace_M5MiniKit.zip , Test_PDQ_M5MinKit.zip , Tetris_M5MiniKit.zip
uncannyEyes_M5MiniKit.zip
DL後 pdf(_.pdf)を削除しzipを解凍します。
SPI 80MHzです。ただし LVGL802_demo, Tetris, uncannyEyes は40MHz動作です。
記事の下に示す「LovyanGFX と SPI Frequency」を参照ください。


.
修理方法:
1. ESP32 MiniKit に交換。(SPI Clock 80MHz可能)
2. ESP32 S2 mini に交換。(SPI Clock 80MHz可能)
3. M5Stamp C3U に交換。(SPI Clock 40MHzまで可能)
4. Libraryは LovyanGFXを使用します。


.
準備:
1. M5Stack基板のLayoutを把握します。
- Parts arrangement of M5Stack。2020.04.01。pdfは 解析と部品配置が示されています。
- レイアウトから部品や信号の流れの把握、修理、改修が可能です。

2. M5StackのSchematicを把握します。
- M5-Core-Schematic(20171206).pdf
- 公式のSchrmaticは 意図的な誤記がありますので解析を把握します。

3. 部品リスト:640円 ( $5 ):価格は 円相場で変動します。

No. Nomen Purchase Price
1 MH ET LIVE ESP32 MiniKIT
WAGAT official Store
. 10個:5585円
. 1個560円
. 輸送期間 10day
. その後 価格上昇。
560円
1 MH ET LIVE ESP32 MiniKIT SAMIORE Store
. 10個:5626円, 1個563円, 輸送期間 9day
563円
1 MH ET LIVE ESP32 MiniKIT SAMIORE Store 698円 698円
1 ESP32 S2 mini V1.0.0
LOLIN Official Store
. $7.85
. 輸送期間 11day
921円
1 ESP32 S2 mini V1.0.0 TENSTAR Store $4.37 603円
1 ESP32 S2 mini V1.0.0 SuperModule Store $4.42 611円
1 M5Stamp C3
M5Stack Official M5Stamp C3
. $10.2 (1162円)
. 5pcs販売は 3923円で 1個 785円
785円
2 FFC 26pin (0.7mm to 2.54mm)
JJiu Online Store
. 5pcs 393円。個 79円
79円
3 N ch FET AO3400A 秋月電子通商
. 10pcs 220円。1個 22円
22円
4 Tip Resistor 10K,100K, 両面テープ,,
5 0.26mm ジュンフロン線 千石電商

.
S2 mini : Without TELEC:ソフトで送信停止 又は アンテナ部に50Ωダミーロードを接続します。
変換基板:LCDのPitchは 0.7mmです。よって 0.7mm to 2.54mm 変換基板を使用します。
N ch FET AO3400A:基板にある FET1 AO03402 が無い場合に使用できます。

4. Libraly:LovyanGFX



.
以下の順に記載します。
1️⃣ ESP32 MiniKit , 2️⃣ ESP32 S2 mini , 3️⃣ M5Stamp C3U

1️⃣ ESP32 MiniKit

改造手順:
1.分解, 2.LCDの取り外し, 3.MiniKit RST Switch取り外し, 4.LCD配線,
5.基板加工, 6.A,B,C,Power Buttonの高さ調整, 7.基板の加工と配線の実例
の順で説明を致します。

1. 分解:
- Screw2本とSpeakerを外します。
- 基板を左に移動し 基板凹部とケース凸部を合わせ 基板を上げます。
- LCDのFront側(両面テープで固定されている)を外す方法もあります。
- LCDのFlex Wireは短い為 切れないように注意します。

2. LCDの取り外し:M5Stackの基板とLCDを外します。
- Flex Wireは 切れやすく難解ですので準備と注意をしてください。
- 注意:Flex Wireは短く 僅かの範囲で基板を浮かせて取り出します。
- 注意:LCDのFlex Wireは短く”力”で切断しやすい為 ”力”を加えない事。
- 2本のネジを外します。
- Speakerの線が切れないように引き出します。
- Speaker側に基板を移動し基板を上側に上げて引出します。
- 基板からFlex Wireをハンダゴテで外すには コテ先の長い部分で
-  Flex Wireハンダ部の全体を溶かして ”力”を加えずに短時間で取ります。


- 補足:Flex wreを破損した場合の処置方法。
-  参照:Repair Repair M5Stack Display
-  より線Wreを 分解して1本にしハンダ付けします。
-  Flex端子と変換基板(半田メッキ済)に半田付け済みのWireを
-  瞬時にハンダ付けします。上からチョンと押す程度です。

3. MiniKit RST Switch 取り外し:
- 参照:ESP32 Minikit schematic
_ MiniKitの部品がM5StackのPower Buttonに接触する為に
_ RST Switch(緑色)を外し 基板(黄色)をカットします。
_ RST Switch(緑色)を外した状態。
_ RST(SW4) , R29, C37, EN の位置。
_ M5StackのPower ButtonとMiniKitの基板が接触しなくなります。

.
4. LCD配線:
- LCDを変換基板へハンダ付けします。
- 配線図に従い 配線します。
- LCD, 変換基板, M5Stack基板の間は 隙間は ありませんので注意。
- BL(Back Light)用の FET(AO3402)は M5Stack基板の部品を使用します。
- 今回 BLは ESP32のGNDへ配線しています。

5. 基板加工:
- メモ:M5Stackの基板は 4層です。

6. A,B,C Button, Reset(Power) Button の高さ調整:

A,B,C Buttonに
シールを4枚程 積み重ね
両面テープで固定します。
Power Buttonは 1枚です。
参考:
Repair M5STACK Power Switch

メモ:M5の設計は 0.1mm
(ポストイット1枚分)
少なく緩みがあります。

.
7. 基板の加工と配線の実例:

1. S4 Power Swicth 配線。

2. この基板のR13(100K)は
_ 値が異なっていた為 103(10KΩ)に交換。
_ RST時定数:1nF+10KΩ。τ=0.47μsec。
_ 100KΩ τ=4.7μsec でも良いです。

3. L2 を外します。
_ MiniKitの3V3を使用する為にL2を外し
_ EA3036 OUTPUT(VCC3V3)を切断。
_ VDD3V3の場合は L3を外します。

4. 3V3 Wire 配線。

5. GND Wire 配線。
_ Grove GNDからESP32 GNDへ配線。

1. EA3036 3V3 OUTPUTは L2の下。
_ VCC_3V3は L2の上から出力されます。

2. R13は 100KΩ,上のC7は1nf。
_ R13,C7はS4 Switchに接続。
_ S4 SwicthをRST Swicthにします。

1. A Switch Wire配線。
+ Resistor(100K)取付。

2. A Switch Wire配線。

3. A Switch Wire配線。

.



.
2️⃣ ESP32 S2 mini

配線:図の様に配線します。
-  A,B,C Switch と Power Switchの配線は 省略しています。
-  BLとGPIOの配線は 省略しています。
-  基板カットは Wireを通す為に カットします。
-  BLは 全てGNDへ接続しています。

 



.
3️⃣ M5Stamp C3U

配線:図の様に配線します。
-  A,B,C Switch と Power Switchの配線は 省略しています。
-  BLとGPIOの配線は 省略しています。
-  基板カットは Wireを通す為に カットします。

 


.
LovyanGFX と SPI Frequency:
SPI Frequency ( cfg.freq_write ) は 最大80MHz, 80MHzを整数で割った値に丸められます。
20,30,40,50,60,70,80M に設定しますと 20,30,40,80MHz に丸められています。
MiniKit, S2 mini は 80MHzでも表示しますが
画像データーを含まれたものは 80MHzでは表示せず 40MHzで表示されます。
M5Stackは 80MHzでは表示せず 最大40MHzになります。


.
LovyanGFX設定:

M5stack の LCD は SPI ILI9342 です。
SPIは SPI2_HOST を使用します。
MiniKit と S2 mini の SPI Clockは 80MHz が可能です。
M5Stamp C3U の SPI Clockは 60MHz までです。

1️⃣ ESP32 MiniKit

//----------------------------------------------------------------------
// https://github.com/lovyan03/LovyanGFX/blob/master/examples/HowToUse/2_user_setting/2_user_setting.ino
//=====================================================================
class LGFX : public lgfx::LGFX_Device{
  lgfx::Panel_ILI9342  _panel_instance;
  lgfx::Bus_SPI        _bus_instance;   // SPIバスのインスタンス

public:LGFX(void){         // バス制御の設定を行います。
  auto cfg = _bus_instance.config(); // バス設定用の構造体を取得します。
  cfg.spi_host = SPI2_HOST;     // 使用するSPIを選択  ESP32-S2,C3 : SPI2_HOST or SPI3_HOST / ESP32 : VSPI_HOST or HSPI_HOST
  // ※ ESP-IDFバージョンアップに伴い、VSPI_HOST , HSPI_HOSTの記述は非推奨になるため、エラーが出る場合は代わりにSPI2_HOST , SPI3_HOSTを使用してください。
  cfg.spi_mode = 0;             // SPI通信モードを設定 (0 ~ 3)
  cfg.freq_write = 80000000;    // 送信時のSPIクロック (最大80MHz, 80MHzを整数で割った値に丸められます)
  cfg.freq_read  = 16000000;    // 受信時のSPIクロック
  cfg.spi_3wire  = true;        // 受信をMOSIピンで行う場合はtrueを設定
  cfg.use_lock   = true;        // トランザクションロックを使用する場合はtrueを設定
  cfg.dma_channel = SPI_DMA_CH_AUTO; // 使用するDMAチャンネルを設定 (0=DMA不使用 / 1=1ch / 2=ch / SPI_DMA_CH_AUTO=自動設定)
  // ※ ESP-IDFバージョンアップに伴い、DMAチャンネルはSPI_DMA_CH_AUTO(自動設定)が推奨になりました。1ch,2chの指定は非推奨になります。
  cfg.pin_sclk = 18;            // SPIのSCLKピン番号を設定
  cfg.pin_mosi = 23;            // SPIのMOSIピン番号を設定
  cfg.pin_miso = 19;            // SPIのMISOピン番号を設定 (-1 = disable)
  cfg.pin_dc   = 27;            // SPIのD/Cピン番号を設定  (-1 = disable)
  _bus_instance.config(cfg);    // 設定値をバスに反映します。
  _panel_instance.setBus(&_bus_instance); // バスをパネルにセットします。
  {// 表示パネル制御の設定
  auto cfg = _panel_instance.config(); // 表示パネル設定用の構造体を取得します。
  cfg.pin_cs       =   14; // CSが接続されているピン番号   (-1 = disable)
  cfg.pin_rst      =   33; // RSTが接続されているピン番号  (-1 = disable)
  cfg.pin_busy     =   -1; // BUSYが接続されているピン番号 (-1 = disable)
  cfg.memory_width =  320; // ドライバICがサポートしている最大の幅
  cfg.memory_height=  240; // ドライバICがサポートしている最大の高さ
  cfg.panel_width  =  320; // 実際に表示可能な幅
  cfg.panel_height =  240; // 実際に表示可能な高さ
  cfg.offset_x     =    0; // パネルのX方向オフセット量
  cfg.offset_y     =    0; // パネルのY方向オフセット量
  cfg.offset_rotation = 0; // 回転方向の値のオフセット 0~7 (4~7は上下反転)
  cfg.dummy_read_pixel= 8; // ピクセル読出し前のダミーリードのビット数
  cfg.dummy_read_bits = 1; // ピクセル以外のデータ読出し前のダミーリードのビット数
  cfg.readable    =  true; // データ読出しが可能な場合 trueに設定
  cfg.invert      = false; // パネルの明暗が反転してしまう場合 trueに設定
  cfg.rgb_order   = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定
  cfg.dlen_16bit  = false; // データ長を16bit単位で送信するパネルの場合trueに設定
  cfg.bus_shared  = false; // SDカードとバス共有はtrueに設定
  _panel_instance.config(cfg);
  }
  setPanel(&_panel_instance); // 使用するパネルをセットします。
  }
};
LGFX tft; // 準備したクラスのインスタンスを作成します。

 


.
LovyanGFX設定:
2️⃣ ESP32 S2 mini

//----------------------------------------------------------------------
// https://github.com/lovyan03/LovyanGFX/blob/master/examples/HowToUse/2_user_setting/2_user_setting.ino
//=====================================================================
class LGFX : public lgfx::LGFX_Device{
  lgfx::Panel_ILI9342  _panel_instance;
  lgfx::Bus_SPI        _bus_instance;   // SPIバスのインスタンス

public:LGFX(void){         // バス制御の設定を行います。
  auto cfg = _bus_instance.config(); // バス設定用の構造体を取得します。
  cfg.spi_host = SPI2_HOST;     // 使用するSPIを選択  ESP32-S2,C3 : SPI2_HOST or SPI3_HOST / ESP32 : VSPI_HOST or HSPI_HOST
  // ※ ESP-IDFバージョンアップに伴い、VSPI_HOST , HSPI_HOSTの記述は非推奨になるため、エラーが出る場合は代わりにSPI2_HOST , SPI3_HOSTを使用してください。
  cfg.spi_mode = 0;             // SPI通信モードを設定 (0 ~ 3)
  cfg.freq_write = 80000000;    // 送信時のSPIクロック (最大80MHz, 80MHzを整数で割った値に丸められます)
  cfg.freq_read  = 16000000;    // 受信時のSPIクロック
  cfg.spi_3wire  = true;        // 受信をMOSIピンで行う場合はtrueを設定
  cfg.use_lock   = true;        // トランザクションロックを使用する場合はtrueを設定
  cfg.dma_channel = SPI_DMA_CH_AUTO; // 使用するDMAチャンネルを設定 (0=DMA不使用 / 1=1ch / 2=ch / SPI_DMA_CH_AUTO=自動設定)
  // ※ ESP-IDFバージョンアップに伴い、DMAチャンネルはSPI_DMA_CH_AUTO(自動設定)が推奨になりました。1ch,2chの指定は非推奨になります。
  cfg.pin_sclk =  7;            // SPIのSCLKピン番号を設定
  cfg.pin_mosi =  5;            // SPIのMOSIピン番号を設定
  cfg.pin_miso = 19;            // SPIのMISOピン番号を設定 (-1 = disable)
  cfg.pin_dc   = 11;            // SPIのD/Cピン番号を設定  (-1 = disable)
  _bus_instance.config(cfg);    // 設定値をバスに反映します。
  _panel_instance.setBus(&_bus_instance); // バスをパネルにセットします。
  {// 表示パネル制御の設定
  auto cfg = _panel_instance.config(); // 表示パネル設定用の構造体を取得します。
  cfg.pin_cs       =    3; // CSが接続されているピン番号   (-1 = disable)
  cfg.pin_rst      =    9; // RSTが接続されているピン番号  (-1 = disable)
  cfg.pin_busy     =   -1; // BUSYが接続されているピン番号 (-1 = disable)
  cfg.memory_width =  320; // ドライバICがサポートしている最大の幅
  cfg.memory_height=  240; // ドライバICがサポートしている最大の高さ
  cfg.panel_width  =  320; // 実際に表示可能な幅
  cfg.panel_height =  240; // 実際に表示可能な高さ
  cfg.offset_x     =    0; // パネルのX方向オフセット量
  cfg.offset_y     =    0; // パネルのY方向オフセット量
  cfg.offset_rotation = 0; // 回転方向の値のオフセット 0~7 (4~7は上下反転)
  cfg.dummy_read_pixel= 8; // ピクセル読出し前のダミーリードのビット数
  cfg.dummy_read_bits = 1; // ピクセル以外のデータ読出し前のダミーリードのビット数
  cfg.readable    =  true; // データ読出しが可能な場合 trueに設定
  cfg.invert      = false; // パネルの明暗が反転してしまう場合 trueに設定
  cfg.rgb_order   = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定
  cfg.dlen_16bit  = false; // データ長を16bit単位で送信するパネルの場合trueに設定
  cfg.bus_shared  = false; // SDカードとバス共有はtrueに設定
  _panel_instance.config(cfg);
  }
  setPanel(&_panel_instance); // 使用するパネルをセットします。
  }
};
LGFX tft; // 準備したクラスのインスタンスを作成します。

 


.
LovyanGFX設定:
3️⃣ M5Stamp C3U

//----------------------------------------------------------------------
// https://github.com/lovyan03/LovyanGFX/blob/master/examples/HowToUse/2_user_setting/2_user_setting.ino
//=====================================================================
class LGFX : public lgfx::LGFX_Device{
  lgfx::Panel_ILI9342  _panel_instance;
  lgfx::Bus_SPI        _bus_instance;   // SPIバスのインスタンス

public:LGFX(void){         // バス制御の設定を行います。
  auto cfg = _bus_instance.config(); // バス設定用の構造体を取得します。
  cfg.spi_host = SPI2_HOST;     // 使用するSPIを選択  ESP32-S2,C3 : SPI2_HOST or SPI3_HOST / ESP32 : VSPI_HOST or HSPI_HOST
  // ※ ESP-IDFバージョンアップに伴い、VSPI_HOST , HSPI_HOSTの記述は非推奨になるため、エラーが出る場合は代わりにSPI2_HOST , SPI3_HOSTを使用してください。
  cfg.spi_mode = 0;             // SPI通信モードを設定 (0 ~ 3)
  cfg.freq_write = 60000000;    // 送信時のSPIクロック (最大80MHz, 80MHzを整数で割った値に丸められます)
  cfg.freq_read  = 16000000;    // 受信時のSPIクロック
  cfg.spi_3wire  = true;        // 受信をMOSIピンで行う場合はtrueを設定
  cfg.use_lock   = true;        // トランザクションロックを使用する場合はtrueを設定
  cfg.dma_channel = SPI_DMA_CH_AUTO; // 使用するDMAチャンネルを設定 (0=DMA不使用 / 1=1ch / 2=ch / SPI_DMA_CH_AUTO=自動設定)
  // ※ ESP-IDFバージョンアップに伴い、DMAチャンネルはSPI_DMA_CH_AUTO(自動設定)が推奨になりました。1ch,2chの指定は非推奨になります。
  cfg.pin_sclk =  5;            // SPIのSCLKピン番号を設定
  cfg.pin_mosi =  4;            // SPIのMOSIピン番号を設定
  cfg.pin_miso = 19;            // SPIのMISOピン番号を設定 (-1 = disable)
  cfg.pin_dc   =  7;            // SPIのD/Cピン番号を設定  (-1 = disable)
  _bus_instance.config(cfg);    // 設定値をバスに反映します。
  _panel_instance.setBus(&_bus_instance); // バスをパネルにセットします。
  {// 表示パネル制御の設定
  auto cfg = _panel_instance.config(); // 表示パネル設定用の構造体を取得します。
  cfg.pin_cs       =    3; // CSが接続されているピン番号   (-1 = disable)
  cfg.pin_rst      =    6; // RSTが接続されているピン番号  (-1 = disable)
  cfg.pin_busy     =   -1; // BUSYが接続されているピン番号 (-1 = disable)
  cfg.memory_width =  320; // ドライバICがサポートしている最大の幅
  cfg.memory_height=  240; // ドライバICがサポートしている最大の高さ
  cfg.panel_width  =  320; // 実際に表示可能な幅
  cfg.panel_height =  240; // 実際に表示可能な高さ
  cfg.offset_x     =    0; // パネルのX方向オフセット量
  cfg.offset_y     =    0; // パネルのY方向オフセット量
  cfg.offset_rotation = 0; // 回転方向の値のオフセット 0~7 (4~7は上下反転)
  cfg.dummy_read_pixel= 8; // ピクセル読出し前のダミーリードのビット数
  cfg.dummy_read_bits = 1; // ピクセル以外のデータ読出し前のダミーリードのビット数
  cfg.readable    =  true; // データ読出しが可能な場合 trueに設定
  cfg.invert      = false; // パネルの明暗が反転してしまう場合 trueに設定
  cfg.rgb_order   = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定
  cfg.dlen_16bit  = false; // データ長を16bit単位で送信するパネルの場合trueに設定
  cfg.bus_shared  = false; // SDカードとバス共有はtrueに設定
  _panel_instance.config(cfg);
  }
  setPanel(&_panel_instance); // 使用するパネルをセットします。
  }
};
LGFX tft; // 準備したクラスのインスタンスを作成します。

 


.
感想:
愛着のある M5Stackが蘇ると嬉しいですね。

- 修理費:M5Stackは 価格高いですが MiniKit版の 640円は安いです。
- 速度の向上:ESP32 MiniKit により 2.6倍 高速化し気分が高まります。

- 変換基板:市販の変換基板は 1.6mmで厚いです。
-  その為に A,B,C Switch の高さ調整が必要です。
-  1mm厚の基板であれば 調整不要か調整が容易になります。
-  1mm基板を製作し付加価値のある回路を追加すると
-  最強のM5Stackになるでしょう。

- ESP32 RST:
-  S4 Power Switch を MiniKitのRST Switchに変更します。
-  C7(1nF)とR13(100KΩ)(τ=4.7μsec)をそのまま使用するか
-  R13=10KΩで τ=0.47μsec(MiniKitの時定数)でも良いです。
-  時定数は ある程度大きい方が安定した書き込みや起動をします。

- RST τ の値:書き込みや起動時に重要な τ(タウ) の値。τ=0.47CR
-  ESP32 Dev Kit:0.22μsec:エラーが起きやすい値です。
-  M5Stack Basic:0.564μsec:書き込みエラーの情報があります。
-  ESP32 MiniKit:0.564μsec:正常に動作しています。
-  ESP32 S2 mini:4.7μsec:従来よりも1桁値が増えています。
-  M5Stamp C3U:221μsec:従来とは桁が違う値です。
-  他 新しいESP32 Boardの τ の値は 大きくなっています。

- SPI 80MHz:
-  60MHzでないと表示が乱れたり動作しない場合があります。
-  原因はスケッチ内の画像データーを読み込む時に発生します。

- MiniKitとGPIO:
-  LCDのGPIOを同一にする事により Arduino IDE での
-  Board Manager は M5Stack-core-ESP32 を選択できたり
-  #include M5Stack.h を使用でき M5Stackの命令も動作します。

- IC と サーマルパッド(GNDパターン):
-  サーマルパッド(GNDパターン)のある ICは ESP32 と IP5306 です。
-  ESP32とIP5306を破損せず外すには 工夫してください。

- M5StackとMiniKit:
-  ESP32-WROOM-32と言う同じMPUを使用しています。
-  LovyanGFXでPDQ Graphics Testを実行すると
-  M5Stackは SPI 40MHzまでの表示です。
-  MiniKitは SPI 80MHzまで表示が可能でした。不思議です。
-  この違いは 部品レイアウトや配線の太さの違いの為かと想像しています。

 


.
.
M5Stack , Gray , FIRE , ESP32 MiniKit , S2 mini , M5Stamp C3U ,

Written by macsbug

6月 8, 2022 at 1:02 pm

カテゴリー: ESP32, M5STACK