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
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.