Bonsoir à tous.
Pour un projet j'utilise la librairie Servo.h
J'arrive très bien à la manipuler avec un programme de test, seulement je développe mon projet sous la forme d'une librairie, et je n'arrive pas à utiliser <Servo.h> convenablement, mon servo est totalement inactif (sans mauvais jeux de mots ).
Voici comment j'utilise Servo.h dans ma lib, pouvez-vous me dire si un truc ne va pas?
Il est difficile de te donner directement une réponse à mon avis, donne directement tout le contenu de ton .h et ton .CPP sinon impossible de dire en 4 5 lignes si le reste est juste, dans ce que tu nous montre bas.. pas grand chose à dire pas de faute apparente quoi..
donne directement tout le contenu de ton .h et ton .CPP
Hem...
Ca va peut-être poser problème, mon .h et mon .cpp font à eux seuls environ 1500 lignes de code
En corrigeant ce petit problème de servo je clôturerais la version beta de mon projet, que je développe depuis plusieurs mois... Pour vous dire un peu à quel point je suis impatient de trouver réponse à ce problème
De fait, je réserve une ??petite surprise?? à celui qui m'aidera à trouver une solution!
En attendant je vais créer une librairie contenant uniquement l'utilisation de Servo.h, pour voir si ça fonctionne.
Tu peut utiliser n'importe quelle librairie dans une autre librairie
Dans le .h :
tu inclut le .h de la lib servo
en private :
tu déclare un objet Servo
tu déclare tout tes variables
en public :
tu déclare le prototypes de toute tes fonctions
Dans le .cpp
tu inclut ton .h
dans ton constructeur : tu peut passer la broche du servo en paramètre, par convention on ne met aucune constante modifiable dans une classe.
Au pire tu rend l'argument optionnel, en fournissant une valeur par défaut dans le .h, et tu initialise tout ce qui doit être initialisé.
tu implémente tes fonctions, et là tu peut utiliser ton objet servo comme tu veut
Salut à tous.
Bon j'ai un peu été stoppé net dans mes tests par un petit contre-temps, mais ouf, je reprends enfin ce soir .
Comme j'en avais l'intention, j'ai fais une petite librairie-test très minimale, qui contient tout juste ce qu'il faut pour tester mon servo.
Et bien ça n'a pas loupé, cette lib ne marche pas... Ce qui n'est pas une mauvaise nouvelle, au moins je sais d'où ça vient xD
Pourtant j'ai essayé de suivre vos conseils, promis!
Mais cette fois-ci comme c'est très léger je peux vous montrer mon code foireux
test.ino
#include <Servo.h>
#include <Testservo.h>
// définition des pins
#define PIN_SERVO 8
// positions du servo-moteur (en degrés)
#define MIN_SERVO 81
#define MAX_SERVO 91
Test servotest(PIN_SERVO); // contructeur
void setup() {}
void loop() {
// la seule et unique fonction de ma lib, qui fait avancer le servo d'un point à un autre
servotest.commencer(MIN_SERVO, MAX_SERVO);
}
Testservo.h
#ifndef Testservo
#define Testservo
#include <Servo.h>
#include "Arduino.h"
class Test {
public:
Test(int pin);
void commencer(int min, int max);
private:
Servo servo;
};
#endif
Testservo.cpp
#include <Testservo.h>
Test::Test(int pin)
{
// on associe le servo au bon pin
servo.attach(pin);
}
void Test::commencer(int min, int max)
{
// avance jusqu'à la position minimale
servo.write(min);
delay(1000);
// puis jusqu'à la position maximale
servo.write(max);
delay(1000);
}
Voila. Le servo de bouge pas d'un yota...
Alors où se cache l'erreur dans mon code?
Tu nous mets le code de Test.cpp, mais alors de deux choses l'une ou il est incomplet ou tu as oublié 2 ou 3 trucs.
Tu crée un objet Servo mais tu ne l'utilises pas.
Tu déclares Test() mais il n'y a aucun code associé.
Autre chose ta librairie utilise Servo ou elle est une surcouche à Servo. Dans le second cas il faudrait l'indiquer dans la déclaration de la classe Test.
Yop yop,
Ça sent surtout le mauvais copié collé sur le forum ...
Toujours ce relire quand on a posté !
En effet!
Voici mon authentique .cpp
#include <Testservo.h>
Test::Test(int pin)
{
// on associe le servo au bon pin
servo.attach(pin);
}
void Test::commencer(int min, int max)
{
// avance jusqu'à la position minimale
servo.write(min);
delay(1000);
// puis jusqu'à la position maximale
servo.write(max);
delay(1000);
}
Je peux me tromper mais je crois que la déclaration de servo dans Test.h ne crée pas d'instance.
Il me semble qu'il faudrait mettre Servo servo; dans Test.cpp pour créer l'objet servo.
Je peux me tromper mais je crois que la déclaration de servo dans Test.h ne crée pas d'instance.
Pourtant il m'est déjà arrivé d'utiliser de cette manière le type File, qui hérite de SD.h .
Ici j'utilise le type Servo qui hérite de Servo.h ... Ça ne fonctionne pas pareil?
Si je le mets dans mon .cpp, où je dois mettre la déclaration de l'objet Servo pour qu'il soit visible dans toutes mes fonctions?
Quand tu déclares la classe test tu dois aussi déclarer les sous-objets quelle utilise donc oui, tu doit utiliser Servo dans test.h
Ton code me semble ok.
Que se passe t'il ?
Problème de compilation ou d'exécution ?
Ah oui au fait : un truc débile : la chaîne AVR est sensible à la casse.
Si ton fichier s'appelle testservo.h c'est pas #include "Testservo.h" mais #include "testservo.h"
Il suffit de regarder les résultats de compilation....
Pas de soucis, mes fichiers .cpp et .h sont tous les 2 nommés par des majuscules, ça ne vient pas de là car ça compile.
Pas de problème de hardware non plus car le servo fonctionne avec le fichier d'exemple fourni...
Quelqu'un a un servo-moteur sous la main pour faire le test, pour voir si c'est juste chez moi que ça déconne?