Welcome to Cockpitbuilders.com. Please login or sign up.

March 28, 2024, 09:24:46 AM

Login with username, password and session length

PROUDLY ENDORSING


Fly Elise-ng
109 Guests, 0 Users
Members
Stats
  • Total Posts: 59,639
  • Total Topics: 7,853
  • Online today: 142
  • Online ever: 582
  • (January 22, 2020, 08:44:01 AM)
Users Online
Users: 0
Guests: 109
Total: 109

COUNTDOWN TO WF2022


WORLDFLIGHT TEAM USA

Will Depart in...

Recent

Welcome

Recent posts

#91
General Discussion Board. / Re: flap indicator interface w...
Last post by ame - August 24, 2023, 01:26:08 PM
Quote from: Jason L on August 24, 2023, 01:15:52 PMAny thoughts of using mobiflight as your interface instead of link2fs?  Actively supported with multiple flavors of arduinos and works really well.
Does it support FS9?

Since it's all working now there's probably not much sense in reimplementing it.
#92
General Discussion Board. / Re: flap indicator interface w...
Last post by Jason L - August 24, 2023, 01:15:52 PM
Any thoughts of using mobiflight as your interface instead of link2fs?  Actively supported with multiple flavors of arduinos and works really well.
#93
General Discussion Board. / Re: flap indicator interface w...
Last post by Mach7 - August 24, 2023, 03:03:57 AM
Thanks again ame

And many thanks to both of you guys!!

Once I have it all connected up I will post a video!

Jim
#94
General Discussion Board. / Re: flap indicator interface w...
Last post by ame - August 24, 2023, 02:54:39 AM
Quote from: Mach7 on August 24, 2023, 02:39:41 AMHello guys, the program works perfectly!!

Thank you!!!!!!!!!!..

@Arturo...I thought I knew what you were talking about with respect to the fuel quantity indication and battery bus power...now seeing it it makes perfect sense to me what you were trying to tell me. Still not an issue for me in this application, but now I understand what you were saying..thanks.

I will put up some screen shots up today.

Also...and not a really big deal...but is there anyway to have the fuel needle(s) move a bit slower to there requested positions?

I notice that it may be beneficial, (to the instrument life itself) to have the needle move slowly to the requested fuel levels...that is to say in transient states the needle will move very fast, epecially when it returns to zero from a high fuel state..the needle "bounces" off its stops.

This may not be too big of an issue...just thinking that anything that moves a bit slower may increase the life of the instrument itself.

Excellent. Glad it's working. Sorry about the rookie mistake.

Regarding damping the needles, a very common technique is to filter the target position with a simple running average:
new_position = (current_ position+target_position)/2
I'll code something up later (now it's bedtime in New Zealand), but that's what I'd do.
#95
General Discussion Board. / Re: flap indicator interface w...
Last post by ame - August 24, 2023, 02:50:08 AM
Quote from: _alioth_ on August 24, 2023, 02:18:50 AMnew mistakes are always funnier, Ame!  :)


I would like to code some cleaner and efficient way to read the link2fs data.

But I would need to know if:
- ticking the box "include CR/LF" there is always a return at the end of each command.
- ticking the box "include comma's between" sends always a "," at the end of each command.

First one, then the other. Not both at the same time, if posible.

Can you help me with this Mach7?  you can see it in link2fs "to card" window or put some screenshots.

Thanks

I see where you're coming from, but nobody uses link2fs anymore, and the website is dead. Link2fs is based on FSConnect, from here:
https://www.dirks-software.ca/

One day FSConnect.dll will die too. However, I thought about using Python to access FSConnect.dll directly, then put a Python wrapper around it. Then it would be no longer necessary to use link2fs.

Furthermore, all the processing could be done in Python, thus leaving the Arduino to output a PWM value to a pin only.
#96
General Discussion Board. / Re: flap indicator interface w...
Last post by Mach7 - August 24, 2023, 02:39:41 AM
Hello guys, the program works perfectly!!

Thank you!!!!!!!!!!..

@Arturo...I thought I knew what you were talking about with respect to the fuel quantity indication and battery bus power...now seeing it it makes perfect sense to me what you were trying to tell me. Still not an issue for me in this application, but now I understand what you were saying..thanks.

I will put up some screen shots up today.

Also...and not a really big deal...but is there anyway to have the fuel needle(s) move a bit slower to there requested positions?

I notice that it may be beneficial, (to the instrument life itself) to have the needle move slowly to the requested fuel levels...that is to say in transient states the needle will move very fast, epecially when it returns to zero from a high fuel state..the needle "bounces" off its stops.

This may not be too big of an issue...just thinking that anything that moves a bit slower may increase the life of the instrument itself.
#97
General Discussion Board. / Re: flap indicator interface w...
Last post by _alioth_ - August 24, 2023, 02:18:50 AM

new mistakes are always funnier, Ame!  :)


I would like to code some cleaner and efficient way to read the link2fs data.

But I would need to know if:
- ticking the box "include CR/LF" there is always a return at the end of each command.
- ticking the box "include comma's between" sends always a "," at the end of each command.

First one, then the other. Not both at the same time, if posible.

Can you help me with this Mach7?  you can see it in link2fs "to card" window or put some screenshots.

Thanks
#98
General Discussion Board. / Re: flap indicator interface w...
Last post by ame - August 24, 2023, 12:43:47 AM
And here's why:
https://stackoverflow.com/questions/92396/why-cant-variables-be-declared-in-a-switch-statement

I've been doing this a while and I've never written anything that happened to cause that problem. I'll try not to do it again (I prefer making new mistakes).
#99
General Discussion Board. / Re: flap indicator interface w...
Last post by ame - August 23, 2023, 11:42:09 PM
Well, how about that?

I concur. I put a bunch of print statements in, to see what was happening: nothing.

Then I moved the variable definitions out: success!

This is why we test code before we post it to the internet.  :-[

Thanks Arturo.
#100
General Discussion Board. / Re: flap indicator interface w...
Last post by _alioth_ - August 23, 2023, 11:28:59 PM
I have tested in tinkercad simulator (no arduino here now) and it says some error related to definitions inside the case.

I have tested this code and seems to work as it should (but tinkercad is not the same as arduino so... ). I have added some Serial.prints inside the case just to test:

Quote/*
    This code is in the public domain
    For use with "Link2fs_Multi"
    Jimspage.co.nz (via archive.org)

*/

int CodeIn;// used on all serial reads

String flaps;
String fuel;    // Re-use this variable for all fuel gauges as we only do one at a time

// PWM pins for gauges. Must be one of 3, 5, 6, 9, 10, or 11 for Arduino Uno
// Flaps
int flaps_PWM_out_pin = 3;
// Fuel
int fuel_L_PWM_out_pin = 5; // Left fuel gauge
int fuel_C_PWM_out_pin = 6; // Centre fuel gauge
int fuel_R_PWM_out_pin = 9; // Right fuel gauge

// Variables for fuel gauges
// Can be reused for each gauge as we do one at a time.
int fuel_PWM_out;
float fuel_percent;
float fuel_lbs;

float flaps_degrees = 0;
int PWM_out = 0;

// Variables to support incremental update of gauges
unsigned long currentMillis; // store the current time

unsigned long previousMillis;
unsigned long period = 100; // 100millis = 0.1s, 10 updates per second

// Variables for flaps gauge
const int flaps_max_PWM_per_slot = 1; // Maximum amount we can move in 0.1s

int flaps_PWM_target; // Target PWM value, based on last flaps degrees
int flaps_PWM_current; // Current PWM value, can only move slowly

bool first_flaps_PWM_value; // Flag to see if we should go directly to target



void setup()
{
  Serial.begin(115200);

  // Set up PWM pins.
  pinMode(flaps_PWM_out_pin, OUTPUT);
  pinMode(fuel_L_PWM_out_pin, OUTPUT);
  pinMode(fuel_C_PWM_out_pin, OUTPUT);
  pinMode(fuel_R_PWM_out_pin, OUTPUT);

  // Set PWM values to zero.
  analogWrite(flaps_PWM_out_pin, 0);
  analogWrite(fuel_L_PWM_out_pin, 0);
  analogWrite(fuel_C_PWM_out_pin, 0);
  analogWrite(fuel_R_PWM_out_pin, 0);

  flaps_PWM_target = 0;
  flaps_PWM_current = 0;
  first_flaps_PWM_value = true;
}


void loop() {
  // Deal with incoming data from link2fs
  if (Serial.available()) {
    CodeIn = getChar();
    if (CodeIn == '=') {
      EQUALS(); // The first identifier is "="
    }
    if (CodeIn == '<') {
      LESSTHAN(); // The first identifier is "<"
    }
    if (CodeIn == '?') {
      QUESTION(); // The first identifier is "?"
    }
    if (CodeIn == '/') {
      SLASH(); // The first identifier is "/" (Annunciators)
    }
  }

  // Other tasks
  // Currently we have to smooth the flaps output.
  // Fuel gauges don't need smoothing.
  currentMillis = millis(); // store the current time
  if (currentMillis - previousMillis >= period) { // check if 100ms passed
    // We're on a 100ms boundary
    previousMillis = currentMillis;  // update the time we were here
    if (flaps_PWM_target > flaps_PWM_current) {
      flaps_PWM_current += flaps_max_PWM_per_slot;
      if (flaps_PWM_current > flaps_PWM_target) flaps_PWM_current = flaps_PWM_target;
    }
    else if (flaps_PWM_target < flaps_PWM_current) {
      flaps_PWM_current -= flaps_max_PWM_per_slot;
      if (flaps_PWM_current < flaps_PWM_target) flaps_PWM_current = flaps_PWM_target;
    }
    else {
      // target and current are equal. Nothing to do.
    }
    analogWrite(flaps_PWM_out_pin, flaps_PWM_current);
  }

}


char getChar()// Get a character from the serial buffer
{
  while (Serial.available() == 0); // wait for data
  return ((char)Serial.read()); // Thanks Doug
}


void EQUALS() {    // The first identifier was "="
  CodeIn = getChar(); // Get another character
  switch (CodeIn) { // Now lets find what to do with it
    case 'A'://Found the second identifier
      //Do something
      break;

    case 'B':
      //Do something
      break;

    case 'C':
      //Do something
      break;
  }
}


void LESSTHAN() {  // The first identifier was "<"
  CodeIn = getChar(); // Get another character
  switch (CodeIn) { // Now lets find what to do with it
    case 'A'://Found the second identifier
      //Do something
      break;

    case 'B':
      //Do something
      break;

    case 'G': //Found the second identifier ("G" Flaps position)
      // Next three characters should be numeric
      flaps = "";
      flaps += getChar();
      flaps += getChar();
      flaps += getChar();
      // convert 3-character numeric string to a float
      // Expected range is 000 to 033
      flaps_degrees = flaps.toFloat();
      // Convert degrees to PWM 0-255.
      // 33 degrees is full scale, so multiplier is 255/33=7.727
      PWM_out = flaps_degrees * 7.727;
      // Clip output to maximum if (for some reason) it's >255
      if (PWM_out > 255) PWM_out = 255;
      // New flaps PWM is calculated. Copy to other variables to
      // be handled by main loop on next 100ms boundary
      flaps_PWM_target = PWM_out;
      // If this is the first value we have received, go directly there.
      if (first_flaps_PWM_value) {
        flaps_PWM_current = flaps_PWM_target;
        first_flaps_PWM_value = false;
      }
      Serial.print("G");
      Serial.println (PWM_out);
      break;

    case 'X': // "X" left fuel gauge
      // Next three characters should be numeric
      fuel = "";
      fuel += getChar();
      fuel += getChar();
      fuel += getChar();
      // convert 3-character numeric string to a float
      // It's a percentage of full, where full is 9200 lbs (left)
      // Expected range is 000 to 100
      fuel_percent = fuel.toFloat();
      fuel_lbs = fuel_percent * 9200;
      // Convert lbs to PWM 0-255.
      // 0 lbs on gauge is PWM 75
      // 10,000 lbs on gauge is 255
      // So PWM is (1.8 x (lbs/100)) + 75
      fuel_PWM_out = ((fuel_lbs * 1.8) / 10000) + 75.0;
      // Clip output to maximum if (for some reason) it's >255
      if (fuel_PWM_out > 255) fuel_PWM_out = 255;
      // Drive the gauge
      analogWrite(fuel_L_PWM_out_pin, fuel_PWM_out);
      Serial.print("X");
      Serial.println (fuel_lbs);
      break;

    case 'Y': // "Y" centre fuel gauge
      // Next three characters should be numeric
      fuel = "";
      fuel += getChar();
      fuel += getChar();
      fuel += getChar();
      // convert 3-character numeric string to a float
      // It's a percentage of full, where full is 4400 lbs (centre)
      // Expected range is 000 to 100
      fuel_percent = fuel.toFloat();
      fuel_lbs = fuel_percent * 4400;
      // Convert lbs to PWM 0-255.
      // 0 lbs on gauge is PWM 75
      // 10,000 lbs on gauge is 255
      // So PWM is (1.8 x (lbs/100)) + 75
      fuel_PWM_out = ((fuel_lbs * 1.8) / 10000) + 75.0;
      // Clip output to maximum if (for some reason) it's >255
      if (fuel_PWM_out > 255) fuel_PWM_out = 255;
      // Drive the gauge
      analogWrite(fuel_C_PWM_out_pin, fuel_PWM_out);
      Serial.print("Y");
      Serial.println (fuel_PWM_out);
      break;

    case 'Z': // "Z" right fuel gauge
      // Next three characters should be numeric
      fuel = "";
      fuel += getChar();
      fuel += getChar();
      fuel += getChar();
      // convert 3-character numeric string to a float
      // It's a percentage of full, where full is 9200 lbs (left)
      // Expected range is 000 to 100
      fuel_percent = fuel.toFloat();
      fuel_lbs = fuel_percent * 9200;
      // Convert lbs to PWM 0-255.
      // 0 lbs on gauge is PWM 75
      // 10,000 lbs on gauge is 255
      // So PWM is (1.8 x (lbs/100)) + 75
      fuel_PWM_out = ((fuel_lbs * 1.8) / 10000) + 75.0;
      // Clip output to maximum if (for some reason) it's >255
      if (fuel_PWM_out > 255) fuel_PWM_out = 255;
      // Drive the gauge
      analogWrite(fuel_R_PWM_out_pin, fuel_PWM_out);
      Serial.print("Z");
      Serial.println (fuel_PWM_out);
      break;

  }

}

void QUESTION() {  // The first identifier was "?"
  CodeIn = getChar(); // Get another character
  switch (CodeIn) { // Now lets find what to do with it
    case 'A'://Found the second identifier
      //Do something
      break;

    case 'B':
      //Do something
      break;

    case 'C':
      //Do something
      break;
  }
}
void SLASH() {  // The first identifier was "/" (Annunciator)
  //Do something
}
Like the Website ?
Support Cockpitbuilders.com and Click Below to Donate