2025年4月8日火曜日

M5STACK LCD Unitのファームウェアアップデート

M5Stamp Picoを弄っていますが、やはり液晶が欲しいなって思っちゃいました。そこで、良く使用されるI2C OLEDディスプレイM5STACK LCD Unitを購入しました。今回は、M5STACK LCD Unitのファームウェアアップデートを行います(写真はアップデート済み)

M5STACK LCD Unitを検索するとファームウェアアップデートに関する情報が出てきます。と言うか、あまり使用例が出てこないんですよねぇ

M5STACKのUnit LCDサイト

上記を確認すると、I2C経由でのアップデート、または裏蓋開けてESP32ダウンローダを使用してアップデートの2つの方法がありました。蓋開けるのは面倒なので、I2C経由でのアップデートしてみようかと思います。GitHubのM5Stack Unit LCD FirmWareを確認するとマニュアルには、M5StickC Plus2は明記されていませんが、スケッチ内には記載があるので大丈夫そうです

GitHubのM5Stack Unit LCD FirmWare

早速、M5StickC Plus2に書き込んで実行してみましたが、searchUnitLCD()の応答待ちでスタックしているように見受けられました(LCD Unitの応答がない?!)

そこで勉強がてら、I2Cスキャナーのスケッチを作成して確認したところ、GroveコネクタのI2Cバス上にアドレスは存在していることは確認できました(スケッチは後述)

    • 内部I2Cバス:0x51(RTC), 0x61(6-axis IMU)
    • Grove I2Cバス:0x3E(LCD Unit)
    • ピンヘッダ I2Cバス:なし

流石にメーカー製のスケッチを解析する気にはなりませんでしたので、I2C経由は諦めてESP32ダウンローダ(Stamp ISPを使用)を使用することにしました

接続したら、M5Burnerから書き込んで終了(書き込む際、ESP32ダウンローダを抑えた方が接触不良なく書き込めます)。無事にアップロードできました

なお、M5STACKのUnit LCDサイト内にあるサンプル記述をM5StickC Plus2に書き込んで動作確認できました。次は、M5Stamp Picoで試したいと思います

参考までにI2Cスキャンのスケッチを下記に乗せておきます:

  1. #include <M5unified .h>
  2. #include <M5StickCPlus2.h>
  3. #include <M5Unified.h>
  4. #include "wire.h"
  5. TwoWire *i2cWire;
  6. uint8_t sda = -1;
  7. uint8_t scl = -1;
  8. uint8_t I2C_SEL = 0;
  9. void I2C_Setting() {
  10. if (I2C_SEL == 1) { // GROVEコネクタ
  11. sda = 32;
  12. scl = 33;
  13. Wire.begin(sda, scl);
  14. i2cWire = &Wire;
  15. } else if (I2C_SEL == 2) { // ピンヘッダー
  16. Wire1.end(); // Wire1を終了し再割り当て
  17. sda = 0;
  18. scl = 26;
  19. Wire1.begin(sda, scl);
  20. i2cWire = &Wire1;
  21. } else { // 内部I2C
  22. Wire1.end();
  23. sda = 21;
  24. scl = 22;
  25. Wire1.begin(sda, scl); // Wire1:通常内部I2C
  26. i2cWire = &Wire1;
  27. }
  28. }
  29. void setup() {
  30. auto cfg = M5.config();
  31. M5.begin(cfg);
  32. M5.Lcd.fillScreen(BLACK);
  33. M5.Lcd.setBrightness(5);
  34. M5.Lcd.setRotation(3); // 画面向き
  35. M5.Lcd.setTextSize(2); // フォントサイズ
  36. M5.Lcd.setTextFont(&fonts::lgfxJapanGothic_8); // フォント
  37. }
  38. void loop() {
  39. int device_cnt = 0;
  40. M5.Lcd.fillScreen(BLACK);
  41. M5.Lcd.setCursor(0, 0);
  42. M5.Lcd.printf("I2Cスキャン:\n");
  43. I2C_SEL = 0;
  44. while (I2C_SEL < 3) {
  45. I2C_Setting();
  46. if (I2C_SEL == 1) {
  47. M5.Lcd.printf("Groce: SDA:%2d SCL:%2d\n", sda, scl);
  48. } else if (I2C_SEL == 2) {
  49. M5.Lcd.printf("ピン : SDA:%2d SCL:%2d\n", sda, scl);
  50. } else {
  51. M5.Lcd.printf("内部 : SDA:%2d SCL:%2d\n", sda, scl);
  52. }
  53. device_cnt = 0;
  54. for (byte address = 0; address <= 127; address++) {
  55. i2cWire->beginTransmission(address);
  56. byte error = i2cWire->endTransmission();
  57. if (error == 0) {
  58. M5.Lcd.printf("0x%02X ", address);
  59. device_cnt++;
  60. }
  61. delay(1);
  62. }
  63. I2C_SEL++;
  64. if (device_cnt == 0) {
  65. M5.Lcd.printf("I2Cデバイスが見つからない!");
  66. }
  67. M5.Lcd.println();
  68. }
  69. delay(3000);
  70. }

参考にさせて頂きましたサイト:

0 件のコメント:

コメントを投稿