Tutoriel: Développement Arduino avec AVR Studio 5.1

Ce tutoriel est une traduction et adaptation de cet excellent tutoriel en anglais.

Il s'adresse à ceux qui comme moi trouvent l'environnement de développement Arduino un peu trop rudimentaire et qui souhaiteraient profiter de tous les avantages d'un vrai IDE avec leur Arduino.

 

Introduction

AVR Studio 5.1 est un Environnement de Développement Intégré (ou IDE en anglais).

Il est destiné à la programmation de tous les microcontrôleurs AVR. Il intègre la chaine d'outils avr-gcc ainsi qu'un émulateur d'AVR permettant de débugguer ses programmes (dans une certaine mesure).

L'environnement est basé sur Microsoft Visual Studio.

 

Malheureusement sa prise en main pour développer avec l'Arduino et ses librairies est fastidieuse.

Mais l'effort en vaut la chandelle dès qu'on doit travailler sur des projets un peu conséquents.

 

Pourquoi changer d'environnement de développement?

L'IDE Arduino fait tellement de choses automatiquement qu'il est quelque peu limitant pour des développeurs expérimentés. Tous les warnings du compilateur sont désactivés, sans même une option pour pouvoir les activer!

Au delà de ça, il n'y a aucune possiblité de débuggage (Excepté Serial.println(), aux possibilités limitées).

L'IDE Arduino n'offre pas non plus beaucoup de flexibilité dans la configuration et les options de compilation des projets.

 

AVR Studio va très au-delà de ces limitations.

Mais il n'est configuré par défaut que pour du C/C++ pur et nécessite un peu de configuration, décrite ci-après, pour pouvoir utiliser les nombreuses librairies développées pour l'Arduino tout en profitant d'un véritable IDE.

 

Préparation d'AVR Studio et de la librairie Arduino core

1) Ce tutoriel suppose que vous avez déjà installé AVR Studio.

 

2) Ensuite il faut donner à AVR Studio accès à la librairie Arduino core, qui est cachée par défaut par l'IDE Arduino.

Pour cela, prenez le projet Arduino que vous cherchez à convertir (ou tout autre projet Arduino) et compilez-le.

Ensuite, dans votre dossier utilisateur Windows, ouvrir le dossier LocalSettings puis temp.

Sur Windows XP le chemin est par exemple : C:\Documents and Settings\<nom utilisateur>\Local Settings\Temp

Sur Vista ou Windows 7 il devrait être quelque chose comme C:\Users\<nom utilisateur>\AppData/Local\Temp

 

Note: le dossier AppData est caché par défaut. Si besoin, le rendre visible via Eplorateur Windows->”Dossiers et Options de Recherche ”->”Vue- >”Afficher les fichiers et dossiers cachés”

 

3) Rechercher un dossiere nommé “buildxxxxxxxx.tmp” où “xxxxxxxxx” est un une longue suite de chiffres.

C'est là que l'IDE Arduino stocke les fichiers compilés, avant de les flasher dans l'Arduino.

Le fichier à rechercher s'appelle "core.a", c'est la librairie core arduino.

Copier et coller ce fichier à un endroit facilement reconnaissable, tel que dans C:\arduino\ par exemple.

Ensuite, renommer "core.a" en "libcore.a" afin qu'AVR Studio le reconnaisse comme une librairie standard.

 

Note: Si vous changez de micro-contrôleur il vous faudra re-générer core.a dans l'Arduino IDE et répéter l'opération de copie.

 

4) Si vous convertissez un projet de nom <MonProjet> par exemple, ouvrez le fichier nommé MonProjet.cpp qui se trouve dans le dossier buildxxxxxxxx.tmp dans un éditeur de texte. Vous allez bientôt le copier/coller dans votre projet AVR Studio.

 

5) Bien! Vous êtes prêt à changer d'environnement.

Ouvrez AVR Studio et créez un nouveau projet de type exécutable C++.

Pensez à le nommer dans l'assistant car il est pénible de le renommer après coup.

 

6)Copiez/collez le code .cpp ouvert à l'étape 4) dans le fichier main.cpp du projet AVR Studio.

 

Note: Vous pouvez aussi copier/coller le code source du sketch  directement depuis l'IDE Arduino.

La première option est plus simple, et recommandée, car le fichier .cpp inclut les prototypes de fonctions que l'IDE Arduino génère automatiquement pour vous, sinon vous devez les ajouter vous-même.

Si ces prototypes de fonction ne sont pas présent, le compilateur se plaindra avec des erreurs de type "not declared in this scope".

Ajouter les prototypes des fonctions créées est très simple quand on y est abitué et peut vraiment faciliter la vie sur des gros projets, où la génération automatique peut poser problème.

Vous devrez aussi ajouter #include "WProgram.h" s'il n'est pas déjà là, où "Arduino.h" à la place si vous utilisez la plateforme Arduino 1.0 ou plus.

 

Configuration du compilateur et de l'éditeur de liens (linker)

compiler symbols

 

1)  Il faut maintenant s'attaquer à la configuration du compilateur et du linker.

Aller dans “Project”->”<ProjectName> Properties” (or taper Alt-F7), puis cliquer sur  “Toolchain”.

Dans le menu de gauche, dans  “AVR/GNU C++ Compiler”, cliquer sur  “Symbols”.  Il faut définir la vitesse du CPU. Pour 16 MHz, ajouter "F_CPU=16000000L" à  “Defined symbols” (e.g. F_CPU=8000000L pour un processeur à 8Mhz, etc).

Ajouter un symbole avec la version de votre plateforme Arduino.

Généralement c'est "ARDUINO=100"

 

2) Ensuite, cliquer sur  “Directories” immediatement sous “Symbols”

tc comp directories

Ajoutez le dossier où se trouve le code source core de votre plateforme Arduino, qui se trouve dans le dossier d'installation de l'IDE Arduino (par exmple: D:\arduino\arduino-1.0\hardware\arduino\cores\arduino )

Faire attention à ce que les chemins ne soient pas relatifs.

 

3) Ajoutez aussi les dossiers des librairies que vous comptez utiliser dans votre projet.

 

4) Cliquez sur “Optimization” immediatement sous “Directories”

tc comp optim

 

Choisir   “Optimize for size” sous “Optimization Level“. 

Ajouter "-fdata-sections" sous “other optimization flags”, et cocher la case “prepare functions for garbage collection”

Ensuite cliquer sur  “Miscellaneous” dans la même liste et ajouter  “-fno-exceptions” au champ  “Other flags”

Il faut se souvenir que l'IDE Arduino désactive toutes les optimisations. vous pouvez laisser tous les autres choix par défaut dans  “Optimization” car ils sont susceptibles d'améliorer la taille de l'exécutable, mais si vous avez des problèmes de compilation, vous pouvez les décocher.

 

5) Toujours dans les options de l'onglet "Toolchain", aller dans “AVR/GNU C++ Linker”->”Libraries”->”Library Search Path” et ajouter le chemin vers la librairie libcore.a que vous avez renommée et copiée précédemment (chez moi elle est dans D:\arduino):

 

tc linker libs

 

6) Cliquez sur “AVR/GNU C++ Linker”->“Optimization”, et cocher la case  “Garbage Collect unused sections (-Wl, –gc-sections)”.  Ceci fait en sorte que le linker élimine le code non utilisé des librairies lors de la phase d'édition des liens, afin de réduire la taille du code flashé dans l'Arduino.  

tc linker optim

 

7) Sous  “Optimization”, cliquer sur  “Miscellaneous”, et ajouter  “-Wl,-lcore  -Wl,-lm” au champ  “Other linker flags” field.  Ceci dit au compilateur de lier libcore.a ainsi que libm.a, la librairie mathématique d'avr-gcc, requise par certaines fonctions de l'Arduino.

 

 

8) Une dernière chose. Maintenant que le compilateur est configuré correctement il reste à ajouter à votre projet les fichiers .cpp de toutes les librairies utilisées dans votre projet.

Pour ce faire, allez dans  “Project”->”Add Existing Item”, et ajouter les librairies (.cpp) Arduino core

Sélectionnez les, mais au lieu de cliqher  “Add”,  cliquer sur la petite flèche à côté puis sur  “Add as link”

Vous remarquez que le fichier apparait dans votre Solution Eplorer avec une petite icône de raccourci à côté.

Vous devez faire ceci au moins pour Print.cpp, WString.cpp, et HardwareSerial.cpp si vous les utilisez,

ainsi que pour toutes les autres librairies core ou toute autre librairie utilisée par votre projet.

 

Je ne sais pas pourquoi AVR Studio vous oblige à inclure ces en-têtes, lier les fichiers dans le compilateur et les lier dans le projet, mais c'est un fait... Si quelqu'un a une meilleure solution, il est le bienvenu.

 

solution_explorer.png

 

Sélectionner le type de micro-contrôleur

Dans l'onglet "Devices", sous "Toolchain", sélectionner le micro-contrôleur utilisé.

Pour un Arduino c'est souvent un ATMega328P

 

device-copie-1.png

Compiler votre projet

Enfin!

A ce stade, votre environnement de développement devrait être prêt.

Appuyez sur F7 pour construire votre solution et surveillez le résultat.

Si c'est OK, vous avez de la chance .

Sinon regardez les erreurs produites pour voir s'il y a un problème avec le code ou bien avec le linker.

Vous remarquerez aussi certainement tout un tas de warnings de compilation, que l'IDE Arduino vous cachait auparavant. Ces warnings ne vont pas nécessairement faire planter votre programme, mais ils le pourraient.

Les éliminer est une bonne pratique.

Il y a quelques warnings générés par les librairies Arduino core. Si vous êtes téméraire vous pouvez en modifier le code mais ça fonctionnera tout de même très bien sans y toucher.

 

Configurer AVRDude pour flasher votre code compilé

1)  Une fois le code compilé avec succès, il reste à le flasher.

Fort heureusement vous pouvez le faire en utilisant les mêmes outils qu'avec l'IDE Arduino. Arduino utilise l'utilitaire avrdude pour flasher via le port série, et nous ferons le même dans AVR Studio, moyennant un peu de configuration.

Cliqer sur  “Tools”->”External Tools…”, puis cliquer sur  “Add” dans la fenêtre popup.

 

2) Si vous utilisez un câble USB vers Série comme la plupart des cartes Arduino, notez quel COM port est utilisé est choisissez un titre du genre "AVRDude COM10".

 

avrdude_conf.png

 

3) Dans le champ “Command”, mettre le chemin vers  avrdude.exe dans votre installation de l'environnment Arduino.

Vous devriez avoir quelque chose comme ceci: D:\arduino\arduino-1.0\hardware\tools\avr\bin\avrdude.exe

 

4) Dans “Arguments”, coller cette ligne: 

-C D:\arduino\arduino-1.0\hardware\tools\avr\etc\avrdude.conf  -p atmega328p -c arduino -P COM10 -b 57600 -D -U flash:w:"$(ProjectDir)Debug\$(ItemFileName).hex":i

 

Modifier le chemin pour pointer vers votre installation d'Arduino et changer le port COM, chip target, et baud rate si nécessaire (ATMega328′s requiert  57600 baud, les anciens  ATMega168′s requièrent 19200). 

Les autres flags sont les mêmes que ceux utilisés par l'IDE Arduino.  Le flag  “-v” contrôle le niveau de verbosité – vous pouvez jouer avec ce paramètre.  Vous pouvez mettre jusqu'à quatre “-v” (ce qui trace chaque octet transmis!), mais deux 'v' produisent suffisamment d'informations. 

 

Note: Si vous avez des problèmes avec cette étape, retournez dans l'IDE Arduino et flasher un projet en mode verbeux en maintenant la touche Maj enfoncée pendant que vous cliquez sur le bouton "Upload". Ca va provoquer l'affichage de toutes les lignes de commandes utilisées dans la fenêtre d'état et vous verrez ainsi exactement quelle commande votre système utilise pour invoquer avrdude.exe.

 

Il est aussi très pratique de cocher la case “Use Output window” afin de pouvoir voir les résultats de l'oppération de flashage. Sinon AVRDude ouvrira une fenêtre de commande et la refermera automatiquement une fois l'opération terminée..

Flash!

Enfin! Retournez à votre projet et cliquez sur le menu “Tools”. Il devrait maintenant y avoir un nouveau item de menu pour votre "AVRDude". Assurez-vous que votre Arduino est connecté à votre ordinateur, puis cliquez sur cet item de menu. Vous devriez voir AVRDude se lancer dans l"output window, puis voir des données passer pendant le transfert vers l'Arduino. Recherchez le  message  “AVRDude is done. Thank you!” indiquant un flash réussi.

 

avrdude_result.png

 

Une large part de ce travail de préparation n'est à faire que la première fois.

Vous devrez paramétrer la toolchain pour chaque nouveau projet, mais maintenant que vous avec les librairies core Ardiono et un peu de pratique, les choses devraient être beaucoup plus rapide pour les autres projets.

La configuration de AVRDude est universelle et peut-être utilisée pour tous  les projets.

 

Vous avez réussi!

Vous avez maintenant un Arduino avec un projet fonctionnel, et une montagne de nouvelle possiblités de développement devant vous.

 

Le simulateur d'AVR est une aide précieuse pour les projets complexes.

Et vous pouvez aussi maintenant mélanger du code Arduino avec du code avr-libc comme vous le souhaitez.

 

Pour terminer

Dans certaines situations, votre build pourrait produire des erreurs ‘cxa_pure_virtual()’ .  

C'est dû à une fonction de gestion d'erreur manquante pour les fonctions virtuels pures C++. Mais nous pouvons la fournir nous-mêmes:

Ajouter extern "C" void __cxa_pure_virtual() { while (1); } à votre fichier source principal.

Cette fonction ne fait pas grand chose, mais ces erreurs peuvent être ignorées sans problème, aussi nous ne fournissons qu'une fonction vide pour satisfaire le compilateur. Vous pourriez aussi placer cette fonction dans un fichier  "pure_virtual.cpp" puis l'inclure dans chaque projet.

Présentation

Partager

Calendrier

Décembre 2014
L M M J V S D
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
<< < > >>
Créer un blog gratuit sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus - Articles les plus commentés