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

Discussie in 'Modelbouwsoftware' gestart door Tadango, 2 apr 2020.

  1. Hobby4Life

    Hobby4Life

    Lid geworden:
    20 nov 2009
    Berichten:
    1.133
    Locatie:
    Avenhorn
    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"
     
  2. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.734
    Locatie:
    Barneveld
    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.
     
  3. r3wd

    r3wd

    Lid geworden:
    9 okt 2020
    Berichten:
    125
    Locatie:
    Tilburg
    Is het echt een 0 of is ie null? Dat laatste zie je bij die S.PORT Pop volgens de omschrijving.
     
  4. Tadango

    Tadango Forum veteraan

    Lid geworden:
    25 jun 2003
    Berichten:
    15.746
    Locatie:
    Groningen
    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.
     
  5. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.734
    Locatie:
    Barneveld
    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.
     

    Bijgevoegde bestanden:

    Laatst bewerkt: 8 mei 2021
    brutus en AHoogendijk vinden dit leuk.
  6. brutus

    brutus Forum veteraan

    Lid geworden:
    18 nov 2008
    Berichten:
    23.955
    Locatie:
    Oldeberkoop
    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
     
  7. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.734
    Locatie:
    Barneveld
    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: 8 mei 2021
    AHoogendijk vindt dit leuk.
  8. brutus

    brutus Forum veteraan

    Lid geworden:
    18 nov 2008
    Berichten:
    23.955
    Locatie:
    Oldeberkoop
    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: 8 mei 2021
  9. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.734
    Locatie:
    Barneveld
    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?
     
  10. Tadango

    Tadango Forum veteraan

    Lid geworden:
    25 jun 2003
    Berichten:
    15.746
    Locatie:
    Groningen
  11. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.734
    Locatie:
    Barneveld
    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
    }
     
  12. brutus

    brutus Forum veteraan

    Lid geworden:
    18 nov 2008
    Berichten:
    23.955
    Locatie:
    Oldeberkoop
    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.
     
  13. GJVO

    GJVO Forum veteraan

    Lid geworden:
    23 dec 2003
    Berichten:
    14.216
    Locatie:
    Weidenbach in de Eifel
    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
     
    wim eon vindt dit leuk.
  14. Tadango

    Tadango Forum veteraan

    Lid geworden:
    25 jun 2003
    Berichten:
    15.746
    Locatie:
    Groningen
    Graag een nieuw draadje gezien dit geen OpenTX draait en deze ook niet snel OpenTX compatible is......
     
  15. Gerard_nl

    Gerard_nl Moderator Moderator team Forum veteraan

    Lid geworden:
    7 sep 2002
    Berichten:
    15.683
    Locatie:
    eindhoven, El diablo.
    pfft ik ben blij dat ik niet zon ding heb, dit gaat gerard allemaal ver boven de pet haha
     
  16. Frits37

    Frits37 The First Aviators

    Lid geworden:
    24 apr 2015
    Berichten:
    971
    Locatie:
    Noordwest Veluwe
    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.
     
  17. Tadango

    Tadango Forum veteraan

    Lid geworden:
    25 jun 2003
    Berichten:
    15.746
    Locatie:
    Groningen
    Zie je een verschil in de sensoren onder Telemetry?
     
  18. Frits37

    Frits37 The First Aviators

    Lid geworden:
    24 apr 2015
    Berichten:
    971
    Locatie:
    Noordwest Veluwe
    Ja, inderdaad daar zat verschil tussen. Ik heb de Dornier nu aangepast conform de Calmato. Hopelijk werkt het nu wel. Bedankt voor de tip!
     
  19. GJVO

    GJVO Forum veteraan

    Lid geworden:
    23 dec 2003
    Berichten:
    14.216
    Locatie:
    Weidenbach in de Eifel
    Kan je nagaan als je OpenTX gebruikt.
    De Ethos is vreselijk simpel te programmeren, simpeler dan de meeste andere merken.

    GJ
     
    Hobby4Life vindt dit leuk.
  20. Tadango

    Tadango Forum veteraan

    Lid geworden:
    25 jun 2003
    Berichten:
    15.746
    Locatie:
    Groningen
    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 :)
     
    eric_laermans vindt dit leuk.

Deel Deze Pagina