Het OpenTX draadje (nieuws, handige weetjes, hardware, diy)

Zou je dan niet RSSI kunnen gebruiken als conditie.. zo lang die >0 is dan updaten, is die 0 dan geen variabelen meer vullen.
Ik weet niet of dit snel genoeg is tov andere "sensoren"
 
Dat weet ik niet, maar ik kan wel een extra sensor met een vaste waarde meesturen en zodra die vaste waarde verandert (nul wordt) de boel afkeuren.
Of een extra sensor een checksumwaarde laten meesturen over mijn temperatuur en druk.
Maar als geen telemetrie standaard "0" wordt voor een LUA script dan is "0" ongeldig verklaren denk ik het simpelst.
 
Sport pop is alleen voor custom streaming data. Er moet ook een tele indicator sensor zijn maar welke weet ik zo niet (ben niet thuis). Je kan ook in de value widget source kijken hoe ze het daar doen.
 
Inmiddels is mijn script (zie attachment voor de tekstfile) zodanig klaar dat het in combinatie met de gemaakte sensor werkt. Het bleek verreweg het handigste om "sensor lost" of "telemetry lost" te detecteren door voor temperatuur en druk de waarde nul af te keuren.

script.jpg


Waar ik nogal mee heb zitten worstelen en alleen via trial en error heb kunnen oplossen is het verschijnsel dat de telemetrievelden in OpenTX rechtstreeks worden doorgegeven en weergegeven in het telemetriescherm, maar als je diezelfde velden als input wil gebruiken, dan worden ze door OpenTX als 10-bit veld geinterpreteerd, waarbij 1024 dan 100 is.
Bij de binnenkomende temperatuur (Kelvin) en druk (Pascal) moet ik dan met 10.24 vermenigvuldigen, omdat er ook nog een decimale punt bij de LUA output wordt gezet.

script scherm.jpg

Op het scherm van het script zelf ziet het er dan zo uit:
Bij de inputs zet je de custom curve "Sinp" en de twee telemetriesensoren voor temperatuur (1001) en druk (1002)
Aan de rechterkant de outputs, waarbij ik dus de temperatuur en druk in het script moet vermenigvuldigen met 10.24 om de gewenste 297.9 graden Kelvin en 1009.5 HectoPascal in dit scherm te krijgen.
F3 is de correctiefactor t.o.v. het binnenkomende gassignaal. In dit voorbeeld moet er 7,5% van volgas af dus dat wordt een uitslag van 85 (merk op dat van volgas (100) naar idle (-100) een totale servoweg is van 200, dus 7,5% van 200 is 15)

Als iemand, die naar mijn script kijkt, een elegantere manier weet om met die verhaspeling met factor 1.024 om te gaan, dan hoor ik dat graag.
 

Bijlagen

Laatst bewerkt:
Ik heb er even een X aantal minuten naar zitten kijken, maar ik kom er niet achter hoe je de formule van de gaswet er in gezet hebt.
Vermoedelijk staar ik me blind op wat nu precies wat is, maar ik herken de formule domweg niet terug. Ik zie dat je de formule "omgebouwd" hebt met die "factor", maar hoe precies.... het ontgaat me gewoon... :p
 
Formule gaswet, zoals ik hem had gekregen

(273/(c+273) x (p/1000) = factor

c = temp in celcius
p = druk in hectopascal

Ik lever in Kelvin aan dus

273 / Kelvin x pressure / 1000 = factor

Je mag ook eerst de tellers vermenigvuldigen dan de noemers vermenigvuldigen en dat op elkaar delen

presssure x 273
kelvin x 1000

En dan weer als twee aparte breuken uit elkaar trekken zodat je dit krijgt: (pressure/kelvin) x (273/1000) = factor

in het script zie je staan 1.024 * 273 * pressure/kelvin - 1024
Het vetgedrukte is de essentie van de gaswetformule wat overblijft. De 1.024 ervoor is de OpenTX verhaspeling en de -1024 er achter is om de factor te laten werken in de regel eronder, waarbij ik de curve een halve servoweg moet verschuiven. Die deling door 1000 zit ergens verstopt in het telemetriewaardenscherm en in mijn sensor. Die 1000 heb ik opgesnoept om de waarden die je bij de sensors ziet en in het LUA script scherm te laten kloppen.

Ik hoop dat het een beetje te volgen is, zodat je kunt kijken of ik geen formule denkfout maak. Want dat kan maar zo. Indien het geval, dan sluiten we dat even buiten dit OpenTX draadje kort, zodat het hier een beetje on-topic blijft.
 
Laatst bewerkt:
Ja hoor... dat kan ik uitstekend volgen, en nu zie ik hem ook... Ik werd gewoon in de war gebracht door de naamgevingen en de getalletjes (die veelvouden van 1024).

Die regel achter "solchan", met dat (i + (i + 1024) * factor /1024), ik neem aan dat die regel is wat het LUA script feitelijk met die uitgerekende correctie doet, en dat dat niets met het rekenwerk te maken heeft?

Helemaal top!

Man! ik ga steeds harder balen van het feit dat voor mijn baan niet zoiets als "thuiswerken" bestaat... :mad:

Sta te trappelen om dit te gaan proberen, en helemaal: de temperatuursveranderingen staan NU de komende maanden te gebeuren, tegen de tijd dat ik thuis ben is het al weer afgevlakt.

Oh... zit hier nog iets in voor dat dingetje met de range van 1050 tot 1950?
Volgens mij is dat niet nodig, is het gewoon een kwestie van de limieten van het betreffende kanaal op die waardes zetten....
 
Laatst bewerkt:
Maar wat ik eigenlijk zou maken als ik jouw was was een sensor die alles zelf regelt maar waarbij de parameters via lua instelbaar zijn. Dan heb je niet de vertraging via de zender (ongeveer 1 seconde).
Nu ik het mixerscript af heb wil ik ook jouw advies verder opvolgen en ben dus aan het kijken naar je voorbeeld om bidirectionele communicatie voor elkaar te krijgen tussen een LUA script en een eigengemaakte S-port sensor.
Code:
#include <SPort.h>                                    //Include the SPort library

SPortHub hub(0x12, 3);                                //Hardware ID 0x12, Software serial pin 3
SimpleSPortSensor sensor(0x5900);                     //Sensor with ID 0x5900

void setup() {
  hub.commandId = 0x1B;                               //Listen to data send to thist physical ID
  hub.commandReceived = handleCommand;                //Function to handle received commands
  hub.registerSensor(sensor);                         //Add sensor to the hub
  hub.begin();                                        //Start listening
}

void loop() {
  sensor.value = 1234;                                //Set the sensor value
  hub.handle();                                       //Handle new data
}

void handleCommand(int prim, int applicationId, int value) {
  hub.sendCommand(0x32, applicationId, value + 1);    //Send a command back to lua, with 0x32 as reply and the value + 1
}
Ik zie in je library bovenstaande voorbeeldsketch en neem aan dat daar ook een voorbeeld LUA script bij hoort, wat gebruik maakt van sportTelemetryPush en sportTelemetryPop
Zo'n voorbeeldscript kan ik alleen niet vinden in je Github repository. Heb je dat wellicht nog ergens?
 
Ja, daar ben ik wel weer even zoet mee, voor ik het begrijp. Bedankt.

Mocht je (of andere forumlezers) het leuk vinden. Ik heb een sketch gemaakt, die met behulp van jouw library ongeveer alle FRsky sensoren aanmaakt. Wellicht is dit handig voor mensen die zelf een sensor willen maken. Ze kunnen dan vanaf dit voorbeeld weggooien wat ze niet nodig hebben. Voel je vrij om hem in je library op te nemen als voorbeeld.

Als je hem compileert in een Arduino krijg je zomaar 20 sensoren in je telemetrie erbij
Alleen de formules voor "flvss_cells" en "gps_date_time" heb ik nog niet kunnen vinden.

Code:
/*
This sketch emulates 20 different sensor parameters based on below FRsky sensor table
It is using Tadango's s.Port library at: https://github.com/RealTadango/FrSky
May 2021: V1 by Hans Meijdam
to-do: Find and add the formula's for "flvss_cells" en "gps_date_time" application ID's.

       Sensor class       |  Physical ID | Application ID |        #define        |      Data type       | Poll time [ms]
  ------------------------+--------------+----------------+-----------------------+----------------------+-----------------
  FrSkySportSensorAss     |     ID10     |     0x0A00     | ASS_SPEED_DATA_ID     | air speed            | 500
  ------------------------+--------------+----------------+-----------------------+----------------------+-----------------
  FrSkySportSensorEsc     |     ID17     |     0x0B50     | ESC_POWER_DATA_ID     | ESC voltage/current  | 300
                          |              |     0x0B60     | ESC_RPM_CONS_DATA_ID  | RPM/consumption      | 300
                          |              |     0x0B70     | ESC_TEMP_DATA_ID      | temperature          | 300
                          |              |     0x0E50     | ESC_SBEC_DATA_ID      | SBEC voltage/current | 300
  ------------------------+--------------+----------------+-----------------------+----------------------+-----------------
  FrSkySportSensorFcs     |     ID3      |     0x0200     | FCS_CURR_DATA_ID      | current              | 500
                          |              |     0x0210     | FCS_VOLT_DATA_ID      | voltage              | 500
  ------------------------+--------------+----------------+-----------------------+----------------------+-----------------
  FrSkySportSensotFlvss   |     ID2      |     0x0300     | FLVSS_CELL_DATA_ID    | cell voltage         | 300
  ------------------------+--------------+----------------+-----------------------+----------------------+-----------------
  FrskySportSensorGps     |     ID4      |     0x0800     | GPS_LAT_LON_DATA_ID   | latitude/longitude   | 1000
                          |              |     0x0820     | GPS_ALT_DATA_ID       | altitude             | 500
                          |              |     0x0830     | GPS_SPEED_DATA_ID     | ground speed         | 500
                          |              |     0x0840     | GPS_COG_DATA_ID       | COG                  | 500
                          |              |     0x0850     | GPS_DATE_TIME_DATA_ID | date/time            | 10000
  ------------------------+--------------+----------------+-----------------------+----------------------+-----------------
  FrskySportSensorRpm     |     ID5      |     0x0400     | RPM_T1_DATA_ID        | temperature 1        | 1000
                          |              |     0x0410     | RPM_T2_DATA_ID        | temperature 2        | 1000
                          |              |     0x0500     | RPM_ROT_DATA_ID       | RPM                  | 500
  ------------------------+--------------+----------------+-----------------------+----------------------+-----------------
  FrSkySportSensorSp2uart |     ID7      |     0x0900     | SP2UARTB_ADC3_DATA_ID | ADC 3                | 500
                          |              |     0x0910     | SP2UARTB_ADC4_DATA_ID | ADC 4                | 500
  ------------------------+--------------+----------------+-----------------------+----------------------+-----------------
  FrskySportSensorVario   |     ID1      |     0x0100     | VARIO_ALT_DATA_ID     | altitude             | 200
                          |              |     0x0110     | VARIO_VSI_DATA_ID     | VSI                  | 100
*/

#include <SPort.h>                           // Include the SPort library
SPortHub hub(0x12, 2);                       // Hardware ID 0x12, Software serial pin 2
SimpleSPortSensor vario_alt(0x0100);         // Vario Altitude
SimpleSPortSensor vario_vsi(0x0110);         // Vario vertical speed
SimpleSPortSensor fcs_current(0x0200);       // FCS current (0x200 - 0x020f)
SimpleSPortSensor fcs_voltage(0x0210);       // FCS voltage (0x210 - 0x021f)
SimpleSPortSensor flvss_cells(0x0300);       // FLvss cell voltage
SimpleSPortSensor rpm_temp1(0x0400);         // RPM temperature 1
SimpleSPortSensor rpm_temp2(0x0410);         // RPM temperature 2
SimpleSPortSensor rpm_rotation(0x0500);      // RPM rotations per minute
SimpleSPortSensor gps_lat_lon(0x0800);       // GPS latitude / longitude
SimpleSPortSensor gps_alt(0x0820);           // GPS altitude
SimpleSPortSensor gps_speed(0x0830);         // GPS speed
SimpleSPortSensor gps_cog(0x0840);           // GPS course over ground
SimpleSPortSensor gps_date_time(0x0850);     // GPS date / time
SimpleSPortSensor sp2uart_adc3(0x0900);      // UART ADC 3
SimpleSPortSensor sp2uart_adc4(0x0910);      // UART ADC 4
SimpleSPortSensor ass_airspeed(0x0A00);      // ASS airspeed
SimpleSPortSensor esc_power(0x0B50);         // ESC power
SimpleSPortSensor esc_rpm(0x0B60);           // ESC Rotations per minute
SimpleSPortSensor esc_temp(0x0B70);          // ESC temperature
SimpleSPortSensor esc_sbec(0x0E50);          // ESC SBEC voltage / current

long alt = 0;
byte sendlat = 0;
long longitude = 000000000;
long latitude = 000000000;

void setup() {
pinMode (13, OUTPUT);
 
  hub.registerSensor(vario_alt);        //Add sensor to the hub
  hub.registerSensor(vario_vsi);        //Add sensor to the hub
  hub.registerSensor(fcs_current);      //Add sensor to the hub
  hub.registerSensor(fcs_voltage);      //Add sensor to the hub
  hub.registerSensor(flvss_cells);      //Add sensor to the hub
  hub.registerSensor(rpm_temp1);        //Add sensor to the hub
  hub.registerSensor(rpm_temp2);        //Add sensor to the hub
  hub.registerSensor(rpm_rotation);     //Add sensor to the hub
  hub.registerSensor(gps_lat_lon);      //Add sensor to the hub
  hub.registerSensor(gps_alt);          //Add sensor to the hub
  hub.registerSensor(gps_speed);        //Add sensor to the hub
  hub.registerSensor(gps_cog);          //Add sensor to the hub
  hub.registerSensor(gps_date_time);    //Add sensor to the hub
  hub.registerSensor(sp2uart_adc3);     //Add sensor to the hub
  hub.registerSensor(sp2uart_adc4);     //Add sensor to the hub
  hub.registerSensor(ass_airspeed);     //Add sensor to the hub
  hub.registerSensor(esc_power);        //Add sensor to the hub
  hub.registerSensor(esc_rpm);          //Add sensor to the hub
  hub.registerSensor(esc_temp);         //Add sensor to the hub
  hub.registerSensor(esc_sbec);         //Add sensor to the hub
  hub.begin();                          //Start listening
}

void loop() {
  vario_alt.value = 12345;              //in cm / default is auto zero offset
  vario_vsi.value = 1234;               //in cm per second
  fcs_current.value = 1234;             //in 0.1 Amps
  fcs_voltage.value = 1234;             //in 0.01 volts
  flvss_cells.value = 0;                //????? to-do (unknown formatting)
  rpm_temp1.value = 123;                //in degrees celcius
  rpm_temp2.value = 123;                //in degrees celcius
  rpm_rotation.value = 123;             //in revolutions per minute

if (sendlat == 0){                      // GPS longitude and latitude is send in an alternating sequence one after the other.
  gps_lat_lon.value = (( ((((uint32_t)( longitude < 0 ? -longitude : longitude)) /10 ) * 6 ) / 10 ) & 0x3FFFFFFF)  | 0x80000000;
  if (longitude < 0) gps_lat_lon.value |= 0x40000000;
  sendlat = 1;
  longitude = longitude - 1000;
}
else {                                  // The same field gps_lat_lon.value is used for both lat and lon.
  gps_lat_lon.value = ((  ((((uint32_t)( latitude < 0 ? -latitude : latitude)) / 10 ) * 6 )/ 10 ) & 0x3FFFFFFF ) ;
  if (latitude < 0) gps_lat_lon.value |= 0x40000000;
  sendlat = 0;
  latitude = latitude + 1000;
}
  digitalWrite(13, sendlat);            // Led will toggle when GPS latitude or longitude is sent
  gps_alt.value = alt = alt+1;          //in cm but per 10cm displayed
  gps_speed.value = 100000;             //in 0.001 kts
  gps_cog.value = 12345;                //in 0.01 degrees
  gps_date_time.value = 0;              // ????? to-do difficult to understand formula/mechanism
  sp2uart_adc3.value = 1234;            //in 0.01 Volt
  sp2uart_adc4.value = 1234;            //in 0.01 Volt
  ass_airspeed.value = 1000;            //in 0.1 kts
  uint32_t volt = 1200;                 //ESC Volts in 0.01 Volts
  uint32_t curr = 3400;                 //ESC Ampere in 0.01 Ampere
  uint32_t powerData = (((uint32_t)round(curr * 100)) << 16) + (uint32_t)round(volt * 100); // for whole volts input
//  uint32_t powerData = (curr << 16) + volt;
  esc_power.value = powerData;          //Set the sensor value
  uint32_t rpm = 9000;                  //ESC RPM in Rotations Per Minute
  uint32_t cons = 3210;                 //ESC consumption in MAh utilized
  uint32_t rpmConsData = (cons << 16) + (rpm / 100);
  esc_rpm.value = rpmConsData;          //Set the sensor value
  esc_temp.value = 123;                 //in degrees Celcius
  uint32_t sbecCurr = 7500;             //in milliAmpere
  uint32_t sbecVolt = 5432;             //in milliVolt
  uint32_t sbecData = (((uint32_t)round(sbecCurr * 1000)) << 16) + (uint32_t)round(sbecVolt * 1000); // for whole values
//  uint32_t sbecData = (sbecCurr << 16) + sbecVolt;
  esc_sbec.value = sbecData;            //Set the sensor value

  hub.handle();                         //Handle new data
}
 
Ik weet niet wat dat bijdraagt... Als de sensor rechtsstreeks ingrijpt op de solenoid (wat ik op zich een prima ding zou vinden) zie ik niet zo goed wat er vanaf de zender nog in te stellen valt.
Maar eerst moet nog aangetoond worden dat die gaswet correctie ook daadwerkelijk de juiste correctie is. Ik denk van wel, en ik hoop van wel... maar het moet "nog effe" bewezen worden in de praktijk.
 
Ik heb hem binnen, de Tandem X20.
Wat willen jullie, zal ik er een nieuw draadje over starten genaamd Ethos?

IMG_20210514_161333.jpg


GJ
 
pfft ik ben blij dat ik niet zon ding heb, dit gaat gerard allemaal ver boven de pet haha
 
Ik heb bij mijn toestellen een lowbat waarschuwing ingesteld als de laagste cel 3,4V is. Dat heb ik gedaan door een logische schakelaar aan te maken (L01) en een speciale functie. Het werkt bijvoorbeeld goed bij mijn Calmato, maar niet bij mijn Dornier Wal. Hij geeft geen waarschuwing bij te lage celspanning. Zie onder. Het enige verschil dat ik zie is dat bij de Calmato 3,40 V staat en bij de Wal alleen 3,40 bij de speciale functies. De telemetrie werkt bij de Wal wel: de totale spanning van de lipo wordt keurig in het display van mijn X9D plus aangegeven. Hoe zou ik dit kunnen oplossen? Het glijvermogen van de Wal is door de forse weerstand nogal beperkt, dus een noodlanding geeft weinig speelruimte.
LS.jpg

De logical switches


SF.jpg

En de speciale functies.
 
Ja, inderdaad daar zat verschil tussen. Ik heb de Dornier nu aangepast conform de Calmato. Hopelijk werkt het nu wel. Bedankt voor de tip!
 
Kan je nagaan als je OpenTX gebruikt.
De Ethos is vreselijk simpel te programmeren, simpeler dan de meeste andere merken.

GJ
Mensen kiezen OpenTX voor de ongekende mogelijkheden, niet omdat het zo simpel is. Maar het stelt ook weinig voor als je er even mee bezig bent. Het is logischer en duidelijker dan een hoop andere systemen :)
 
Back
Top