Bonjour, je suis en terminale S SI et je dois pour la fin de l'année rendre un projet de groupe. Nous devons créer un système permettant de stabiliser une caméra sur un ballon. Je suis actuellement bloqué par la programmation de notre carte arduino et je ne sais pas comment m'en sortir étant donné que je pars de zéro et sans cours eu au préalable.
Notre système utilise un accéléromètre branché à une carte arduino uno et un système grove. La carte est ensuite reliée à 2 servomoteurs qui sont sensés stabiliser la caméra.
J'ai pour l'instant ce programme qui me pose beaucoup de problème :
#include "MMA7660.h"
#include <Wire.h>
#include <Servo.h>
MMA7660 acc; //accéléromètre
Servo servox; //servomoteur axe x
Servo servoy; //servomoteur axe y
void setup()
{
MMA7660.init();
Serial.begin(115200); // calibrage à 115 200 bauds
servox.attach(6); // servomoteur axe x
servoy.attach(7); // servomoteur axe y
}
void loop()
{
while (1); // début de la boucle
{
static long cnt = 0;
static long cntout = 0;
servox.write(0);
servoy.write(0);
int8_t x, y, z;
float ax,ay,az;
acc.getXYZ(&x,&y,&z);
float axa= asin(ax/(sqrt(ax*ax)+(ay*ay)+(az*az))), axy= asin(ay/(sqrt(ax*ax)+(ay*ay)+(az*az))); // on passe d'une valeure d'accélération à un angle
if(axa!=0) // si mouvement détecté
{
servox.write(-axa);
}
else{}
if(axy!=0) // si mouvement détecté
{
servoy.write(-axy);
}
else{}
} // fin de la boucle
}
Merci d'avance de l'aide que vous pourriez me fournir.
Bonjour JLM et Pierre,
J'ai assemblé ce code à partir d'une librairie de l'accéléromètre auquelle j'ai ajouté des ordres pour mes servomoteurs en fonction des infos de l'accéléromètre.
Mon accéléromètre doit mesurer l'inclinaison de ma caméra et le programme doit convertir les données en g en inclinaison en °. Les servomoteurs doivent alors tourner d'un angle inverse de celui donné par l'accéléromètre afin de garder constamment la caméra horizontale.
Nos servomoteurs ont un angle de liberté de 180°, je vais retirer ma boucle dans ce cas.
LucasBnt:
Je viens de compiler mon programme et aucune erreur n'est affichée mise à part :
avr-g++: error: CreateProcess: No such file or directory
exit status 1
Erreur de compilation pour la carte Arduino/Genuino Uno
ben si il y a des erreurs, la preuve, ca ne compile pas.
mets en mode verbose l'ide pour afficher plus d'infos
Si ca ce n'est pas une liste d'erreurs
sketch_mar27a:9: error: 'const1' does not name a type
const const1=(sqrt(axax)+(ayay)+(az*az)
^
/tmp/arduino_modified_sketch_916991/sketch_mar27a.ino: In function 'void loop()':
sketch_mar27a:25: error: 'Val2' was not declared in this scope
Val2= val
^
sketch_mar27a:25: error: 'val' was not declared in this scope
Val2= val
^
sketch_mar27a:30: error: 'class MMA7660' has no member named 'getXYZ'
Plusieurs bibliothèque trouvées pour "Wire.h"
Utilisé : /home/loic/sketchbook/arduino-1.8.1/hardware/arduino/avr/libraries/Wire
Non utilisé : /home/loic/sketchbook/arduino-1.8.1/libraries/Wire
acc.getXYZ(&x,&y,&z);
^
sketch_mar27a:32: error: 'ax' was not declared in this scope
float axa= asin(ax/const1)), axy= asin(ay/const1)); // on passe d'une valeure d'accélération à un angle
^
sketch_mar27a:32: error: 'const1' was not declared in this scope
float axa= asin(ax/const1)), axy= asin(ay/const1)); // on passe d'une valeure d'accélération à un angle
^
sketch_mar27a:36: error: 'axy' was not declared in this scope
servoy.write(-axy);
^
exit status 1
'const1' does not name a type
L'accéléromètre est sensé mesurer les mouvements du ballon, il donne une accélération en G et le programme doit traduire cette accélération en ° afin que les servomoteurs effectue l'angle inverse afin de garder constamment la caméra horizontale. Le code vient de moi-même.. Désolé pour cet amas de fautes de codage mais je mise à part du html chez moi je n'avais pas fait de progra auparavant.
J'ai suivi les messages d'erreurs et ai corrigé tout en mettant ce qui me semblait bon jusqu'à ne plus avoir d'erreurs et j'ai obtenu cela, pourriez vous me dire si mon programme est viable ? (je n'ai pas de possibilités de le tester ce soir..)
#include <MMA7660.h>
#include <Wire.h>
#include <Servo.h>
MMA7660 acc; //accéléromètre
Servo servox; //servomoteur axe x
Servo servoy; //servomoteur axe y
int ax, ay, az, axa, axy;
int b=(sqrt(ax*ax)+(ay*ay)+(az*az));
void setup()
{
acc.init();
Serial.begin(115200); // calibrage à 115 200 bauds
servox.attach(6); // servomoteur axe x
servoy.attach(7); // servomoteur axe y
}
void loop()
{
int8_t x, y, z;
float ax,ay,az;
float axa= asin(ax/b), axy= asin(ay/b); // on passe d'une valeure d'accélération à un angle
servox.write(-axa);
servoy.write(-axy);
}
J'ai suivi les messages d'erreurs et ai corrigé tout en mettant ce qui me semblait bon jusqu'à ne plus avoir d'erreurs et j'ai obtenu cela, pourriez vous me dire si mon programme est viable ? (je n'ai pas de possibilités de le tester ce soir..)
tu crois que l'on a le matériel pour tester chaque code?
ca compile ou non?
J-M-L:
ça sert à quoi ça dans les déclarations globales?
int ax, ay, az, axa, axy;
int b=(sqrt(axax)+(ayay)+(az*az));
Ca, c'est une des erreurs de deuxième ordre que j'avais repérée. Au départ, LucasBnt calculait plusieurs fois cette valeur dans le flot. Je lui avait dit de ne le faire qu'une seule fois, mais il l'a mal placée : il l'a placée avant l'initialisation de l'accéléro, ce qui n'a pas de sens. Ce calcul doit être fait dans le setup() après avoir initialisé l'accéléro ; peut-être même après une temporisation pour permettre une stabilisation de l'accéléro.
infobarquee:
tu crois que l'on a le matériel pour tester chaque code?
Ce n'est pas ce que je voulais dire, juste que je ne pouvais pas assurer qu'il fonctionnait pour le moment.
J-M-L:
ça sert à quoi ça dans les déclarations globales?
et bien je déclare la variable b et mes valeurs d'accélération que m'envoie l'accéléromètre
ChPr:
Ce calcul doit être fait dans le setup() après avoir initialisé l'accéléro ; peut-être même après une temporisation pour permettre une stabilisation de l'accéléro.
J'ai mis ces valeurs en dessous de l'initialisation, mais ma valeur b créer toujours une erreur 'b' was not declared in this scope ainsi que '-axy' alors que axa ne me pose pas de problème. Je ne comprends pas mes erreurs
J'ai modifié le programme et je n'ai plus aucunes erreurs lors de la compilation cependant il ne marche pas, pourriez vous me dire ce qu'il me manque ?
#include <MMA7660.h>
#include <Wire.h>
#include <Servo.h>
MMA7660 acc; //accéléromètre
Servo servox; //servomoteur axe x
Servo servoy; //servomoteur axe y
void setup()
{
acc.init();
Serial.begin(115200); // calibrage à 115 200 bauds
servox.attach(6); // servomoteur axe x
servoy.attach(7); // servomoteur axe y
}
void loop()
{
int axa, axy;
float ax, ay, az;
float b = (sqrt(ax*ax)+(ay*ay)+(az*az));
int8_t x, y, z;
axa = asin(ax/b); // on passe d'une valeure d'accélération à un angle
axy = asin(ay/b);
servox.write(-axa);
servoy.write(-axy);
}
Lorsque je téléverse le programme sur ma carte, j'ai beau faire bouger mon accéléromètre les servomoteurs ne se mettent pas en mouvement, seul un servomoteur tourne de quelques degrés lorsque je finis le téléversement puis se bloque car il a atteint son angle maximal.
void loop()
{
int axa, axy;
float ax, ay, az; // [color=red]<--- combien valent ax, ay az à ce moment? [/color]
float b = (sqrt(ax*ax)+(ay*ay)+(az*az)); // [color=red]<-- en déduire combien vaut b[/color]
...
où lisez vous les valeurs de l'accéléromètre dans votre code?