Go Down

Topic: Problème création libairie (Read 481 times) previous topic - next topic

gaelperr

Bonjour,

Afin de m'entraîner, j'ai voulu créer une librairie en suivant le tutoriel suivant : https://www.arduino.cc/en/Hacking/LibraryTutorial

J'ai voulu essayé de créer une librairie dans laquelle je pourrai rentré la valeur de la pin souhaitée et que dans la librairie, une fonction configure cette pin en sortie, et une 2ème fonction change simplement la valeur précédente (Si elle était à 1, met un 0...), puis une petite attente de 500ms.

Ce que je ne comprend pas dans le tuto cité ci-dessus, c'est comment ils font pour appeler une des fonctions.
Pour appeler leur fonction "dot" ils font cela : morse.dot();

Que signifie ce point entre les deux noms ? il s'agit "d'instance" ? Je ne comprends pas de quoi il s'agit...

Quelqu'un pourrait m'aider ?

bricoleau

Bonjour

C'est de la programmation objet
morse est un objet = une instance de la classe définie par la bibliothèque.
dot() est une méthode applicable à cet objet

Si ces termes te semblent abscons, je te suggère de commencer par faire le tour de quelques tutos sur la programmation objet en C++
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

gaelperr

Merci beaucoup de ta réponse.
Est-il possible d'appeler une fonction qui est dans une librairie sans utiliser cette particularité du C++ ? Je connais uniquement le C...

gaelperr

Parce'que même en essayant d'avoir la même structure que l'exemple, ça ne fonctionne pas...

biggil

Est-il possible d'appeler une fonction qui est dans une librairie sans utiliser cette particularité du C++ ? Je connais uniquement le C...
Tu mélanges "est dans une librairie" et "fonctionne en C++". C'est totalement indépendant.
En tous cas, si une fonction est définie comme membre (non-statique) d'une classe, c'est du C++, tu ne peux pas y couper (et tu ne peux appeler cette fonction sans avoir un objet de la classe)

68tjs

#5
Jan 31, 2018, 06:05 pm Last Edit: Jan 31, 2018, 06:07 pm by 68tjs
Il faut s'entendre sur les termes.
Une library, en français bibliothèque, c'est du code que, pour le  réutiliser facilement, on place dans des fichiers.
Si, en plus, on utilise une IDE cette IDE défini des emplacements spéciaux pour y déposer les fichiers bibliothèques. Les emplacements étant fixes et connus l'utilisateur n'a pas besoin de communiquer l'adresse des fichiers au compilateur.

Le fichier ino que tu écris n'est pas transmis tel quel au compilateur.
L'IDE Arduino le transforme en un vrai fichier cpp en y ajoutant les prototypes de fonctions, la fonction main() dans laquelle sont appelés la fonction init() dont tu n'a probablement jamais entendu parlé, la fonction setup() et la boucle infinie dans laquelle est appelée la fonction loop().

Il est compilé et si on utilise une ou plusieurs bibliothèques leurs fichiers sont aussi compilés un par un.
Tous les fichiers compilés sont liés par l'éditeur de lien (Linker).

Univers arduino :
Il existe des bibliothèques de fonctions et des bibliothèques de classes (programmation orienté objet).
Très majoritairement tu trouvera des bibliothèques de classe.

Mais il existe aussi des bibliothèques de fonctions.
Par exemple la fonction digitalWrite(x) appartient à une bibliothèque de fonction à savoir le fichier wiring_digital.c .
On déduit que c'est une bibliothèque de fonction parce que le fichier est en extension c.
Le nom du fichier rappelle qu'Arduino est un fork du projet Wiring.

Les bibliothèques de classes s'utilisent selon les règles de la programmation objet.
Avis d'un tout petit programmeur : La lecture d'un tuto d'initiation au cpp ne fera jamais de mal et fera même gagner du temps.

bricoleau

Difficile d'échapper à la programmation objet dans le monde arduino.

Tout le monde passe par exemple par Serial.print()

Les usages de base ne sont pas très durs à appréhender. Il y a plein de tutos disponibles là-dessus.

Après tu n'es pas obligé de t'attaquer aux notions plus complexes d'héritage, polymorphisme ou généricité.
Quoique je suspecte beaucoup de monde dans le coin, d'utiliser allègrement la méthode .print() un peu partout, sans avoir notion de sa définition sous-jacente  :) 
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

68tjs

Quote
Difficile d'échapper à la programmation objet dans le monde arduino.
Oui.
Mais il y a des exceptions et une de taille : l'I2C

Je ne connais aucune bibliothèque qui hérite de la classe Two-Wire.
Toutes les bibli que je connais utilisent l'objet Wire instancié directement dans le fichier de la classe Two-Wire.

C'est a un tel point que quasiment tout le monde pense que Wire c'est une bibliothèque alors que c'est un objet.

gaelperr

Merci de toutes vos réponses.

Il est donc important de connaître le C++ pour la compréhension des bibliothèques.

Mais je ne comprends pas vraiment pourquoi ma bibliothèque ne fonctionne pas alors que j'ai suivi exactement ce qu'ils disent dans le tutoriel...

Voici mon .cpp :

#include <Arduino.h>
#include <Inverse.h>


Inverse::Inverse(int pin)
{
 pinMode(pin, OUTPUT);
 _pin = pin;
}

void Inverse::change()
{
int pin;
_etat = digitalRead(pin);
digitalWrite(pin, !_etat);
}





et mon .h :


#ifndef Inverse_h //si Inverse_h n'est pas défini
#define Inverse_h // On le défini

#include <Arduino.h>

class Inverse
{
   public:
      Inverse(int pin);
      void change();
   
   private:
      int _pin;
      int _etat;
};

#endif


Est-ce que comme ça vous voyez une erreur qui vous saute aux yeux ? :P

kamill

#9
Feb 05, 2018, 09:11 am Last Edit: Feb 05, 2018, 09:13 am by kamill
Bonjour,

Dans ta fonction change() pin n'est pas initialisé.
Code: [Select]
void Inverse::change()
{
int pin;
_etat = digitalRead(pin);
digitalWrite(pin, !_etat);
}


ce devrait être
Code: [Select]
void Inverse::change()
{
_etat = digitalRead(_pin);
digitalWrite(_pin, !_etat);
}


Mets ton code entre balises.

gaelperr

Merci de ton aide kamill.

J'en ai pris note, malheureusement ça ne change rien a mon programme :(

Voici aussi le code du programme principal :

#include <Inverse.h>

Inverse inverse(7);

void setup()
{
}

void loop()
{
  Inverse change();
  delay(500);
}




Dans l'exemple, ils mettent "Inverse.change();" avec un point entre les deux, mais chez moi si je fais comme ça, une erreur apparaît car il ne comprend pas ce que ça signifie..

kamill

#11
Feb 05, 2018, 10:58 am Last Edit: Feb 05, 2018, 11:01 am by kamill
Lors de l'appel c'est l'instance qu'il faut appeler et non la classe.

inverse.change() et non Inverse.change()

gaelperr

Merci kamill !

J'ai enfin pu faire fonctionné ma librairie !

gaelperr

Il faut s'entendre sur les termes.
Une library, en français bibliothèque, c'est du code que, pour le  réutiliser facilement, on place dans des fichiers.
Si, en plus, on utilise une IDE cette IDE défini des emplacements spéciaux pour y déposer les fichiers bibliothèques. Les emplacements étant fixes et connus l'utilisateur n'a pas besoin de communiquer l'adresse des fichiers au compilateur.

Le fichier ino que tu écris n'est pas transmis tel quel au compilateur.
L'IDE Arduino le transforme en un vrai fichier cpp en y ajoutant les prototypes de fonctions, la fonction main() dans laquelle sont appelés la fonction init() dont tu n'a probablement jamais entendu parlé, la fonction setup() et la boucle infinie dans laquelle est appelée la fonction loop().

Il est compilé et si on utilise une ou plusieurs bibliothèques leurs fichiers sont aussi compilés un par un.
Tous les fichiers compilés sont liés par l'éditeur de lien (Linker).

Univers arduino :
Il existe des bibliothèques de fonctions et des bibliothèques de classes (programmation orienté objet).
Très majoritairement tu trouvera des bibliothèques de classe.

Mais il existe aussi des bibliothèques de fonctions.
Par exemple la fonction digitalWrite(x) appartient à une bibliothèque de fonction à savoir le fichier wiring_digital.c .
On déduit que c'est une bibliothèque de fonction parce que le fichier est en extension c.
Le nom du fichier rappelle qu'Arduino est un fork du projet Wiring.

Les bibliothèques de classes s'utilisent selon les règles de la programmation objet.
Avis d'un tout petit programmeur : La lecture d'un tuto d'initiation au cpp ne fera jamais de mal et fera même gagner du temps.

Et comment peut on créer une bibliothèque de fonction et non de classe ? :P

kamill

Bonjour,

Tu définis tes fonctions dans un fichier .cpp (éventuellement dans un fichier .c) et tu déclares ces fonctions dans un fichier .h.
Tu inclus le fichier .h dans ton programme qui appelle les fonctions.
Il est de bonne pratique de donner le même nom au fichier .h et .cpp.

Go Up