Код для поиска

Проект RGB LED матрицы ESP32-S3 4 - Наклоненная точка

Проект RGB LED матрицы ESP32-S3 4 - Наклоненная точка

Проект 4 - Наклонная точка (Перемещение точки путем наклона матрицы RGB LED ESP32-S3)

Проект 4 представляет собой датчик движения, встроенный в модуль RGB LED Matrix на базе ESP32-S3. Вместо того чтобы автоматически перемещать точку (как в Проекте 1) или прокручивать текст (Проекты 2 и 3), этот проект позволяет вам контролировать положение точки, просто наклоняя плату. Точка плавно перемещается по 8×8 RGB дисплею на основе данных в реальном времени от акселерометра QMI8658C, расположенного на обратной стороне модуля.

Все шесть проектов в этой серии продемонстрированы в одном видео на YouTube. То же видео встроено на этой странице, так что вы можете увидеть, как точка движется в реальном времени по мере наклона доски. Полный код для этого проекта автоматически загружается ниже статьи, а партнерские ссылки для модуля появляются под разделом кода.

Обзор модуля RGB LED матрицы ESP32-S3

Этот проект использует модуль RGB LED матрицы ESP32-S3, который включает в себя:

  • Микроконтроллер ESP32-S3с Wi-Fi и Bluetooth
  • 8×8 RGB светодиодная матрица(64 индивидуально настраиваемых светодиодов)
  • QMI8658C акселерометрна задней стороне для наклона и обнаружения движения
  • USB-портдля программирования и питания
  • Кнопки загрузки / сброса
  • Используемые контакты GPIOдля будущего расширения

Датчик QMI8658C считываетX,Y, иZзначения ускорения и ориентации, позволяющие точке перемещаться вверх/вниз/влево/вправо в зависимости от наклона доски.:contentReference[oaicite:0]{index=0}

Проекты, включенные в видео (временные метки)

  • 00:00- Введение
  • 02:01- Установка плат ESP32
  • 03:32- Установка библиотек
  • 05:32- Проект 1: Движущаяся Точка
  • 11:11- Проект 2: Прокрутка текста
  • 12:59- Проект 3: HTTP Текст
  • 16:41-Проект 4: Tilt Dot (этот проект)
  • 18:55Проект 5: Стрелка вверх
  • 20:02- Проект 6: Игра-цель

Рекомендуется посмотреть демонстрацию наклона в видео, так как вы можете увидеть, как точка плавно реагирует на ориентацию доски.:contentReference[oaicite:1]{index=1}

Установка плат ESP32 в Arduino IDE

Если вы завершили любой предыдущий проект, поддержка платы уже установлена. В противном случае выполните следующие шаги:

  1. ОткрытьFile > Preferences→ Добавить URL плат ESP32.
  2. Идти кTools > Board > Boards Manager…и установитьESP32.
  3. Выберите вашу плату ESP32-S3 в разделеTools > Board.
  4. Выберите правильный COM-порт подTools > Port.

Установка необходимых библиотек

Этот проект требует следующие библиотеки:

  • Adafruit NeoMatrix
  • Adafruit NeoPixel
  • Adafruit GFX Library
  • QMI8658(датчик движения)

Установите их в Диспетчере библиотек:

  1. ОткрытьSketch > Include Library > Manage Libraries….
  2. Поиск заAdafruit NeoMatrix→ Установить.
  3. Разрешить автоматическую установкуAdafruit GFXиAdafruit NeoPixel.
  4. Поиск заQMI8658по указанному автору → Установить.:contentReference[oaicite:2]{index=2}

Как работает Проект 4

Датчик QMI8658C непрерывно предоставляет данные о ускорении вдоль осей X, Y и Z. Для этого проекта мы используем только оси X и Y для принятия решений:

  • Насколько далеко переместить точку влево или вправо (по оси X)
  • Насколько далеко нужно переместить точку вверх или вниз (ось Y)

Значения сенсоров отображаются в диапазоне координат от 0 до 7 (для матрицы LED 8×8). Положение точки обновляется много раз в секунду, создавая плавный эффект скольжения при наклоне модуля.:contentReference[oaicite:3]{index=3}

Проект 4 - Настройки кода (Tilt Dot)

Ниже находятся настраиваемые пользователем параметры, расположенные в верхней части кода проекта. Полная схема появляется под статьей автоматически.

Матрица Пин и размер


// 8×8 RGB matrix configuration
const int MATRIX_PIN    = 14;   // fixed pin for this board
const int MATRIX_WIDTH  = 8;
const int MATRIX_HEIGHT = 8;

УйтиMATRIX_PINв14Он жестко интегрирован с бортовой матрицей.

Яркость


// Overall brightness (0–255)
uint8_t matrixBrightness = 40;

Увеличьте, если необходимо, но избегайте экстремальной яркости при просмотре вблизи.

Цвет точки


// Dot color (R, G, B)
uint8_t dotRed   = 0;
uint8_t dotGreen = 200;   // light green (default)
uint8_t dotBlue  = 0;

Измените эти значения, чтобы создать любой цвет. Примеры:

  • Красный:(255, 0, 0)
  • Желтый:(255, 255, 0)
  • Белый:(255, 255, 255)

Чувствительность к движению

Чтобы предотвратить резкие скачки, значения акселерометра обычно ограничиваются или масштабируются. Типичная настройка выглядит следующим образом:


// How aggressively tilt affects movement
float sensitivity = 4.0f;   // larger = faster movement across screen

Если точка движется слишком медленно → увеличьте значение. Если точка движется слишком резко → уменьшите его.

Скорость обновления (Частота обновления)

Вы можете добавить небольшую задержку между обновлениями, чтобы сгладить движение:


// Delay between position updates (ms)
int refreshDelayMs = 20;   // lower = smoother and faster response

Значения от 10 до 30 мс ощущаются как очень отзывчивые.

Резюме

Проект 4 активирует встроенный акселерометр QMI8658C ESP32-S3, позволяя вам управлять светодиодной матрицей с помощью физических движений. Небольшой наклон платы перемещает точку в том же направлении, что делает этот проект отличной отправной точкой для более сложных проектов "Стрела вверх" и "Целевая игра".

Полная схема Tilt Dot загружена ниже этой статьи (автоматически). Для лучшего понимания посмотрите демонстрацию наклона в видео, где вы можете увидеть, как плавно движется точка при повороте платы. Ссылки на покупку модуля RGB LED Matrices ESP32-S3 включены в разделе кода.

Изображения

ESP32 S3 Matrix
ESP32 S3 Matrix
ESP32 S3 Matrix  pin out
ESP32 S3 Matrix pin out
ESP32-S3_RGB_8x8_matrix-3
ESP32-S3_RGB_8x8_matrix-3
ESP32 S3 Matrix displaying rainbow heart
ESP32 S3 Matrix displaying rainbow heart
ESP32-S3_RGB_8x8_matrix1
ESP32-S3_RGB_8x8_matrix1
ESP32-S3_RGB_8x8_matrix-2
ESP32-S3_RGB_8x8_matrix-2
802-ESP32-S3 RGB LED Matrix Project 4 - Tilt dot
Язык: C++
/*
 * Проект 4: Tilt Dot - RGB LED матрица ESP32-S3 (Waveshare)
 * 
 * Этот скетч считывает наклон с ИМУ QMI8658C и плавно перемещает точку на матрице RGB LED 8×8 в зависимости от ориентации платы.
 * 
 * ▶️ Видеоурок:
 * https://youtu.be/JKLuYrRcLMI
 * 
 * 📚⬇️ Ресурсы и страница кода:
 * 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> // Лахав Гахали

 // -------- НАСТРОЙКА СВЕТОДИОДНОЙ МАТРИЦЫ --------
#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
);

 // -------- УСТАНОВКА IMU QMI8658 --------
QMI8658 imu;
QMI8658_Data imuData;

 // -------- НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ --------

 // истина -> точка на противоположной стороне: USB↔OUSB, 34↔15
 // ложно -> точка на той же стороне, что и ВВЕРХ
bool useOppositeMapping = false;

 // Цвет точки (0-255 каждая)
uint8_t dotRed   = 0;
uint8_t dotGreen = 100;
uint8_t dotBlue  = 0;

 // Боковые стороны
enum Side {
  SIDE_CENTER = 0,
  SIDE_USB,
  SIDE_OUSB,
  SIDE_15,
  SIDE_34
};

 // Положение точки (в пиксельных координатах, но сохраняется как дробное число для облегчения)
float dotPosX = 3.0f; // начать в центре
float dotPosY = 3.0f;

 // Фактор сглаживания: меньшее значение = более медленное движение (0.1 очень медленно, 0.5 быстрее)
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 "?";
  }
}

 // Определите, какая сторона находится ВВЕРХУ, используя откалиброванные оси:
 // +X = USB, -X = OUSB, +Y = 34, -Y = 15
Side detectSideUp(float ax_g, float ay_g, float az_g) {
 // Обнаружение плоских объектов
  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;

 // Пороговые значения для определения "эта ось действительно наклонена"
  const float tiltThreshY = 0.5f;
  const float tiltThreshX = 0.5f;

 // 1) Предпочитайте ось Y для 15 / 34, если она явно наклонена.
  if (fabs(ay_g) >= tiltThreshY) {
    if (ay_g > 0) {
      return SIDE_15; // +Y = 34 вверх
    } else {
      return SIDE_34; // -У = 15 вверх
    }
  }

 // 2) В противном случае проверьте ось X на наличие USB / OUSB
  if (fabs(ax_g) >= tiltThreshX) {
    if (ax_g > 0) {
      return SIDE_USB; // +X = USB вверх
    } else {
      return SIDE_OUSB; // -X = OUSB вверх
    }
  }

 // 3) Если ничего не сильно наклонено, просто назовите это ЦЕНТРОМ
  return SIDE_CENTER;
}

 // Карта от стороны UP до места, куда должно попасть точка.
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;
  }
}

 // Преобразуйте координаты точки в матричные координаты.
void getDotPixel(Side dotSide, int &px, int &py) {
 // Матрица (0,0) = верхний левый угол
 // верхний центр: (3,0) → USB
 // центр внизу: (3,7) → OUSB
 // левый центр: (0,3) → 15
 // правый центр: (7,3) → 34
 // центр: (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 для 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);

 // --- Плавное движение к цели ---
  dotPosX += (targetX - dotPosX) * dotSmooth;
  dotPosY += (targetY - dotPosY) * dotSmooth;

 // Преобразовать в целые пиксельные координаты
  int px = (int)round(dotPosX);
  int py = (int)round(dotPosY);

 // Зажим на всякий случай
  if (px < 0) px = 0;
  if (px > 7) px = 7;
  if (py < 0) py = 0;
  if (py > 7) py = 7;

 // --- Нарисовать точку ---
  matrix.fillScreen(0);
  uint16_t color = matrix.Color(dotRed, dotGreen, dotBlue);
  matrix.drawPixel(px, py, color);
  matrix.show();

 // Отладка
  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);
}




Вещи, которые могут вам понадобиться

Ресурсы и ссылки

Файлы📁

Файл Fritzing