Hi,
wollte auch mal was zu FrSky schreiben.
Am Original-Hub lassen sich auch Standart NMEA-GPS Module betreiben (9600Baud/1Hz), sowie BMP085-Sensoren.
Der RPM-Eingang erwartet nur einen Takt.
Einen Konverter (RS232<->TTL) kann man einfach mit einem Transistor und 2 Widerständen bauen.
Man kann auch andere Daten über FrSky senden (z.B. direkt NMEA), das Protokoll auf der RX-Seite legt nur der Hub fest,
auf der TX-Seite muss man allerdings seine Daten dann wieder aus dem FrSky-Protokoll (User-Daten) extrahieren.
Dabei sollte man aber insgesammt unter 2000 Zeichen/Sec bleiben.
Als Hub kann man auch einen Arduino mit Software-Serial nutzen um den Hardware-Serial Port für ein GPS frei zu haben.
Einen Demo-Code hab ich auch dafür (Sendet jedoch nur Fake-Daten / RPM & Lipo-Voltage):
Code:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
#define FRSKY_USERDATA_GPS_ALT_B 0x01
#define FRSKY_USERDATA_TEMP1 0x02
#define FRSKY_USERDATA_RPM 0x03
#define FRSKY_USERDATA_FUEL 0x04
#define FRSKY_USERDATA_TEMP2 0x05
#define FRSKY_USERDATA_CELL_VOLT 0x06
#define FRSKY_USERDATA_GPS_ALT_A 0x09
#define FRSKY_USERDATA_BARO_ALT_B 0x10
#define FRSKY_USERDATA_GPS_SPEED_B 0x11
#define FRSKY_USERDATA_GPS_LONG_B 0x12
#define FRSKY_USERDATA_GPS_LAT_B 0x13
#define FRSKY_USERDATA_GPS_CURSE_B 0x14
#define FRSKY_USERDATA_GPS_DM 0x15
#define FRSKY_USERDATA_GPS_YEAR 0x16
#define FRSKY_USERDATA_GPS_HM 0x17
#define FRSKY_USERDATA_GPS_SEC 0x18
#define FRSKY_USERDATA_GPS_SPEED_A 0x19
#define FRSKY_USERDATA_GPS_LONG_A 0x1A
#define FRSKY_USERDATA_GPS_LAT_A 0x1B
#define FRSKY_USERDATA_GPS_CURSE_A 0x1C
#define FRSKY_USERDATA_BARO_ALT_A 0x21
#define FRSKY_USERDATA_GPS_LONG_EW 0x22
#define FRSKY_USERDATA_GPS_LAT_EW 0x23
#define FRSKY_USERDATA_ACC_X 0x24
#define FRSKY_USERDATA_ACC_Y 0x25
#define FRSKY_USERDATA_ACC_Z 0x26
#define FRSKY_USERDATA_CURRENT 0x28
#define FRSKY_USERDATA_VOLTAGE_B 0x3A
#define FRSKY_USERDATA_VOLTAGE_A 0x3B
uint16_t val = 0;
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);
}
void SendVoltage(uint8_t cellID, uint16_t voltage) {
voltage /= 2;
uint8_t v1 = (voltage & 0x0f00)>>8 | (cellID<<4 & 0xf0);
uint8_t v2 = (voltage & 0x00ff);
uint16_t Value = (v1 & 0x00ff) | (v2<<8);
SendValue(FRSKY_USERDATA_CELL_VOLT, Value);
}
void setup(void) {
Serial.begin(9600);
mySerial.begin(9600);
}
void loop(void) {
SendValue(FRSKY_USERDATA_RPM, val++);
delay(400);
SendVoltage(0, 3200);
delay(100);
SendVoltage(1, 3300);
delay(100);
SendVoltage(2, 3400);
delay(100);
}
Der Code ist allerdings nur mit meiner eigenen Boden-Station getestet, diese funktioniert aber genause mit dem Original-Hub.
Daher sollte es auch mit dem Original Display funktionieren !
Gruß,
Olli