以下の内容はhttps://gijin77.blog.jp/archives/2025-07.htmlより取得しました。


◆M5Stack Tab5 で「M5Unified」無しでタッチスクリーンを試してみました。

 tab5_touch_demo
 以前下記ボードで三種のライブラリで試験しましたが、その中のbb_captouchを
 使いました。
 下記ブログ内記事を参照して下さい。
 ・JC1060P470C(ESP32P4 ESP32C6 搭載) でタッチスクリーンを試してみた

1.タッチの仕様
 ①静電容量方式
 ②インターフェースは、「I2C」でアドレスは、「0x14」
 ➂解像度 1280 x 720

2.参考資料等
 ①「M5Stack Tab5」について回路図等詳しくは、下記ブログ内記事を参照して下さい。
 ・M5Stack TAB5 ArduinoIDE M5GFX RTC 環境でニキシー管時計もどきを表示してみた
 
3.開発環境 2025/07/30時点
  ①Windows11 X64 Pro 24H2 
  ②Arduino IDE 2.3.6
  ➂ESP32ボードバージョンV3.3.0
  ④M5STACK Tab5 ボードバージョンV3.2.2
  ⑤M5GFX ライブラリv0.2.9
  ⑥bb_captouch ライブラリv1.3.1  「ライブラリマネージャーでインストールします。」

4.スケッチ及びコンパイル時の設定
 ①ボード設定「M5Stack -> M5Tab5」
 ②コンパイル時設定
 tab5_ide

 ➂LCD表示用のライブラリは、「M5GFX」を使用していますが、書式として
  「Arduino_GFX_Library」に準拠するように変更しています。

 6:#include <M5GFX.h>
 7:
 8:M5GFX tft;
 9:LGFX_Device* gfx = &tft;  // ← これで gfx->begin() の形式が使える

 ④スケッチ例「tab5_BBCapTouch_test.ino」
 
//tab5_BBCapTouch_test.ino
//V2025/07/30 M5Stack Tab5 1280x720 by JK1VCk
//blog URL:https://gijin77.blog.jp/archives/45237682.html

//***************************************************************************
#include <M5GFX.h>

M5GFX tft;
LGFX_Device* gfx = &tft;  // ← これで gfx->begin() の形式が使える

#define GFX_BL 22 // LCD バックライト
//***************************************************************************

#include <bb_captouch.h>
#include <Wire.h>

//GT911 I2C adress 0x14
//PI4IOE5V6408 P5 TOUCH_RST
//https://docs.m5stack.com/ja/core/Tab5 //GPIO割当

#define TOUCH_SDA 31
#define TOUCH_SCL 32
#define TOUCH_INT 23
#define TOUCH_RST -1

BBCapTouch bbct;

//***************************************************************************
int32_t w, h, n, n1, cx, cy, cx1, cy1, cn, cn1; //画面サイズ等の各種データ
//***************************************************************************

void setup(){
  Serial.begin(115200);
  while (!Serial); 
  Serial.println("\n\nM5Stack Tab5 BBCapTouch test start\n");
  if (!gfx->begin()) {
    Serial.println("gfx->begin() failed!");
  } else {
    Serial.println("gfx->begin() OK!!");
  }
  
  gfx->setRotation(3);
  w = gfx->width();
  h = gfx->height();
  n = min(w, h);
  n1 = n - 1;
  cx = w / 2;
  cy = h / 2;
  cx1 = cx - 1;
  cy1 = cy - 1;
  cn = min(cx1, cy1);
  cn1 = cn - 1;

  pinMode(GFX_BL, OUTPUT);
  digitalWrite(GFX_BL, HIGH); //バックライトON
  
// Init touch device *********************
  bbct.init(TOUCH_SDA, TOUCH_SCL, TOUCH_RST, TOUCH_INT);
  int iType = bbct.sensorType();
  Serial.printf("iType=%d \n",iType); 

  gfx->fillScreen(BLACK); 
  gfx->setTextSize(6);
  gfx->setTextColor(GREEN);
  gfx->setCursor(0,0);
  gfx->println("touch test Start By JK1VCK"); 
}
void loop() {
  bool touched;
  uint16_t touchX, touchY,cox,coy;
  w=gfx->width();
  h=gfx->height();
  int r=gfx->getRotation();
  TOUCHINFO ti;
  if (bbct.getSamples(&ti)) {
    ti.x[0] = map(ti.x[0], 0, 1280, 0, w - 1);  // X軸を0〜1280にマッピング
    ti.y[0] = map(ti.y[0], 0, 720, 0, h - 1);  // y軸を0〜720にマッピング
    cox=ti.x[0];
    coy=ti.y[0];
    switch (r) {
      case 1:
        touchY=h-cox;touchX=coy;break;
      case 2:
        touchX=w-cox;touchY=h-coy;break;
      case 3:
        touchY=cox;touchX=w-coy;break;
      default:
        touchX=cox;touchY=coy;break;
    }
    Serial.printf("x=%d,y=%d \r\n",touchX,touchY);
    gfx->fillRect(touchX,touchY,5,5, RED);
    if(touchX>1200){ //画面右端タッチにて画面クリア
      gfx->fillScreen(BLACK);
    }
  }
  delay(10);
}


5.実際の実行の様子
 ①タッチされたところに点を表示するプログラムとなっております。
 ②試しに「へへののもへじ」をタッチしてみました。
 tab5_touch_demo

以上


ブログトップへ

◆遂にM5Stack Tab5 ArduinoIDE 環境でWiFiが使えるようになりました。
 環境は、下記の通りです。(2025/07/18時点)
  ①Windows11 X64 Pro 24H2 
  ②Arduino IDE V2.3.6
  ➂ESP32ボードバージョンV3.2.1
  ④M5StackボードバージョンV3.2.2
  ⑤M5GFX バージョンV0.2.9
  ⑥M5Unified バージョンV0.2.7

1.スケッチは、下記に示します。
 
//tab5_M5GFX_wifi_Scan.ino
//V1 /2025/05/18 By JK1VCK <M5GFX.h>使用
//blog URL:https://gijin77.blog.jp/archives/45137181.html
//tab5 esp32p4 Flash Size:"16MB" Partition Scheme:16M Flash(3MB APP..) 
//     PSRAM : en USB_CDC Ob Boot : en  
//     UPload Mode : Hardware CDC...

#include <WiFi.h>
#include <M5GFX.h>
#include <M5Unified.h>

M5GFX tft;

#define GFX_BL 22

void setup() {
  Serial.begin(115200);
  delay(1000);
  pinMode(GFX_BL, OUTPUT);digitalWrite(GFX_BL, HIGH); //バックライトON  
  tft.begin();
  tft.setRotation(3);tft.fillScreen(BLACK);
  tft.setCursor(0,2);tft.setTextColor(GREEN);tft.setTextSize(5);
  tft.drawRect(0,0,tft.width()-1,tft.height()-1,YELLOW);//枠表示
 
  Serial.println("WiFi Scan / M5GFX_Library Start");  
  tft.println("WiFi Scan / M5GFX_Library Start");  
  // Set WiFi to station mode and disconnect from an AP if it was previously connected.
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  Serial.println("Setup done");
  tft.println("Setup done");
  delay(2000);
}

void loop() {
  tft.fillScreen(BLACK);tft.setCursor(0,2);
  tft.drawRect(0,0,tft.width()-1,tft.height()-1,YELLOW);//枠表示
  tft.setTextSize(4);tft.setTextColor(GREEN);
  Serial.println("WiFi Scan start");tft.println("WiFi Scan start");
  //WiFi.scanNetworks will return the number of networks found.
  int n = WiFi.scanNetworks();
  Serial.println("WiFi Scan done");tft.println("WiFi Scan done");
  if (n == 0) {
    Serial.println("no networks found");tft.println("no networks found");
  } else {
    Serial.printf("\n %d networks found\n",n);tft.printf("\n %d networks found\n",n);
    tft.setTextSize(3);tft.setTextColor(CYAN);
    Serial.println(" No| SSID                 | MAC アドレス       | RSSI | CH | Encryption");
    tft.println(" No| SSID                 | MAC address        | RSSI | CH | Encryption");
    for (int i = 0; i < n; ++i) {
      // Print SSID and RSSI for each network found
      tft.setTextColor(ORANGE);
      
      Serial.printf(" %2d| %-20.20s | %-18.18s | %4ld | %2ld | ", i + 1,WiFi.SSID(i).c_str(),WiFi.BSSIDstr(i).c_str(),WiFi.RSSI(i),WiFi.channel(i));
      tft.printf(" %2d| %-20.20s | %-18.18s | %4ld | %2ld | ", i + 1,WiFi.SSID(i).c_str(),WiFi.BSSIDstr(i).c_str(),WiFi.RSSI(i),WiFi.channel(i));      switch (WiFi.encryptionType(i)) {
        case WIFI_AUTH_OPEN:            Serial.print("open");     tft.print("open"); break;
        case WIFI_AUTH_WEP:             Serial.print("WEP");      tft.print("WEP");break;
        case WIFI_AUTH_WPA_PSK:         Serial.print("WPA");      tft.print("WPA"); break;
        case WIFI_AUTH_WPA2_PSK:        Serial.print("WPA2");     tft.print("WPA2"); break;
        case WIFI_AUTH_WPA_WPA2_PSK:    Serial.print("WPA+WPA2"); tft.print("WPA+WPA2"); break;
        case WIFI_AUTH_WPA2_ENTERPRISE: Serial.print("WPA2-EAP"); tft.print("WPA2-EAP"); break;
        case WIFI_AUTH_WPA3_PSK:        Serial.print("WPA3");     tft.print("WPA3"); break;
        case WIFI_AUTH_WPA2_WPA3_PSK:   Serial.print("WPA2+WPA3");tft.print("WPA2+WPA3"); break;;
        case WIFI_AUTH_WAPI_PSK:        Serial.print("WAPI");     tft.print("WAPI"); break;
        default:                        Serial.print("unknown");  tft.print("unknown");
      }                                                                 
      Serial.println();tft.println();
      delay(10);
    }
  }
 
  Serial.println("");tft.println("");
  // Delete the scan result to free memory for code below.
  WiFi.scanDelete();
  // Wait a bit before scanning again.
  delay(20000);
}


  写真は、WiFiスキャンの様子です。
 m5_tab5_wifi

これで色々遊べます。めでたしめでたし

以上


ブログトップへ

◆最新のESP32P4を搭載したJC1060P470Cを入手したので色々調べてみましたので
 備忘録に残して置きます。
 まだまだ、情報不足で思うように遊べていません。
 2025/03/02現在、色々検索してArduino IDEの環境で少しずつ遊べています。
 JC1060P470C_URA

 JC1060P470C-1

1.このボードについて
 ①入手先
  1. ボードの入手先(AliExpress)
    静電容量式タッチスクリーン,esp32p4,ESP32-C6, 32m,psram,
   16mフラッシュ,1024x600,dsi,mipi,ESP32-C6


  2. データの入手先
   http://pan.jczn1688.com/directlink/1/HMI%20display/JC1060P470C_I_W.zip

 ②各種参考となるURL
  1.このボードの元となったボードのようです。
    *ESP32-P4 機能 EV ボード
  2.このボードの製造過程のTikTok動画
  3.このボードの完成後のチェック時のTikTok動画
  4.このボードのWiFi接続試験のTikTok動画
  5.このボードの機能紹介のTikTok動画
  6.このボードのアプリ紹介のTikTok動画
  7.このボードのカメラ紹介のTikTok動画
  8.このボードの音楽再生紹介のTikTok動画
 
 ➂ESP32シリーズ比較表
 esp32_etc

 ④LCDコントローラ(JD9165)について
  1,esp_lcd コンポーネントを使用したJD9165 LCD コントローラーの実装
  ESP LCD JD9165 (MIPI-DSI)

  2.データシート
  JD9165A-A

 ⑤静電容量式タッチスクリーン タッチIC: GT911
  *解像度 800x480

 ⑥GPIO割当等
 JC1050P470_GPIO-1
 JC1050P470_GPIO-2
 
 ⑦回路図(Zipファイルより抜粋)
  1.PWR
  1_PWR
  2.LCD
  2_LCD
  
  3.ESP32-P4
  3_ESP32-P4

  4.CONN
  4_CONN

  5.ESP32-C6
  5_ESP32-C6
  6.USB
  6_USB

  7.CODEC
  7_CODEC
 
2.スケッチ
 LVGLデモコードを試していますが、まだタッチがうまく動いていません。
 ◆LVGLは、良く分からないので今まで使い慣れた「Arduino_GFX_Library」が
  対応しているみたいでしたので試してみました。うまく動いてくれました。

  Arduino IDE環境で、タッチ操作など色々実験しています。
  下記ブログ内記事を参照してみて下さい。

 ①・JC1060P470C(ESP32P4 ESP32C6 搭載) で「Arduino_GFX_Library」の
  デモを動かしてみた


 ②・JC1060P470C(ESP32P4 ESP32C6 搭載) でタッチスクリーンを試してみた

 ➂・JC1060P470C(ESP32P4 搭載)でRTCを使いパタパタ時計もどきを表示してみた

 ④・JC1060P470C(ESP32P4搭載)でI2Sでの録音再生実験をしてみた

 ⑤・JC1060P470C(ESP32P4)でMotion JPEG 画像ビューアを試してみた

 ⑥・JC1060P470C(ESP32P4 ESP32C6 搭載) ArduinoIDE環境でWiFiが使えるようになった

 ⑦・JC1060P470C(ESP32P4 ESP32C6 搭載) ArduinoIDE環境でNHK RSSニュース表示
   してみた


 ⑧・JC1060P470(ESP32P4) 他で「RSSニュース」を無料の「Sound of Text」を
  使い喋らせてみた



 *カメラを繋いでみる(これから)

 *SDカード内の音楽ファイルを再生してみる。(これから)

3.Arduino IDE環境では、これから先大変そうなので「ESP-IDF5.4」の環境を
 勉強がてら構築してみました。
 下記は、「ESP-IDF5.4」環境でのビルドです。

 ①・JC1060P470C(ESP32P4搭載)で「ESP IDF 5.4」を使い「Lチカ」をしてみた

 ②・JC1060P470C(ESP32P4搭載)にラズパイ用カメラを繋いでみた

 *VSC IDF5.5.1環境(2026/04/01追記)
 ➂・JC1060P470 (ESP32P4) ボードに「xiaozhi ベトナム版」を入れてみた


以上


ブログトップへ

◆おもちゃの折り畳み式ドローンを入手しましたので、まずはマニュアルを日本語化しました。
 ドローン本体
 コントローラ

 入手先は、下記のAliExpressです。4Kカメラが2個付いて2000円未満でした。
 使えなかったら部品取りにしたいと思っています。
 2024 E99Pro RC ドローン 4K プロフェッショナル 1080P 広角 HD カメラ付き折りたたみ式
 ヘリコプター WIFI FPV 高さ保持ギフトおもちゃ

 ドローン全体


 ◆アマゾンでは、下記で買えるようです。
 E99 ドローン カメラ付き 4K HDデュアルカメラ 100g未満 申請不要 トイドローン 小型 折り畳み式 初心者向け ミニドローン 子供向け 収納ケース付き 飛行時間12分 90°調整可能 ヘッドレスモード 高度維持 軌跡飛行モード 360°ロール 重力センサー 2.4GHz 4CH 国内認証済み 子供・大人向けギフト 誕生日プレゼント ブラック

1.取説が、英語と中国語の為、よく理解できないので日本語化してみました。
 ①原本の取説
 取説-1
 取説-2

 ②日本語化した取説(下記「ドローン取説.PDF」ファイル)
  (日本語訳は、完ぺきではないと思いますので、参考程度に)
  

 
2.原っぱで、飛ばしてみましたが、なかなか上手く操縦できませんでした。
 これから、練習しなくてはなりません。
 
以上


ブログトップへ

◆ESP32 GFX_Library_for_Arduino 環境でSSD1306を表示させようとしましたが、現時点で
 コンパイラエラーが発生して表示出来ません。
 他のLCDと同等のインターフェイスで表示させたいと思い色々試しましたが、
 上手くいきませんでした。
 ですので「Adafruit_SSD1306」ライブラリを使ってのラッパーを作成しました。
 これで、同等のインターフェイスで表示可能となりました。
 SSD1306

1.下記が、ラッパー用「GFXWrapper.h」のスケッチです。
  (保障無しの自己責任で)
//GFXWrapper.h
//2025/06/28 By JK1VCK SSD1306 制御するラッパー
//blog URL:https://gijin77.blog.jp/archives/44998235.html

//Arduino_GFX_Libraryと同様のインターフェイスでSSD1306を制御するラッパー

#pragma once
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
#define SCREEN_ADDRESS 0x3C

class GFXWrapper {
public:
  Adafruit_SSD1306 *oled;

  GFXWrapper(int width, int height, TwoWire *wire, int reset_pin) {
    oled = new Adafruit_SSD1306(width, height, wire, reset_pin);
  }

  bool begin() {
    return oled->begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
  }

  void display() { oled->display(); }
  void clearDisplay() { oled->clearDisplay(); }

  // テキスト関連
  void print(const String &text) { oled->print(text); }
  void println(const String &text) { oled->println(text); }
  void print(const char* text) { oled->print(text); }
  void println(const char* text) { oled->println(text); }
  void print(int val) { oled->print(val); }
  void println(int val) { oled->println(val); }

  void setCursor(int16_t x, int16_t y) { oled->setCursor(x, y); }
  void setTextSize(uint8_t s) { oled->setTextSize(s); }
  void setTextColor(uint16_t c) { oled->setTextColor(c); }
  void setTextWrap(bool w) { oled->setTextWrap(w); }

  // 画面サイズ
  int16_t width()  { return oled->width(); }
  int16_t height() { return oled->height(); }

  // 回転
  void setRotation(uint8_t r) { oled->setRotation(r); }
  uint8_t getRotation() const { return oled->getRotation(); }

  // グラフィックス
  void drawPixel(int16_t x, int16_t y, uint16_t color) {
    oled->drawPixel(x, y, color);
  }

  void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) {
    oled->drawLine(x0, y0, x1, y1, color);
  }
  void drawFastHLine(int16_t x0, int16_t y0, int16_t x1, uint16_t color) { //drawFastHLine
    oled->drawLine(x0, y0, x1, y0, color);
  }
  void drawFastVLine(int16_t x0, int16_t y0, int16_t y1, uint16_t color) { //drawFastVLine
    oled->drawLine(x0, y0, x0, y1, color);
  }
  void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {
    oled->drawRect(x, y, w, h, color);
  }

  void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {
    oled->fillRect(x, y, w, h, color);
  }
  void fillScreen(uint16_t color) { //fillScreen
    oled->fillRect(0, 0, width()-1, height()-1, color);
  }

  void drawCircle(int16_t x, int16_t y, int16_t r, uint16_t color) {
    oled->drawCircle(x, y, r, color);
  }

  void fillCircle(int16_t x, int16_t y, int16_t r, uint16_t color) {
    oled->fillCircle(x, y, r, color);
  }

  void drawTriangle(int16_t x0, int16_t y0,
                    int16_t x1, int16_t y1,
                    int16_t x2, int16_t y2,
                    uint16_t color) {
    oled->drawTriangle(x0, y0, x1, y1, x2, y2, color);
  }

  void fillTriangle(int16_t x0, int16_t y0,
                    int16_t x1, int16_t y1,
                    int16_t x2, int16_t y2,
                    uint16_t color) {
    oled->fillTriangle(x0, y0, x1, y1, x2, y2, color);
  }

  void drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h,
                     int16_t r, uint16_t color) {
    oled->drawRoundRect(x, y, w, h, r, color);
  }

  void fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h,
                     int16_t r, uint16_t color) {
    oled->fillRoundRect(x, y, w, h, r, color);
  }

  // ビットマップ描画
  void draw16bitRGBBitmap(int16_t x, int16_t y,
                   uint16_t *bitmap, int16_t w, int16_t h){
    //ダミールーチン
    return;
  }
  
  void drawBitmap(int16_t x, int16_t y, 
                  const uint8_t *bitmap, int16_t w, int16_t h,
                  uint16_t color) {
    oled->drawBitmap(x, y, bitmap, w, h, color);
  }

  void drawXBitmap(int16_t x, int16_t y,
                   const uint8_t *bitmap, int16_t w, int16_t h,
                   uint16_t color) {
    oled->drawXBitmap(x, y, bitmap, w, h, color);
  }

  // その他
  void invertDisplay(bool i) { oled->invertDisplay(i); }
};


2.下記が、テスト用「gfx_SSD1306.ino」のスケッチです。
  (保障無しの自己責任で)

//gfx_SSD1306.ino
//2025/06/28 By JK1VCK SSD1306 制御するラッパー
//blog URL:https://gijin77.blog.jp/archives/44998235.html

//Arduino_GFX_Libraryと同様のインターフェイスでSSD1306を制御するラッパー
//#include <Arduino_GFX_Library.h>
//Arduino_DataBus *bus = new Arduino_Wire(SSD1306_I2C_ADDR, wire);
//Arduino_SSD1306 *gfx = new Arduino_SSD1306(bus, -1, SCREEN_WIDTH, SCREEN_HEIGHT);

#include <Wire.h>
#include "GFXWrapper.h"
GFXWrapper *gfx = new GFXWrapper(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(115200);
  Wire.begin(32,33); //SDA,SCL esp32
  //Wire.begin();
  if (!gfx->begin()) {
    Serial.println("SSD1306 initialization failed!");
    while (1);
  }
  gfx->setRotation(0);
  gfx->clearDisplay();
  gfx->setTextColor(SSD1306_WHITE);
  gfx->setCursor(10, 4);
  gfx->setTextSize(2);
  gfx->println("<SSD1306>");
  gfx->fillCircle(26,40, 15, SSD1306_WHITE);
  gfx->drawTriangle(64,26,50,56,80,56,SSD1306_WHITE);
  gfx->fillRect(90, 26, 30, 30, SSD1306_WHITE);  
  gfx->display();
int w = gfx->width();
int h = gfx->height();
  gfx->drawRect(0, 0, w - 1, h - 1, SSD1306_WHITE);
  gfx->display();
}

void loop() {
  // ここで何か描画更新してもOK
}


3.これが実現出来たので、色々なLCDと混在して開発できています。
 応用例として下記ブログ内記事を参照してみて下さい。
 ・JC1060P470(ESP32P4) 他で「RSSニュース」を無料の「Sound of Text」を
  使い喋らせてみた

 

 
以上
 

ブログトップへ



以上の内容はhttps://gijin77.blog.jp/archives/2025-07.htmlより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14