* THE FORUM FOR ALL THOSE INTERESTED IN BUILDING AND OPERATING MODEL SUBMARINES *



Join the AMS - Registered Forum users can become members of the AMS and it's free ...... To join register on the forum first then follow the forum link to our membership form which is on our website


For further details of any events shown here also see the "Shows and Events" section on the forum

Let us know of your plans for 2018 and we will promote them on this Forum

Looking forward to 2018. In the meantime have a look at the "Photos of events sections" for those memories of last summer!

.

.

. .

.

.

.

,

Who is online?

In total there is 1 user online :: 0 Registered, 0 Hidden and 1 Guest

None


Most users ever online was 37 on Sun Mar 13, 2011 11:27 am

Latest topics

» openLRS and 2.4 Ghz and Submarines
Tue Oct 10, 2017 9:25 am by david f

» Model Boats Magazine October 2017
Thu Oct 05, 2017 1:50 pm by david f

» U32 (class 212A submarine) in swimming bath at Langwedel
Thu Oct 05, 2017 1:40 pm by david f

» Bournville Sep 2017
Mon Sep 18, 2017 10:28 pm by timgarrod

» Model Sub Related Events for 2017
Fri Sep 08, 2017 9:00 am by david f

» Haydock Park 2017
Wed Sep 06, 2017 12:08 pm by david f

» Going Brushless?
Tue Sep 05, 2017 3:55 pm by david f

» Barrow in Furness MBC regatta and sub day
Mon Sep 04, 2017 3:46 pm by david f

» Model Boat Convention, Haydock Park, 26,27 August
Mon Aug 14, 2017 9:27 am by david f

Statistics

Our users have posted a total of 10335 messages in 1675 subjects

We have 734 registered users

The newest registered user is LenaMax24


    Telemetry on openLRS

    Share
    avatar
    david f
    AMS Treasurer

    Posts : 1892
    Join date : 2010-11-10
    Age : 67
    Location : Cumbria

    Telemetry on openLRS

    Post  david f on Sat Feb 13, 2016 11:32 am

    Tim S has asked me to put his latest coding on here to keep it safe.

    For those of you following this, mostly on SubPirates, Tim is working on Telemetry for subs.

    I can testify to the the fact that (an early version of this ) is working very well on my subs. Giving temperature and current draw and battery voltage.

    This is the latest version (still under development by Tim) now incorporating a depth sensor. (And yes - it works!)

    Tim's code follows: (You need to use it with Arduino IDE version 1.6.7 or above and the FrSkyTelemetryLRS library installed)


    /*
     FrSky Telemetry library LRS test
     (c) Pawelsky 20150724.
     Not for commercial use

     FrSkyTelemetry library modified to deal with LRS format (TTL level serial instead of FrSky format...
     renamed to FrSkyTelemetryLRS

     modifications by tim senecal
    */

    #include "FrSkyTelemetryLRS.h"


    #define minraw    272.0
    #define maxraw    1015.0
    #define minreal   9.0
    #define maxreal   158.0
    //#define voltsdiv  84.81
    //#define voltsdiv  102.40
    #define voltsdiv  104.2839

    //explanation of some math...
    // arduino analog pins return values from 0 to 1023...
    // which represent voltages from 0 to 5
    // pressure transducer returns 0.5 to 4.5 volts,
    // for the 5psi model, 4.5 volts represents 11.5 feet, or 138 inches, or 350 cm, or 3500 mm
    // if 1023 = 5 volts, then 921 = 4.5 volts, then 921 = 3500 mm
    // however, we need to establish what "zero" is.
    // we start with 102, which should be 0.5 volts...
    // but because we converted our sensor to a sealed sensor, it might not be 102...
    // so we have some variables and math to handle that.
    #define maxP    921
    #define milli   3514.344
    #define centi   351.434
    #define inches  138.36

    FrSkyTelemetryLRS telemetry; // Create telemetry object

    const int analogTemp1 = A0;
    const int analogTemp2 = A1;
    const int analogAmp = A2;
    const int analogVolt = A3;
    const int analogPressure = A6;

    int mVperAmp = 66;    // use 185 for 5A, 100 for 20A, and 66 for 30A
    int ACSoffset = 2500; // offset to remove negative side of range
    int baseline = 102;   // this should be the zero psi baseline for 0.5 volts, but may not be
    int init_counter = 0;

    float calc_milli = 0;
    float calc_centi = 0;
    float calc_inches = 0;

    float amperes = 0;
    float voltage = 0;
    float actual_rpm = 0;
    float calc_speed = 0;
    float Temp1 = 0;
    float Temp2 = 0;
    float depth = 0;

    void setup()
    {
     // Configure the telemetry serial port
     telemetry.begin(SERIAL_1);

     Serial.begin(9600);
    }

    void loop()
    {
     actual_rpm = 3000;
     calc_speed = 2.258;

     amperes = calc_amperage_val();
     voltage = calc_voltage_val();

     telemetry.setFasData(amperes,   // Current consumption in amps
                          voltage);  // Battery voltage in volts

     depth = calc_pressure_val();

     telemetry.setFgsData(depth);  // Fuel level in percent -  unsigned int16 - any value between 0 and 65535

     // Set LiPo voltage sensor (FLVS) data (we use two sensors to simulate 8S battery
     // (set Voltage source to Cells in menu to use this data for battery voltage)
     float v1 = voltage/2;
     float v2 = voltage/2;
     telemetry.setFlvsData(v1, v2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);  // Cell voltages in volts (cells 1-8). Cells 9-12 are not used in this example

     // Set variometer sensor (FVAS) data
     telemetry.setFvasData(depth);  // Altitude in m (can be nevative)

     // Set GPS data
     float heading = 125.22;

     telemetry.setGpsData(39.847993, -105.104269,  // Latitude and longitude in degrees decimal (positive for N/E, negative for S/W)
                          depth,                   // Altitude in m (can be negative)
                          calc_speed,              // Speed in m/s
                          heading,                 // Course over ground in degrees
                          15, 2, 19,               // Date (year - 2000, month, day)
                          12, 00, 00);             // Time (hour, minute, second) - will be affected by timezone setings in your radio

     float accel_angle_x =  2.35;
     float accel_angle_y =  4.25;
     float accel_angle_z =  3.15;

     telemetry.setTasData(accel_angle_x,     // calculated x angle
                          accel_angle_y,     // calculated y angle
                          accel_angle_z);    // calculated z angle

     // Set temperature sensor (TEMS) data, two temperatures T1 & T2

       // Set temperature sensor (TEMS) data, two temperatures T1 & T2
     Temp1 = calc_temp_val(analogTemp1);
     Temp2 = calc_temp_val(analogTemp2);
     telemetry.setTemsData(Temp1,   // Temperature #1 in degrees Celsuis (can be negative)
                           Temp2);  // Temperature #2 in degrees Celsuis (can be negative)

     // Set RPM sensor (RPMS) data
     // (set number of blades to 2 in telemetry menu to get correct rpm value)
     telemetry.setRpmsData(actual_rpm);  // Rotations per minute

     // Send the telemetry data, note that the data will only be sent for sensors
     // that had their data set at least once. Also it will only be set in defined
     // time intervals, so not necessarily at every call to send() method.
     telemetry.send();

     delay(100);  //delay for 1/10 of a second
    }


    float fmap (float x, float in_min, float in_max, float out_min, float out_max) {
     return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
    }

    float calc_temp_val(int analog_pin){
     uint16_t raw_val;
     float temp, raw_float;

     temp = 0;
     raw_val = analogRead(analog_pin);
    //  raw_val = 1023 - raw_val;
     raw_float = raw_val;
     temp = fmap(raw_val, minraw, maxraw, minreal, maxreal);

    //  Serial.print("raw temp: ");
    //  Serial.print(analog_pin);
    //  Serial.print(" ");
    //  Serial.println(raw_val);

     return temp;
    }

    float calc_voltage_val(){
     int RawValue = analogRead(analogVolt);
     voltage = RawValue;

    //  Serial.print("raw volt: ");
    //  Serial.println(RawValue);
     voltage = voltage / voltsdiv; // Gets you adjusted Volts

     return voltage;
    }

    float calc_amperage_val(){
     int RawValue = analogRead(analogAmp);
     Serial.print("raw amps: ");
     Serial.println(RawValue);

     float mVoltage = RawValue;
     mVoltage = mVoltage / 1024.0;
     mVoltage = mVoltage * 5000; // Gets you mV 5000 is VCC for 5v arduino
     Serial.print("mVolts: ");
     Serial.println(mVoltage);
     amperes = abs(((mVoltage - ACSoffset) / mVperAmp));
     Serial.print("amps: ");
     Serial.println(amperes);

     return amperes;
    }

    float calc_pressure_val(){
     // read the input on analog pin 0:
     int RawValue = analogRead(analogPressure);

     // here is code where we establish what the real zero baseline is
     // we read the sensor ten times in the first second of running,
     // and take the average of those ten readings as the baseline
     if (init_counter < 10)
     {
       baseline = baseline + RawValue;
       baseline = baseline / 2;

       init_counter = init_counter + 1;

       // we then calculate what each discrete value for an analog
       // result would need to be multiplied by to reach max depth at 921
       calc_milli = (maxP - baseline) / milli;
       calc_centi = (maxP - baseline) / centi;
       calc_inches = (maxP - baseline) / inches;
     }

     int fixed_sensor = RawValue - baseline;
     Serial.print("raw depth: ");
     Serial.println(fixed_sensor);

     if (fixed_sensor < 0)
     {
       fixed_sensor = 0;
     }
     //  float depth = fixed_sensor / calc_inches;
     //  float depth = fixed_sensor / calc_centi;
     float depth = fixed_sensor / calc_milli;

     Serial.print("calced depth: ");
     Serial.println(depth);

     return depth;
    }



    Later Edit: Good point, John. I will do it once I have worked out how to do it! We can't just store a zip file but we can include a link to SubPirates.

    Later Edit: Well, I have managed to lock myself out of SubPirates (I tried changing my password!)

    So I can't download the zip file!

    Perhaps (John or Tim or any other person signed on with SubPirates) you could download the zip and keep it safe.

    It is on this page:

    http://www.subpirates.com/showthread.php?5271-Custom-Frsky-Telemetry-Hub/page3

    The link is labelled:

    FrSkyTelemetryLRS.zip

    Later Later Edit: I have a copy of the library zip files now. (Retrieved from my waste paper basket!) Now to get a password working on SubPirates again.


    Last edited by david f on Tue Feb 16, 2016 2:48 pm; edited 7 times in total
    avatar
    John Wrennall
    AMS member

    Posts : 157
    Join date : 2011-11-16
    Age : 71
    Location : Leyland

    Re: Telemetry on openLRS

    Post  John Wrennall on Sat Feb 13, 2016 4:14 pm

    Hi David.

    for completeness,I think you should include Tim's latest Zip file for the FrSkyTelemetryLRS library

    John

      Current date/time is Thu Oct 19, 2017 12:44 am