An interactive touch-enabled grid display application for the M5Stack Tab5 ESP32-P4 development board. Features animated text messages with emoji support, creating an engaging visual experience on the 5-inch display.
This project is a port of the original Grid Board by Eric Nam (@0015) to the M5Stack Tab5 platform.
- Interactive Touch Grid: 5x9 grid of touch-responsive cells
- Animated Messages: Smooth text animations with customizable messages
- Emoji Support: Full Unicode emoji rendering
- Landscape Orientation: Optimized for horizontal viewing
- Customizable Messages: Easy to modify display messages
- ESP32-C6 Wi-Fi Integration: The code includes support for ESP32-C6 wireless module via SDIO, but it's currently non-functional due to firmware and controller issues. This feature is under development.
- M5Stack Tab5 development board
- ESP32-P4 main processor (RISC-V 32-bit dual-core 400MHz)
- 5" IPS TFT Display (1280Γ720) via MIPI-DSI
- GT911 multi-touch controller
- 16MB Flash + 32MB PSRAM
- ESP32-C6 wireless module (present but not supported in this version)
- ESP-IDF v5.4+ (ESP-IDF v5.5 recommended)
- Python 3.8+
- esptool.py v4.10+
git clone https://github.com/yourusername/grid-board-tab5.git
cd grid-board-tab5# Source ESP-IDF environment
source /path/to/esp-idf/export.sh
# Or on macOS with default installation
source ~/esp/esp-idf/export.shidf.py build# Flash all components
idf.py -p /dev/cu.usbmodem212301 flash
# Or flash with specific parameters
python -m esptool --chip esp32p4 -b 460800 --before default_reset --after hard_reset \
write_flash --flash_mode dio --flash_size 16MB --flash_freq 80m \
0x2000 build/bootloader/bootloader.bin \
0x10000 build/partition_table/partition-table.bin \
0x20000 build/grid_board_tab5.binidf.py -p /dev/cu.usbmodem212301 monitor
# Or use screen
screen /dev/cu.usbmodem212301 115200Press Ctrl+] to exit the monitor.
Edit the messages array in main/main_simple.cpp:
const char* messages[] = {
"HELLO WORLD! ππ",
"M5STACK TAB5 πβ¨",
"TOUCH ME! ππ",
"ESP32-P4 POWER! πͺπ₯",
"FAMILY TOGETHER β€πβ€"
};Messages cycle every 30 seconds automatically.
grid-board-tab5/
βββ main/
β βββ main_simple.cpp # Main application entry
β βββ grid_board.cpp # Grid board UI implementation
β βββ grid_board.h # Grid board header
β βββ CMakeLists.txt # Build configuration
βββ components/
β βββ m5stack_tab5/ # BSP for M5Stack Tab5
β βββ imlib/ # Image and font libraries
βββ build/ # Build artifacts (generated)
βββ partitions.csv # Partition table configuration
βββ sdkconfig # Project configuration
βββ CMakeLists.txt # Root build configuration
βββ README.md # This file
- Grid Size: 5 rows Γ 9 columns (45 cells total)
- Cell States: Empty, filled, or animated
- Touch Response: Visual feedback on touch events
- Animation: Smooth transitions between states
- Text Processing: Automatic character-to-grid mapping
- Emoji Rendering: Full Unicode support
- Animation Speed: Configurable delay between characters
- Cycle Time: 30-second intervals between messages
- SDIO communication with C6 module fails to initialize properly
- Firmware flashing for C6 is problematic
- The feature is left in the codebase for future development
If you see C6-related initialization errors in the logs, they can be safely ignored:
W (1179) GridBoard_Tab5: C6 communication initialization failed
W (1180) GridBoard_Tab5: ESP32-C6 may not have SDIO slave firmware installed
Touch events are processed through the GT911 controller:
// Touch callback in grid_board.cpp
static void touchpad_read(lv_indev_t *indev, lv_indev_data_t *data)
{
// Touch processing logic
}-
Partition Table MD5 Error
E (1115) partition: No MD5 found in partition tableSolution: Use the provided partition table or disable MD5 check in menuconfig.
-
Display Not Initializing
- Ensure proper connection to the device
- Check if bootloader is flashed correctly
- Verify flash addresses match the partition table
-
Touch Not Working
- Check I2C connections (GPIO 31/32)
- Verify GT911 initialization in logs
- Ensure display backlight is enabled
Enable verbose logging:
idf.py -p /dev/cu.usbmodem212301 monitor -b 115200Check for initialization messages:
I (1109) GridBoard_Tab5: Grid Board Demo for M5Stack Tab5 starting...
I (1144) GridBoard_Tab5: Initializing display with landscape orientation
I (1168) GridBoard_Tab5: Starting LVGL task
I (1186) GridBoard_Tab5: Grid board initialized successfully!
- Display Refresh Rate: 60 Hz
- Touch Sampling Rate: 100 Hz
- Message Cycle Time: 30 seconds
- Animation Frame Rate: 100 fps (10ms per frame)
- Memory Usage: ~200KB RAM + PSRAM
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests and verify functionality
- Submit a pull request
This project is licensed under the MIT License - see the LICENSE file for details.
- Original Grid Board Project: Eric Nam (@0015) - Creator of the original Grid Board concept and implementation
- M5Stack for the Tab5 hardware platform
- Espressif for ESP-IDF framework
- LVGL for the graphics library
- Community for testing and feedback
This project is a port/adaptation of Eric Nam's Grid Board to the M5Stack Tab5 platform, adding support for the ESP32-P4's MIPI-DSI display, GT911 touch controller, and ESP32-C6 wireless integration.
- Port Author: Alexander Vasilyev
- GitHub: @mrvasilyev
- This Port: Grid Board Tab5
- Original Project: Grid Board by @0015
- v1.0.0 (2025-08-28)
- Initial release
- Full touch grid implementation
- Emoji support
- Message cycling
- ESP32-C6 integration code (non-functional, experimental)
The Grid Board displays animated messages on a 5x9 touch-responsive grid. Messages cycle every 30 seconds with smooth animations and full emoji support.
Made with β€οΈ for the M5Stack community

