Bonjour !
Pour le PPE de Terminale, mon groupe doit s'occuper d'un phare qui se réglerait automatiquement en fonction du chargement de la voiture pour ne pas éblouir les autres passagers.
Seulement l'Arduino Uno pose quelques problèmes de précision : en effet les fonctions trigonométriques nécessite un angle en radians en float, or l'angle calculé varie si peu qu'après conversion il vaut systématiquement 0.03 radians. J'ai pensé à mettre des doubles, mais sur un Uno ça change rien.
Je voudrais donc avoir un truc pour améliorer la précision des calculs.
Voici le code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include<Servo.h> Servo servo; float hauteurAr, hauteurAv, incliVoiture, positionPhare, startTime, endTime, correctPhare; const int trigH1=10, echoH1=11, trigH2=12, echoH2=13; //définition des ports utilisés void setup(){ pinMode(trigH1, OUTPUT); pinMode(trigH2, OUTPUT); digitalWrite(trigH1, LOW); digitalWrite(trigH2, LOW); pinMode(echoH1, INPUT); pinMode(echoH2, INPUT); servo.attach(7); hauteurAv = distanceH(1); //Récupération distance H1 en cm hauteurAr = distanceH(2); //......................H2...... Serial.begin(9600); } void loop(){ hauteurAv = distanceH(1); //Récupération distance H1 en cm hauteurAr = distanceH(2); //......................H2...... incliVoiture = atan(2580/(hauteurAr-hauteurAv)); //calcul donnant en sortie des degrés correctPhare = atan((40842*(1-sin(incliVoiture)))/(hauteurAv-acos(incliVoiture))); //calcul nécessitant des radians servo.write(correctPhare); delay(1000); } int distanceH(int x){ //récupération de la distance (en cm) détecté par le capteur choisi int distance; if (x == 1){ //Pour H1 digitalWrite(trigH1, HIGH); delayMicroseconds(10); digitalWrite(trigH1, LOW); distance = (pulseIn(echoH1, HIGH))/58; } else if (x == 2){ //Pour H2 digitalWrite(trigH2, HIGH); delayMicroseconds(10); digitalWrite(trigH2, LOW); distance = (pulseIn(echoH2, HIGH))/58; } return distance; } |
Merci.
+0
-0