(€)Betaalde Hulp nodig bij HMC5883L kompas
12 berichten
• Pagina 1 van 2 • 1, 2
(€)Betaalde Hulp nodig bij HMC5883L kompas
Goedeavond,
ik ben bezig met het maken van een robot. nu moet deze robot in een rechte lijn blijven rijden op het moment dat hij start, de enige oplossing die ik nog zie is door een Arduino board te gebruiken in combinatie met een HMC5883L kompas module.
ik ben zelf al een aantal (lange)dagen aan het stoeien geweest en ik kom er niet uit. nu is mijn vraag:
Wil er iemand voor mij code schrijven voor het volgende,
Ik heb op dit moment de Arduino UNO en de HMC5883L kompas module.
op het moment dat het board gestart wordt moet de kompas module de richting aanhouden waar hij op het moment van opstarten naartoe staat. als hij hier vanaf wijkt moet hij een digitale uitgang hoog maken ( als hij afwijkt naar links een digitale uitgang hoog. als deze terugkomt over het 0 punt laag en als hij naar rechts afwijkt een andere digitale uitgang hoog en over het 0 punt weer laag)
ik heb al uren zitten zoeken op internet om te kijken of er een bestaande code is die ik kan gebruiken maar deze heb ik helaas niet kunnen vinden! daarom ben ik op zoek naar iemand die de code voor mij kan schrijven.
Ik hoop dat iemand me kan en wil helpen. als er betaald moet worden is dat geen probleem, laat maar weten wat het zou moeten kosten.
alvast bedankt,
ik ben bezig met het maken van een robot. nu moet deze robot in een rechte lijn blijven rijden op het moment dat hij start, de enige oplossing die ik nog zie is door een Arduino board te gebruiken in combinatie met een HMC5883L kompas module.
ik ben zelf al een aantal (lange)dagen aan het stoeien geweest en ik kom er niet uit. nu is mijn vraag:
Wil er iemand voor mij code schrijven voor het volgende,
Ik heb op dit moment de Arduino UNO en de HMC5883L kompas module.
op het moment dat het board gestart wordt moet de kompas module de richting aanhouden waar hij op het moment van opstarten naartoe staat. als hij hier vanaf wijkt moet hij een digitale uitgang hoog maken ( als hij afwijkt naar links een digitale uitgang hoog. als deze terugkomt over het 0 punt laag en als hij naar rechts afwijkt een andere digitale uitgang hoog en over het 0 punt weer laag)
ik heb al uren zitten zoeken op internet om te kijken of er een bestaande code is die ik kan gebruiken maar deze heb ik helaas niet kunnen vinden! daarom ben ik op zoek naar iemand die de code voor mij kan schrijven.
Ik hoop dat iemand me kan en wil helpen. als er betaald moet worden is dat geen probleem, laat maar weten wat het zou moeten kosten.
alvast bedankt,
Advertisement
Re: (€)Betaalde Hulp nodig bij HMC5883L kompas
om even een snel antwoord te geven
Probeer eerst maar eens onderstaand om te beginnen.
Het werkt via I2C dat zijn dus pinnen A4 en A5
voorbeeld komt van https://www.sparkfun.com/tutorials/301
cpp code
Probeer eerst maar eens onderstaand om te beginnen.
Het werkt via I2C dat zijn dus pinnen A4 en A5
voorbeeld komt van https://www.sparkfun.com/tutorials/301
cpp code
#include <Wire.h> //I2C Arduino Librarycpp code
#define address 0x1E //0011110b, I2C 7bit address of HMC5883
void setup(){
//Initialize Serial and I2C communications
Serial.begin(9600);
Wire.begin();
//Put the HMC5883 IC into the correct operating mode
Wire.beginTransmission(address); //open communication with HMC5883
Wire.send(0x02); //select mode register
Wire.send(0x00); //continuous measurement mode
Wire.endTransmission();
}
void loop(){
int x,y,z; //triple axis data
//Tell the HMC5883L where to begin reading data
Wire.beginTransmission(address);
Wire.send(0x03); //select register 3, X MSB register
Wire.endTransmission();
//Read data from each axis, 2 registers per axis
Wire.requestFrom(address, 6);
if(6<=Wire.available()){
x = Wire.receive()<<8; //X msb
x |= Wire.receive(); //X lsb
z = Wire.receive()<<8; //Z msb
z |= Wire.receive(); //Z lsb
y = Wire.receive()<<8; //Y msb
y |= Wire.receive(); //Y lsb
}
//Print out values of each axis
Serial.print("x: ");
Serial.print(x);
Serial.print(" y: ");
Serial.print(y);
Serial.print(" z: ");
Serial.println(z);
delay(250);
}
paul deelen
shooter@home.nl
shooter@home.nl
Re: (€)Betaalde Hulp nodig bij HMC5883L kompas
De x en y waarde kun je met een formule ! (even zelf nadenken) omzetten naar een hoek. denk aan de waardes en dat een arduino met radialen werkt.
paul deelen
shooter@home.nl
shooter@home.nl
Re: (€)Betaalde Hulp nodig bij HMC5883L kompas
Bedankt voor je reactie.
Nu is het zo dat ik al met meerdere codes heb getest en dat ging allemaal prima.. heb alleen de juiste nog niet kunnen vinden.
Ik ben nu op zoek naar iemand die de code voor mij kan schrijven doordat ik nu helaas niet de tijd heb om het mezelf aan te leren ivm de deadline van mijn project.
Ik hoop dat je me kan/wil helpen
Ik hoor het graag
Nu is het zo dat ik al met meerdere codes heb getest en dat ging allemaal prima.. heb alleen de juiste nog niet kunnen vinden.
Ik ben nu op zoek naar iemand die de code voor mij kan schrijven doordat ik nu helaas niet de tijd heb om het mezelf aan te leren ivm de deadline van mijn project.
Ik hoop dat je me kan/wil helpen
Ik hoor het graag
Re: (€)Betaalde Hulp nodig bij HMC5883L kompas
Dit is waar ik mee aan het stoeien ben.. deze heb ik nu werkend met een servo! het enige probleem is dat zijn 0 punt vast staat en daar zou ik graag vanaf willen.
dus op het moment van opstarten dat dat dan zijn 0 punt is.
dus op het moment van opstarten dat dat dan zijn 0 punt is.
- Code: Alles selecteren
#include <Wire.h>
#include <HMC5883L.h>
#include <Servo.h>
#define SERVO 2
#define CENTER 100
#define GOAL 0
HMC5883L compass;
int goal = GOAL;
float declinationAngle = 0.212; // Radians
Servo myservo;
void setup() {
Serial.begin(57600);
myservo.attach(SERVO);
Wire.begin();
compass = HMC5883L();
// Set scale to +/- 1.3 Ga
int error = compass.SetScale(1.3);
if (error != 0)
Serial.println(compass.getErrorText(error));
// Set measurement mode to continous
error = compass.setMeasurementMode(Measurement_Continuous);
if (error != 0)
Serial.println(compass.getErrorText(error));
}
void loop() {
int angle = getDegrees();
int error = goal - angle;
if (error >= 180)
error = 180;
if (error <= -180)
error = -180;
// Update servo and keep with range of +/- 60
if (error > 60)
error = 60;
if (error < -60)
error = -60;
myservo.write(CENTER + error);
delay(10);
}
int getDegrees () {
MagnetometerScaled scaled = compass.ReadScaledAxis();
// Calculate heading when the magnetometer is level, then correct for signs of axis.
float heading = atan2(scaled.YAxis, scaled.XAxis) + 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.
return (int) (heading * 180 / M_PI);
}
Re: (€)Betaalde Hulp nodig bij HMC5883L kompas
ErikdeP schreef:Dit is waar ik mee aan het stoeien ben.. deze heb ik nu werkend met een servo! het enige probleem is dat zijn 0 punt vast staat en daar zou ik graag vanaf willen.
dus op het moment van opstarten dat dat dan zijn 0 punt is.
dat is dus de startangle.
dat mag dus in setup, en anders gebruik je een startvlag in de loop:
if (startvlag) {startangle ophalen
startvlag=false;}
- Code: Alles selecteren
#include <Wire.h>
#include <HMC5883L.h>
#include <Servo.h>
#define SERVO 2
#define CENTER 100
#define GOAL 0
HMC5883L compass;
int goal = GOAL;
float declinationAngle = 0.212; // Radians
Servo myservo;
float startangle=0;
void setup() {
Serial.begin(57600);
myservo.attach(SERVO);
Wire.begin();
compass = HMC5883L();
// Set scale to +/- 1.3 Ga
int error = compass.SetScale(1.3);
if (error != 0)
Serial.println(compass.getErrorText(error));
// Set measurement mode to continous
error = compass.setMeasurementMode(Measurement_Continuous);
if (error != 0)
Serial.println(compass.getErrorText(error));
//dat mag hierin de setup
startangle= getDegrees();
}
void loop() {
int angle = getDegrees()-startangle;
int error = goal - angle;
if (error >= 180)
error = 180;
if (error <= -180)
error = -180;
// Update servo and keep with range of +/- 60
if (error > 60)
error = 60;
if (error < -60)
error = -60;
myservo.write(CENTER + error);
delay(10);
}
int getDegrees () {
MagnetometerScaled scaled = compass.ReadScaledAxis();
// Calculate heading when the magnetometer is level, then correct for signs of axis.
float heading = atan2(scaled.YAxis, scaled.XAxis) + 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.
return (int) (heading * 180 / M_PI);
}
paul deelen
shooter@home.nl
shooter@home.nl
Re: (€)Betaalde Hulp nodig bij HMC5883L kompas
Goedeavond @Shooter,
Ik ben erachter gekomen dat ik je de verkeerde code heb gestuurd. zou jij hetzelfde verhaal toe kunnen passen op het volgende?
[code][/code]
// adaptation of Adafruit sample of code
// https://github.com/adafruit/Adafruit_HM ... sensor.ino
#include <Servo.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>
/* Assign a unique ID to this sensor at the same time */
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);
Servo myservo;
int servoPos = 85; //
int compassCorrection = 0; // set to 0 (not used)
void displaySensorDetails(void)
{
sensor_t sensor;
mag.getSensor(&sensor);
Serial.println("------------------------------------");
Serial.print ("Sensor: "); Serial.println(sensor.name);
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" uT");
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" uT");
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" uT");
Serial.println("------------------------------------");
Serial.println("");
myservo.attach(9);
delay(500);
}
void setup(void)
{
Serial.begin(9600);
Serial.println("HMC5883 Magnetometer Test"); Serial.println("");
/* Initialise the sensor */
if(!mag.begin())
{
/* There was a problem detecting the HMC5883 ... check your connections */
Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
while(1);
}
/* Display some basic information on this sensor */
displaySensorDetails();
myservo.write(85);
delay(1000);
}
void loop(void)
{
/* Get a new sensor event */
sensors_event_t event;
mag.getEvent(&event);
/* Display the results (magnetic vector values are in micro-Tesla (uT)) */
// Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print(" ");
// Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print(" ");
// Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print(" ");Serial.println("uT");
// Hold the module so that Z is pointing 'up' and you can measure the heading with x&y
// Calculate heading when the magnetometer is level, then correct for signs of axis.
float heading = atan2(event.magnetic.y, event.magnetic.x);
// 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: -13* 2' W, which is ~13 Degrees, or (which we need) 0.22 radians
// If you cannot find your Declination, comment out these two lines, your compass will be slightly off.
//float declinationAngle = 0.22;
//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.
float headingDegrees = heading * 180/M_PI;
int headingDegreesInteger = headingDegrees;
// not used here, since correction is set to 0
if ((headingDegreesInteger - compassCorrection) >= 0)
{
headingDegreesInteger = headingDegreesInteger - compassCorrection;
}
else
{
headingDegreesInteger = headingDegreesInteger - compassCorrection + 360;
}
Serial.print("Heading (degrees): "); Serial.println(headingDegrees);
// Calculate corresponding servo position
if (headingDegreesInteger > 90 && headingDegreesInteger < 270)
{
if (headingDegreesInteger <= 180)
{
servoPos = 180;
}
else
{
servoPos = 10;
}
}
else
{
if (headingDegreesInteger <= 90)
{
servoPos = map(headingDegreesInteger, 0, 90, 85, 10);
}
else
{
servoPos = map(headingDegreesInteger, 360, 270, 85, 180);
}
}
myservo.write(servoPos);
delay(10);
}
Ik ben erachter gekomen dat ik je de verkeerde code heb gestuurd. zou jij hetzelfde verhaal toe kunnen passen op het volgende?
[code][/code]
// adaptation of Adafruit sample of code
// https://github.com/adafruit/Adafruit_HM ... sensor.ino
#include <Servo.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>
/* Assign a unique ID to this sensor at the same time */
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);
Servo myservo;
int servoPos = 85; //
int compassCorrection = 0; // set to 0 (not used)
void displaySensorDetails(void)
{
sensor_t sensor;
mag.getSensor(&sensor);
Serial.println("------------------------------------");
Serial.print ("Sensor: "); Serial.println(sensor.name);
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" uT");
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" uT");
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" uT");
Serial.println("------------------------------------");
Serial.println("");
myservo.attach(9);
delay(500);
}
void setup(void)
{
Serial.begin(9600);
Serial.println("HMC5883 Magnetometer Test"); Serial.println("");
/* Initialise the sensor */
if(!mag.begin())
{
/* There was a problem detecting the HMC5883 ... check your connections */
Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
while(1);
}
/* Display some basic information on this sensor */
displaySensorDetails();
myservo.write(85);
delay(1000);
}
void loop(void)
{
/* Get a new sensor event */
sensors_event_t event;
mag.getEvent(&event);
/* Display the results (magnetic vector values are in micro-Tesla (uT)) */
// Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print(" ");
// Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print(" ");
// Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print(" ");Serial.println("uT");
// Hold the module so that Z is pointing 'up' and you can measure the heading with x&y
// Calculate heading when the magnetometer is level, then correct for signs of axis.
float heading = atan2(event.magnetic.y, event.magnetic.x);
// 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: -13* 2' W, which is ~13 Degrees, or (which we need) 0.22 radians
// If you cannot find your Declination, comment out these two lines, your compass will be slightly off.
//float declinationAngle = 0.22;
//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.
float headingDegrees = heading * 180/M_PI;
int headingDegreesInteger = headingDegrees;
// not used here, since correction is set to 0
if ((headingDegreesInteger - compassCorrection) >= 0)
{
headingDegreesInteger = headingDegreesInteger - compassCorrection;
}
else
{
headingDegreesInteger = headingDegreesInteger - compassCorrection + 360;
}
Serial.print("Heading (degrees): "); Serial.println(headingDegrees);
// Calculate corresponding servo position
if (headingDegreesInteger > 90 && headingDegreesInteger < 270)
{
if (headingDegreesInteger <= 180)
{
servoPos = 180;
}
else
{
servoPos = 10;
}
}
else
{
if (headingDegreesInteger <= 90)
{
servoPos = map(headingDegreesInteger, 0, 90, 85, 10);
}
else
{
servoPos = map(headingDegreesInteger, 360, 270, 85, 180);
}
}
myservo.write(servoPos);
delay(10);
}
Re: (€)Betaalde Hulp nodig bij HMC5883L kompas
zoals ik reeds schreef moet je als eerste stap bijvoorbeeld in de setup een heading meten en dat is dan je neiuwe nulpunt. en dan moet je dus in de loop telkens het nulpunt ervanaf trekken
dus in setup bepal je de startheading
en in de loop doe je nieuwe heading is gemeten heading - startheading.
het is de bedoeling dat je zelf ook een beetje nadenkt.
dus in setup bepal je de startheading
en in de loop doe je nieuwe heading is gemeten heading - startheading.
het is de bedoeling dat je zelf ook een beetje nadenkt.
paul deelen
shooter@home.nl
shooter@home.nl
Re: (€)Betaalde Hulp nodig bij HMC5883L kompas
als ik jou berichten lees heb ik het idee dat jij precies weet waar je over praat en is het voor jou waarschijnlijk een kleine moeite.
zou je alsjeblieft hetgeen ik nodig heb toe kunnen voegen aan de laatste code die ik gestuurd heb? je zou mij er ontzettend mee helpen. laat maar weten wat je ervoor wilt hebben.
ik zou het graag zelf doen maar heb helaas niet de kennis om het uit te voeren. en ik heb de code wel nodig om mijn project tot een goed einde te brengen.
als jij het niet ziet zitten, heb je dan misschien een suggestie voor iemand bij wie ik terecht kan?
ik hoor het graag en alvast bedankt.
zou je alsjeblieft hetgeen ik nodig heb toe kunnen voegen aan de laatste code die ik gestuurd heb? je zou mij er ontzettend mee helpen. laat maar weten wat je ervoor wilt hebben.
ik zou het graag zelf doen maar heb helaas niet de kennis om het uit te voeren. en ik heb de code wel nodig om mijn project tot een goed einde te brengen.
als jij het niet ziet zitten, heb je dan misschien een suggestie voor iemand bij wie ik terecht kan?
ik hoor het graag en alvast bedankt.
Re: (€)Betaalde Hulp nodig bij HMC5883L kompas
cpp code
ik heb een paar regels toegevoegd.
// adaptation of Adafruit sample of code
// https://github.com/adafruit/Adafruit_HM ... sensor.ino
#include <Servo.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>
/* Assign a unique ID to this sensor at the same time */
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);
Servo myservo;
int servoPos = 85; //
int compassCorrection = 0; // set to 0 (not used)
float startheading;
void displaySensorDetails(void)
{
sensor_t sensor;
mag.getSensor(&sensor);
Serial.println("------------------------------------");
Serial.print ("Sensor: "); Serial.println(sensor.name);
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" uT");
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" uT");
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" uT");
Serial.println("------------------------------------");
Serial.println("");
myservo.attach(9);
delay(500);
}
void setup(void)
{
Serial.begin(9600);
Serial.println("HMC5883 Magnetometer Test"); Serial.println("");
/* Initialise the sensor */
if(!mag.begin())
{
/* There was a problem detecting the HMC5883 ... check your connections */
Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
while(1);
}
startheading = atan2(event.magnetic.y, event.magnetic.x);
/* Display some basic information on this sensor */
displaySensorDetails();
myservo.write(85);
delay(1000);
}
void loop(void)
{
/* Get a new sensor event */
sensors_event_t event;
mag.getEvent(&event);
/* Display the results (magnetic vector values are in micro-Tesla (uT)) */
// Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print(" ");
// Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print(" ");
// Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print(" ");Serial.println("uT");
// Hold the module so that Z is pointing 'up' and you can measure the heading with x&y
// Calculate heading when the magnetometer is level, then correct for signs of axis.
float heading = atan2(event.magnetic.y, event.magnetic.x);
// 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: -13* 2' W, which is ~13 Degrees, or (which we need) 0.22 radians
// If you cannot find your Declination, comment out these two lines, your compass will be slightly off.
//float declinationAngle = 0.22;
//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.
float headingDegrees = ((heading-startheading) * 180/M_PI);
int headingDegreesInteger = headingDegrees;
// not used here, since correction is set to 0
if ((headingDegreesInteger - compassCorrection) >= 0)
{
headingDegreesInteger = headingDegreesInteger - compassCorrection;
}
else
{
headingDegreesInteger = headingDegreesInteger - compassCorrection + 360;
}
Serial.print("Heading (degrees): "); Serial.println(headingDegrees);
// Calculate corresponding servo position
if (headingDegreesInteger > 90 && headingDegreesInteger < 270)
{
if (headingDegreesInteger <= 180)
{
servoPos = 180;
}
else
{
servoPos = 10;
}
}
else
{
if (headingDegreesInteger <= 90)
{
servoPos = map(headingDegreesInteger, 0, 90, 85, 10);
}
else
{
servoPos = map(headingDegreesInteger, 360, 270, 85, 180);
}
}
myservo.write(servoPos);
delay(10);
}
ik heb een paar regels toegevoegd.
paul deelen
shooter@home.nl
shooter@home.nl
12 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten