GPS Controlled Parachute

Hello All,

During my spare time (I hardly know what that is, but anyway), I build and launch water rockets.

They are all basically the same. A rocket that has a parachute that is deployed via altimeter. Ok that is fun and all, but I want something thrilling!!

So I got an idea: Slap a GPS module on a Arduino and use that to control a parafoil style parachute (the same style as what skydivers use) and then have two servos to steer it.

Basically a rocket that would do its best to circle the launch site, instead of wandering off to who know where.

I lack a background in Arduino. Is this something that a beginner could accomplish? Would it be as easy as pairing a GPS module with an Arduino, hooking up the servos and programming, or is there more that I would need? How would you go about this is this was your project?

Thanks!!!!

I would think that the dynamics of controlling a parafoil from GPS information would be quite complicated. You have not only to figure out how much tension to apply to your steering lines, and how to measure that tension (I know nothing about parafoils, so my jargon may be wrong), but you have to have wind compensation, and the effect of wind will vary depending on the speed and heading of your parafoil. I suggest a degree in aeronautical engineering, Then try this project.

This is an interesting idea and I'm going to say it's not impossible, but it may be pretty complicated to get it perfect or at least acceptable. Let me first inject an alternate idea though.

What if you stick with ejecting the parafoil with your altimeter and control those servos with a radio instead? That way you can control the rate and direction of descent from the launch site. As I type that it sounds like a fun idea but this is the Arduino forum so I won't just leave it at that.

It's true that there are GPS control modules that are specifically designed for use in rocketry that might be suitable for this task, but let's face it, those are pretty expensive, and you would still have to include some modifications to make it work as you have described above.

So let's just look first at interfacing a GPS with an Arduino..
Here is a VERY BASIC demonstration of that which should work with most common internet available GPS modules. Arduino Playground GPS tutorial.

Okay, so you have your Arduino talking to the GPS module. Cool, step one. Now, the tricky part. You want to put the GPS module in a rocket. 99% of the GPS modules us amateur engineers can get our hands on have hard-coded limitations, so that they can't be used to control missiles, for obvious, anti mad scientist reasons. These GPS modules will cut out or lose at least partial function if one of two, or both height and speed limits are met. Some cut out completely when either is met, some cut out only when both are met etc. There seems to be some confusion among manufacturers about how exactly it's supposed to happen. I've even emailed a few and ask them and didn't get a definite answer. Anyway, the point is, that you're likely to run into this issue if your rocket (A) Reaches an altitude greater that 60,000 feet (Some shut off at around 40,000) or (B) Reaches or exceeds a speed of 1,200 miles per hour.

I'm not familiar with the capabilities of water rockets, but I know that these are achievable goals for a modest solid fueled model rocket. If you don't expect your water rocket can meet or exceed either of those then you probably don't have to worry about it.

As far as getting the rocket to circle the landing site during it's descent, that might be something you have to work out in your code. Perhaps something like having the Arduino store a center location at the moment the rocket leaves the launch pad, and work out a routine where it circles that point, or at least makes some effort to regularly navigate itself back in that direction every few seconds. That may be something you can test on the ground with a basic two wheeled robot too. Set it down, press a button to record the current location, then pick the robot up and move it away a few feet and work out some code that has the robot turning and moving in the direction of the starting point.

Once this project gets up in the air, the moving around bit changes somewhat though, and I'm not entirely sure how to work that out, but assuming pulling on a cord on the left side turns the parachure left, and pulling on the right side turns it right, that could be correlated to turning on and off left and right motors on a rover bot. I'm sorry I don't have much code for you at this particular moment, but I hope some of my ideas have helped.

@Steverobey, that was a very helpful post, with one exception:

Here is a VERY BASIC demonstration of that which should work with most common internet available GPS modules. Arduino Playground GPS tutorial.

I'm sorry, but that is about the worst GPS example I have seen. The only thing that could make it worse would be if it used the String class. :smiley:

Problems:

  1. It puts the GPS on pin 0, which will prevent uploading new programs over the USB. Instead, use AltSoftSerial on pins 8 & 9 for a robust and efficient 2nd serial port.

  2. It checks Serial.read() for -1. That's not terrible, but it should use Serial.available() instead.

  3. It uses delay(100) to wait for GPS characters to arrive. At 4800, about 50 characters will come in during this time, nearly filling the input buffer. Just skip everything if no characters are available. This blocking approach will prevent adding libraries that could use this time.

  4. It does not prevent buffer overflow (warning comment provided -_- ).

  5. It does not validate the checksum, which could allow invalid GPS fields to be used.

  6. It does not parse the fields into useful values. It just prints them out.

  7. It does not compile.

8) It sets the pin mode of the serial port, as if that were necessary. Serial.begin takes care of that.

  1. It uses a 300-byte buffer for a GPS sentence, and does not use the F macro around "double-quoted" strings.

  2. It does not parse sentences from newer GPS that have a GL or GN talker ID, instead of GP.

Instead, please consider using NeoGPS, a library I wrote. It is smaller, faster, more robust and completely configurable. For comparison, here is a NeoGPS version of that playground code:

#include <Arduino.h>
#include "NMEAGPS.h"

HardwareSerial &gps_port = Serial;

NMEAGPS   gps;

const int ledPin   = 13;
bool      ledState = false;

//--------------------------

void setup()
{
  pinMode(ledPin, OUTPUT);       // Initialize LED pin

  Serial.begin( 9600 );
  while (!Serial)
    ;

  gps_port.begin( 9600 );
}

//--------------------------

void loop()
{
  while (gps.available( gps_port )) {
    gps_fix fix = gps.read();

    Serial.print( F("\nDate/Time in UTC: ") );
    if (fix.valid.time)
      Serial << fix.dateTime;
    Serial.print( F("\nStatus (>= 3 is OK): ") );
    if (fix.valid.status)
      Serial.print( fix.status );
    Serial.print( F("\nLatitude: ") );
    if (fix.valid.location)
      Serial.print( fix.latitude(), 6 );
    Serial.print( F("\nLongitude: ") );
    if (fix.valid.location)
      Serial.print( fix.longitude(), 6 );
    Serial.print( F("\nVelocity in knots: ") );
    if (fix.valid.speed)
      Serial.print( fix.speed() );
    Serial.print( F("\nHeading in degrees: ") );
    if (fix.valid.heading)
      Serial.print( fix.heading() );
    Serial.println();

    ledState = !ledState; // toggle
    digitalWrite( ledPin, ledState );
  }
}

The original program uses 3178 bytes of program space and 752 bytes of RAM.
The NeoGPS version uses 8016 bytes of program space and 263 bytes of RAM. That's one-third the RAM size. The program space could be reduced even further if it didn't use floating-point values. And it fixes all the problems enumerated above.

Thanks again, Steve, for your well-considered advice. I would also add that you don't get an orientation from GPS. You can get a speed and a heading when it is moving fast enough, but that still doesn't tell you which way the system is oriented. You would need a compass, or you would need to write the sketch so it tries a correction and watches the response. If the correction helps, continue with it. If it doesn't help, try a "different" correction.

Cheers,
/dev

Blenderite:
I lack a background in Arduino. Is this something that a beginner could accomplish? Would it be as easy as pairing a GPS module with an Arduino, hooking up the servos and programming, or is there more that I would need? How would you go about this is this was your project?

This is being worked on, as a means of controlling the decent of high altitude balloons, I gather its far from simple, definetly not begginer stuff.

In any case your chance of circling the launch site are probably not good unless its a perfect flat calm day at altitude. A parafoil is very draggy, and its unlikely to make much headway against the wind. Most likley it would be blown backwards and spiral downwind.

Thanks @Steverobey for your very detailed and helpful post. Thanks!!!

I don't expect this to do much against the wind. A water rocket can't launch in too much wind anyway, as they are fairly lightweight for their size so they can easily be blown around. The fastest I have ever had one go is under 200mph and the highest is about 700ft, though I expect to get over 1000ft at some point, so the limitations of GPS is not a concern here.

I don't know a ton about how GPS works and all, but my original thought was that the launch pad location would be saved as home and then if the current GPS location was more than a certain distance from the home location then it would turn in one direction say 45 degrees and check again. If it still wasn't within the max distance from home, it would repeat the turn and check. Would this be workable or would that not work with GPS?

Thanks!