Project tutorial

RC Thrust Dyno © MIT

Just how powerful is that plane?

  • 1,370 views
  • 0 comments
  • 4 respects

Components and supplies

11113 01
SparkFun Arduino Pro Mini 328 - 5V/16MHz
×1
Linkitone 03
MediaTek Labs LinkIt ONE
×1
ACS-712 Hall Effect Current Sensor
×1
HX-711 Load Cell Amp
×1
Load Cell
×1

Necessary tools and machines

09507 01
Soldering iron (generic)

About this project

I've been playing with RC toys for a very long time now. I recently started with electric airplanes. With nitro powered planes it was easy to tell when they are tuned well. You can hear it.

These little ducted fans really don't lend themselves to tuning by ear...

I decided to make a simple Dyno.

Step 1: The Load Cell Amplifier

The first thing was to get a load cell and matching amplifier board. These are plentiful on ebay.

I used the HX711 24Bit load cell amplifier and ADC. I printed a small case to protect the amplifier board.

Step 2: The Load Cell

I used a short piece of aluminum angle iron to mount the cell. Then I attached some picture hanging wire to the free end.

Step 3: Voltage and Current Sensor

I made a tee fitting to go between the battery pack and the plane. This allows me to measure the battery voltage and current under load. I used an ACS 712 30A hall effect current sensor to measure the current and a simple voltage divider connected to an Analog pin to measure the pack voltage.

Step 4: Testing Different Motors and Props

I like to test different motors and props and will make a simple sled for this.It would be nice to have a tachometer sensor too. I guess that's for V2.

Step 5: Mounting it all up

I started with an Arduino mini. I used a piece of laminate flooring to mount all the parts to. I also added a small ESP wifi transmitter to replace the USB cable. It never worked as well as I had hoped. That's when I tried the Linkit One. It's built in Bluetooth SPP seemed a natural choice. I could have used WiFi too.

I already had the linkit mounted on a plate so affixing it was easy. I used the 4 thumb screws that come with these Turtlebot plates. I had to add a couple of rubber feet to make it stable and keep those thumb screws from hitting the table.

Step 6: Radio or Servo Tester

Sometimes its easier to use a servo tester to run the motors. The final testing should still be done with the actual radio you plan to fly with installed. That way you know you will be hitting full throttle.

Speaking of throttle I want to make a servo tester with a big pistol grip joystick like real Engine Dyno's use for throttle......

Step 7: Schematic and Code

Wiring it up is pretty simple. The code is even easier. It just send 3 values separated by commas. Thrust, Voltage, Current. I had milliseconds in there too but it didn't seem to be needed. I let Maker Plot do all the hard work.

I particularly like using its Klaxon alarm for over-current and under-voltage conditions....

Step 8: Testing and Calibration

If you're using the USB serial sketch just start the Arduino Ide serial monitor. If you are using the Bluetooth sketch you will first have to pair with your Linkit's Bluetooth Serial port. Power up the Linikit and then search for Bluetooth devices. You should see one named RC_Dyno. Just click "pair" there is no password. Now you will have a new choice under ports in the Arduino IDE also called RC_Dyno. As you can see from the screen caps there is no different in the data from either port.

To calibrate the Voltage and Current readings just comment out the "map" commands to see the raw readings. For the current sensor I used a static load, in this case a car tail light. A typical 1156 draws almost 3A when you tie both filaments together. Do that for 6 bulbs and you get a 15A draw and some nice heat... Voltage is done the same way.

To calibrate the thrust I used a luggage scale to weigh a car alternator bracket. I then hung that bracket from the pull wire on the load cell. I took the raw reading divided it by the weight in grams of the bracket. I used that as a divisor in the scale factor. I then removed the bracket and too the new reading as the tare weight. I subtracted that from the reading to get the final result. A better way is to read the tare weight at each boot up or have a Zero/Tare button that sets it on demand. But I'm not that picky.

Step 9: First Dyno Runs

Sitting out in the garage waiting for some attention are these two ducted fans. One has a single fan the other has two.

There are two Videos here. One is a park flyer prop plane. The other is the dual ducted fan with one motor screeching from bad bearings.

Guess which is which.....

Step 10: Future Enhancements

I have these encased Dallas 18B20 temperature sensors. I like to add a few for battery, motor, and ESC temperature readings.

A motor tachometer or two would be nice.

Maybe a DHT11 for ambient temperature and humidity readings....

To go really overkill maybe add the Pulse Width reading on the signal to the ESC.

Schematics

Schematic
Fo7jcg1ii7f1w5x

Code

bluetooth_rc_dyno.inoArduino
//****************************************************************
//*  Name    : RC Dyno                                           *
//*  Author  : Robert Joseph Korn                                *
//*  Notice  : Copyright (c) 2015 Open Valley Consulting Corp    *
//*  Date    : 12/15/15                                          *
//*  Version : 1.75                                              *
//*  Notes   :                                                   *
//*          :                                                   *
//****************************************************************
#include <LBT.h>
#include <LBTServer.h>

float voltage ;
float current ;
long  thrust ;

#define PD_SCK 2
#define DOUT 3

void setup() {
  
  pinMode(PD_SCK, OUTPUT);
  pinMode(DOUT, INPUT);
  digitalWrite(PD_SCK, LOW);
  LBTServer.begin((uint8_t*)"RC_Dyno") ;
 
}

void loop() {
   
  if(LBTServer.connected())  {
    
  voltage = analogRead(A0);
  current = analogRead(A1);

  voltage  = map(voltage, 0,343,0,500);
  
  current = constrain(current, 512, 1023); 
  current  = map(current, 512,570,0,280);

  thrust = readhx()/400-21091;

      LBTServer.print(thrust);
      LBTServer.print(",");
      LBTServer.print(voltage/100);
      LBTServer.print(",");
      LBTServer.print(current/100);
      LBTServer.println(",");
      delay(100);
  }
  else
  {
    LBTServer.accept(5);
  }
}


bool is_ready() {
  return digitalRead(DOUT) == LOW;
}

long readhx() {
  // wait for the chip to become ready
  while (!is_ready());
  delay(2);
  unsigned long Count; 
  unsigned char i;  
  Count = 0;
  // pulse the clock pin 24 times to read the data
  for (i=0; i<24; i++) {
    digitalWrite(PD_SCK, HIGH);
      
    if(digitalRead(DOUT) > 0){
      Count++;
    }
    digitalWrite(PD_SCK, LOW);
    Count=Count<<1; 
    delay(1);

  }
  
  digitalWrite(PD_SCK, HIGH);
  delay(1);
  digitalWrite(PD_SCK, LOW);
  Count=Count^0x800000; 
  return Count;          
}
usb_rc_dyno.inoArduino
//****************************************************************
//*  Name    : RC Dyno                                           *
//*  Author  : Robert Joseph Korn                                *
//*  Notice  : Copyright (c) 2015 Open Valley Consulting Corp    *
//*  Date    : 12/15/15                                          *
//*  Version : 1.75                                              *
//*  Notes   :                                                   *
//*          :                                                   *
//****************************************************************

float voltage ;
float current ;
long  thrust ;

#define PD_SCK 2
#define DOUT 3

void setup() {
  
  pinMode(PD_SCK, OUTPUT);
  pinMode(DOUT, INPUT);
  digitalWrite(PD_SCK, LOW);
 
  Serial.begin(115200);
  
  while(!Serial){
     delay(100);
  }
}

void loop() {

  voltage = analogRead(A0);
  current = analogRead(A1);

  voltage  = map(voltage, 0,343,0,500);
  
  current = constrain(current, 512, 1023); 
  current  = map(current, 512,570,0,280);

  thrust = readhx()/400-21091;
  
//  Serial.print(millis());
//  Serial.print(",");
  Serial.print(thrust);
  Serial.print(",");
  Serial.print(voltage/100);
  Serial.print(",");
  Serial.print(current/100);
  Serial.println(",");

  delay(100);
}


bool is_ready() {
  return digitalRead(DOUT) == LOW;
}

long readhx() {
  // wait for the chip to become ready
  while (!is_ready());
  delay(2);
  unsigned long Count; 
  unsigned char i;  
  Count = 0;
  // pulse the clock pin 24 times to read the data
  for (i=0; i<24; i++) {
    digitalWrite(PD_SCK, HIGH);
      
    if(digitalRead(DOUT) > 0){
      Count++;
    }
    digitalWrite(PD_SCK, LOW);
    Count=Count<<1; 
    delay(1);

  }
  
  digitalWrite(PD_SCK, HIGH);
  delay(1);
  digitalWrite(PD_SCK, LOW);
  Count=Count^0x800000; 
  return Count;          
}

Comments

Similar projects you might like

Sigfox Forest Fire Detector

Project tutorial by Louis Moreau

  • 1,549 views
  • 1 comment
  • 10 respects

TV Tee Shirt

Project showcase by Maddy

  • 3,233 views
  • 1 comment
  • 9 respects

Arduino Live WiFi Web Scoreboard

Project tutorial by Oli Norwell

  • 1,892 views
  • 0 comments
  • 3 respects

IR Home Automation on Arduino

Project tutorial by Techduino

  • 916 views
  • 0 comments
  • 9 respects
Add projectSign up / Login