Я работаю над проектом, в котором использую Happymodel ELRS ES24TX Pro 2,4 ГГц TX и M5StickC для получения и обработки телеметрии через протокол S.Port.
Основная цель — считывать телеметрию с полетного контроллера, подключенного к приемнику ELRS, и отображать эти данные на экране M5StickC, а также в Serial Monitor. В настоящее время я использую M5StickC для отправки команд RC через CRSF на приемник ELRS, и эта часть работает успешно. Однако я хотел бы добавить возможность считывания телеметрии, поступающей от контроллера полета через S.Port, и у меня возникли с этим трудности.
Мои текущие настройки:Transmitter: Happymodel ELRS ES24TX Pro 2.4GHz TX.
Microcontroller: M5StickC (ESP32).
Using the CRSF library to send RC data, and I want to use the same or a new library to receive telemetry.
Проблема:
I know that S.Port is used for simultaneous channel data transmission and telemetry.
At the moment, I am successfully transmitting RC packets to the receiver, but I can't figure out how to properly read the telemetry data.
My goal is to understand how to correctly switch to receiving telemetry data and how to work with the data stream from S.Port.
Я также пробовал использовать таймер и переключаться между отправкой и получением данных, но получатель все равно не видит стабильного соединения, а телеметрия либо отсутствует, либо приходит в неправильном формате.
Вопросы:
Есть ли какие-нибудь рекомендации или примеры, как правильно читать телеметрию через S.Port с помощью M5Stick и Happymodel ELRS?
Как следует настроить контакты RX/TX для использования S.Port в ELRS?
Нужно ли мне дополнительно обрабатывать или модифицировать пакеты CRSF для корректного получения телеметрии?
#include "CRSF.h"
#include "M5StickCPlus2.h"
#define CRSFinterval 50
#define uartCRSFinverted false
const int ledPin = 19;
const int rxPin = 26;
CRSF crsf;
#define CRSF_CHANNEL_VALUE_MIN 172
#define CRSF_CHANNEL_VALUE_MID 992
#define CRSF_CHANNEL_VALUE_MAX 1811
hw_timer_t *timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
volatile bool printFlag = false;
void printPacketHex(uint8_t *packet, size_t length) {
for (size_t i = 0; i < length; i++) {
if (packet < 0x10) {
Serial.print("0");
}
Serial.print(packet, HEX);
Serial.print(" ");
}
Serial.println();
}
void IRAM_ATTR onTimer() {
portENTER_CRITICAL_ISR(&timerMux);
crsf.sendRCFrameToFC();
printFlag = true;
portEXIT_CRITICAL_ISR(&timerMux);
}
void StartTimer() {
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, CRSFinterval * 80, true);
timerAlarmEnable(timer);
}
void setup() {
M5.begin();
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(1.5);
Serial.begin(115200);
Serial1.begin(115200, SERIAL_8N1, rxPin, -1);
if (Serial1) {
Serial.println("Serial1 initialized successfully.");
M5.Lcd.setCursor(1, 1);
M5.Lcd.println("Serial1 initialized.");
} else {
Serial.println("Error initializing Serial1.");
M5.Lcd.setCursor(1, 1);
M5.Lcd.println("Serial1 init error.");
}
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
delay(200);
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
crsf.Begin();
crsf.PackedRCdataOut.ch0 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch1 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch2 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch3 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch4 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch5 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch6 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch7 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch8 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch9 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch10 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch11 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch12 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch13 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch14 = CRSF_CHANNEL_VALUE_MIN;
crsf.PackedRCdataOut.ch15 = CRSF_CHANNEL_VALUE_MIN;
crsf.sendRCFrameToFC();
StartTimer();
}
void loop() {
if (printFlag) {
printFlag = false;
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(1, 1);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.println("CRSF packet:");
M5.Lcd.setTextColor(GREEN);
for (size_t i = 0; i < sizeof(crsf.PackedRCdataOut); i++) {
if (((uint8_t *)&crsf.PackedRCdataOut) < 0x10) {
M5.Lcd.print("0");
}
M5.Lcd.print(((uint8_t *)&crsf.PackedRCdataOut), HEX);
M5.Lcd.print(" ");
}
M5.Lcd.println();
}
if (Serial1.available() > 0) {
M5.Lcd.setCursor(10, 85);
M5.Lcd.setTextColor(YELLOW);
M5.Lcd.setTextSize(1);
M5.Lcd.println("Incoming data:");
if (Serial1.available() >= 32) {
crsf.PackedRCdataOut.ch0 = Serial1.read() | (Serial1.read()
Подробнее здесь: https://stackoverflow.com/questions/791 ... es24tx-pro
Как читать телеметрию через S.Port с помощью M5Stick и Happymodel ELRS ES24TX Pro ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Не удалось разрешить заполнитель «server.port» в значении «${server.port}».
Anonymous » » в форуме JAVA - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-