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 ! <code> 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) </code> 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'' : <code c> /* 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 } </code> 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. <code> 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 </code> ---- ===== 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