Hi,
I finally got it work.
To summerize, DO NOT USE AN ARDUINO BOARD WITH USB INTEGRATE ON IT (like Arduino Uno, Arduino Nano, ....) , IT WILL DISRUPT SIGNAL
Configuration is:
Lipomètre v0.43 can be found here: http://www.thyzoon.fr/Aeromod/LipoHott/LipoHott3.php (Thanks to Thyzoon )
Upload with Arduino IDE 0.22
On board Arduino Mini v4
Receiver GR12 with Firmware rx6_2a80_e9
Remote control is MX-12 Hott
http://img580.imageshack.us/img580/4470/imgp7859j.jpg
http://img189.imageshack.us/img189/5853/imgp7860j.jpg
http://img593.imageshack.us/img593/3580/imgp7861.jpg
http://img210.imageshack.us/img210/9570/imgp7862u.jpg
http://img19.imageshack.us/img19/4292/imgp7863z.jpg
Thanks to Mulder (Jochen) also for his help on this forum
New version 1.1:
Adding a text protocol version with parameters stored in the memory of the Arduino:
http://johnlenfr.1s.fr/PHOTOS/Realisations/Electronique/arduino/2012-03-25Lipometre/Lipometre-screen.jpg
The module is capable of other things like use of leds.
Demo of the leds here:
http://www.youtube.com/watch?v=rK5NlR1kAQA
http://www.youtube.com/watch?v=uSyz2yqyp3c
More infos for the module here:
http://johnlenfr.1s.fr/index.php?option=com_content&view=article&id=470&Itemid=110
The code is here:
http://johnlenfr.1s.fr/index.php?option=com_rokdownloads&view=folder&Itemid=122&id=988:lipometre
This code is ready for GPS if needed decomment the code you want.
Tested on MX16 and MX20 Hott with GR12 GR16 and GR24 receivers.
GPS Structure:
/*
// GPS MODULE #33600
struct HOTT_GPS_MSG{
uint8_t startByte; //#1 Starting byte data == 0x7C
uint8_t sensorID; //#2 Sensor ID GPS Sensor == 0x8A
uint8_t warning_beeps; //#3 Byte 3: 0…= warning beeps
VOICE OR BIP WARNINGS
0x00 00 No alarm
0x01 01 A Min Speed A
0x02 02 B Descent / B 3s -1 m / s
0x03 03 C Descent / s C -10 m / s
0x04 04 D Max Distance D
0x05 05 E
0x06 06 F
0x07 07 G
0x08 08 H
0x09 09 I
0xA 10 J
0xB 11 K
0xC 12 L Max Speed L
0xD 13 M Rate of Climb / 3s M 1 m / s
0xE 14 N Rate of Climb / s N 10 m / s
0xF 15 O Min Old O
0x10 16 P
0x11 17 Q
0x12 18 R
0x13 19 S
0x14 20 T
0x15 21 U
0x16 22 V
0x17 23 W
0x18 24 X
0x19 25 Y
0x1A 26 Z Max Old Z
uint8_t sensorTextID; //#4 160 0xA0 Sensor ID Neu!
uint8_t alarmInverse1; //#5 01 inverse status
uint8_t alarmInverse2; //#6 00 inverse status status 1 = no GPS Signal
uint8_t flightDirection; //#7 119 = Flightdir./dir. 1 = 2°; 0° (North), 9 0° (East), 180° (South), 270° (West)
uint16_t GPSSpeed; //#8 LSB 196 8 = speed / low byte GPS speed 8km / h
//#9 MSB 002 0 = speed / GPS speed high byte
uint8_t LatitudeNS; //#10 000 = N = 48°39’988 / north=0, south=1
uint16_t LatitudeMin; //#11 231 0xE7 = 0x12E7 = 4839
//#12 018 18=0x12
uint16_t LatitudeSec; //#13 171 220 = 0xDC = 0x03DC =0988
//#14 016 3 = 0x03
uint8_t longitudeEW; //#15 000 = E= 9° 25’9360 / east=0, west=1
uint16_t longitudeMin; //#16 150 157 = 0x9D = 0x039D = 0925
//#17 003 3 = 0x03
uint16_t longitudeSec; //#18: 056 144 = 0x90 0x2490 = 9360
//#19 004 36 = 0x24
uint16_t distance; //#20 LSB 027 123 = Distance low byte 6 = 6 m
//#21 MSB 036 35 = Distance high byte
uint16_t altitude; //#22 LSB 243 244 = Altitude low byte 500 = 0m
//#23 MSB 001 1 = Altitude high byte
//#24 LSB 48 = m/s (resolution 0.01m 48 = 30000 = 0.00m/s (1=0.01m/s))
//#25 MSB 117 = High Byte m/s resolution 0.01m
uint16_t climbrate1s; //#26 climb rate in 0.01m/s. Value of 30000 = 0.00 m/s 120 = 0m/3s
uint8_t GPSNumSat; //#27 GPS.Satelites (number of satelites) (1 byte)
uint8_t GPSFixChar; //#28 GPS.FixChar. (GPS fix character. display, if DGPS, 2D oder 3D) (1 byte)
uint8_t HomeDirection; //#29 HomeDirection (direction from starting point to Model position) (1 byte)
uint8_t angleXdirection; //#30 angle x-direction (1 byte)
uint8_t angleYdirection; //#31 angle y-direction (1 byte)
uint8_t angleZdirection; //#32 angle z-direction (1 byte)
int8_t gps_time_h; //#33 UTC time hours / gyro x low byte (2 bytes)
int8_t gps_time_m; //#34 UTC time minutes / gyro x high byte
int8_t gps_time_s; //#35 UTC time seconds / gyro y low byte (2 bytes)
int8_t gps_time_sss; //#36 UTC time milliseconds / gyro y high byte
int16_t msl_altitude; //#37 mean sea level altitude / gyro z low byte (2 bytes)
//#38 gyro z high byte
uint8_t vibration; //#39: vibration (1 bytes)
uint8_t Ascii4; //#40: 00 ASCII Free Character [4]
uint8_t Ascii5; //#41: 00 ASCII Free Character [5]
uint8_t GPS_fix; //#42: 00 ASCII Free Character [6], we use it for GPS FIX
uint8_t version; //#43: 00 version number
uint8_t endByte; //#44: 0x7D End byte
uint8_t parity; //#45: CHECKSUM Parity Byte
} ;
VARIO STRUCTURE:
// VARIO MODULE #33601
// Hott v4
struct HOT_VM_MSG{
uint8_t startByte; //#1 0x7C = Start byte data
uint8_t sensorID; //#2 0x89 = Vario Sensor
uint8_t warning_beeps; //#3 0…= warning beeps
VOICE OR BIP WARNINGS
0x00 00 No alarm
0x01 01 A
0x02 02 B Descent / B 3s -1 m / s
0x03 03 C Descent / s C -10 m / s
0x04 04 D
0x05 05 E
0x06 06 F
0x07 07 G
0x08 08 H
0x09 09 I
0xA 10 J
0xB 11 K
0xC 12 L
0xD 13 M Rate of Climb / 3s M 1 m / s
0xE 14 N Rate of Climb / s N 10 m / s
0xF 15 O Min Alt O
0x10 16 P
0x11 17 Q
0x12 18 R
0x13 19 S
0x14 20 T
0x15 21 U
0x16 22 V
0x17 23 W
0x18 24 X
0x19 25 Y
0x1A 26 Z Max Alt Z
uint8_t sensorTextID; //#4 144 0x90 Sensor ID Neu!
uint8_t alarmInverse; //#5 0 Inverse status
uint16_t altitude; //#6 LSB 244 244 = Low Byte Actual Altitude -2m (244+256=0m)
//#7 MSB 1 1 = actual altitude (500 = 0m)
uint16_t maxAltitude; //#8 LSB 244 244 = Low Byte Maximum Altitude. -2m (244+256=0m)
//#9 MSB 1 = max. altitude (500 = 0m)
uint16_t minAltitude; //#10 LSB 244 244 = Low Byte min. altitude -2m (244+256=0m)
//#11 MSB 1 = High Byte min. altitude (500 = 0m)
uint16_t m1s; //#12 LSB 48 Low Byte m/s resolution 0.01m 48 = 30000 = 0.00m/s (1=0.01m/s)
//#13 MSB 117 117 = High Byte m/s resolution 0.01m 117
uint16_t m3s; //#14 LSB 48 Low Byte m/3s resolution 0.01m 48 = 30000 = 0.00m/s (1=0.01m/3s)
//#15 MSB 117 117 = High Byte m/3s resolution 0.01m 117
uint16_t m10s; //#16 LSB 48 Low Byte m/10s resolution 0.01m 48 = 30000 = 0.00m/s (1=0.01m/10s)
//#17 MSB 117 117 = High Byte m/10s resolution 0.01m 117
uint8_t text[24]; //#18: 0 ASCII [1]
//#19: 0 ASCII [2]
//#20: 0 ASCII [3]
//#21: 0 ASCII [4]
//#22: 0 ASCII [5]
//#23: 0 ASCII [6]
//#24: 0 ASCII [7]
//#25: 0 ASCII [8]
//#26: 0 ASCII [9]
//#27: 0 ASCII [10]
//#28: 0 ASCII [11]
//#29: 0 ASCII [12]
//#30: 0 ASCII [13]
//#31: 0 ASCII [14]
//#32: 0 ASCII [15]
//#33: 0 ASCII [16]
//#34: 0 ASCII [17]
//#35: 0 ASCII [18]
//#36: 0 ASCII [19]
//#37: 0 ASCII [20]
//#38: 0 ASCII [21]
//#39: 0 ASCII Free Character [1]
//#40: 0 ASCII Free Character [2]
//#41: 0 ASCII Free Character [3]
uint8_t empty; //#42 0 free
uint8_t version; //#43 0 version number
uint8_t endByte; //#44 0x7D End byte
uint8_t parity; //#45 CHECKSUM Parity Byte
} ;
*/
GENERAL MODULE STRUCTURE:
// GENERAL AIR MODULE (LIPOMETER)
struct HOTT_GAM_MSG {
byte start_byte; //#01 start byte constant value 0x7c
byte gam_sensor_id; //#02 EAM sensort id. constat value 0x8d=GENRAL AIR MODULE
byte warning_beeps; //#03 1=A 2=B ... 0x1a=Z 0 = no alarm
/* VOICE OR BIP WARNINGS
Alarme sonore A.. Z, octet correspondant 1 à 26
0x00 00 0 No alarm
0x01 01 A
0x02 02 B Negative Difference 2 B
0x03 03 C Negative Difference 1 C
0x04 04 D
0x05 05 E
0x06 06 F Min. Sensor 1 temp. F
0x07 07 G Min. Sensor 2 temp. G
0x08 08 H Max. Sensor 1 temp. H
0x09 09 I Max. Sensor 2 temp. I
0xA 10 J Max. Sens. 1 voltage J
0xB 11 K Max. Sens. 2 voltage K
0xC 12 L
0xD 13 M Positive Difference 2 M
0xE 14 N Positive Difference 1 N
0xF 15 O Min. Altitude O
0x10 16 P Min. Power Voltage P // We use this one for Battery Warning
0x11 17 Q Min. Cell voltage Q
0x12 18 R Min. Sens. 1 voltage R
0x13 19 S Min. Sens. 2 voltage S
0x14 20 T Minimum RPM T
0x15 21 U
0x16 22 V Max. used capacity V
0x17 23 W Max. Current W
0x18 24 X Max. Power Voltage X
0x19 25 Y Maximum RPM Y
0x1A 26 Z Max. Altitude Z
*/
byte sensor_id; //#04 constant value 0xd0
byte alarm_invers1; //#05 alarm bitmask. Value is displayed inverted
//Bit# Alarm field
// 0 all cell voltage
// 1 Battery 1
// 2 Battery 2
// 3 Temperature 1
// 4 Temperature 2
// 5 Fuel
// 6 mAh
// 7 Altitude
byte alarm_invers2; //#06 alarm bitmask. Value is displayed inverted
//Bit# Alarm Field
// 0 main power current
// 1 main power voltage
// 2 Altitude
// 3 m/s
// 4 m/3s
// 5 unknown
// 6 unknown
// 7 "ON" sign/text msg active
byte cell[6]; //#7 Volt Cell 1 (in 2 mV increments, 210 == 4.20 V)
//#8 Volt Cell 2 (in 2 mV increments, 210 == 4.20 V)
//#9 Volt Cell 3 (in 2 mV increments, 210 == 4.20 V)
//#10 Volt Cell 4 (in 2 mV increments, 210 == 4.20 V)
//#11 Volt Cell 5 (in 2 mV increments, 210 == 4.20 V)
//#12 Volt Cell 6 (in 2 mV increments, 210 == 4.20 V)
uint16_t Battery1; //#13 LSB battery 1 voltage LSB value. 0.1V steps. 50 = 5.5V only pos. voltages
//#14 MSB
uint16_t Battery2; //#15 LSB battery 2 voltage LSB value. 0.1V steps. 50 = 5.5V only pos. voltages
//#16 MSB
byte temperature1; //#17 Temperature 1. Offset of 20. a value of 20 = 0°C
byte temperature2; //#18 Temperature 2. Offset of 20. a value of 20 = 0°C
byte fuel_procent; //#19 Fuel capacity in %. Values 0--100
//graphical display ranges: 0-100% with new firmwares of the radios MX12/MX20/...
uint16_t fuel_ml; //#20 LSB Fuel in ml scale. Full = 65535!
//#21 MSB
uint16_t rpm; //#22 RPM in 10 RPM steps. 300 = 3000rpm
//#23 MSB
uint16_t altitude; //#24 altitude in meters. offset of 500, 500 = 0m
//#25 MSB
uint16_t climbrate_L; //#26 climb rate in 0.01m/s. Value of 30000 = 0.00 m/s
//#27 MSB
byte climbrate3s; //#28 climb rate in m/3sec. Value of 120 = 0m/3sec
uint16_t current; //#29 current in 0.1A steps 100 == 10,0A
//#30 MSB current display only goes up to 99.9 A (continuous)
uint16_t main_voltage; //#31 LSB Main power voltage using 0.1V steps 100 == 10,0V
//#32 MSB (Appears in GAM display right as alternate display.)
uint16_t batt_cap; //#33 LSB used battery capacity in 10mAh steps
//#34 MSB
uint16_t speed; //#35 LSB (air?) speed in km/h(?) we are using ground speed here per default
//#36 MSB speed
byte min_cell_volt; //#37 minimum cell voltage in 2mV steps. 124 = 2,48V
byte min_cell_volt_num; //#38 number of the cell with the lowest voltage
uint16_t rpm2; //#39 LSB 2nd RPM in 10 RPM steps. 100 == 1000rpm
//#40 MSB
byte general_error_number; //#41 General Error Number (Voice Error == 12) TODO: more documentation
byte pressure; //#42 High pressure up to 16bar. 0,1bar scale. 20 == 2.0bar
byte version; //#43 version number (Bytes 35 .43 new but not yet in the record in the display!)
byte stop_byte; //#44 stop byte 0x7D
byte parity; //#45 CHECKSUM CRC/Parity (calculated dynamicaly)
};