Créer une librairie

Bonjours ! :slight_smile:

J'aimerai créer une librairie mais mon code a une erreur :

In file included from basic.cpp:1:
K:\Ateliers\E\Programmes\arduino-1.0\libraries\CubiLib/cubiLib.h:4:26: error: WProgram.h: No such file or directory
basic.cpp: In function 'void loop()':
basic:31: error: expected unqualified-id before '.' token

L'erreur est à propos de : cubiLib.avance(); que j'ai mis dans mon loop().

Dans mon .cpp j'ai mis :

#include "WProgram.h"
#include "cubiLib.h"

cubiLib::cubiLib(int pin)
{
  int servo_gauche = 9;
  int servo_droite = 10;
}
 
void cubiLib::avance()
{
  servo_gauche.write(89);
  servo_droite.write(95);
}

Et dans mon .h j'ai mis :

#ifndef cubiLib_h
#define cubiLib_h
     
    #include "WProgram.h"
     
    class cubiLib
    {
      public:
        cubiLib(int pin);
        void avance();
        
      private:
        int _pin;
    };
     
    #endif

Merci d'avance !

Enlève une fois l'include du .h ?

#include "WProgram.h"

Jsuis pas spécialiste librairie pour un sou mais d'une part servo_gauche et servo_droite sont des variables que tu déclares, et ensuite c'est des fonctions ? :

  servo_gauche.write(89);
  servo_droite.write(95);

d'autres part, ces fonctions je ne les connais pas, ne voulais-tu pas plutôt écrire :

  analogWrite(servo_gauche,89);
  analogWrite(servo_droite,95);

?

Tien j'avais pas fais attention à cette bizarrerie :fearful:, j'étais sur "WProgram.h: No such file or directory".
En effet soit tes attributs doivent être déclaré dans ton .h et initialisé dans le constructeur et non juste déclaré dans ton constructeur, ensuite int n'est pas un type d'objet donc pas de méthodes à appliqué dessus ...
Je verais plutôt quelque chose comme ça.

CubiLib.h

#ifndef cubiLib_h
#define cubiLib_h
     
    #include <Servo.h> 
     
    class CubiLib
    {
      public:
        CubiLib(byte pinSG, byte pinSD);
        void avance(byte aglG, byte aglD);
        
      private:
        Servo servoG;
        Servo servoD;
    };
     
    #endif

CubiLib.cpp

#include "WProgram.h"
#include "CubiLib.h"

CubiLib::CubiLib(ibyte pinSG, byte pinSD)
{
  servoG.attach(pinSG);
  servoG.attach(pinSD);
}
 
void CubiLib::avance(byte aglG, byte aglD)
{
  servoG.write(aglG);
  servoD.write(aglD);
}

cubi.pde

#include <CubiLib.h>

CubiLib cubi(9, 10);

void setup()
{
}

void loop()
{
  cubi.avance(89, 95);
}

Ah oui, effectivement il y a un problème :sweat_smile:

Merci pour ton code osaka, il a l'air en effet plus juste que le mien. C'est ma première librairie, donc je découvre :wink:

J'ai du mal à comprendre ce qu'il y a entre parenthèse dans :

CubiLib(byte pinSG, byte pinSD);
void avance(byte aglG, byte aglD);

Et il y a un problème, lors de la vérification, sur ce même bout de code :

In file included from basic.cpp:1:
K:\Ateliers\E\Programmes\arduino-1.0\libraries\CubiLib/cubiLib.h:4:24: error: Servo.h: No such file or directory
In file included from basic.cpp:1:
cubiLib.h:8: error: expected `)' before 'pinSG'
cubiLib.h:9: error: 'byte' has not been declared
cubiLib.h:9: error: 'byte' has not been declared
cubiLib.h:12: error: 'Servo' does not name a type
cubiLib.h:13: error: 'Servo' does not name a type
basic:16: error: no matching function for call to 'CubiLib::CubiLib(int, int)'
K:\Ateliers\E\Programmes\arduino-1.0\libraries\CubiLib/cubiLib.h:7: note: candidates are: CubiLib::CubiLib()
K:\Ateliers\E\Programmes\arduino-1.0\libraries\CubiLib/cubiLib.h:7: note: CubiLib::CubiLib(const CubiLib&)

Mes servomoteurs sont commandé par impulsion PWM digitals. Que dois-je déclarer de type "byte" ?

Merci beaucoup de vos aides !

Arf, c'est le truc ch... avec l'ide arduino, je sais jamais qui est inclus où, etc.

#ifndef cubiLib_h
#define cubiLib_h
    #include "WProgram.h" 
    #include "Servo.h" 
     
    class CubiLib
    {
      public:
        CubiLib(byte pinSG, byte pinSD); //pinSG = "pin servo gauche", pinSD = "pin servo droit"
        void avance(byte aglG, byte aglD); //aglG = "angle gauche", aglD = "angle droit"
        
      private:
        Servo servoG;
        Servo servoD;
    };
     
#endif
#include "CubiLib.h"

CubiLib::CubiLib(byte pinSG, byte pinSD)
{
  servoG.attach(pinSG);
  servoD.attach(pinSD);
}
 
void CubiLib::avance(byte aglG, byte aglD)
{
  servoG.write(aglG);
  servoD.write(aglD);
}
#include <Servo.h>
#include <CubiLib.h>

CubiLib cubi(9, 10); //on instancie l'objet cubi en attribuant la pin/servo gauche et droite

void setup()
{
}

void loop()
{
  cubi.avance(89, 95); //on appel la methode avance de l'objet cubi, 1er param pour le gauche, 2 ème param pour le droit
}

Pour le constructeur c'est ici que tu vas attribuer (attacher) un servo à la "pin" correspondante, lors de la construction (l'instanciation) de ton objet.

Le fait d'utilisé le type byte plutôt que int est juste une question de taille, 1 int (2 octet) pour les valeurs allant de -32.768 à 32.767 et 1 byte (1octet) pour des valeurs allant de 0 à 255 et comme ici tu n'iras jamais au delà du nombre de pin que comprend ton arduino ... ça te fait 2 octet d'économisé en mémoire.
Entre (): 1 byte = 1 unsigned char, entre ()2 : un objet est l'instance d'une classe.

constructeur.

CubiLib::CubiLib(byte pinSG, byte pinSD)
{
  servoG.attach(pinSG); //on attribue une pin à un objet Servo (de droite)
  servoD.attach(pinSD); //on attribue une pin à un objet Servo (de gauche)
}

dans le pde, appel au constructeur de ta classe CubiLib afin d'attacher tes pin/servo lors de l'instanciation de ton objet cubi.

CubiLib cubi(9, 10);

méthode de classe pour l'avance

void CubiLib::avance(byte aglG, byte aglD)
{
  servoG.write(aglG);
  servoD.write(aglD);
}

dans le pde appel de cette méthode sur l'objet instancié avance en degré d'angle de tes servo

  cubi.avance(89, 95);

Merci osaka !

Quelques petits soucis encore.
Il me dit :

cubiLib.h:9: error: 'byte' has not been declared

J'ai donc voulu déclarer byte dans le .h sous la section public :

class CubiLib
    {
      public:
      byte pinSG;
      byte pinSD;
      byte aglG;
      byte aglD;

Mais ça ne change rien à l'erreur.

J'ai aussi un :

cubiLib.h:8: error: expected `)' before 'pinSG'

ça semble concerner cette ligne : CubiLib(byte pinSG, byte pinSD); //pinSG = "pin servo gauche", pinSD = "pin servo droit".

Merci de ton aide, on approche :stuck_out_tongue:

Yop yop,
C'est parce que tu es sous la version 1.0 du core arduino sans doute, remplace dans le .h

#include "WProgram.h"

par

#include "Arduino.h"