Pages: [1] 2 3   Go Down
Author Topic: [Résolu] Librairie maison  (Read 2444 times)
0 Members and 1 Guest are viewing this topic.
France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
Je n'ai rien trouvé qui réponde positivement à ma question ni sur internet ni su ce forum.
Cette question est :
Peut-on faire nous mêmes des librairies, si oui :
- doit-on télécharger un logiciel spécial ? (je suis sur mac)
- est-ce la même référence si non est-elle sur www.arduino.cc/fr
« Last Edit: September 23, 2012, 04:41:53 am by numero_744 » Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour

Rien de plus facile que de faire une bibliothèque.
Contrairement à un environnement de développement traditionnel où les bibliothèques sont fournies dans des packages précompilés, sur Arduino, une bibliothèque n'est qu'un ensemble de fichiers sources CPP et H

Tu peut regarder comment est faite par exemple la biblio Servo qui se trouve dans le répertoire arduino\libraries\Servo
Tu trouveras :
Code:
Servo
+--- Servo.cpp      : le code de la bibliothèque
+--- Servo.h        : l'interface de la bibliothèque
+--- keywords.txt   : un fichier qui liste les différents mots clefs pour activer la coloration syntaxique
+--- examples       : le répertoire des exemples
         +--- exemple1
                  +--- exemple1.ino
         +--- exemple2
                  +--- exemple2.ino

Le plus simple pour développer ta bibliothèque c'est de procéder comme pour un sketch normal (le sketch d'exemple) et d'avoir les sources dans le même répertoire :

Code:
MesSketches
    +--- MaLib
             +--- exemple1
                  +--- exemple1.ino
                  +--- MaLib.cpp      : le code de la bibliothèque
                  +--- MaLib.h        : l'interface de la bibliothèque
                  +--- keywords.txt   : un fichier qui liste les différents mots clefs pour activer la coloration syntaxique

L'IDE Arduino va ainsi ouvrir automatiquement dans d'autres onglets Malib.cpp et MaLib.h
Tu travailles sur l'exemple et la lib en même temps.

Quand tu es prêt, tu met en place comme indiqué plus haut.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Il existe un tutoriel (en anglais) sur le site officiel arduino.cc :
http://arduino.cc/en/Hacking/LibraryTutorial

Il existe aussi une version "francisé" de l'ancienne version du tutoriel officiel pour arduino <=0023 :
http://www.robot-maker.com/index.php?/tutorials/article/30-creer-une-bibliotheque-arduino/
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci à vous deux pour votre aide.
Pour les utilisateurs de mac qui nous liront, le dossier "librairy" est accessible par :
> Clic droit sur l'app. Arduino
> Afficher le contenu du paquet
> Contents
> Ressources
> Java

J'ai du ouvrir les *.cpp avec "TextEdit"
J'ai encore quelques questions et je vous les poserai plus tard mais juste une pour l'instant :
Dois-je l'écrire avec TextEdit ?

Merci pour votre aide !
« Last Edit: September 05, 2012, 12:31:41 pm by numero_744 » Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Relis mon message.
j'explique comment faire avec l'IDE Arduino
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je cherche mais je confond *.h et *.cpp
Ma bibliothèque doit servir pour un ou plusieurs afficheur(s) comme ceux des réveils numériques (avec des 8)
     H
HG    HD
     M
BG     BD
     B

Mon ancien programme est joint.

J'aimerais pouvoir :
- créer des caractères personnalisés (0001001 pour =) avec "createChar"
- avoir déjà 0123456789 avec "numLCD.write(x)"
- tout effacer avec "numLCD.clear()"
- Faire un ensemble de plusieurs '8' pour envoyer un nombre et non un chiffre à chaque '8'
- le tester avec "numLCD.test()"

Je crois que la première partie de par exemple
Code:
Serial.begin(9600);
donne la bibliothèque et que la seconde partie sert à donner le
Code:
void
correspondant.

Merci de m'avoir lu et merci pour votre future aide !!!

* Afficheur_ordi.ino (11.11 KB - downloaded 4 times.)
« Last Edit: September 07, 2012, 10:18:21 am by numero_744 » Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

En général, un CPP est le fichier source qui contient l'implémentation, là où est le vrai boulot (fonctions et variables)
Le H est la définition de l'interface qui explique à ceux qui veulent l'utiliser comment l'utiliser.

Dans le cas des afficheurs 7-segments, avant de te préoccuper des de la bibliothèque, préoccupe toi de
- comment ca marche
- comment tu connecte a ton arduino
- fait marche un sketch de test
Si tu es grand débutant, ce n'est pas le moment de commencer a tout mélanger et de vouloir faire une bibliothèque dès le début

Repose les bases : que veux tu faire, commant penses tu y arriver.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Bretagne
Offline Offline
Edison Member
*
Karma: 10
Posts: 1296
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je profite du sujet pour exposer ma première tentative de librairie maison. j'ai bien le .c, le .h, le keywords.txt...
Ca ne veut pas compiler :
Quote
Mega_lcd_Keyb_debug.cpp.o: In function `loop':
C:\DOCUME~1\FREEPO~1\LOCALS~1\Temp\build8396374676808604553.tmp/Mega_lcd_Keyb_debug.cpp:36: undefined reference to `kb_read()'
Mega_lcd_Keyb_debug.cpp.o: In function `setup':
C:\DOCUME~1\FREEPO~1\LOCALS~1\Temp\build8396374676808604553.tmp/Mega_lcd_Keyb_debug.cpp:28: undefined reference to `keyB_init()'
Je comprends pas, car c'est pas dans mes fichiers que ça coince... une histoire de public / private? Je ne veux pas utiliser les classes, ce n'est vraiment pas justifié ici.

la lib est assez simple, donc je mets tout ici :

le .h :
Code:
#include "WProgram.h"

// fonctions
void keyB_init();
uint8_t kb_read();

// variables
volatile uint8_t kb_available;


le .c
Code:
#include <MEGA_LCD_KB_debug.h>
#include "WProgram.h"

volatile uint8_t tbl_key[16] = {0xBE, 0x77, 0xB7, 0xD7, 0x7B, 0xBB, 0xDB, 0x7D, 0xBD, 0xDD, 0xE7, 0xEB, 0xED, 0xEE, 0xDE, 0x7E};
volatile uint8_t tbl_btn[5] = {0x1E, 0x1B, 0x1D, 0x17, 0x0F};

#define btn_nobtn 0x1F
#define debounce 100  // délai anti-rebond
#define max_key_buff 16
volatile uint8_t kb_key = kb_nokey;
volatile uint8_t kb_tmp;
volatile uint8_t kb_index;
volatile uint8_t kb_buffer[max_key_buff];

void keyB_init(){
  DDRA = 0x07;  // trois leds en sortie
  DDRB &= 0xE0;  // B4:0 input : 5 boutons
  DDRK = 0xF0;
  PORTB |= 0x1F;
  PORTK = 0x0F;  // pulup clavier 4 x 4
  PCMSK2 = 0x0F;  // active PCINT23:16
  PCMSK0 = 0x1F;  // active PCINT4:0
  PCICR = 0x05;  // active PCI2 et PCI0;
}

uint8_t kb_read(){  // lit la prochaine touche dans le buffer
  static uint8_t kb_r_index;
  uint8_t key_to_return;
 
  if (kb_available){
    kb_r_index++;
    kb_r_index &= 0x0F;  // assure la rotation de l'index
    kb_available--;
    key_to_return = kb_buffer[kb_r_index];
  } else {
    key_to_return = kb_nokey;
  }
  return(key_to_return);
}

// la suite, plein de fonctions internes, ISR etc etc...

le programme qui utilise la lib :
Code:
#include <LiquidCrystal.h>
#include <MEGA_LCD_KB_debug.h>

LiquidCrystal lcd(38, 39, 40, 41, 42, 43);

void setup() {
  keyB_init();
  lcd.clear();
}

void loop() {
  if (kb_available){
    lcd.setCursor(0,0);
    lcd.print(kb_read(), HEX);
    lcd.print(' ');
  }
}
Logged

France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Comme promis j'envoie un exemple de programme :
Code:
int numLED1 = (2,3,4,5,6,7,8); //Définis l'afficheur n°1
int point = P; //Si Serial.available() > 0

void setup() {
  numLEDa.begin(1); //pinMode(..., OUTPUT); avec toutes les broches et définis le groupe afficheur a contenant l'afficheur n°1
  pinMode(Point, OUTPUT);
  Serial.begin(9600);
  numLEDa.test(); //Teste les broches (voir mon ancien programme)
  if(numLEDa.result() != 0) {
    Serial.println("Ces broches ne marchent pas :")
    Serial.write(numLEDa.result()) //Exemple : 0100101
}

void loop() {
  if(Serial.available() > 0) {
    numLEDa.write(Serial.read()); //Affiche le chiffre reçu sur le groupe afficheur a
    digitalWrite(point, HIGH); //Remplit sa fonction
  }
  delay(10); //Attend que Serial se remplisse
  if(Serial.available() == 0) {
    digitalWrite(point, LOW); //Dis que le dernier chiffre est affiché
  }
  delay(990); //Totalise 1"
  numLEDa.clear();
}
« Last Edit: September 07, 2012, 10:56:24 am by numero_744 » Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

2 problèmes :

- Ton .H et ton .C ne sont pas compatibles IDE 1.0
- Ta Lib est en C alors que ton sketch INO est compilé comme du C++
Hors, il s'avère que la fonction toto() dans toto.c n'est pas la même chose que toto() dans un fichier .cpp
Donc quand ton test.ino (tranformé par l'IDE en test.cpp) cherche la fonction keyB_init() il cherche une fonction C++ et non pas C

la raison est que dans le fichier objet compilé, le C++ ajoute des caractères au nom de la fonction ce qui permet la notion de surcharge, c'est à dire d'avoir 2 fonctions qui ont le même nom mais pas les mêmes paramètres.
Ainsi dans un CPP tu as le droit de faire :

Code:
void toto( int a )
{
...
}

void toto( unsigned int a )
{
...
}

mais pas en C

Donc dans le fichier objet compilé depuis le C, tu n'auras qu'une fonction toto() alors que dans le fichier objet compilé depuis le CPP tu auras une fonction toto_param_int et une fonction toto_param_unsigned_int.

Donc ton test.ino cherche une fonction keyB_init_void et non pas une fonction keyB_init.

La solution consiste a ajouter ce que j'ai ajouté dans le fichier H

J'en ai profité pour déclarer aussi KB_NOKEY (en majuscule...) parce que sinon ca compilait pas smiley-wink

* MEGA_LCD_KB_debug.zip (2.01 KB - downloaded 5 times.)
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Bretagne
Offline Offline
Edison Member
*
Karma: 10
Posts: 1296
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Super analyse Barbu!

Je regarde ce que tu as fait, et je vais voir pour KB_NOKEY, car je suis sous l'IDE22 (pas le courage de me mettre encore à la 1.0... Mais je pense que ça passera. (il va falloir que je mette en majuscule tous mes define (y'en a plein d'autres que j'ai pas mis pour ne pas alourdir mon post)? ou c'est juste une spécificité du 1.0? j'aime pas trop les majuscules en prog, je trouve que ça surcharge un peu trop...

A tout'!
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est pas obligatoire, c'est un standard.

Il existe de nombreux standards de règle de codages.
Les règles de codages servent à ce que l'on identifie au 1er coup d'oeil les éléments. Suivants les règles on va pouvoir distinguer par exemple les variables globales des variables locales et des paramètres de fonctions. Distinguer les noms de types des noms de variables ou de fonctions, ...
Il en existe des tas différentes.

Mais il y au moins une règle sur laquelle tout le monde s'accorde de le début : les constantes en #define sont en MAJUSCULES.

Suivre une règle de codage, c'est un bon principe. Ca donne de la rigueur à ton code et ca aide à la relecture et à la maintenance ultérieure.
C'est comme l'indentation.
Le compilateur il s'en contrefiche de l'indentation.
Mais si tu indentes correctement ton code, tu sauras mieux le relire et le maintenir
Idem avec les règles de codages.

Et quand tu partages ton code soit pour l'offrir à la communauté soit pour poser une question sur le forum, c'est comme un post : si c'est mal écrit, cela ne donne pas envie de le lire et d'y répondre.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

0
Offline Offline
God Member
*****
Karma: 0
Posts: 798
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

Super fort Barbudor smiley-wink

Il faudrait aussi rappeler les règles pour les #includes.

Les guillements pour les libs crées dans le répertoire courant.
Les crochets pour les libs standards.

@+

Zoroastre.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Bretagne
Offline Offline
Edison Member
*
Karma: 10
Posts: 1296
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut à vous deux.

Il faut que je vous avoue que j'ai fait l'impasse complète en prog à l'école (quel con... mais ça ne m'a pas empêché d'avoir mon BTS électro haut la main, car à l'époque en 95, la micro n'était pas trop importante). Je suis donc totalement autodidacte en prog. Je pensais que le C++ était juste du C avec quelque fonctionnalités en plus plus (la notion de x++, ++x par exemple), et que les deux pouvaient marcher ensemble...

De plus, selon les langages, l'un est sensible à la casse, pas l'autre, etc etc... et pour ce qui est des règles de de codage, je me contente juste de conserver des espacement de début de ligne dans les blocs pour retrouver facilement la fin du bloc, et j'ai tendance à nommer mes variables comme en basic (je crois) : "nom_de_la_variable" et non "nomDeLaVariable" comme il faudrait (je trouve la première forme plus lisible, c'est du perso)...

Pour revenir à ma lib maison, j'intègre les modifs et je teste ce matin même! Je suis sous IDE 0022, rappelons-le...

Merci encore à vous deux!

cinci

PS / EDIT :

Quote
In file included from C:\Program Files\arduino-0022\hardware\arduino\cores\arduino/WProgram.h:6,
                 from C:\Program Files\arduino-0022\libraries\MEGA_LCD_KB_debug\/MEGA_LCD_KB_debug.h:8,
                 from C:\Program Files\arduino-0022\libraries\MEGA_LCD_KB_debug\MEGA_LCD_KB_debug.c:26:
c:/program files/arduino-0022/hardware/tools/avr/lib/gcc/../../avr/include/math.h:439: error: expected identifier or '(' before 'double'
c:/program files/arduino-0022/hardware/tools/avr/lib/gcc/../../avr/include/math.h:439: error: expected ')' before '>=' token

j'ai mis tout le bloc ci-dessous du .c en commentaire, et ça a compilé.
Code:
#include "Arduino.h"

#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "wiring.h"
#endif

et ça marche. Bon, faudrait un tuto un peu plus clair que ce qu'on trouve avec la lib Morse sur la façon de passer d'un prog à une lib, car j'aime pas trop ne pas comprendre ce que je fais, comme dans le cas présent. S'il le faut, je passerai au 1.0...
« Last Edit: September 08, 2012, 01:08:35 am by Super_Cinci » Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Je pensais que le C++ était juste du C avec quelque fonctionnalités en plus plus (la notion de x++, ++x par exemple), et que les deux pouvaient marcher ensemble...
Oui et non.
Le C++ fait beaucoup plus que d'ajouter 2..3 fonctionnalités.  En tout pas cas celles que tu cite : ++x et x++ existent depuis le début en C.
Mais la surcharge de fonctions que j'ai expliqué est un ajout qui impose un traitement différent sur les noms de fonctions.
Cela n'empêche pas de mélanger les 2, ils restent totalement compatible et la plupart du temps c'est transparent.
En dehors de la programmation objet, des templates etc ... le C++ ajoute au C :
- la surcharge des fonctions et des opérateurs
- la possibilité de déclarer des variables locales n'importe où et pas seulement en début de block.

La plupart du temps, je code dans un fichier CPP pour bénéficier sans m'en rendre compte des ajouts du C++ même si je ne fais pas de classes ou autre fonctionnalités purement C++.

Quote
De plus, selon les langages, l'un est sensible à la casse, pas l'autre, etc etc...
Tat le C que le C++ sont sensibles à la casse.

Quote
j'ai tendance à nommer mes variables comme en basic (je crois) : "nom_de_la_variable" et non "nomDeLaVariable" comme il faudrait
Il n'y a pas de "comme il faudrait". Ta règle est tout a fait valable que ce soit en C ou en Basic de même que l'inverse.
A part les define en majuscules qui est une règle de fait, toutes les règles sont possibles. En avoir une c'est mieux que ne pas en avoir.

j'ai mis tout le bloc ci-dessous du .c en commentaire, et ça a compilé.
Code:
#include "Arduino.h"

#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "wiring.h"
#endif

Arduino.h ne devrait être présent qu'une fois? j'ai merdé.
Essaye en enlevant juste le 1er #include Arduino.h et en gardant ce qui est entre #if ... #endif

Ce n'est pas temps le problème de passer d'un programme à une lib (les Lib Arduino n'étant pas de vrai lib) que le problème de tous les changements entre la version 022 et la version 1.0.
Perso je ne vois aucune raison de rester dans une vielle version alors que plusieurs problèmes ont été corrigés dans la lib core Arduino dans la v1.0.
Il vaut mieux avoir la 1.0(.1) et  apprendre à migrer les exemples vers cette version plutôt que garder une version obsolète.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Pages: [1] 2 3   Go Up
Jump to: