Outils pour utilisateurs

Outils du site


tuto_arduino_eclipse_la_librairie_arduino_avec_eclipse

[TUTO] [Arduino] [Eclipse] la Librairie Arduino avec Eclipse


Introduction

Dans ce tutoriel, je vous propose d'utiliser la librairie Arduino sous Eclipse et ainsi bénéficier de la completion de code, de la navigation dans les sources, etc…

Le début est toujours le même .. La mise sous configuration reste facultative, mais recommandée. :-)

De mon coté, le projet existe déjà, si vous voulez le télécharger pour l’étudier ou vous y référer, il est là : https://github.com/spelle/Arduino_Core_lib.git.

Et pour ne rien vous cacher, il existe deja un tuto qui decrit ce qui va suivre sur le playground de Arduino : http://playground.arduino.cc//Code/Eclipse


Creation du Projet

Pour ma part, le projet, je l'ai nommé Arduino_Core_lib. Encore une fois, je me suis imposé une convention de nommage : AVR ou Arduino, m'indique si il s'agit d'un projet en AVR pur, ou un projet en Arduino, Core est le nom de mon projet, et lib a la fin pour indiquer qu'il s'agit d'une librairie ; rien s'il s'agit d'un executable.

Nous y voila donc .. nous avons un repertoire dans notre workspace, qui est soit un repertoire “normal”, soit un clone d'un repository GIT decentralisé.

[ACTION] Créer un nouveau projet C/C++ de type AVR Cross Target Static Library nommé Arduino_Core_lib, pour un ATmega328P cadencé à 16MHz

Si vous avez jeté un oeil sur le tuto du Arduino playground, vous avez peut-etre vu qu'il y a trois alternatives :

  • soit utliser un mecanisme du compilateur permettant de pointer vers le repertoire d'installation de Arduino,
  • soit copier les sources,
  • soit créer un lien symbolique vers le repertoire d'installation de Arduino.
Pour ma part, J'ai choisi de copier les sources. En effet, il ne m'etait pas possible de symlinker puisque GIT ne suit pas les liens symboliques, de meme, j'ai deux PC, un sous Debian Wheezy à la maison, et un sous Windows 7 (professionel), la solution de la directive compilateur ne pouvait donc pas non plus fonctionner, de meme que les symlinks d'ailleurs. ne reste que l'alternative de copier les sources…

Pour ce faire rien de plus simple : il faut simplement copier le répertoire hardware/arduino/cores/arduino dans un répertoire de notre projet. J'ai choisi de conserver l'information du numero de version de Arduino dans le nom de repertoire, j'ai donc créé le repertoire src_v1.0.4.

[ACTION] mkdir src_v1.0.4
[ACTION] cp -R ~/opt/arduino-1.0.4/hardware/arduino/cores/arduino src_v1.0.4

Voilà notre répertoire src_v1.0.4 créé. Et le contenu de la bibliothèque Arduino copié… Un petit coup de refresh, et voila qu'il apparaît dans notre Explorateur de projet.

Pour la suite on ne va garder que la configuration Debug, que l'on pourra renommer a l'occasion.

[ACTION] Supprimer la configuration Release

Il nous faut ensuite définir deux/trois options de compilations…

[ACTION] Afficher les propriétés du projet : click-droit > Propriétés
[ACTION] Dans le panneau de droite, sélectionner C/C++ Build > Settings

On peut d'ors-et-déjà constater que dans Additionnal Tools in Toolchain il ne nous propose pas de générer un .hex pour la flash ou l'eeprom…

[ACTION] Dans AVR Compiler > Directories, ajouter notre repertoire src_v1.0.4 (le chemin relatif de Eclipse est ${workspace_loc:/${ProjName}/src_v1.0.4})

[ACTION] Dans AVR Compiler > Debugging, laisser comme c'est.

[ACTION] Dans AVR Compiler > Optimizations, sélectionner Size Optimizations (-Os) pour Optimitzation Level
[ACTION] Dans AVR Compiler > Optimizations, décocher Pack structs (-fpack-struct)
[ACTION] Dans AVR Compiler > Optimizations, décocher Short enums (-fshort-enums)
[ACTION] Dans AVR Compiler > Optimizations, spécifier -ffunction-sections -fdata-sections dans le champ Other Optimization Flags

[ACTION] Dans AVR Compiler > Language Standard, décocher char is unsigned (-funsigned-char)
[ACTION] Dans AVR Compiler > Language Standard, décocher bitfields are unsigned (-funsigned-bitfields)

Répéter ces opérations pour AVR C++ Compiler :

[ACTION] Dans AVR C++ Compiler > Directories, ajouter le répertoire src_v1.0.4 (le chemin relatif de Eclipse est ${workspace_loc:/${ProjName}/src_v1.0.4})

[ACTION] Dans AVR C++ Compiler > Debugging, laisser comme c'est.

[ACTION] Dans AVR C++ Compiler > Optimizations, sélectionner Size Optimizations (-Os) pour Optimitzation Level
[ACTION] Dans AVR C++ Compiler > Optimizations, décocher Pack structs (-fpack-struct)
[ACTION] Dans AVR C++ Compiler > Optimizations, décocher Short enums (-fshort-enums)
[ACTION] Dans AVR C++ Compiler > Optimizations, spécifier -ffunction-sections -fdata-sections dans le champ Other Optimization Flags

[ACTION] Dans AVR C++ Compiler > Language Standard, décocher char is unsigned (-funsigned-char)
[ACTION] Dans AVR C++ Compiler > Language Standard, décocher bitfields are unsigned (-funsigned-bitfields)
[ACTION] Dans AVR C++ Compiler > Language Standard, cocher Do not use Exceptions (-fno-exceptions)

[ACTION] Appliquer les changements et valider

Les options de compilation sont a présent définies. Lançons une compilation.

[ACTION] Lancer la compilation

Tiens ?!?! avr-gcc se plaint d'un fichier d'en-tête manquant !

07:40:48 **** Build of configuration Nano for project Arduino_Core_lib ****
make all 
Building file: ../src_v1.0.4/CDC.cpp
Invoking: AVR C++ Compiler
avr-gcc -I"D:\Utilisateurs\A127590\Workspaces\Eclipse-4.3.1-AVR-Arduino\Arduino_Core_lib\src_v1.0.4" -Wall -g2 -gstabs -Os -ffunction-sections -fdata-sections -fno-exceptions -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"src_v1.0.4/CDC.d" -MT"src_v1.0.4/CDC.d" -c -o "src_v1.0.4/CDC.o" "../src_v1.0.4/CDC.cpp"
In file included from ../src_v1.0.4/Platform.h:15,
                 from ../src_v1.0.4/CDC.cpp:19:
../src_v1.0.4/Arduino.h:213:26: error: pins_arduino.h: No such file or directory
make: *** [src_v1.0.4/CDC.o] Error 1

07:41:04 Build Finished (took 15s.648ms)

Le fichier d'en-tête pins_arduino.h est spécifique a chaque carte… Il suffit de trouver celui adapté à notre carte. Pour pas être embêté par la suite, on va copier de la même manière que pour les sources, les fichiers d'en-tête des cartes.

[ACTION] mkdir variants_v1.0.4
[ACTION] cp -R ~/opt/arduino-1.0.4/hardware/arduino/cores/variants/* variants_v1.0.4

Il reste ensuite a ajouter le répertoire contenant le fichier pins_arduino.h associé à notre carte à la liste des répertoires d'inclusion. Pour trouver cette info il faut regarder le fichier hardware/arduino/boards.txt. Pour une Arduino Uno, on regardera le champ uno.build.variant=standard. Pour une Arduino Nano, ce sera nano328.build.variant=eightanaloginputs.

[ACTION] Dans AVR Compiler > Directories, ajouter notre repertoire variants_v1.0.4/<carte> (le chemin relatif de Eclipse est ${workspace_loc:/${ProjName}/variants_v1.0.4/<carte>})

[ACTION] Dans AVR C++ Compiler > Directories, ajouter le repertoire variants_v1.0.4/<carte> (le chemin relatif de Eclipse est ${workspace_loc:/${ProjName}/variants_v1.0.4/<carte>})

[ACTION] Appliquer les changements et valider

Le build est ensuite un succès.

Bien entendu, pour supporter plusieurs cartes, il suffit de definir plusieurs configurations, une par carte.

La suite, ça sera de faire un exécutable qui utilise cette librairie.


Un premier projet

Nous allons à présent créer notre premier projet Arduino sous Eclipse. Pour changer, nous allons faire clignoter une LED. Celle sur la broche #13 de notre Arduino Uno ou Nano. Il s'agit donc toujours d'un projet pour un ATmega328P cadencé à 16MHz.

Le debut reste le même, nouveau repo, clone, nouveau projet… Celui là, nous allons l'appeller Arduino_Blink_A_LED. De la même manière, pour reference : https://github.com/spelle/Arduino_Blink_A_LED.git

Commencons par ajouter le sources suivant, soit dans un fichier main.c/cpp ou Arduino_Blink_A_LED.c/cpp :

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
#include <Arduino.h>
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
 
// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);
}
 
// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

Tiens c'est bizarre, ça ressemble a un sketch Arduino… Oui, à part la directive #include <Arduino.h>, c'est un sketch Arduino… Ou plutôt, un skectch Arduino, c'est un fichier source en C/C++ tout à fait normal.

Passons à la configuration de notre projet, c'est là que réside la clef ! Il y a pas mal de chose communes avec la librairie qu'il faut refaire, je vais donc les detailler a nouveau.

[ACTION] Afficher les propriétés du projet : click-droit > Propriétés
[ACTION] Dans le panneau de droite, sélectionner C/C++ Build > Settings

On peut d'ors-et-déjà constater que dans Additionnal Tools in Toolchain il nous est proposé de générer un .hex pour la mémoire Flash et l'EEPROM

[ACTION] Dans AVR Compiler > Directories, ajouter le répertoire src_v1.0.4 de Arduino_Core_lib (le chemin relatif de Eclipse est ${workspace_loc:/Arduino_Core_lib/src_v1.0.4})

Pour une carte Arduino Uno :
[ACTION] Dans AVR Compiler > Directories, ajouter le répertoire variants_v1.0.4/standard de Arduino_Core_lib (le chemin relatif de Eclipse est ${workspace_loc:/Arduino_Core_lib/variants_v1.0.4/standard})

Pour une carte Arduino Nano :
[ACTION] Dans AVR Compiler > Directories, ajouter le répertoire variants_v1.0.4/eightanaloginputs de Arduino_Core_lib (le chemin relatif de Eclipse est ${workspace_loc:/Arduino_Core_lib/variants_v1.0.4/eightanaloginputs})

[ACTION] Dans AVR Compiler > Debugging, laisser comme c'est.

[ACTION] Dans AVR Compiler > Optimizations, sélectionner Size Optimizations (-Os) pour Optimitzation Level
[ACTION] Dans AVR Compiler > Optimizations, décocher Pack structs (-fpack-struct)
[ACTION] Dans AVR Compiler > Optimizations, décocher Short enums (-fshort-enums)
[ACTION] Dans AVR Compiler > Optimizations, spécifier -ffunction-sections -fdata-sections dans le champ Other Optimization Flags

[ACTION] Dans AVR Compiler > Language Standard, décocher char is unsigned (-funsigned-char)
[ACTION] Dans AVR Compiler > Language Standard, décocher bitfields are unsigned (-funsigned-bitfields)

Répéter ces opérations pour AVR C++ Compiler :

[ACTION] Dans AVR C++ Compiler, specifier avr-gcc dans le champ Command
[ACTION] Dans AVR C++ Compiler > Directories, ajouter le répertoire src_v1.0.4 de Arduino_Core_lib (le chemin relatif de Eclipse est ${workspace_loc:/Arduino_Core_lib/src_v1.0.4})

Pour une carte Arduino Uno : [ACTION] Dans AVR C++ Compiler > Directories, ajouter le répertoire variants_v1.0.4/standard de Arduino_Core_lib (le chemin relatif de Eclipse est ${workspace_loc:/Arduino_Core_lib/variants_v1.0.4/standard})

Pour une carte Arduino Nano : [ACTION] Dans AVR C++ Compiler > Directories, ajouter le répertoire variants_v1.0.4/eightanaloginputs de Arduino_Core_lib (le chemin relatif de Eclipse est ${workspace_loc:/Arduino_Core_lib/variants_v1.0.4/eightanaloginputs})

[ACTION] Dans AVR C++ Compiler > Debugging, laisser comme c'est.

[ACTION] Dans AVR C++ Compiler > Optimizations, sélectionner Size Optimizations (-Os) pour Optimitzation Level
[ACTION] Dans AVR C++ Compiler > Optimizations, décocher Pack structs (-fpack-struct)
[ACTION] Dans AVR C++ Compiler > Optimizations, décocher Short enums (-fshort-enums)
[ACTION] Dans AVR C++ Compiler > Optimizations, spécifier -ffunction-sections -fdata-sections dans le champ Other Optimization Flags

[ACTION] Dans AVR C++ Compiler > Language Standard, décocher char is unsigned (-funsigned-char)
[ACTION] Dans AVR C++ Compiler > Language Standard, décocher bitfields are unsigned (-funsigned-bitfields)
[ACTION] Dans AVR C++ Compiler > Language Standard, cocher Do not use Exceptions (-fno-exceptions)

A présent, il ne reste plus qu'a specifier au compilateur que l'on se lier avec la librarie Arduino :

[ACTION] Dans AVR C++ Linker > Libraries, dans la liste Libraries (-l), ajouter Arduino_Core_lib et m (m est une librairie ajoutée quasiment toujours par defaut. Elle permet de reduire la taille de l'executable)
[ACTION] Dans AVR C++ Linker > Libraries, dans la liste Libraries Path (-L), ajouter le chemin vers la librairie Arduino. Il faut prendre la librairie adequate en fonction de la configuration utilisée (Uno ou Nano). Pour ma part c'etait pour une Nano : ${workspace_loc:/Arduino_Core_lib/Nano}

[ACTION] Dans AVR C++ Linker > General, specifier -Wl,–gc-sections dans le champ Other Arguments

[ACTION] Appliquer les changements et valider

Il doit etre ensuite possible de compiler avec succes :

[ACTION] Compiler/Construire le projet.

13:37:31 **** Incremental Build of configuration Nano for project Arduino_Blink_A_LED ****
make all 
Building target: Arduino_Blink_A_LED.elf
Invoking: AVR C++ Linker
avr-gcc -s -Os -o"Arduino_Blink_A_LED.elf"  ./Arduino_Blink_A_LED.o   -lArduino_Core_lib -lm -lm -Wl,-Map,Arduino_Blink_A_LED.map,--cref -Wl,--gc-sections -L"D:\Utilisateurs\A127590\Workspaces\Eclipse-4.3.1-AVR-Arduino\Arduino_Core_lib\Arduino_Nano_v3" -mmcu=atmega328p
Finished building target: Arduino_Blink_A_LED.elf
 
Invoking: AVR Create Extended Listing
avr-objdump -h -S Arduino_Blink_A_LED.elf  >"Arduino_Blink_A_LED.lss"
Finished building: Arduino_Blink_A_LED.lss
 
Create Flash image (ihex format)
avr-objcopy -R .eeprom -O ihex Arduino_Blink_A_LED.elf  "Arduino_Blink_A_LED.hex"
Finished building: Arduino_Blink_A_LED.hex
 
Create eeprom image (ihex format)
avr-objcopy -j .eeprom --no-change-warnings --change-section-lma .eeprom=0 -O ihex Arduino_Blink_A_LED.elf  "Arduino_Blink_A_LED.eep"
Finished building: Arduino_Blink_A_LED.eep
 
Invoking: Print Size
avr-size --format=avr --mcu=atmega328p Arduino_Blink_A_LED.elf
AVR Memory Usage
----------------
Device: atmega328p

Program:    1082 bytes (3.3% Full)
(.text + .data + .bootloader)

Data:         11 bytes (0.5% Full)
(.data + .bss + .noinit)


Finished building: sizedummy

Remarques, Propositions d'améliorations, Questions

Vous pouvez poster vos remarques, propositions d'amelioration, et questions sur le forum, dans la discussion prévue a cet effet : http://fablab-robert-houdin.org/fablab/phpBB-3.0.11-fr/phpBB3/viewtopic.php?f=3&t=14


tuto_arduino_eclipse_la_librairie_arduino_avec_eclipse.txt · Dernière modification: 2013/10/31 13:23 par spelle