This tutorial is part of: ESP32-S3 RGB LED மேட்ரிக்ஸ்
ESP32-S3 RGB மேட்ரிக்ஸ் தொகுதியைப் பயன்படுத்தி வேடிக்கையான மற்றும் நடைமுறை பயன்பாடுகளுக்காக உருவாக்க அருமையான திட்டம். பிற வீடியோக்களுக்கான இணைப்புகள் இந்தக் கட்டுரையின் கீழே உள்ளன.
ESP32-S3 RGB LED மேட்ரிக்ஸ் திட்டம் 5 - அம்பு எப்போதும் மேலே
திட்டம் 5 – அம்பு எப்போதும் மேல்நோக்கி (QMI8658C ஐப் பயன்படுத்தி திசை காட்டி)
திட்டம் 5, ESP32-S3 RGB LED மேட்ரிக்ஸின் திசையைக் கண்டறிய QMI8658C மோஷன் சென்சாரைப் பயன்படுத்துகிறது, மேலும் ஈர்ப்பு விசையுடன் தொடர்புடைய மேல்நோக்கி சுட்டிக்காட்டும் அம்புக்குறியை எப்போதும் காட்டுகிறது. பலகையை எப்படி சுழற்றினாலும்—USB பக்கம் மேலே, OUSB பக்கம் மேலே, பக்கம் “15”, அல்லது பக்கம் “34”—அம்பு தானாகவே திரும்பி இயற்பியல் ரீதியாக மேல்நோக்கிய திசையை நோக்கி சுட்டிக்காட்டும்.
இது உள்ளமைந்த ஆக்சிலரோமீட்டரைப் பயன்படுத்தி நிகழ்நேர திசை உணர்வின் சக்திவாய்ந்த ஆர்ப்பாட்டமாகும். இந்த தொகுதிக்கான ஆறு திட்டங்களும் ஒரு YouTube வீடியோவில் நிரூபிக்கப்பட்டுள்ளன, இது இந்தப் பக்கத்திலும் உட்பொதிக்கப்பட்டுள்ளது. திட்டம் 5க்கான முழுமையான குறியீடு கட்டுரைக்கு கீழே தானாக ஏற்றப்படுகிறது, மேலும் இணைப்பு இணைப்புகள் குறியீடு பிரிவின் கீழ் தோன்றும்.

ESP32-S3 RGB LED மேட்ரிக்ஸ் தொகுதி கண்ணோட்டம்
ESP32-S3 RGB LED மேட்ரிக்ஸ் தொகுதியில் இந்த திட்டத்தை சாத்தியமாக்கும் பல கூறுகள் உள்ளன:

- ESP32-S3 மைக்ரோகண்ட்ரோலர் — Wi-Fi, BLE வழங்குகிறது, மேலும் LED/IMU தர்க்கத்தை இயக்குகிறது.
- 8×8 RGB LED மேட்ரிக்ஸ் — நான்கு திசைகளில் ஏதேனும் ஒன்றில் அம்புக்குறியைக் காட்டுகிறது.
- QMI8658C ஆக்சிலரோமீட்டர் — சாய்வு, இயக்கம் மற்றும் திசையைக் கண்டறிகிறது.:contentReference[oaicite:0]{index=0}
- USB-C போர்ட் Arduino IDE இல் மின்சாரம் மற்றும் நிரலாக்கத்திற்காக.
- ரீசெட் மற்றும் பூட் பொத்தான்கள் ஸ்கெட்ச்களை பதிவேற்றுவதற்காக.
- GPIO பின்கள் கூடுதல் திட்டங்களுக்காக பலகையைச் சுற்றி கிடைக்கின்றன.
அம்புக்குறி திசை முற்றிலும் ஆக்சிலரோமீட்டர் அளவீடுகளால் தீர்மானிக்கப்படுகிறது. பலகை சுழற்றப்படும்போது, QMI8658C புதிய X/Y/Z மதிப்புகளை உணர்கிறது, மேலும் ஸ்கெட்ச் எந்த அம்பு வடிவத்தை (↑, ↓, ←, →) வரைய வேண்டும் என்பதைத் தேர்ந்தெடுக்கிறது.

வீடியோவில் உள்ளடக்கிய திட்டங்கள் (நேர முத்திரைகள்)
- 00:00 – அறிமுகம்
- 02:01 – ESP32 பலகைகளை நிறுவுதல்
- 03:32 – நூலகங்களை நிறுவுதல்
- 05:32 – திட்டம் 1: நகரும் புள்ளி
- 11:11 – திட்டம் 2: உரை ஸ்க்ரோல்
- 12:59 – திட்டம் 3: HTTP உரை
- 16:41 – திட்டம் 4: சாய்வு புள்ளி
- 18:55 – திட்டம் 5: அம்பு எப்போதும் மேல்நோக்கி (இந்த திட்டம்)
- 20:02 – திட்டம் 6: இலக்கு விளையாட்டு
தொகுதி எவ்வாறு திருப்பப்படுகிறது என்பதன் அடிப்படையில் அம்புக்குறி உடனடியாக திசையை மாற்றுவதை வீடியோ தெளிவாகக் காட்டுகிறது. இந்த பகுதியைப் பார்ப்பது மிகவும் பரிந்துரைக்கப்படுகிறது.:contentReference[oaicite:1]{index=1}

Arduino IDE இல் ESP32 பலகைகளை நிறுவுதல்
முந்தைய திட்டத்தை நீங்கள் முடித்திருந்தால், பலகை அமைப்பு ஏற்கனவே செய்யப்பட்டுள்ளது. இல்லையெனில்:
File > Preferences→ ESP32 பலகை URL ஐச் சேர்க்கவும்Tools > Board > Boards Manager…→ “ESP32” ஐ நிறுவவும்Tools > Boardஇன் கீழ் ESP32-S3 பலகையைத் தேர்ந்தெடுக்கவும்Tools > Portஇன் கீழ் சரியான USB COM போர்ட்டைத் தேர்ந்தெடுக்கவும்
தேவையான நூலகங்களை நிறுவுதல்
திட்டம் 5 பயன்படுத்துகிறது:
Adafruit NeoMatrixAdafruit NeoPixelAdafruit GFXQMI8658(மோஷன் சென்சார்)
Sketch > Include Library > Manage Libraries…- தேடல்: NeoMatrix → நிறுவு
- சார்புகளை நிறுவவும்: NeoPixel + GFX
- QMI8658 ஐ அதன் ஆசிரியரால் தேடி நிறுவவும்
திட்டம் 5 எவ்வாறு செயல்படுகிறது
QMI8658C X, Y மற்றும் Z அச்சுகளில் ஈர்ப்பு விசையை அளவிடுகிறது. இந்த மதிப்புகளை ஒப்பிடுவதன் மூலம், பலகையின் எந்த இயற்பியல் பக்கம் மேல்நோக்கி உள்ளது என்பதை ஸ்கெட்ச் தீர்மானிக்கிறது:
- USB பக்கம் மேலே
- OUSB பக்கம் மேலே (USB க்கு எதிரே)
- பக்கம் “15” மேலே
- பக்கம் “34” மேலே
ஒவ்வொரு திசையும் 8×8 மேட்ரிக்ஸில் வெவ்வேறு அம்பு வடிவத்திற்கு ஒத்திருக்கிறது. மேப்பிங் முந்தைய பிழைத்திருத்த அமர்வுகளிலிருந்து உங்கள் உறுதிப்படுத்தப்பட்ட திசை தர்க்கத்தைப் பின்பற்றுகிறது. பலகையின் சுழற்சி தொடர்ந்து படிக்கப்படுகிறது, மேலும் மேல்நோக்கிய பக்கம் மாறியவுடன் அம்பு புதுப்பிக்கப்படுகிறது.
திட்டம் 5 – குறியீடு அமைப்புகள் (அம்பு எப்போதும் மேல்நோக்கி)
கீழே உள்ளமைவு பகுதியிலிருந்து பயனர் சரிசெய்யக்கூடிய மதிப்புகள் உள்ளன. முழுமையான திட்ட குறியீடு கட்டுரைக்கு கீழே தானாக தோன்றும்.
மேட்ரிக்ஸ் உள்ளமைவு
// மேட்ரிக்ஸ் உள்ளமைவு
const int MATRIX_PIN = 14; // இந்த தொகுதிக்கு நிலையானது
const int MATRIX_WIDTH = 8;
const int MATRIX_HEIGHT = 8;
// பரிந்துரைக்கப்பட்ட திசை: மேல்-இடது தோற்றம், முற்போக்கான முறை
// (உண்மையான கன்ஸ்ட்ரக்டர் கீழே ஏற்றப்பட்ட குறியீட்டில் உள்ளது)
இந்த திட்டம் உண்மையான இயக்கத்தின் அடிப்படையில் அம்பு சரியாக சுட்டிக்காட்டுவதை உறுதிசெய்ய NEO_MATRIX_PROGRESSIVE தளவமைப்பைப் பயன்படுத்துகிறது.
பிரகாசம்
uint8_t matrixBrightness = 40; // 0–255
பிரகாசமான சூழல்களுக்கு இந்த மதிப்பை உயர்த்தலாம். உட்புற பயன்பாட்டிற்கு, 30–60 வசதியாக இருக்கும்.
அம்பு நிறம்
// அம்பு நிறம்
uint8_t arrowRed = 255;
uint8_t arrowGreen = 0;
uint8_t arrowBlue = 0;
அம்புக்குறியின் நிறத்தை மாற்ற இந்த மதிப்புகளை மாற்றவும். எடுத்துக்காட்டாக:
- பச்சை அம்பு:
(0, 255, 0) - நீல அம்பு:
(0, 0, 255) - வெள்ளை அம்பு:
(255, 255, 255)
உணர்திறன் மற்றும் மென்மையாக்கல்
ஜிட்டரைத் தவிர்க்க, குறியீடு மென்மையாக்கல் மற்றும் வாசல் தர்க்கத்தை உள்ளடக்கியது. அமைப்புகளில் இதுபோன்ற ஒன்றை நீங்கள் காணலாம்:
// உணர்திறன் / மென்மையாக்கல் சரிசெய்தல்
float tiltThreshold = 0.30f; // அம்பு எளிதில் மாறினால் சரிசெய்யவும்
- உங்கள் அம்பு மிக எளிதாக சுழன்றால் → அதிகரிக்கவும் வரம்பு.
- அம்பு மாற மிக மெதுவாக இருந்தால் → குறைக்கவும் வரம்பு.
அம்பு வடிவங்கள்
இந்த ஸ்கெட்ச்சில் பின்வருவனவற்றிற்கான அம்பு பிட்மேப் வடிவங்கள் உள்ளன:
- ↑ மேல்
- ↓ கீழ்
- ← இடது
- → வலது
இவற்றை மாற்ற வேண்டிய அவசியமில்லை, ஆனால் வேறு பாணி வேண்டுமெனில் குறியீட்டில் உள்ள வடிவங்களை மாற்றலாம்.
சுருக்கம்
திட்டம் 5, ESP32-S3 RGB LED மேட்ரிக்ஸ் மற்றும் QMI8658C முடுக்கமானி எவ்வாறு ஒன்றாகச் செயல்பட்டு, திசையைக் கண்டறிந்து எப்போதும் மேல்நோக்கிச் சுட்டிக்காட்டும் அம்பைக் காட்டுகிறது என்பதை நிரூபிக்கிறது. இந்தத் திட்டம் Tilt Dot (திட்டம் 4) அடிப்படையில் உருவாக்கப்பட்டு, திட்டம் 6 இல் உள்ள இறுதி ஊடாடும் விளையாட்டிற்கு உங்களைத் தயார்படுத்துகிறது.
முழு “Arrow Always Up” ஸ்கெட்ச் இந்தக் கட்டுரைக்குக் கீழே கிடைக்கிறது (தானாக ஏற்றப்பட்டது). வீடியோவின் தொடர்புடைய பகுதியைப் பார்ப்பது மிகவும் பரிந்துரைக்கப்படுகிறது, ஏனெனில் போர்டு சுழற்சிக்கு அம்பு எவ்வளவு உடனடியாக பதிலளிக்கிறது என்பதைக் காணலாம். இந்தத் திட்டத்தை வீட்டில் உருவாக்க விரும்பினால், ESP32-S3 RGB LED மேட்ரிக்ஸ் தொகுதிக்கான இணைப்பு இணைப்புகள் குறியீட்டுப் பகுதிக்குக் கீழே உள்ளன.
படங்கள்
This tutorial is part of: ESP32-S3 RGB LED மேட்ரிக்ஸ்
- ESP32-S3 RGB LED மேட்ரிக்ஸ் திட்டம் 1- அடிப்படை புள்ளி
- ESP32-S3 RGB LED மேட்ரிக்ஸ் திட்டம் 2 - உருளும் உரை
- ESP32-S3 RGB LED மேட்ரிக்ஸ் திட்டம் 3 - மொபைல் போனிலிருந்து உரை
- ESP32-S3 RGB LED மேட்ரிக்ஸ் திட்டம் 4 - சாய்வு புள்ளி
- ESP32-S3 RGB LED மேட்ரிக்ஸ் திட்டம் 6 - Cible விளையாட்டு
- ESP32-S3 RGB LED மேட்ரிக்ஸ் Wi-Fi + NTP நேர கடிகார திட்டம் -1 அடிப்படை கடிகாரம்
- ESP32-S3 RGB LED மேட்ரிக்ஸ் இணைய கடிகார திட்டம் - 2 கடிகார பல வண்ண நேரம் & தேதி காட்சி
- ESP32-S3 RGB LED மேட்ரிக்ஸ் இணைய கடிகார திட்டம் - தேதியுடன் 3 இரவு நிறங்கள்
- ESP32-S3 RGB LED மேட்ரிக்ஸ் இணைய கடிகார திட்டம் - 5 வானவில் நிறம்
- ESP32-S3 RGB LED மேட்ரிக்ஸ் இணைய கடிகார திட்டம் - 4 சீரற்ற நிறம்
- ESP32-S3 RGB LED Matrix test for RGB, GRB setting
/*
Project 5: Arrow Always Up – 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/RJT833
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 -> arrow points to opposite side
// USB↔OUSB, 34↔15
// false -> arrow points to the same side that is UP
bool useOppositeMapping = false;
// Arrow color (0–255 each)
uint8_t dotRed = 0;
uint8_t dotGreen = 150;
uint8_t dotBlue = 0;
// Board sides
enum Side {
SIDE_CENTER = 0,
SIDE_USB,
SIDE_OUSB,
SIDE_15,
SIDE_34
};
// Direction for arrow drawing
enum ArrowDir {
ARROW_CENTER,
ARROW_UP,
ARROW_DOWN,
ARROW_LEFT,
ARROW_RIGHT
};
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 "?";
}
}
// -------- ARROW DRAWING (YOUR CODE, UNCHANGED) --------
// Draw a simple arrow on 8x8 matrix pointing in the given direction
void drawArrow(ArrowDir dir, uint16_t color) {
matrix.fillScreen(0);
switch (dir) {
case ARROW_UP:
// Tip
matrix.drawPixel(3, 0, color);
matrix.drawPixel(4, 0, color);
// Second row
matrix.drawPixel(2, 1, color);
matrix.drawPixel(3, 1, color);
matrix.drawPixel(4, 1, color);
matrix.drawPixel(5, 1, color);
// Shaft
matrix.drawLine(3, 2, 3, 6, color);
matrix.drawLine(4, 2, 4, 6, color);
break;
case ARROW_DOWN:
// Tip
matrix.drawPixel(3, 7, color);
matrix.drawPixel(4, 7, color);
// Row above tip
matrix.drawPixel(2, 6, color);
matrix.drawPixel(3, 6, color);
matrix.drawPixel(4, 6, color);
matrix.drawPixel(5, 6, color);
// Shaft
matrix.drawLine(3, 1, 3, 5, color);
matrix.drawLine(4, 1, 4, 5, color);
break;
case ARROW_LEFT:
// Tip
matrix.drawPixel(0, 3, color);
matrix.drawPixel(0, 4, color);
// Column after tip
matrix.drawPixel(1, 2, color);
matrix.drawPixel(1, 3, color);
matrix.drawPixel(1, 4, color);
matrix.drawPixel(1, 5, color);
// Shaft
matrix.drawLine(2, 3, 6, 3, color);
matrix.drawLine(2, 4, 6, 4, color);
break;
case ARROW_RIGHT:
// Tip
matrix.drawPixel(7, 3, color);
matrix.drawPixel(7, 4, color);
// Column before tip
matrix.drawPixel(6, 2, color);
matrix.drawPixel(6, 3, color);
matrix.drawPixel(6, 4, color);
matrix.drawPixel(6, 5, color);
// Shaft
matrix.drawLine(1, 3, 5, 3, color);
matrix.drawLine(1, 4, 5, 4, color);
break;
case ARROW_CENTER:
default:
// Simple plus in the center
matrix.drawLine(3, 3, 4, 3, color);
matrix.drawLine(3, 4, 4, 4, color);
matrix.drawLine(3, 3, 3, 4, color);
matrix.drawLine(4, 3, 4, 4, color);
break;
}
matrix.show();
}
// -------- IMU → SIDE DETECTION --------
// We calibrated earlier:
// +X = USB, -X = OUSB
// +Y = 15, -Y = 34 (after your correction)
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;
// Prefer Y axis for 15 / 34
if (fabs(ay_g) >= tiltThreshY) {
if (ay_g > 0) {
return SIDE_34; // +Y = 34 up
} else {
return SIDE_15; // -Y = 15 up
}
}
// Otherwise, use 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
}
}
// Not clearly tilted → treat as center
return SIDE_CENTER;
}
// Map from UP side to where the arrow should point
Side arrowSideFromUpSide(Side upSide) {
if (!useOppositeMapping) {
// Arrow shows the side that is UP
return upSide;
}
// Arrow shows the opposite side
switch (upSide) {
case SIDE_USB: return SIDE_OUSB;
case SIDE_OUSB: return SIDE_USB;
case SIDE_15: return SIDE_34;
case SIDE_34: return SIDE_15;
case SIDE_CENTER:
default: return SIDE_CENTER;
}
}
// Convert SIDE to ArrowDir
ArrowDir arrowDirFromSide(Side s) {
switch (s) {
case SIDE_USB: return ARROW_UP;
case SIDE_OUSB: return ARROW_DOWN;
case SIDE_15: return ARROW_LEFT;
case SIDE_34: return ARROW_RIGHT;
case SIDE_CENTER:
default: return ARROW_CENTER;
}
}
// ---------------- SETUP & LOOP ----------------
void setup() {
Serial.begin(115200);
delay(500);
matrix.begin();
matrix.setBrightness(20);
matrix.fillScreen(0);
matrix.show();
// IMU: SDA=11, SCL=12 on 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 arrowSide = arrowSideFromUpSide(upSide);
ArrowDir dir = arrowDirFromSide(arrowSide);
uint16_t color = matrix.Color(dotRed, dotGreen, dotBlue);
drawArrow(dir, color);
// 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(" | ARROW="); Serial.println(sideName(arrowSide));
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