Netduino home hardware projects downloads community

Jump to content


The Netduino forums have been replaced by new forums at community.wildernesslabs.co. This site has been preserved for archival purposes only and the ability to make new accounts or posts has been turned off.
Photo

Quad.Net Quadrocopter for .NETMF


  • Please log in to reply
119 replies to this topic

#101 Luke Cummings

Luke Cummings

    Advanced Member

  • Members
  • PipPipPip
  • 38 posts
  • LocationCalgary, AB

Posted 26 February 2011 - 12:40 AM

Alright guys, I've some new hardware, footage and failure.

Here's the new flight video:
http://www.youtube.com/watch?v=8Dy-4ppzCIM

This is a drastic improvement over the last iteration, and it still involves no native code!

Check out the full post here.
Cheap, Fast, Good... Pick two

#102 terrorgen

terrorgen

    Member

  • Members
  • PipPip
  • 12 posts

Posted 26 February 2011 - 01:31 AM

how often does GC kick in?

#103 Luke Cummings

Luke Cummings

    Advanced Member

  • Members
  • PipPipPip
  • 38 posts
  • LocationCalgary, AB

Posted 26 February 2011 - 03:00 AM

how often does GC kick in?


about every 5 - 7 seconds
Cheap, Fast, Good... Pick two

#104 jbw

jbw

    Member

  • Members
  • PipPip
  • 10 posts

Posted 26 February 2011 - 04:53 AM

Very nice! Is the improvement primarily because of the new motors? Or maybe the higher moment from the socks makes the system more stable for lower sampling rates

#105 Corey Kosak

Corey Kosak

    Advanced Member

  • Members
  • PipPipPip
  • 276 posts
  • LocationHoboken, NJ

Posted 26 February 2011 - 05:44 PM

Whoa, this is really awesome!

#106 Gilles

Gilles

    New Member

  • Members
  • Pip
  • 1 posts

Posted 05 March 2011 - 11:08 PM

https://code.google.com/p/quadnet/



Hello Brandon

I am interrested by your project, i would like to read your code but i can't access google site and tortoise say "Forbidden
Your client does not have permission to get URL /p/quadnet/ from this server."

it's my fault (bad client or bad actions) or it's because you should give me a read acces before ?

Thanks a lot

#107 Luke Cummings

Luke Cummings

    Advanced Member

  • Members
  • PipPipPip
  • 38 posts
  • LocationCalgary, AB

Posted 07 March 2011 - 05:15 PM

Hello Brandon

I am interrested by your project, i would like to read your code but i can't access google site and tortoise say "Forbidden
Your client does not have permission to get URL /p/quadnet/ from this server."

it's my fault (bad client or bad actions) or it's because you should give me a read acces before ?

Thanks a lot


Gilles,

Currently the project is not posted but we will be going live soon, the new project site is available at http://dotcopter.net/
Cheap, Fast, Good... Pick two

#108 Michel Trahan

Michel Trahan

    Advanced Member

  • Members
  • PipPipPip
  • 155 posts

Posted 31 March 2011 - 05:20 PM

https://code.google.com/p/quadnet/

Where is the code ? How do we get access to it ? I like the plug and play framework philosophy and want to build a netduino quadcopter with kalman filters for stability ... I want to contribute too but you guys are way ahead of me ... I just started !

So how can I get the code ?
Started with C in 1985, moved to Vb3 ... to vb6 and stopped. Now started with .Net and learning C# and VB.net and wishing VB.net was on MF !

#109 Simar

Simar

    New Member

  • Members
  • Pip
  • 2 posts

Posted 02 August 2011 - 12:16 AM

Hi Everyone! This is a really nice project, being a relatively new netduino user, I don't have much knowledge of what's being talked about here but I really like the whole idea of the project. Maybe if given the code, I could help a bit, I will catch up :D

#110 ItsDan

ItsDan

    Advanced Member

  • Members
  • PipPipPip
  • 101 posts

Posted 03 August 2011 - 02:07 PM

code would be great. I've got my quadrocopter physically built and am onto the software part of it. Would love to see a full .net implementation.
Follow the adventures of the Box of Crappy Surplus

Total BOCS Traveled Distance: 9708 miles | States Visited: 5
Track the Box

#111 Chris Walker

Chris Walker

    Secret Labs Staff

  • Moderators
  • 7767 posts
  • LocationNew York, NY

Posted 03 August 2011 - 03:44 PM

code would be great. I've got my quadrocopter physically built and am onto the software part of it. Would love to see a full .net implementation.

You've been busy!

#112 aalmada

aalmada

    Advanced Member

  • Members
  • PipPipPip
  • 44 posts
  • LocationPortugal

Posted 03 August 2011 - 06:48 PM

code would be great. I've got my quadrocopter physically built and am onto the software part of it. Would love to see a full .net implementation.


Are you using a Motion Plus for the gyroscope? I have developed the code for the Classic Controller and for the Nunchuck but I'm having problems communicating with the Motion Plus. I wanted to have a NETMF-based quadcopter similar to the MultiWii solution.
My code is available at https://bitbucket.org/aalmada/hydramf/

aalmada

#113 ItsDan

ItsDan

    Advanced Member

  • Members
  • PipPipPip
  • 101 posts

Posted 03 August 2011 - 10:20 PM

You've been busy!


Have had it built for a few weeks, although the tinkering is never done :P
Follow the adventures of the Box of Crappy Surplus

Total BOCS Traveled Distance: 9708 miles | States Visited: 5
Track the Box

#114 Brandon G

Brandon G

    Advanced Member

  • Members
  • PipPipPip
  • 92 posts
  • LocationVancouver BC, Canada

Posted 04 August 2011 - 03:52 PM

Hi guys, Long time, I have fallen into an abyss of work and have not been able to track back at all here. Last bit of progress was a generic plug and play driver system that is 90% finished. Luke and I touched base the other day and as my work schedule slows we will be back to contributing. Will post back here as soon as I can Brandon

#115 Joshua Lunsford

Joshua Lunsford

    New Member

  • Members
  • Pip
  • 1 posts

Posted 05 December 2011 - 11:39 PM

Hey guys, Another noob here. Just got ahold of a netduino. Think i'm going to jump on this bandwagon :D How is the progress of the quad.net lib coming? I'm about to purchase some equipment for a test rig.

#116 nickatredbox

nickatredbox

    New Member

  • Members
  • Pip
  • 9 posts

Posted 15 June 2012 - 01:15 AM

I too have a tricopter hovering with TinyCLR

Hover Test 1

public void DoStability()
        {


            do
            {
              
                TimeSpan elapsedSpan = new TimeSpan((DateTime.Now.Ticks - LastTicks));
                LastTicks = DateTime.Now.Ticks;
                

                Analog.SyncScanInputs();

                int[] ServerValue = Telemetery.ServerValues;

                //Datums
                TricopterSettings.LeftPivotDatum = ServerValue[1];
                TricopterSettings.RightPivotDatum = ServerValue[2];

                //Some debug stuff
                PitchPID.Pgain = ServerValue[4];
                RollPID.Pgain = ServerValue[5];
                YawPID.Pgain = ServerValue[6];

                X_PID.Pgain = ServerValue[9];
                Y_PID.Pgain = ServerValue[10];
                Z_PID.Pgain = ServerValue[11];

                int StationHold = ServerValue[12];


                //Set demands
                Throttle.ThrottleDemand = ((double)ServerValue[3] / 10.0);

                Throttle.PitchRate_degSec = 0;// (double)Telemetery.ServerValue(0);
                Throttle.RollRate_degSec = 0;
                Throttle.YawRate_degSec = 0;

                //X Y Z Rotate in yaw command rates
                int X_Transalate = 0;
                int Y_Transalate = 0;
                int Z_Transalate = 0;




                //Get the throttle demand in % and pitch,roll,yaw rates in deg/Sec
                int throttle = (int)(Throttle.ThrottleDemand * ((double)TricopterSettings.ThrottleScaler / 1000.0));

                //Get pich,roll,yaw rates requested
                int pitchrate = (int)(Throttle.PitchRate_degSec * ((double)TricopterSettings.PitchRateScaler / 1000.0));
                int rollrate = (int)(Throttle.RollRate_degSec * ((double)TricopterSettings.RollRateScaler / 1000.0));
                int yawrate = (int)(Throttle.YawRate_degSec * ((double)TricopterSettings.YawRateScaler / 1000.0));




                //Control PID enables
                if (Throttle.ThrottleDemand < (double)TricopterSettings.ThrottleMin)
                {
                    WOZ();

                    Pitch_PID.Enable = false;
                    Roll_PID.Enable = false;
                    Yaw_PID.Enable = false;

                    X_PID.Enable = false;
                    Y_PID.Enable = false;
                    Z_PID.Enable = false;
                }
                else
                {
                    Pitch_PID.Enable = true;
                    Roll_PID.Enable = true;
                    Yaw_PID.Enable = true;

                    X_PID.Enable = true;
                    Y_PID.Enable = true;
                    Z_PID.Enable = true;
                }





                //X Y Z Accel sensors
                int X_Input = (Analog.AnIn(Analog.AN_IN.Accel_X) - m_X_AccelWOZ);
                int Y_Input = (Analog.AnIn(Analog.AN_IN.Accel_Y) - m_Y_AccelWOZ);
                int Z_Input = (Analog.AnIn(Analog.AN_IN.Accel_Z) - m_Z_AccelWOZ);


                //Do rolling average
                X_AccelAccumulator[c] = (Int16)X_Input;
                Y_AccelAccumulator[c] = (Int16)Y_Input;
                Z_AccelAccumulator[c] = (Int16)Z_Input;


                X_AccelMean = 0;
                Y_AccelMean = 0;
                Z_AccelMean = 0;

                /* 
                const int NumPoints = 10;

                for (int i = 0; i < NumPoints; i++)
                {
                    X_AccelMean += (int)X_AccelAccumulator[i];
                    Y_AccelMean += (int)Y_AccelAccumulator[i];
                    Z_AccelMean += (int)Z_AccelAccumulator[i];
                }

                X_AccelMean /= NumPoints;
                Y_AccelMean /= NumPoints;
                Z_AccelMean /= NumPoints;
                */

                if ((++c) > 50)
                    c = 0;

                
                //Get the Gyro inputs
                int Pitch_Input = (Analog.AnIn(Analog.AN_IN.Gyro_X) - m_PitchGyroWOZ);
                int Roll_Input = (Analog.AnIn(Analog.AN_IN.Gyro_Y) - m_RollGyroWOZ);
                int Yaw_Input = (Analog.AnIn(Analog.AN_IN.Gyro_Z) - m_YawGyroWOZ);

                //Calculate X Y Z rate PID inputs
                X_PID.Input = (X_Input - X_Transalate);// + X_AccelMean;
                Y_PID.Input = (Y_Input + Y_Transalate);// + Y_AccelMean;
                Z_PID.Input = (Z_Input + Z_Transalate);// + Z_AccelMean; 

                //Debug.Print("inputs X:" + X_Input.ToString() + " Y:" + Y_Input.ToString() + " Z:" + Z_Input.ToString());

                //Sync update the Accel PID's
                X_PID.SyncUpdate();
                Y_PID.SyncUpdate();
                Z_PID.SyncUpdate();

                int x_AccelTrim = X_PID.Output;
                int y_AccelTrim = Y_PID.Output;
                int z_AccelTrim = Z_PID.Output;//Note Z not used currently

                //Debug.Print("Trims X:" + x_trim.ToString() + " Y:" + y_trim.ToString() + " Z:" + z_trim.ToString());

                //Calculate inputs for Rotation PID's
                Pitch_PID.Input = (Pitch_Input - pitchrate);
                Roll_PID.Input = (Roll_Input - rollrate);
                Yaw_PID.Input = (Yaw_Input - yawrate);

                //Sync update the Gyro PID's
                Pitch_PID.SyncUpdate();
                Roll_PID.SyncUpdate();
                Yaw_PID.SyncUpdate();


                //Get the PID Outputs
                int pitch_trim = Pitch_PID.Output;
                int roll_trim = Roll_PID.Output;
                int yaw_trim = Yaw_PID.Output;

                //Debug.Print("P:" + pitch_trim.ToString() + " R:" + roll_trim.ToString() + " Y:" + yaw_trim.ToString());
                //Debug.Print("Trims X:" + x_trim.ToString() + " Y:" + y_trim.ToString() + " Z:" + z_trim.ToString());


#if DEBUG
                if ((c % 50) == 0)
                {
                    Debug.Print("Tick " + elapsedSpan.Milliseconds.ToString());
                    Debug.Print("StationHold " + StationHold.ToString());
                    //Debug.Print("woz\t" + m_X_AccelWOZ.ToString() + "\t" + m_Y_AccelWOZ.ToString() + "\t" + m_Z_AccelWOZ.ToString());
                    Debug.Print("Gyro\t" + pitch_trim.ToString() + "\t" + roll_trim.ToString() + "\t" + yaw_trim.ToString());
                    Debug.Print("Accel\t" + x_AccelTrim.ToString() + "\t" + y_AccelTrim.ToString() + "\t" + z_AccelTrim.ToString());
                    //Debug.Print("Mean\t" + X_AccelMean.ToString() + "\t" + Y_AccelMean.ToString() + "\t" + Z_AccelMean.ToString());
                }
#endif

                int RollBias = ServerValue[7];//Left Right Bias
                int PitchBias = ServerValue[0];//Pitch Bias                
                int YawBias = ServerValue[8];//Yaw Bias


                //Calculate the target speeds for the rotorsx_trim
                //Goes - then +
                int LeftRPM = throttle - roll_trim - RollBias + y_AccelTrim;
                int RightRPM = throttle + roll_trim + RollBias - y_AccelTrim;

                //Pitch acts on the tail rotor only
                int TailRPM = throttle + pitch_trim + PitchBias - x_AccelTrim; 

                //Calculate pivot positions for yaw 
                //remember the servos face away from each other hense - on left and right
                int LeftPivot = TricopterSettings.LeftPivotDatum + yaw_trim + YawBias;// -x_AccelTrim;
                int RightPivot = TricopterSettings.RightPivotDatum + yaw_trim + YawBias;// +x_AccelTrim;

                if (LeftPivot < 650) LeftPivot = 650; else if (LeftPivot > 980) LeftPivot = 980;
                if (RightPivot < 650) RightPivot = 650; else if (RightPivot > 980) RightPivot = 980;
                
                //Set the pivot targets
                Servos.SetServo(Servos.eServo.LeftPivot, LeftPivot);
                Servos.SetServo(Servos.eServo.RightPivot, RightPivot);

                //Set the ESC targets
                Servos.SetServo(Servos.eServo.LeftRPM, LeftRPM);
                Servos.SetServo(Servos.eServo.RightRPM, RightRPM);
                Servos.SetServo(Servos.eServo.TailRPM, TailRPM);
                                                
            }
            while (m_Threaded);
        }


#117 Carlos Bomtempo

Carlos Bomtempo

    New Member

  • Members
  • Pip
  • 2 posts

Posted 25 December 2012 - 06:17 AM

The project is dead? What about the Netduino Plus 2? It's now possible to build a quadcopter?

#118 Arbiter

Arbiter

    Advanced Member

  • Members
  • PipPipPip
  • 132 posts
  • LocationBrisbane, Australia

Posted 23 January 2013 - 01:31 PM

I cannot help but wonder whether required thrust can be expressed as a function of inputs using an FPGA. Possibly one per motor. I would expect inputs to include 

  • required vector
  • accelerometers
  • gyros
  • velocity
  • current vector
  • last-interation thrust values for all engines

and of course it would be necessary to clip the magnitude of the requested vector to what is actually possible with available thrust.

 

Using an FPGA would make it possible to make very frequent microadjustments; the Netduino would fulfil a role more like an autopilot. Such an arrangement would be excellent for building a drone.


One day, all this too shall parse.

#119 Giuliano

Giuliano

    Advanced Member

  • Members
  • PipPipPip
  • 361 posts
  • LocationSimi Valley, CA

Posted 11 March 2014 - 05:09 AM

Brandon/Luke, do you guys have any updates for the community on this really cool project?

 

Have you guys used with the Netduino 2 or Netduino Plus 2 for this project?

 

Thanks



#120 Tobias Vandenbempt

Tobias Vandenbempt

    Advanced Member

  • Members
  • PipPipPip
  • 32 posts
  • LocationGenth, Belgium

Posted 18 April 2014 - 09:20 AM

Yes! Please! Get the guys on this forum playing with Quad.net, especially if you guys have dropped this altogether. 






1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users

home    hardware    projects    downloads    community    where to buy    contact Copyright © 2016 Wilderness Labs Inc.  |  Legal   |   CC BY-SA
This webpage is licensed under a Creative Commons Attribution-ShareAlike License.