[résolu] Utilisation de <Servo.h> dans une librairie

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 :stuck_out_tongue: ).

Voici comment j'utilise Servo.h dans ma lib, pouvez-vous me dire si un truc ne va pas?

MaLib.h :

#ifndef MaLib
#define MaLib
#include <Servo.h>
#define MIN_SERVO 81
#define MAX_SERVO 91

class MaClasse {
        public:
        ...
	private:
        Servo servo;
        ...
};
#endif

MaLib.cpp

#include "MaLib.h"
Robot::Robot()
{
	servo.attach(PIN_SERVO);
        ...
}

void Robot::commencer(void)
{
	servo.write(MAX_SERVO);
	delay(3000);
	servo.write(MIN_SERVO);
	delay(3000);
        ...
}

Merci à vous!

Bonjour,

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..

Skizo ! !

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 :smiley:

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 :slight_smile:

De fait, je réserve une ??petite surprise?? à celui qui m'aidera à trouver une solution! :smiley:

En attendant je vais créer une librairie contenant uniquement l'utilisation de Servo.h, pour voir si ça fonctionne.

Youp.

Essayes ça: #include "Servo.h" .
Ici

Robot::Robot()
{
	servo.attach(PIN_SERVO);
        ...
}

Tu es certain de ta constante "PIN_SERVO" ?
Elle est où ?
Peut être le mettre plutôt en paramètres constructeur non, c'est pas très dynamique sinon ?

Robot::Robot(byte pinServo)
{
	servo.attach(pinServo);
        ...
}
Robot robert(PIN_SERVO);

Merci Osaka, j'essaie ça dès que j'ai ma carte sous la main!
Je vous tient au courant :slight_smile:

Au fait, pourquoi "Servo.h"? Les quotes ne sont pas réservées aux librairies que nous avons crées?

Youp

Bonjour,

Tu peut utiliser n'importe quelle librairie dans une autre librairie :wink:

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

Cool!
Et bien idem, j'essaierais tout ça dans quelques jours, là je n'ai pas mon petit bébé électronique à portée de main :stuck_out_tongue:

Merci beaucoup! A+

Bon courage si il ne te manque que sa ^^ le cadeau secret tu dira quand même ce que c'est aux autres non? :stuck_out_tongue:

Skizo !

C'est un gros chèque :stuck_out_tongue:

Plus sérieusement tu le sera bien assez tôt...
Enfin quand j'aurais résolu ce petit détail quoi, ça devrait pas tarder.

A+!

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 :slight_smile: .

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 :slight_smile:

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?

Merci à vous
Youp.

Edit : rectification du miss-copier-collé :slight_smile:

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.

Effectivement, ton testservo.cpp est une copie du fichier H
Ce n'est pas comme cela.

tu devrais avoir quelque chose comme

#include "Arduino.h"
#include "Servo.h"
#include "Testservo.h"

public:

Test::Test(int pin)
{
// Mettre ici le code du constructeur
}

Test::commencer(int min, int max)
{
// mettre ici le code de commencer()
}

Yop yop,
Ça sent surtout le mauvais copié collé sur le forum ... :sweat_smile:
Toujours ce relire quand on a posté ! :grin:

Yop yop,
Ça sent surtout le mauvais copié collé sur le forum ...
Toujours ce relire quand on a posté !

En effet! :grin:

Voici mon authentique .cpp :slight_smile:

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

Désolé ^^

Ça sent surtout le mauvais copié collé sur le forum ...

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?

Youp.

Ok. Je réessaye ce soir en branchant un servo.