данные через frsky-d (имитация frsky-hub)

Tohyich

Что-то не осилил я общение с гуглом и не смог подобрать правильный вопрос.
Итак имеются:

  1. Airwolf rx-F702 (внешне очень похож на rx-F802/rx-F801, термоусадку пока не вскрывал, маркировку микропроцессора не видел)
  2. Turnigy 9x (er9x) + FrSKY DJT
  3. USB ttl / Arduino Pro Mini

На приемнике (1) обнаружена телеметрия (через резисторный делитель уже вижу напряжение АКБ), и пин с маркировкой Rx.
Нашел в интернетах, что на пин Rx можно повесить USART со скоростью 9600. Предполагаю, что подключив этот Rx к Tx`у USB-ttl и отправив определенную строку можно передать ее на экран пульта Турниги.
Но вот что написать туда (в Usart), чтобы на пульте появилось значение? например, высоты Alt?

Tohyich

Нашел что-то похожее
Надергал упрощенный скетч

#include <SoftwareSerial.h> // To communicate with the FrSky RX
#define PIN_SerialTX 2       // the pin to transmit the serial data to the frsky telemetry enabled receiver
#define FRSKY_USERDATA_BARO_ALT_B   0x10 //#define FRSKY_USERDATA_GPS_ALT_B    0x01

int inByte = 0;         // incoming serial byte
SoftwareSerial mySerial(3, PIN_SerialTX,true); // Software Serial is used including the Inverted Signal option ( the "true" in the line below )

void setup() {
  // start serial port at 9600 bps:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  establishContact();  // send a byte to establish contact until receiver responds
  mySerial.begin(9600);
}


void loop() {
  // if we get a valid byte, read analog ins:
  if (Serial.available() > 0) {
    // get incoming byte:
    inByte = Serial.parseInt();
    if (inByte!=0){
    Serial.println(inByte, DEC);
    // read first analog input, divide by 4 to make the range 0-255:
    SendValue(FRSKY_USERDATA_BARO_ALT_B, inByte);
    }
   Serial.flush();
  }
}


void establishContact() {
  while (Serial.available() <= 0) {
    Serial.println("Ready");   // send a capital A
    delay(300);
  }
}

void SendValue(uint8_t ID, uint16_t Value) {
  Serial.println("Try to send value");   // send a capital A
  uint8_t tmp1 = Value & 0x00ff;
  Serial.println(tmp1, DEC);
  uint8_t tmp2 = (Value & 0xff00)>>8;
  Serial.println(tmp2, DEC);

  mySerial.write(0x5E);
  mySerial.write(ID);
  if(tmp1 == 0x5E) {
    mySerial.write(0x5D);
    mySerial.write(0x3E);
  }
  else if(tmp1 == 0x5D) {
    mySerial.write(0x5D);
    mySerial.write(0x3D);
  }
  else {
    mySerial.write(tmp1);
  }
  if(tmp2 == 0x5E) {
    mySerial.write(0x5D);
    mySerial.write(0x3E);
  }
  else if(tmp2 == 0x5D) {
    mySerial.write(0x5D);
    mySerial.write(0x3D);
  }
  else {
    mySerial.write(tmp2);
  }
  mySerial.write(0x5E);
}

Запитал ардуину от 3,3В соеденил землю с передатчиком и пин2 с пином RX.
Отправляю на ардуину 1000, в ответ вижу:
1000
Try to send value
232
3

Значит tmp1= 232, tmp2=3
На приемнике значение Alt 0.0 (то есть ничего не меняется)

Musgravehill

На Турнигу уже передавали телеметрию, перепрошив ее на Er9 и подпаяв проводки к АтМега.

Я пробовал гнать данные через порт 9600, он не прозрачный. Приходится энкапсулировать данные и помечать начало посылки. Потом на мониторчик выводил.
На этом форуме был код.

Tohyich

Не, на самой турниге проблем пока не вижу, уровень сигнала и напряжение на делителе A1 выводится замечательно.
Но есть другие параметры (Alt, Gspd, Vspd, проч.), вот я и пытаюсь на Rx приемника подать нужную строку и там вроде не всё так прозрачно…

Musgravehill
Tohyich:

Но есть другие параметры (Alt, Gspd, Vspd, проч.), вот я и пытаюсь на Rx приемника подать нужную строку и там вроде не всё так прозрачно…

А, сымитировать hub, подключенный к D-приемнику. На Гитхабе находил имитацию на Ардуино.

Кстати, не так давно испытывал Frsky S-port на новых приемниках. Он работает как однопроводной rxtx serial. На rcgroups есть код для Ардуино - имитирует всякие датчики.

Tohyich

Так я инвертированный УАРТ и сымитировал (код во втором сообщении) но на Турниге ничего не отображается. То ли прошивка в приемнике обрезанная, то ли я где то косячу…

Musgravehill

В Турниге не нужно искать и включать отображение датчиков?
На Таранисе нужно через меню приемника Search telemetry data - оно думает-думает, а потом показывает, какие датчики есть в потоке телеметрии. Выбираю и размещаю.

Tohyich

В меню настроек телеметрии я могу выбрать несколько параметров, которые будут выведены на экран. Но все выводится с нулями.

Нашел еще один вариант, но тоже ноль реакции. Напряжение на пине ардуины меняется, значит передача идёт, но до турниговского экрана не доходит…

2 months later
Tohyich

C самодельным приемником работает такой код:

#include <SoftwareSerial.h> // To communicate with the FrSky RX
#define PIN_SerialTX 2       // the pin to transmit the serial data to the frsky telemetry enabled receiver
#define FRSKY_USERDATA_BARO_ALT_B   0x10 //#define FRSKY_USERDATA_GPS_ALT_B    0x01
#define FRSKY_USERDATA_GPS_SPEED_B  0x11
#define FRSKY_USERDATA_GPS_SPEED_A  0x19
int inByte = 0;         // incoming serial byte
int analogPin = 3;

SoftwareSerial mySerial(0, PIN_SerialTX,true); // Software Serial is used including the Inverted Signal option ( the "true" in the line below )

void setup() {
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  mySerial.begin(9600);
  pinMode(A3, INPUT_PULLUP);
}


void loop() {

inByte=analogRead(analogPin);     // read the input pin
  Serial.println(inByte);
    SendValue(FRSKY_USERDATA_BARO_ALT_B, inByte);
    SendValue(FRSKY_USERDATA_GPS_SPEED_B, inByte);
    SendValue(FRSKY_USERDATA_GPS_SPEED_A, inByte);
    delay(100);
}


void establishContact() {
  while (Serial.available() <= 0) {
    Serial.println("Ready");   // send a capital A
    delay(1000);
  }
}

void SendValue(uint8_t ID, uint16_t Value) {
  uint8_t tmp1 = Value & 0x00ff;
  uint8_t tmp2 = (Value & 0xff00)>>8;
  mySerial.write(0x5E);
  mySerial.write(ID);
  if(tmp1 == 0x5E) {
    mySerial.write(0x5D);
    mySerial.write(0x3E);
  }
  else if(tmp1 == 0x5D) {
    mySerial.write(0x5D);
    mySerial.write(0x3D);
  }
  else {
    mySerial.write(tmp1);
  }
  if(tmp2 == 0x5E) {
    mySerial.write(0x5D);
    mySerial.write(0x3E);
  }
  else if(tmp2 == 0x5D) {
    mySerial.write(0x5D);
    mySerial.write(0x3D);
  }
  else {
    mySerial.write(tmp2);
  }
  mySerial.write(0x5E);
}

со второго пина ардуины идет провод на RX приемника.
пин A3 через 10К реостат идет на землю.
Вращая реостат меняем значение высоты и скорости, наблюдаем изменения на передатчике.
Видимо в покупном прошивка не та. Надо перешивать.