Обсуждаем ESP 32 S3 Прошивка для HID

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
17 Май 2025
Сообщения
3
Реакции
0
Привет на зарубежных форумах множество людей начали прошивать платы esp32, esp 32 s3 и другие для определения их как HID устройств с приемом и отправкой данных на пк.

Вот сама прошивка от автора julian0521, но насколько я вижу у многих людей кто знаком с платами впервые как и у меня возникли огромные трудности с правильным выставлением настроек для прошивки.

ESP32 S3 HID Firmware .:
Expand Collapse Copy
#include "Adafruit_TinyUSB.h"
 
Adafruit_USBD_HID usb_hid;
 
uint8_t const desc_hid_report[] = {
  0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00,
  0x05, 0x09, 0x19, 0x01, 0x29, 0x03, 0x15, 0x00, 0x25, 0x01,
  0x95, 0x03, 0x75, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x05,
  0x81, 0x03, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x15, 0x81,
  0x25, 0x7F, 0x75, 0x08, 0x95, 0x02, 0x81, 0x06, 0xC0, 0xC0
};
 
// ==== Cola de comandos HID ====
struct HidCommand {
  uint8_t report[3];
};
 
const int QUEUE_SIZE = 64;
HidCommand commandQueue[QUEUE_SIZE];
volatile int queueHead = 0;
volatile int queueTail = 0;
 
bool enqueueCommand(const uint8_t* report) {
  int nextHead = (queueHead + 1) % QUEUE_SIZE;
  if (nextHead == queueTail) return false;  // Cola llena
  memcpy(commandQueue[queueHead].report, report, 3);
  queueHead = nextHead;
  return true;
}
 
bool dequeueCommand(uint8_t* outReport) {
  if (queueHead == queueTail) return false;  // Vacía
  memcpy(outReport, commandQueue[queueTail].report, 3);
  queueTail = (queueTail + 1) % QUEUE_SIZE;
  return true;
}
 
// ==== SETUP ====
void setup() {
  Serial.begin(921600);
  usb_hid.setReportDescriptor(desc_hid_report, sizeof(desc_hid_report));
  usb_hid.setPollInterval(1);
  usb_hid.begin();
}
 
// ==== LOOP ====
void loop() {
  static char buffer[32];
  static uint8_t idx = 0;
 
  while (Serial.available() > 0) {
    char c = Serial.read();
    if (c == '\n' && idx > 0) {
      buffer[idx] = '\0';
      parseCommand(buffer);
      idx = 0;
    } else if (idx < sizeof(buffer) - 1 && c >= ' ') {
      buffer[idx++] = c;
    }
  }
 
  // Despachar comando HID si el dispositivo está listo
  static uint32_t lastSendTime = 0;
  if (usb_hid.ready() && millis() - lastSendTime >= 1) {
    uint8_t report[3];
    if (dequeueCommand(report)) {
      usb_hid.sendReport(0, report, sizeof(report));
      lastSendTime = millis();
    }
  }
}
 
// ==== COMANDO PARSER ====
void parseCommand(const char* cmd) {
  if (cmd[0] == 'M') {
    char* comma = strchr(cmd + 1, ',');
    if (comma) {
      *comma = '\0';
      int8_t dx = atoi(cmd + 1);
      int8_t dy = atoi(comma + 1);
      uint8_t report[3] = { 0, dx, dy };
      enqueueCommand(report);
    }
  }
  else if (strcmp(cmd, "CLICK_LEFT_DOWN") == 0) {
    uint8_t report[3] = {1, 0, 0};
    enqueueCommand(report);
  }
  else if (strcmp(cmd, "CLICK_LEFT_UP") == 0) {
    uint8_t report[3] = {0, 0, 0};
    enqueueCommand(report);
  }
}

Сами настройки которые я выставлял для прошивки в Arduiono ide 2.3.6
1751013441536.png
1751013561048.png


Но в мониторе порта происходит паник мод, и устройство не может считать память. Если есть люди которые могут помочь и объяснить как правильно прошить, и возможно укажет на ошибки буду благодарен. Возможно эта тема поможет людям которые тоже, только начали вникать в код Arduino
 
Назад
Сверху Снизу