Lors du dernier meeting HZV, Mandarine a présenté le TI Launchpad, un circuit d'expérimentation réalisé par TI et basé sur un micro-contrôleur MSP430. J'avais auparavant entendu parler d'Arduino, et même eu dans les mains un Arduino prêté par l'ami Tixlegeek, mais j'hésitais à en acheter un. Et je dois avouer que le MSP430 m'a fait craquer.
Arduino vs. TI Launchpad
Lorsque Mandarine a présenté le TI Launchpad, je m'attendais à quelque chose d'un peu roots, et je n'ai pas été déçu. Contrairement à l'Arduino, le Launchpad ne possède aucun module d'extension officiel (ce qu'on nomme shields chez Arduino), et il faut donc tout concevoir. Cette approche me plaît plus qu'avec Arduino, car cela nécessite une documentation et un effort de la part de celui qui veut concevoir un circuit basé sur un MSP430. Mais c'est vrai que cela peut faire peur. Toutefois, mis à part cet aspect rustique de la board de TI, plusieurs éléments m'ont séduit.
Le premier d'entre eux est l'existence de plusieurs packages Debian et Ubuntu offrant la possibilité de développer en C et même en C++ sur MSP430, en s'affranchissant royalement d'une surcouche, contrairement à Arduino où il faut employer l'IDE Arduino et la couche Arduino, qui n'améliore pas les performances. Ces outils sont opensource, et dérivés des outils standards GNU comme binutils et gcc. J'aime.
Second point, le prix. C'est idiot, mais à 4 dollars et 30 cents le TI Launchpad, cela vaut vraiment le coup. Sans compter qu'un MSP430 de rechange est fourni (si vous grillez celui installé sur la board), ainsi que des contacteurs et un micro-quartz que l'on peut souder pour améliorer la stabilité de l'horloge. Et un cordon USB. Pour seulement un peu plus de 4 dollars. Comparé aux 20 et quelques euros réclamés pour un Arduino UNO, c'est très intéressant.
J'ai donc décidé d'en commander deux, pour voir exactement ce que c"est et comment cela pourrait me servir dans mes projets hardware. Et je viens de les recevoir.
Unboxing du TI Launchpad
Je dois avouer que tout cela est très bien packagé: une belle boîte (quoique, dans mon cas recouvertes d'étiquettes en tout genre), une présentation soignée, et des stickers de surcroît !
Installation de la toolchain
La toolchain est en réalité un ensemble d'outils permettant de développer et compiler des programmes pour le MSP430 du Launchpad. Heureusement, plusieurs paquets existent pour les distributions Debian et Ubuntu:
msp430-gcc msp430-libc mspdebug
Mais en réalité, ces paquets ne sont disponibles que sur Ubuntu 10.10 ou Debian sid (testing). Or ma distribution de choix est Squeeze (Debian 6.0), et ces paquets ne sont pas compatibles. J'ai bien essayé de les installer à la barbare, mais rien n'y fait. Pas le choix donc que de trouver une solution alternative: la compilation from scratch.
Pour les heureux possesseurs d'une Debian Squeeze qui souhaiteraient comme moi tester le Launchpad de TI et son MSP430, je vous livre dans les lignes suivantes la technique pour installer proprement et correctement la toolchain, testé et approuvé.
L'outil msp430-gcc est en réalité une version modifiée du célèbre compilateur GNU GCC, et un projet créé par des adorateurs ultimes du MSP430 a été créé de manière à fournir aux libristes un moyen de créer cette toolchain: j'ai nommé le projet mspgcc. Ce projet contient un ensemble de patches à appliquer à des versions publiées et stables d'outils GNU (comme binutils et gcc) afin d'obtenir des binaires permettant de compiler des programmes pour MSP430.
Avant toute chose, il faut passer root sur sa machine, et créer un dossier dédié à la construction de la toolchain:
$ su - # mkdir msp430 # cd msp430
On s'assure ensuite d'avoir tous les paquets nécessaires à la compilation:
msp430:/# apt-get install libmpfr-dev libncurses5-dev zlibc zlib1g-dev libx11-dev libusb-dev libreadline6-dev libgmp3-dev libmpc-dev make
Ensuite, on récupère la version LTS (Long-Term Support) de mspgcc :
msp430/:# wget -O mspgcc.tar.bz2 http://downloads.sourceforge.net/project/mspgcc/mspgcc/mspgcc-20120406.tar.bz2?r=&ts=1359415411&use_mirror=ignum msp430/:# tar xvjf mspgcc.tar.bz2 msp430/:# mv mspgcc-20120406 mspgcc msp430/:# cd mspgcc msp430/mspgcc/:#
On jette un oeil aux versions des logiciels requis pour les patches:
msp430/mspgcc/:# ls -Al drwxr-sr-x 2 root root 4096 6 avril 2012 docs drwxr-sr-x 4 root root 4096 6 avril 2012 htdocs -rw-r--r-- 1 root root 342378 6 avril 2012 msp430-binutils-2.21.1a-20120406.patch -rw-r--r-- 1 root root 390548 6 avril 2012 msp430-gcc-4.6.3-20120406.patch -rw-r--r-- 1 root root 382048 6 avril 2012 msp430-gdb-7.2a-20111205.patch -rw-r--r-- 1 root root 9 6 avril 2012 msp430-libc.version -rw-r--r-- 1 root root 9 6 avril 2012 msp430mcu.version -rw-r--r-- 1 root root 2955 6 avril 2012 README -rw-r--r-- 1 root root 52679 6 avril 2012 RELEASES.TXT
Cette version de mspgcc se base sur la version 2.21.1a de binutils, la version 4.6.3 de gcc et la version 7.2a de gdb. On télécharge ces logiciels sous forme d'archive de code source dans le dossier courant:
msp430/mspgcc/:# wget ftp://ftp.gnu.org/pub/gnu/binutils/binutils-2.21.1a.tar.bz2 msp430/mspgcc/:# wget ftp://ftp.gnu.org/pub/gnu/gcc/gcc-4.6.3/gcc-4.6.3.tar.bz2 msp430/mspgcc/:# wget ftp://ftp.gnu.org/pub/gnu/gdb/gdb-7.2a.tar.bz2
Et on les décompresse dans le dossier courant:
msp430/mspgcc/:# tar xvjf binutils-2.21.1a.tar.bz2 msp430/mspgcc/:# tar xvjf gcc-4.6.3.tar.bz2 msp430/mspgcc/:# tar xvjf gdb-7.2a.tar.bz2
On applique ensuite les patches du projet mspgcc. Attention, cette étape est cruciale, si vous l'oubliez la suite ne fonctionnera pas !
msp430/mspgcc/:# cd binutils-2.21.1 msp430/mspgcc/binutils-2.21.1/:# patch -p1 < ../msp430-binutils-2.21.1a-20120406.patch msp430/mspgcc/:# cd ../gcc-4.6.3/ msp430/mspgcc/gcc-4.6.3/:# patch -p1 < ../msp430-gcc-4.6.3-20120406.patch msp430/mspgcc/:# cd ../gdb-7.2/ msp430/mspgcc/gdb-7.2/:# patch -p1 < ../msp430-gdb-7.2a-20111205.patch msp430/mspgcc/gdb-7.2/:# cd ..
Avant de commencer à construire la toolchain, il faut au préalable créer un dossier de destination dans lequel on installera les binaires. J'ai opté pour /opt/msp430, mais libre à vous de choisir le nom et l'emplacement qui vous plaît.
msp430/mspgcc/:# mkdir /opt/msp430 msp430/mspgcc/:# export BUILD=/opt/msp430
On configure et on compile les binutils:
msp430/mspgcc/:# cd binutils-2.21.1 msp430/mspgcc/binutils-2.21.1/:# ./configure --target=msp430 --prefix=$BUILD msp430/mspgcc/binutils-2.21.1/:# make && make install msp430/mspgcc/binutils-2.21.1/:# cd ..
On configure et on compile gcc:
msp430/mspgcc/:# cd gcc-4.6.3 msp430/mspgcc/gcc-4.6.3/:# mkdir gcc-build msp430/mspgcc/gcc-4.6.3/gcc-build/:# ../configure --target=msp430 --enable-languages=c,c++ --prefix=$BUILD msp430/mspgcc/gcc-4.6.3/gcc-build/:# make && make install
Et pour terminer, on configure et on compile gdb:
msp430/mspgcc/:# cd gdb-7.2 msp430/mspgcc/gdb-7.2/:# ../configure --target=msp430 --prefix=$BUILD msp430/mspgcc/gdb-7.2/:# make && make install
Les outils de compilation ont été installés dans le dossier /opt/msp430 (ou celui que vous avez paramétré). Il ne reste plus qu'à installer la libc compilée pour le MSP430 et les entêtes. Pour cela, il faut récupérer sur le site du projet les fichiers suivants:
msp430mcu-20120716.tar.bz2 msp430-libc-20120716.tar.bz2
La compilation de la libc nécessite que le binaire msp430-gcc, produit lors de la compilation de gcc pour msp430, soit accessible dans le PATH:
msp430/:# export PATH=$*PATH*:$BUILD/bin
On peut ensuite décompresser la libc, la configurer, la compiler et l'installer:
msp430/:# tar xvjf msp430-libc-20120716.tar.bz2 msp430/:# cd msp430-libc-20120716 msp430/msp430-libc-20120716/:# ./configure --prefix=$BUILD msp430/msp430-libc-20120716/:# cd src msp430/msp430-libc-20120716/src:# make && make install msp430/msp430-libc-20120716/src:# cd ../../
Et terminer par l'installation des entêtes de développement:
msp430/:# tar xvjf msp430mcu-20120716.tar.bz2 msp430/:# cd msp430mcu-20120716 msp430/msp430mcu-20120716/:# export MSP430MCU_ROOT=$(pwd) msp430/msp430mcu-20120716/:# scripts/install.sh $BUILD
Bon, voilà une bonne chose de faite ! On a installé gcc, gdb, la libc et les entêtes de développement. Nous allons aussi modifier le fichier /etc/profile pour qu'il prenne en compte nos binaires créés. Pour cela on l'édite, et on ajoute la ligne suivante à la fin du fichier:
export PATH=$*PATH*:/opt/msp430/bin
On recharge ensuite notre profil:
# source /etc/profile
Installation de mspdebug
Mspdebug est l'outil nécessaire pour programmer et déboguer le MSP430. Il s'agit encore une fois d'un projet opensource, que l'on va installer sur notre machine. Téléchargez la dernière version sur Sourceforge, puis installez-la:
msp430/:# tar xvzf mspdebug-0.21.tar.gz msp430/:# cd mspdebug-0.21/ msp430/mspdebug-0.21/:# ./configure && make && make install
Configuration d'UDEV
Afin que notre Launchpad soit détecté par USB, il faut s'assurer qu'une règle est bien présente dans la configuration d'UDEV. Si elle n'y est pas, il faut la créer:
# cat /etc/udev/rules.d/46-launchpad.rules ATTRS*idVendor*=='0451',ATTRS*idProduct*=='f432',MODE='0660',GROUP='plugdev'
Une fois cela effectué, vous pouvez vous amuser avec votre launchpad. Vous trouverez notamment un programme exemple sur Hack a Day, et la manière de programmer le MSP430 avec mspdebug. Je ferai certainement un prochain billet sur le développement sur Launchpad.
Bon, pour la route je vous donne mon Helloworld:
int main(void) {
/* disable watchdog */
WDTCTL = WDTPW + WDTHOLD;
P1DIR = BIT0|BIT6;
P1OUT = BIT6;
while(1) {
if ((P1IN & BIT3)==BIT3)
P1OUT = BIT6;
else
P1OUT = BIT0;
}
}
Et mon Makefile:
CC=msp430-gcc CFLAGS=-Os -Wall -g -mmcu=msp430g2231 OBJS=main.o all: $(OBJS) $(CC) $(CFLAGS) -o main.elf $(OBJS) %.o: %.c $(CC) $(CFLAGS) -c $< clean: rm -fr main.elf $(OBJS)
Conclusion
Le Launchpad de TI est tout à fait valable, car pas cher et quand même très bien fourni avec son MSP430. Certes, cela nécessite plus de travail qu'avec un Arduino, mais c'est un peu comme avec Linux, on a plus de contrôle sur le système et on peut donc en faire exactement ce que l'on veut. Une philosophie que j'apprécie tout particulièrement. Testez, découvrez, bidouillez avec le Launchpad de TI.