Monocopter experimenteel ontwerp

Enkelblads helikopter, esdoornzaad, monocopter, roterende vleugel.
Gebruikersavatar
luppie
Beheerder
Berichten: 1730
Lid geworden op: do aug 12, 2010 9:29 pm
Locatie: Double-u monkeyfield
Contacteer:

Re: Monocopter experimenteel ontwerp

Bericht door luppie » zo nov 24, 2013 12:27 pm

Ik hoop dat ik ongelijk krijg maar die dingen zijn retegevoelig
Klopt ook want tijdens het testen met de magnetometer en de servo zag ik dat ik hem perfect horizontaal moet houden om een beetje mooie resultaten te zien op de servo.

Ik kan nog kantelcompensatie toepassen (Tilt Compensating a Compass with an Accelerometer) de accelerometer zit al op mijn 10 DOF printje waar ook de magnetometer op zit. Ook heb ik een losse magnetometer (HMC5883L Triple Axis Magnetometer) en accelerometer (ADXL345 Triple Axis Accelerometer). Het probleem zit hem vooral in een stukje software waarin dit geschreven moet worden.

Ik kan wel een voorgekauwd stukje software gebruiken maar dit kan ik niet eenvoudig in mijn al geschreven stukje software plaatsen zonder een hele lijst aan error's te krijgen.
Heb je vragen over foto's op het forum of andere privacy gevoelige dingen, stuur dan een pb of email naar mij.

Gebruikersavatar
ton
Lid
Berichten: 745
Lid geworden op: ma sep 23, 2013 6:31 pm
Locatie: zwolle
Contacteer:

Re: Monocopter experimenteel ontwerp

Bericht door ton » zo nov 24, 2013 2:47 pm

New age alchemist,lol
Ik zie dat je research er niet om liegt!
Ik vind dit draadje dan ook zeer interresant.
Heb nog wel even tijd nodig om me goed in te lezen ( waarvoor dank)
Ook leuk hoe die camera sync's gebruikt worden.
Maar dat is weer een stapje verder denk (hoop) ik?
Ik blijf dit aandachtig volgen,keep up the good work :D

Gebruikersavatar
luppie
Beheerder
Berichten: 1730
Lid geworden op: do aug 12, 2010 9:29 pm
Locatie: Double-u monkeyfield
Contacteer:

Re: Monocopter experimenteel ontwerp

Bericht door luppie » zo dec 08, 2013 10:56 pm

Ik zal proberen uit te leggen wat ik de laatste tijd heb gedaan. Ik ben begonnen met het schrijven van een programma en als eerste heb ik iets gemaakt waardoor ik alle ingangen die ik ga gebruiken kan uitlezen op de pc.

Het programma is in de basis behoorlijk simpel want eerst vertel je waar de in en uitgangen zitten waarna een loop volgt. De loop word eindeloos herhaald dus wanneer de processor de loop heeft gedaan begint hij weer opnieuw.

bijvoorbeeld een eindeloos knipperlichtje:

Code: Selecteer alles

(setup)

uitgang 9 = ledje

(loop)

ledje aan

wacht 1 seconde

ledje uit

wacht 1 seconde

Voor de besturing ga ik de zelfde functies als een heli gebruiken:

Roll (vergelijkbaar met rolroer van een vliegtuig)
nick (vergelijkbaar met hoogteroer van een vliegtuig)
yaw (vergelijkbaar met richtingsroer van een vliegtuig)
pitch (het omhoog en omlaag gaan)

hier de gehele code die ik tot nu toe heb:

Code: Selecteer alles

#include <Wire.h>
// Reference the HMC5883L Compass Library
#include <HMC5883L.h>
#include <Servo.h>
// Store our compass as a variable.
HMC5883L compass;
// Record any errors that may occur in the compass.
int error = 0;
// Out setup routine, here we will configure the microcontroller and compass.

//Define 2 variables. deze gebruik ik alleen om de tijd van de loop te meten.
unsigned long time0 = 0;
unsigned long time1 = 0;
unsigned long time_ms = 0;
// Here's where we'll keep our input values
unsigned int pitch;
unsigned int nick;
unsigned int roll;
unsigned int yaw;

Servo    myservo;  //noem servo myservo

void setup() {
  
  pinMode(9, OUTPUT); // servo uitgangkanaal 
  pinMode(2, INPUT); // ingang voor ontvanger kanaal 4 pitch
  pinMode(3, INPUT); // ingang voor ontvanger kanaal 2 nick
  pinMode(4, INPUT); // ingang voor ontvanger kanaal 1 roll
  pinMode(5, INPUT); // ingang voor ontvanger kanaal 3 yaw
  
  
 // Initialize the serial port.
 Serial.begin(9600);
 Serial.println("Starting the I2C interface.");
 Wire.begin(); // Start the I2C interface.
 Serial.println("Constructing new HMC5883L");
 compass = HMC5883L(); // Construct a new HMC5883 compass.
 Serial.println("Setting scale to +/- 1.3 Ga");
 error = compass.SetScale(1.3); // Set the scale of the compass.
 if(error != 0) // If there is an error, print it out.
   Serial.println(compass.GetErrorText(error));
   Serial.println("Setting measurement mode to continous.");
 error = compass.SetMeasurementMode(Measurement_Continuous); // Set the measurement  mode to Continuous
 if(error != 0) // If there is an error, print it out.
   Serial.println(compass.GetErrorText(error));
}
// Our main program loop.
void loop()
{
  time0=millis(); // sla aan het begin van de loop de milliseconden sinds de start van de arduino op

  pitch = pulseIn(2, HIGH, 25000); // Read the pulse width of 
  nick = pulseIn(3, HIGH, 25000); // each channel
  roll = pulseIn(4, HIGH, 25000);
  yaw = pulseIn(5, HIGH, 25000);

 // Retrive the raw values from the compass (not scaled).
 MagnetometerRaw raw = compass.ReadRawAxis();
 // Retrived the scaled values from the compass (scaled to the configured scale).
 MagnetometerScaled scaled = compass.ReadScaledAxis();
 // Values are accessed like so:
 int MilliGauss_OnThe_XAxis = scaled.XAxis;// (or YAxis, or ZAxis)
 // Calculate heading when the magnetometer is level, then correct for signs of axis.
 float heading = atan2(scaled.YAxis, scaled.XAxis);
 // Once you have your heading, you must then add your 'Declination Angle', which is  the 'Error' of the magnetic field in your location.
 // Find yours here: http://www.magnetic-declination.com/
 // Mine is: 2� 37' W, which is 2.617 Degrees, or (which we need) 0.0456752665  radians, I will use 0.0457
 // If you cannot find your Declination, comment out these two lines, your compass  will be slightly off.
 float declinationAngle = 0.0457;
 heading += declinationAngle;
 // Correct for when signs are reversed.
 if(heading < 0)
   heading += 2*PI;
   // Check for wrap due to addition of declination.
 if(heading > 2*PI)
   heading -= 2*PI;
  // Convert radians to degrees for readability.
 int headingDegrees = heading * 180/M_PI;  //orgineel float headingDegrees = heading * 180/M_PI; 
 // Output the data via the serial port.
 Output(headingDegrees); 
 //(orgineel)Output(raw, scaled, heading, headingDegrees);
 // Normally we would delay the application by 66ms to allow the loop
 // to run at 15Hz (default bandwidth for the HMC5883L).
 // However since we have a long serial out (104ms at 9600) we will let
 // it run at its natural speed.
 // delay(66);
}
// Output the data down the serial port.
void Output(int  headingDegrees)
//(orgineel)void Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float  headingDegrees)
{
  //Serial.print("Raw:\t");
  //Serial.print(raw.XAxis);
  //Serial.print("   ");   
  //Serial.print(raw.YAxis);
  //Serial.print("   ");   
  //Serial.print(raw.ZAxis);
  //Serial.print("   \tScaled:\t");
  //
  //Serial.print(scaled.XAxis);
  //Serial.print("   ");   
  //Serial.print(scaled.YAxis);
  //Serial.print("   ");   
  //Serial.print(scaled.ZAxis);
  //
  //Serial.print("   \tHeading:\t");
  //Serial.print(heading);
  
Serial.print("pitchpuls:\t");
Serial.print (pitch);
Serial.print("\tmillisec.\t");

Serial.print("nickpuls:\t");
Serial.print (nick);
Serial.print("\tmillisec.\t");

Serial.print("rollpuls:\t");
Serial.print (roll);
Serial.print("\tmillisec.\t");

Serial.print("yawpuls:\t");
Serial.print (yaw);
Serial.println("\tmillisec.\t");

Serial.print("vliegrichting\t");
Serial.print(headingDegrees);
Serial.println(" graden\t");
  
Serial.print("looptijd:\t");
Serial.print(millis()-time0); // trek begin van einde af en verstuur dit via seriële poort naar ..........
Serial.println("\tmillisec.\t");

}
Ik ga niet alles uitleggen maar wat achter de // staat is vaak een stukje uitleg van de betreffende code. Met deze code heb ik in feite niks anders gedaan dan het lezen van de ontvanger op 4 kanalen en het lezen van de digitaal kompas. Alle waarden worden in begrijpelijke getallen weergegeven op mijn pc scherm.

Hier een voorbeeld van de getallen die hij dan spuugt:

Code: Selecteer alles

Starting the I2C interface.
Constructing new HMC5883L
Setting scale to +/- 1.3 Ga
Entered scale was not valid, valid gauss values are: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1
Setting measurement mode to continous.

pitchpuls:	1484	millisec.	nickpuls:	1476	millisec.	rollpuls:	1477	millisec.	yawpuls:	1555	millisec.	
vliegrichting	232 graden	
looptijd:	144	millisec.
	
pitchpuls:	1478	millisec.	nickpuls:	1471	millisec.	rollpuls:	1477	millisec.	yawpuls:	1555	millisec.	
vliegrichting	231 graden	
looptijd:	144	millisec.
	
pitchpuls:	1473	millisec.	nickpuls:	1476	millisec.	rollpuls:	1484	millisec.	yawpuls:	1544	millisec.	
vliegrichting	232 graden	
looptijd:	145	millisec.

Om dit te begrijpen moet je weten dat de ontvanger pulsen geeft aan bijvoorbeeld de servo of regelaar. Die puls heeft een lengte van 1000 milliseconden (gas dicht) tot 2000 milliseconden (vol gas). Mijn pulsjes zijn allemaal ronde de 1500 omdat alle sticks in het midden stonden.

De vliegrichting spreekt voor zich want dit is waar de voorkant van het kompas naar toe wees.

de looptijd heb ik er bij gezet omdat die tijd niet te lang mag zijn. Als hij te lang is word het programma te traag om te werken op de monocopter. 145 milliseconden is al veel te lang en het echte rekenwerk moet nog beginnen :shock: :shock:

De schuldige van deze lange looptijd is het lezen van de ontvanger dus dat moet ik op een andere manier gaan doen (pulseIn vervangen voor PinChangeInt) .
Ook kan ik alles waar "serial print" bij staat uit zetten want dat heb je alleen nodig wanneer je pc er aan hangt.

snappen jullie het nog?
Heb je vragen over foto's op het forum of andere privacy gevoelige dingen, stuur dan een pb of email naar mij.

Gebruikersavatar
ton
Lid
Berichten: 745
Lid geworden op: ma sep 23, 2013 6:31 pm
Locatie: zwolle
Contacteer:

Re: Monocopter experimenteel ontwerp

Bericht door ton » ma dec 09, 2013 8:18 am

Pfft,idd snap het wel maar :roll: :oops: een beetje.
Maar ga aub door met je vorderingen posten tis nl.reuze interresant. :lol:

Gebruikersavatar
ton
Lid
Berichten: 745
Lid geworden op: ma sep 23, 2013 6:31 pm
Locatie: zwolle
Contacteer:

Re: Monocopter experimenteel ontwerp

Bericht door ton » ma dec 09, 2013 8:23 am

Kortere loops parallel laten lopen zou een oplossing kunnen zijn ivm tijd :?:

Gebruikersavatar
Erikf
Lid
Berichten: 779
Lid geworden op: za sep 24, 2011 4:41 pm
Contacteer:

Re: Monocopter experimenteel ontwerp

Bericht door Erikf » ma dec 09, 2013 9:11 am

Mooi werk :) en ook leuk om me weer een beetje in het programmeren te verdiepen.

Die looptijd is dat met het printen van de info op het scherm erbij? Want dat kost ook tijd maar die tijd ben je niet kwijt als je het programma klaar hebt. Kun je achterhalen hoeveel mS dit kost?

ps ik neem aan dat je in de uitleg met de tijden van de servo's 1000 microseconden of 1 milliseconde bedoelt. Want 1000 milliseconden is al weer 1 seconde, dat is wat erg lang ;)
Groeten,
Erik

Gebruikersavatar
eric_laermans
Berichten: 93
Lid geworden op: za sep 14, 2013 9:14 am
Contacteer:

Re: Monocopter experimenteel ontwerp

Bericht door eric_laermans » ma dec 09, 2013 1:08 pm

Indrukwekkend! Erg leuk dat je hiermee experimenteert. Ga je nog verder mogelijkheden 'm bestuurbaar te maken?

Gebruikersavatar
luppie
Beheerder
Berichten: 1730
Lid geworden op: do aug 12, 2010 9:29 pm
Locatie: Double-u monkeyfield
Contacteer:

Re: Monocopter experimenteel ontwerp

Bericht door luppie » ma dec 09, 2013 5:35 pm

Kortere loops parallel laten lopen zou een oplossing kunnen zijn ivm tijd :?:
Ja dat kan maar dat betekend dat je voor elke loop een eigen processor moet gebruiken. De processor werkt met een klokfrequentie en hij werkt gewoon zijn lijstje af op die snelheid.
Ik heb er wel aan zitten denken om bepaalde handelingen te splitsen maar uiteindelijk moet dit weer bij elkaar komen. Aangezien dit klusje al moeilijk genoeg is hou ik het even bij één.
Die looptijd is dat met het printen van de info op het scherm erbij? Want dat kost ook tijd maar die tijd ben je niet kwijt als je het programma klaar hebt. Kun je achterhalen hoeveel mS dit kost?
Klopt want serial print kost ook redelijk veel tijd. Je kunt zien dat ik in de code al een hele rits heb uitgeschakeld door //.
wanneer ik alles aan zet en daarna alles uit kan ik goed het verschil in tijd zien. Helaas nog niet genoeg.

Minimaal moet de loop 50X per seconde draaien (verwacht ik) maar ik heb het liefst 200x per seconde. Wanneer de monocopter dan 10 rondjes per seconde draaiy heb ik nog 20 corrigeerpunten per rondje. Ik heb eigenlijk geen idee wat voor snelheid ik nodig heb.
ps ik neem aan dat je in de uitleg met de tijden van de servo's 1000 microseconden of 1 milliseconde bedoelt. Want 1000 milliseconden is al weer 1 seconde, dat is wat erg lang ;)
Klopt ook Erik. de puls is inderdaad in microseconden dus maximaal 2 milliseconden. Foutje in mijn tekst.
Ga je nog verder mogelijkheden 'm bestuurbaar te maken?
Ondanks dat ik heel druk ben om de complete besturing te maken moet ik eerst maar eens beginnen met één stuurmogelijkheid bijvoorbeeld de yaw. Dit bied al meer dan genoeg uitdaging.

Ik probeer op het NL arduino forum ook wat hulp te krijgen maar tot nu toe heb ik nog geen antwoorden gekregen op mijn vragen. Wel heb ik een concept stukje code gemaakt in mijn eigen woorden.
Luppie schreef:setup:

newyaw = mag 0° // zet de yaw (voorkant vliegtuig) op nul graden

loop:

yawinput = bij 1000 micros -10 // wanneer de stick links is het getal negatief maken
bij 1500 micros 0
bij 2000 micros +10 // wanneer de stick rechts is het getal positief maken

Yaw = newyaw + yawinput // yaw krijgt dus nul graden plus (-10 tm +10) hierdoor draait de voorkant maximaal 10° per loop (eventueel veel kleiner getal van maken!)

tijdstart = yaw uitlezen op de mag dan starten millis //start met timen van de draaisnelheid
tijd = yaw uitlezen op de mag dan stoppen millis // dit zou de draaisnelheid moeten geven

newyaw == yaw // newyaw krijgt de waarde van yaw zodat wanneer de loop opnieuw word gelezen yaw een nieuw getal krijgt in de vorige formule

nick =(formule!?!) //bij een waarde van 1500 tot 2000 micros naar yaw toe bewegen
(formule!?!) //bij een waarde van 1000 tot 1499 micros van yaw af bewegen

roll = (formule!?!) //bij een waarde van 1500 tot 2000 micros naar yaw + 90° toe bewegen
(formule!?!) //bij een waarde van 1000 tot 1499 micros van yaw -90° af bewegen

servo output = pitch + (nick en roll) //de pitch is leidinggevend aan de uitgang voor de servo maar word aangepast door nick en rol. Nick en roll moeten de zelfde frequentie/sinussnelheid hebben als de magnetometer

led output = yaw // het ledje gaat aan wanneer yaw (de voorkant) voorbij komt om de voorkant visueel te maken


Dit is voorlopig het beste waar ik mee kan komen... Vooral het stukje (formule!?!) is waar het moeilijke werk moet komen. Dus een waarde afhankelijk van yaw, nick en tijd. Yaw bepaald wanneer de maximale waarde moet zijn, nick bepaald hoeveel die maximale waarde moet zijn en tijd bepaald hoe snel die waarde van maximaal naar minimaal naar maximaal gaat :shock: :| :roll:
Heb je vragen over foto's op het forum of andere privacy gevoelige dingen, stuur dan een pb of email naar mij.

Gebruikersavatar
ton
Lid
Berichten: 745
Lid geworden op: ma sep 23, 2013 6:31 pm
Locatie: zwolle
Contacteer:

Re: Monocopter experimenteel ontwerp

Bericht door ton » ma dec 09, 2013 7:30 pm

hier heb je vast al wel gekeken? http://en.wikipedia.org/wiki/Flight_dyn ... _aircraft)
Andere benadering met vector https://forums.bukkit.org/threads/how-d ... tor.50317/
Ik weet werkelijk niet of je er iets aan hebt aangezien het m'n petje bijna te boven gaat. :oops:

Gebruikersavatar
ton
Lid
Berichten: 745
Lid geworden op: ma sep 23, 2013 6:31 pm
Locatie: zwolle
Contacteer:

Re: Monocopter experimenteel ontwerp

Bericht door ton » ma dec 09, 2013 7:34 pm

Bovenste linkje even did you mean aanklikken :x :)

Plaats reactie