(€)Betaalde Hulp nodig bij HMC5883L kompas

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 9
Geregistreerd: 30 Jun 2019, 17:54

(€)Betaalde Hulp nodig bij HMC5883L kompas

Berichtdoor ErikdeP » 24 Jul 2019, 22:18

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,

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: (€)Betaalde Hulp nodig bij HMC5883L kompas

Berichtdoor shooter » 25 Jul 2019, 09:38

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
#include <Wire.h> //I2C Arduino Library

#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();
}
cpp code
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

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: (€)Betaalde Hulp nodig bij HMC5883L kompas

Berichtdoor shooter » 25 Jul 2019, 09:45

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

Berichten: 9
Geregistreerd: 30 Jun 2019, 17:54

Re: (€)Betaalde Hulp nodig bij HMC5883L kompas

Berichtdoor ErikdeP » 25 Jul 2019, 10:32

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

Berichten: 9
Geregistreerd: 30 Jun 2019, 17:54

Re: (€)Betaalde Hulp nodig bij HMC5883L kompas

Berichtdoor ErikdeP » 25 Jul 2019, 11:54

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.


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);
}



Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: (€)Betaalde Hulp nodig bij HMC5883L kompas

Berichtdoor shooter » 25 Jul 2019, 12:45

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

Berichten: 9
Geregistreerd: 30 Jun 2019, 17:54

Re: (€)Betaalde Hulp nodig bij HMC5883L kompas

Berichtdoor ErikdeP » 27 Jul 2019, 19:08

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);
}

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: (€)Betaalde Hulp nodig bij HMC5883L kompas

Berichtdoor shooter » 27 Jul 2019, 23:59

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.
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 30 Jun 2019, 17:54

Re: (€)Betaalde Hulp nodig bij HMC5883L kompas

Berichtdoor ErikdeP » 28 Jul 2019, 01:02

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.

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: (€)Betaalde Hulp nodig bij HMC5883L kompas

Berichtdoor shooter » 28 Jul 2019, 12:33

cpp 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)
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

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 25 gasten