Bonjour les amis,
Y a quelques mois j'ai fait appel a vous pour ce projet.
Aujoud'hui je reviens vers vous car j'ai détecté un truc que je n'arrive pas a resoudre tout seul.
Voila mon souci:
J'ai une HMC5883l qui est connectée bien sur a une carte arduino uno puis un servo moteur.
je veux faire en sorte que la boussole control la direction de mon engin ( Kontiki) jusqu'ici tout va bien quand je bouge la bousole le servo change la direction pour la corriger vers celle de départ.
NB: - Servo est a la position 90 au départ
- HeadingDegree Position initiale dés le fonctionnement de systeme (j'oriente le kontiki vers la direction que je souhaite avant de demarrer le systeme)
Quand je fesais les tests j'etait sur le cap entre 90 et 130 (ce cap représente la position initiale celle que je veux que le moteur corrigé a chaque fois le kontiki change de direction) du coup puisque le moteur soit : va partir de 90 vers 180 ou vers 0 ( +90 ou -90 ) dans ce cas pas de pb mais quand j'ai recement fait le test et que j'etait sur 20 degré (20 vers 0 vers -4 vers - 15 par exemple) le servo change completement la direction car l'ecart devient grand et aussi change la polarisation (soit de + vers le - ou le contraire) et c'est la le souci au fait.
CODE
#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 myservo1;
Servo myservo2;
int servoPos = 90;
int servoPos1 = 90;
int memo_cap_degres;
int compassCorrection = 0; // set to 0 (not used)
int MaxLimit = 180;
int MinLimit = 0;
int Limit_drt = 4;
int Limit_gch = 176;
//on suppose que les BP actionnés ammenent GND sur leur entrée
byte LED[] = {0, 2, 3, 4, 5}; // les LEDS sont sur 3, 4, 5, 6
byte REED[] = {0, 7, 8, 10, 13}; // les BP sont sur 7, 8, 9, 10
int Relais[] = {0, 12};// les Relais sont sur 11,12 case 0 non utilisée
unsigned long deb_tempo[]={0,0,0,0,0};
unsigned long tempo [] = {0000, 5000, 10000, 20000, 30000};//tableau des temps désirés
boolean flag_tempo[] = {false, false, false, false, false, false};
void setup()
{
Serial.begin(9600);
for ( byte f = 1; f <= 4; f++)
{
pinMode(REED[f], INPUT_PULLUP);
pinMode(LED[f], OUTPUT); digitalWrite(LED[f], LOW);
}
pinMode(Relais[1], OUTPUT); digitalWrite(Relais[1], LOW);
pinMode(Relais[2], OUTPUT); digitalWrite(Relais[2], LOW);
test_leds();
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();
myservo1.write(90);
myservo2.write(90);
delay(2000);
}
void displaySensorDetails(void)
{
sensor_t sensor;
mag.getSensor(&sensor);
myservo1.attach(6);
myservo2.attach(11);
delay(500);
}
static int headingInitial;
void loop()
{
extinction_leds();
/*Section du HMC5883l*/
sensors_event_t event;
mag.getEvent(&event);
float heading = atan2(event.magnetic.y, event.magnetic.x);
int headingDegrees = (heading * 180/M_PI);
//heading = abs(heading);
if (headingInitial==0)
{
headingInitial =headingDegrees;
}
int offset = headingInitial - headingDegrees;
myservo1.write(servoPos1 - offset);
/*Serial.print("Heading (Initial): "); Serial.println(headingInitial);
Serial.print("headingDegrees: "); Serial.println(headingDegrees);
Serial.print("offset "); Serial.println(offset);
Serial.print("Servo pos "); Serial.println(servoPos - offset);*/
Serial.println(offset);
myservo1.write(offset);
delay(500);
/*Fin Section du HMC5883l*/
for ( byte f = 1; f <= 4; f++)
{
if ((digitalRead(REED[f]) == LOW) && ( flag_tempo[f] == false)) //lecture des BP chacun à son tour
{
flag_tempo[f] = true;
deb_tempo[f] = millis();
}
MINUTES(1);//1 pour relais 1
}
}
void MINUTES(byte relais)
{
for (byte m = 1; m <= 4; m++)
{
if (flag_tempo[m] == true)
{
if ((millis() - deb_tempo[m]) < tempo[m])
{
digitalWrite(Relais[relais], HIGH);
digitalWrite(LED[m] , HIGH); //allume la led correspondant à la tempo
}
else
{
flag_tempo[m] = false;
digitalWrite(Relais[relais], LOW);
digitalWrite(LED[m] , LOW); //allume la led correspondante
myservo2.write(180);
delay(1000);
//myservo2.write(0);
//delay(1000);
myservo2.write(90);
}
}
}
}
void extinction_leds()
{
//Serial.print(" extinction led ");
for ( byte f = 1; f <= 4; f++)
{
if (flag_tempo[f] == false)
{
digitalWrite(LED[f], LOW); //eteinds les leds
}
}
}
void test_leds()
{
for ( byte f = 1; f <= 4; f++)
{ digitalWrite(LED[f] , HIGH);//allume les 4 leds
}
delay(500);
for ( byte f = 1; f <= 4; f++)
{ digitalWrite(LED[f] , LOW);//eteinds les 4 leds
}
}
Je ne sais pas est ce que je suis claire ou pas mais si vous avez des question n'hesitez pas svp
Par avance merci