এই টিউটোরিয়ালটি এর একটি অংশ: ESP32-S3 RGB LED ম্যাট্রিক্স
ESP32-S3 RGB ম্যাট্রিক্স মডিউল ব্যবহার করে মজাদার এবং ব্যবহারিক অ্যাপ্লিকেশন তৈরি করার জন্য দুর্দান্ত প্রকল্প। অন্যান্য ভিডিওর লিঙ্ক এই নিবন্ধের নীচে রয়েছে।
ESP32-S3 RGB LED ম্যাট্রিক্স প্রজেক্ট ৪ - টিল্ট ডট
প্রজেক্ট ৪ – টিল্ট ডট (ESP32-S3 RGB LED ম্যাট্রিক্স কাত করে ডট সরানো)
প্রজেক্ট ৪ ESP32-S3 RGB LED ম্যাট্রিক্স মডিউলে নির্মিত মোশন সেন্সর পরিচয় করিয়ে দেয়। ডট স্বয়ংক্রিয়ভাবে সরানোর (প্রজেক্ট ১-এর মতো) বা টেক্সট স্ক্রল করার (প্রজেক্ট ২ এবং ৩) পরিবর্তে, এই প্রজেক্টটি আপনাকে কেবল বোর্ডটি কাত করে ডটের অবস্থান নিয়ন্ত্রণ করতে দেয়। মডিউলের পিছনে থাকা QMI8658C অ্যাক্সিলেরোমিটার থেকে লাইভ রিডিংয়ের ভিত্তিতে ডটটি ৮×৮ RGB ডিসপ্লে জুড়ে মসৃণভাবে চলে।
এই সিরিজের ছয়টি প্রজেক্টই একটি YouTube ভিডিওতে প্রদর্শিত হয়েছে। একই ভিডিও এই পৃষ্ঠায় এমবেড করা আছে, তাই আপনি বোর্ড কাত হওয়ার সাথে সাথে ডটটি রিয়েল টাইমে কীভাবে সরে যায় তা দেখতে পারবেন। এই প্রজেক্টের সম্পূর্ণ কোড নিবন্ধের নীচে স্বয়ংক্রিয়ভাবে লোড হয় এবং মডিউলটির জন্য অ্যাফিলিয়েট কেনার লিঙ্কগুলি কোড বিভাগের নীচে প্রদর্শিত হয়।


ESP32-S3 RGB LED ম্যাট্রিক্স মডিউল ওভারভিউ
এই প্রজেক্টটি ESP32-S3 RGB LED ম্যাট্রিক্স মডিউল ব্যবহার করে, যার মধ্যে রয়েছে:

- ESP32-S3 মাইক্রোকন্ট্রোলার Wi-Fi এবং ব্লুটুথ সহ
- ৮×৮ RGB LED ম্যাট্রিক্স (৬৪টি পৃথকভাবে অ্যাড্রেসযোগ্য LED)
- QMI8658C অ্যাক্সিলেরোমিটার পিছনে, টিল্ট এবং মোশন ডিটেকশনের জন্য
- USB পোর্ট প্রোগ্রামিং এবং পাওয়ারের জন্য
- Boot / Reset বাটন
- ব্যবহারযোগ্য GPIO পিন ভবিষ্যতের সম্প্রসারণের জন্য
QMI8658C সেন্সর X, Y এবং Z অ্যাক্সিলারেশন এবং ওরিয়েন্টেশন মান পড়ে, যা বোর্ডটি কীভাবে কাত হচ্ছে তার উপর ভিত্তি করে ডটটিকে উপরে/নীচে/বামে/ডানে সরাতে দেয়।

ভিডিওতে কভার করা প্রজেক্টসমূহ (টাইমস্ট্যাম্প)
- 00:00 – ভূমিকা
- 02:01 – ESP32 বোর্ড ইনস্টল করা
- 03:32 – লাইব্রেরি ইনস্টল করা
- 05:32 – প্রজেক্ট ১: মুভিং ডট
- 11:11 – প্রজেক্ট ২: টেক্সট স্ক্রল
- 12:59 – প্রজেক্ট ৩: HTTP টেক্সট
- 16:41 – প্রজেক্ট ৪: টিল্ট ডট (এই প্রজেক্টটি)
- 18:55 – প্রজেক্ট ৫: অ্যারো আপ
- 20:02 – প্রজেক্ট ৬: টার্গেট গেম
ভিডিওতে টিল্ট ডেমোনস্ট্রেশন দেখা অত্যন্ত সুপারিশ করা হয়, কারণ আপনি দেখতে পাবেন বোর্ডের ওরিয়েন্টেশনে ডটটি কীভাবে মসৃণভাবে প্রতিক্রিয়া জানায়।

Arduino IDE-তে ESP32 বোর্ড ইনস্টল করা
আপনি যদি আগের কোনো প্রজেক্ট সম্পন্ন করে থাকেন, তাহলে বোর্ড সাপোর্ট ইতিমধ্যেই ইনস্টল করা আছে। অন্যথায়, এই ধাপগুলি অনুসরণ করুন:
File > Preferencesখুলুন → ESP32 Boards URL যোগ করুন।Tools > Board > Boards Manager…-এ যান এবং ESP32 ইনস্টল করুন।Tools > Board-এর অধীনে আপনার ESP32-S3 বোর্ড নির্বাচন করুন।Tools > Port-এর অধীনে সঠিক COM পোর্ট নির্বাচন করুন।
প্রয়োজনীয় লাইব্রেরি ইনস্টল করা
এই প্রজেক্টের জন্য নিম্নলিখিত লাইব্রেরিগুলি প্রয়োজন:
Adafruit NeoMatrixAdafruit NeoPixelAdafruit GFX LibraryQMI8658(মোশন সেন্সর)
লাইব্রেরি ম্যানেজারে এগুলি ইনস্টল করুন:
Sketch > Include Library > Manage Libraries…খুলুন।- Adafruit NeoMatrix অনুসন্ধান করুন → ইনস্টল করুন।
- Adafruit GFX এবং Adafruit NeoPixel-এর স্বয়ংক্রিয় ইনস্টলেশন অনুমতি দিন।
- তালিকাভুক্ত লেখক দ্বারা QMI8658 অনুসন্ধান করুন → ইনস্টল করুন।
প্রজেক্ট ৪ কীভাবে কাজ করে
QMI8658C সেন্সর X, Y এবং Z অক্ষ বরাবর ক্রমাগত অ্যাক্সিলারেশন ডেটা সরবরাহ করে। এই প্রজেক্টের জন্য, আমরা কেবল X এবং Y অক্ষ ব্যবহার করি সিদ্ধান্ত নিতে:
- ডটটি কতদূর বামে বা ডানে সরবে (X অক্ষ)
- ডটটি কতদূর উপরে বা নীচে সরবে (Y অক্ষ)
সেন্সর মানগুলি 0 থেকে 7 পর্যন্ত একটি কোঅর্ডিনেট রেঞ্জে ম্যাপ করা হয় (৮×৮ LED ম্যাট্রিক্সের জন্য)। ডটের অবস্থান প্রতি সেকেন্ডে অনেকবার আপডেট হয়, যা মডিউলটি কাত করার সময় মসৃণ স্লাইডিং প্রভাব দেয়।
প্রজেক্ট ৪ – কোড সেটিংস (টিল্ট ডট)
নীচে প্রজেক্টের কোডের শীর্ষে পাওয়া ব্যবহারকারী-সম্পাদনাযোগ্য সেটিংস দেওয়া হল। সম্পূর্ণ স্কেচটি নিবন্ধের নীচে স্বয়ংক্রিয়ভাবে প্রদর্শিত হয়।
ম্যাট্রিক্স পিন এবং সাইজ
// ৮×৮ RGB ম্যাট্রিক্স কনফিগারেশন
const int MATRIX_PIN = 14; // এই বোর্ডের জন্য নির্দিষ্ট পিন
const int MATRIX_WIDTH = 8;
const int MATRIX_HEIGHT = 8;
MATRIX_PIN 14-এ রাখুন। এটি অনবোর্ড ম্যাট্রিক্সের সাথে হার্ড-ওয়্যার্ড।
উজ্জ্বলতা
// সামগ্রিক উজ্জ্বলতা (০–২৫৫)
uint8_t matrixBrightness = 40;
প্রয়োজনে বাড়ান, তবে কাছ থেকে দেখার সময় চরম উজ্জ্বলতা এড়িয়ে চলুন।
ডটের রঙ
// ডটের রঙ (R, G, B)
uint8_t dotRed = 0;
uint8_t dotGreen = 200; // হালকা সবুজ (ডিফল্ট)
uint8_t dotBlue = 0;
যেকোনো রঙ তৈরি করতে এই মানগুলি পরিবর্তন করুন। উদাহরণ:
- লাল:
(255, 0, 0) - হলুদ:
(255, 255, 0) - সাদা:
(255, 255, 255)
মোশন সেনসিটিভিটি
চরম লাফ এড়াতে, অ্যাক্সিলেরোমিটার মানগুলি সাধারণত ক্ল্যাম্প বা স্কেল করা হয়। একটি সাধারণ সেটিং দেখতে এরকম:
// টিল্ট কতটা আক্রমণাত্মকভাবে চলাচলকে প্রভাবিত করে
float sensitivity = 4.0f; // বড় = স্ক্রিন জুড়ে দ্রুত চলাচল
যদি ডটটি খুব ধীরে চলে → মান বাড়ান। যদি ডটটি খুব হঠাৎ করে চলে → মান কমিয়ে দিন।
আপডেট স্পিড (রিফ্রেশ রেট)
আপনি মসৃণ গতি পেতে আপডেটের মধ্যে একটি ছোট বিলম্ব যোগ করতে পারেন:
// অবস্থান আপডেটের মধ্যে বিলম্ব (মি.সে.)
int refreshDelayMs = 20; // কম = মসৃণ এবং দ্রুত প্রতিক্রিয়া
১০–৩০ মি.সে. এর মধ্যে মান খুব প্রতিক্রিয়াশীল মনে হয়।
সারসংক্ষেপ
প্রজেক্ট ৪ ESP32-S3-এর অন্তর্নির্মিত QMI8658C অ্যাক্সিলেরোমিটারকে সক্রিয় করে, যা আপনাকে শারীরিক গতির মাধ্যমে LED ম্যাট্রিক্স নিয়ন্ত্রণ করতে দেয়। বোর্ডের সামান্য কাত হলে ডটটি একই দিকে চলে যায়, যা এই প্রজেক্টটিকে আরও উন্নত “Arrow Up” এবং “Target Game” প্রজেক্টের জন্য একটি নিখুঁত সোপান করে তোলে।
সম্পূর্ণ Tilt Dot স্কেচটি এই নিবন্ধের নীচে (স্বয়ংক্রিয়ভাবে) লোড করা আছে। সর্বোত্তম বোঝার জন্য, ভিডিওতে টিল্ট প্রদর্শন দেখুন, যেখানে আপনি দেখতে পাবেন বোর্ডটি ঘোরানোর সময় ডটটি কত মসৃণভাবে চলে। ESP32-S3 RGB LED ম্যাট্রিক্স মডিউল কেনার লিঙ্কগুলি কোড বিভাগের নীচে অন্তর্ভুক্ত করা হয়েছে।
এই টিউটোরিয়ালটি বিভাগের একটি অংশ: ESP32-S3 RGB LED ম্যাট্রিক্স
- ESP32-S3 আরজিবি এলইডি ম্যাট্রিক্স প্রজেক্ট ১- মৌলিক ডট
- ESP32-S3 RGB LED ম্যাট্রিক্স প্রজেক্ট ২ - স্ক্রলিং টেক্সট
- ESP32-S3 RGB LED ম্যাট্রিক্স প্রজেক্ট ৩ - মোবাইল ফোন থেকে টেক্সট
- ESP32-S3 RGB LED ম্যাট্রিক্স প্রজেক্ট ৫ - তীর সর্বদা উপরে
- ESP32-S3 RGB LED ম্যাট্রিক্স প্রজেক্ট ৬ - সিবল গেম
- ESP32-S3 RGB LED ম্যাট্রিক্স Wi-Fi + NTP সময় ঘড়ি প্রকল্প -১ মৌলিক ঘড়ি
- ESP32-S3 RGB LED ম্যাট্রিক্স ইন্টারনেট ক্লক প্রজেক্ট - ২ ক্লক মাল্টি কালার সময় ও তারিখ ডিসপ্লে
- ESP32-S3 RGB LED ম্যাট্রিক্স ইন্টারনেট ক্লক প্রজেক্ট - তারিখসহ ৩টি রাতের রঙ
- ESP32-S3 RGB LED ম্যাট্রিক্স ইন্টারনেট ক্লক প্রজেক্ট - ৫ রেইনবো রঙ
- ESP32-S3 RGB LED ম্যাট্রিক্স ইন্টারনেট ক্লক প্রজেক্ট - ৪টি র্যান্ডম রঙ
- ESP32-S3 RGB LED Matrix test for RGB, GRB setting
/*
Project 4: Tilt Dot – ESP32-S3 RGB LED Matrix (Waveshare)
This sketch reads tilt from the QMI8658C IMU and smoothly moves a dot
on the 8×8 RGB LED matrix based on board orientation.
▶️ Video Tutorial:
https://youtu.be/JKLuYrRcLMI
📚⬇️ Resources & Code Page:
https://robojax.com/RJT829
QMI8658_RGB_2
*/
#include <Arduino.h>
#include <math.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <QMI8658.h> // by Lahav Gahali
// -------- LED MATRIX SETUP --------
#define MATRIX_PIN 14
#define MATRIX_WIDTH 8
#define MATRIX_HEIGHT 8
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(
MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800
);
// -------- QMI8658 IMU SETUP --------
QMI8658 imu;
QMI8658_Data imuData;
// -------- USER SETTINGS --------
// true -> dot on opposite side: USB↔OUSB, 34↔15
// false -> dot on same side as UP
bool useOppositeMapping = false;
// Dot color (0–255 each)
uint8_t dotRed = 0;
uint8_t dotGreen = 100;
uint8_t dotBlue = 0;
// Board sides
enum Side {
SIDE_CENTER = 0,
SIDE_USB,
SIDE_OUSB,
SIDE_15,
SIDE_34
};
// Smooth dot position (in pixel coordinates, but kept as float for easing)
float dotPosX = 3.0f; // start at center
float dotPosY = 3.0f;
// Smoothing factor: smaller = slower movement (0.1 very slow, 0.5 faster)
const float dotSmooth = 0.25f;
bool isFlat = false;
const char* sideName(Side s) {
switch (s) {
case SIDE_CENTER: return "CENTER";
case SIDE_USB: return "USB";
case SIDE_OUSB: return "OUSB";
case SIDE_15: return "15";
case SIDE_34: return "34";
default: return "?";
}
}
// Detect which side is UP using calibrated axes:
// +X = USB, -X = OUSB, +Y = 34, -Y = 15
Side detectSideUp(float ax_g, float ay_g, float az_g) {
// Flat detection
const float flatThreshXY = 0.15f;
const float flatThreshZ = 0.15f;
if (fabs(ax_g) < flatThreshXY &&
fabs(ay_g) < flatThreshXY &&
fabs(az_g - 1.0f) < flatThreshZ) {
isFlat = true;
return SIDE_CENTER;
}
isFlat = false;
// Thresholds to say "this axis is really tilted"
const float tiltThreshY = 0.5f;
const float tiltThreshX = 0.5f;
// 1) Prefer Y axis for 15 / 34 if it's clearly tilted
if (fabs(ay_g) >= tiltThreshY) {
if (ay_g > 0) {
return SIDE_15; // +Y = 34 up
} else {
return SIDE_34; // -Y = 15 up
}
}
// 2) Otherwise, check X axis for USB / OUSB
if (fabs(ax_g) >= tiltThreshX) {
if (ax_g > 0) {
return SIDE_USB; // +X = USB up
} else {
return SIDE_OUSB; // -X = OUSB up
}
}
// 3) If nothing is strongly tilted, just call it CENTER
return SIDE_CENTER;
}
// Map from UP side to where the dot should go
Side dotSideFromUpSide(Side upSide) {
switch (upSide) {
case SIDE_USB:
return useOppositeMapping ? SIDE_OUSB : SIDE_USB;
case SIDE_OUSB:
return useOppositeMapping ? SIDE_USB : SIDE_OUSB;
case SIDE_34:
return useOppositeMapping ? SIDE_15 : SIDE_34;
case SIDE_15:
return useOppositeMapping ? SIDE_34 : SIDE_15;
case SIDE_CENTER:
default:
return SIDE_CENTER;
}
}
// Convert dot side to matrix coordinates
void getDotPixel(Side dotSide, int &px, int &py) {
// Matrix (0,0) = top-left
// top center: (3,0) → USB
// bottom center: (3,7) → OUSB
// left center: (0,3) → 15
// right center: (7,3) → 34
// center: (3,3)
switch (dotSide) {
case SIDE_USB: px = 3; py = 0; break;
case SIDE_OUSB: px = 3; py = 7; break;
case SIDE_15: px = 0; py = 3; break;
case SIDE_34: px = 7; py = 3; break;
case SIDE_CENTER:
default: px = 3; py = 3; break;
}
}
void setup() {
Serial.begin(115200);
delay(500);
matrix.begin();
matrix.setBrightness(20);
matrix.fillScreen(0);
matrix.show();
// IMU: SDA=11, SCL=12 for ESP32-S3-Matrix
if (!imu.begin(11, 12)) {
Serial.println("Failed to initialize QMI8658!");
while (1) { delay(1000); }
}
imu.setAccelUnit_mg(true);
imu.setGyroUnit_dps(true);
imu.setDisplayPrecision(4);
Serial.print("QMI8658 initialized. useOppositeMapping = ");
Serial.println(useOppositeMapping ? "TRUE" : "FALSE");
}
void loop() {
if (!imu.readSensorData(imuData)) {
return;
}
float ax_g = imuData.accelX / 1000.0f;
float ay_g = imuData.accelY / 1000.0f;
float az_g = imuData.accelZ / 1000.0f;
Side upSide = detectSideUp(ax_g, ay_g, az_g);
Side dotSide = dotSideFromUpSide(upSide);
int targetX, targetY;
getDotPixel(dotSide, targetX, targetY);
// --- Smooth movement toward target ---
dotPosX += (targetX - dotPosX) * dotSmooth;
dotPosY += (targetY - dotPosY) * dotSmooth;
// Convert to integer pixel coordinates
int px = (int)round(dotPosX);
int py = (int)round(dotPosY);
// Clamp just in case
if (px < 0) px = 0;
if (px > 7) px = 7;
if (py < 0) py = 0;
if (py > 7) py = 7;
// --- Draw dot ---
matrix.fillScreen(0);
uint16_t color = matrix.Color(dotRed, dotGreen, dotBlue);
matrix.drawPixel(px, py, color);
matrix.show();
// Debug
Serial.print("AX="); Serial.print(ax_g, 3);
Serial.print(" AY="); Serial.print(ay_g, 3);
Serial.print(" AZ="); Serial.print(az_g, 3);
Serial.print(" | UP="); Serial.print(sideName(upSide));
Serial.print(" | DOT="); Serial.print(sideName(dotSide));
Serial.print(" | px="); Serial.print(px);
Serial.print(" py="); Serial.println(py);
delay(80);
}
আপনাকে যা প্রয়োজন হতে পারে
-
অ্যামাজন
-
ইবে
-
অলি এক্সপ্রেসPurchase ESP32-S3 RGB Matrix from AliExpresss.click.aliexpress.com
-
অলি এক্সপ্রেসPurchase ESP32-S3 RGB Matrix from AliExpress (2)s.click.aliexpress.com
সম্পদ ও রেফারেন্সসমূহ
-
অভ্যন্তরীণ🎨 Color picker Toolrobojax.com
ফাইলসমূহ📁
ফ্রিটজিং ফাইল
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB