Привет на зарубежных форумах множество людей начали прошивать платы esp32, esp 32 s3 и другие для определения их как HID устройств с приемом и отправкой данных на пк.
Вот сама прошивка от автора julian0521, но насколько я вижу у многих людей кто знаком с платами впервые как и у меня возникли огромные трудности с правильным выставлением настроек для прошивки.
Сами настройки которые я выставлял для прошивки в Arduiono ide 2.3.6
Но в мониторе порта происходит паник мод, и устройство не может считать память. Если есть люди которые могут помочь и объяснить как правильно прошить, и возможно укажет на ошибки буду благодарен. Возможно эта тема поможет людям которые тоже, только начали вникать в код Arduino
Вот сама прошивка от автора julian0521, но насколько я вижу у многих людей кто знаком с платами впервые как и у меня возникли огромные трудности с правильным выставлением настроек для прошивки.
ESP32 S3 HID Firmware .:
#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
Но в мониторе порта происходит паник мод, и устройство не может считать память. Если есть люди которые могут помочь и объяснить как правильно прошить, и возможно укажет на ошибки буду благодарен. Возможно эта тема поможет людям которые тоже, только начали вникать в код Arduino