Identification de la carte Versa1
Selon ce qu'on souhaite réaliser comme application, on aura besoin de certaines fonctionnalités de la carte Fruit et pas d'autres ; a-t-on besoin d'un servo-moteur, d'une LED, de deux LED, de quatre potentiomètres… ? On va donc assembler ces fonctionnalités dans le programme qui sera mémorisé dans le micro-processeur. Cela se fait dans Pure Data et avec un simple éditeur de texte.
Pour présenter les premiers modules, nous supposerons réaliser une architecture simple, locale :
Ordinateur ↔carte Pied ↔carte Fruit Versa1 locale
mais les explications sont valides pour d'autres architectures.
Relier la carte Pied et la carte Fruit Versa1 par un câble en nappe.
Relier la carte Pied à l'ordinateur par un câble USB (USB type A mâle - USB type B mâle).
La LED rouge de la carte Pied, notée LED_G sur la carte, doit se mettre à clignoter.
Contrôle des cartes
Lancer Pd. Ouvrir un nouveau patch.
Ajouter une boîte objet pied/pied
. L'objet doit apparaître comme ceci
S'il apparaît comme ceci
cela signifie que Pd ne connaît pas les objets de l'environnement Fraise. Vérifiez le chemin dans les Préférences de Pd et vérifiez que le dossier Fraise est bien installé à ce chemin (voir Environnement logiciel).
S'il apparaît comme ceci
le port USB de l'ordinateur n'a pas été détecté, les explications suivantes vont aider à résoudre le problème.
Le premier paramètre de cet objet est le numéro du port USB que la carte Pied a pris lorsque vous l'avez connectée à l'ordinateur. Pour connaître ce numéro, cliquez sur le bouton vert utils
Puis sur list_serial_devices
qui va afficher les ports USB affectés. L'affichage apparaît dans Fenêtre-Fenêtre PD
. Sous Linux la carte Pied apparaîtra probablement avec le nom /dev/ttyACM0
. Le numéro du port figure sur la même ligne, ici le port est 0.
Si vous avez un doute vous pouvez essayer d'afficher les numéros de ports quand le câble USB est connecté et quand il est déconnecté. S'il n'y a pas de différence, il y a un problème.
Le deuxième paramètre est l'adresse d'un port service qui ne pourrait pas être utilisé par le système Linux, ici 54321 convient. Éditez l'objet pied/pied
pour y ajouter le numéro du port USB et cette adresse.
Dans la Fenêtre PD
, le numéro identifiant le pied apparaît, ainsi que dans l'objet pied/pied
, ici l'identifiant du Pied est 1. C'est ce numéro qui servira pour identifier la carte Pied et pour y faire référence. Ce numéro peut être modifié par utils
et set_ID
.
Dans votre document Pure Data, ajoutez une boîte objet fruit/fruit
qui devrait apparaître comme ceci :
Le premier paramètre de cet objet est l'identifiant de la carte Pied .
Le deuxième paramètre est le nom de la carte Fruit.
Le troisième paramètre est l'identifiant de la carte Fruit.
Vous définissez ces deux valeurs pour identifier la carte dans l'installation que vous êtes en train de réaliser. Vous devez seulement respecter les contraintes syntaxiques : le nom est une chaîne de caractères sans espace ; l'identifiant est une valeur numérique comprise entre 1 et 126. Le nom et l'identifiant ne sont pas des informations immuables, vous pourrez les modifier. Supposons que notre carte se nomme Fruit01 avec l'identifiant 1.
Le quatrième paramètre est la configuration de la carte. C'est le nom du dossier qui contient le programme de configuration. Nous étudierons ce programme dans la section suivante et nous l'appellerons pgmCI
.
Pour l'instant, nous avons inscrit le nom, l'identifiant et la configuration comme paramètres, mais ceux-ci ne sont pas encore effectifs. Nous allons d'abord construire le programme qu'il faudra mettre sur la carte.
Programmation du micro-processeur
Nous allons voir maintenant comment construire le programme du micro-processeur. Ce programme est construit en fonction de l'usage qu'on veut faire de la carte ; a-t-on besoin d'un moteur, d'une LED, etc. Ce programme indiquera, par exemple, qu'on utilise une LED sur le premier connecteur, un potentiomètre sur le deuxième connecteur et un servo-moteur sur le cinquième connecteur ; il définit les fonctionnalités de la carte. Le fait de se servir du potentiomètre pour contrôler la LED ou le servo-moteur, ou les deux, de façon linéaire ou avec un seuil, etc... sera réalisé dans un patch PureData ; ou plutôt dans des patchs Pure Data, car une fois les fonctionnalités de la carte définies, on peut imaginer plusieurs patchs les utilisant.
Pour ce premier programme de micro-processeur, on souhaite simplement que la carte envoie un message « Hello » de façon périodique et que la LED rouge de la carte puisse être contrôlée par un patch Pure Data.
Le programme de micro-processeur doit être dans un dossier situé au même endroit que le patch Pure Data.
enregistrez votre patch où vous le souhaitez ; dans notre exemple, nous le nommons
premierPatchFraise.pd.
au même endroit, créez un dossier portant le nom de votre application (simplifiez-vous la vie en évitant les caractères spéciaux et même les espaces ; nous le nommons ici
pgmCI.
)dans ce dossier, copiez les fichiers
config.h
etmain.c
qui se trouvent dans le dossierpd-externals/Fraise/fruit/examples/exampleFruit
Voici à quoi ressemble l'organisation de ces documents :
Le fichier config.h
contient quelques déclarations.
Le fichier main.c
contient le programme principal et donc l'assemblage de votre carte. Nous allons décrire les différentes parties de ce programme qui seront modifiées. Ouvrez le document main.c
avec un éditeur de texte et examinons quelques-unes des lignes de ce programme.
#define BOARD Versa1
Cette instruction va indiquer comment sont affectées les pattes du micro-processeur sur la carte Versa1.
#include <fruit.h>
Cette instruction inclut au programme les fonctions d'un fichier. À cet endroit, seront indiqués les modules utiles pour votre carte. Le module fruit.h
sera toujours présent puisqu'il contient les fonctions du fruit. D'autres modules pourront venir s'ajouter ; par exemple, servo.h
si vous utilisez un servo-moteur, analog.h
si vous utilisez une entrée analogique telle qu'un potentiomètre…
Le programme contient plusieurs fonctions. La fonction setup()
, comme son nom l'indique, permet d'initialiser certaines fonctionnalités de la carte. La fonction loop()
, comme son nom l'indique aussi, est une boucle qui sera infiniment répétée.
La fonction loop()
, la boucle infinie, se divise en deux parties : une partie exécutée le plus souvent possible et une partie exécutée à intervalles réguliers.
void loop(){
… // partie exécutée le plus souvent possible
if (delayFinished(mainDelay))
{
… // partie exécutée à intervalles réguliers
}
}
La partie exécutée le plus souvent possible contiendra les instructions liées à la communication et aux modules. La partie exécutée à intervalles réguliers contiendra plutôt les instructions concernant l'écoute et le traitement des composants connectés à la carte. A vérifier
Dans le programme d'exemple, la carte enverra un message Hello à intervalles réguliers (avec un compteur qui s'incrémentera à chaque message) et initialisera la LED rouge qui se trouve sur la carte. L'allumage de la LED pourra être contrôlé à partir du patch Pure Data.
En supprimant quelques lignes et en en modifiant certaines autres, réécrivez les fonctions setup()
et loop()
pour qu'elles contiennent ce qui suit (vous pouvez laisser les commentaires qui se trouvent derrière les caractères //) :
void setup(void) {
fruitInit();
pinModeDigitalOut(LED);
digitalClear(LED);
delayStart(mainDelay, 5000);
}
void loop() {
fraiseService();
if(delayFinished(mainDelay))
{
delayStart(mainDelay, 5000);
t2 = t2 + 1;
printf("Cs Hello ! t2=%d\n", t2);
}
}
Fonction setup()
:
fruitInit();
initialise le protocole de communication entre la carte Fruit et la carte Pied.
pinModeDigitalOut(LED);
associe la LED à une patte du micro-processeur.
digitalClear(LED);
éteint la LED au démarrage.
delayStart(mainDelay, 5000);
fixe le délai à 5 ms pour les actions exécutées à intervalles réguliers.
Fonction loop()
, partie exécutée le plus souvent possible :
fraiseService();
écoute des événements de communication du protocole Fraise.
Fonction loop()
, partie exécutée à intervalles réguliers :
delayStart(mainDelay, 5000);
réinitialisation du délai pour l'intervalle régulier à la même durée de 5 ms.
t2 = t2 + 1;
on incrémente un compteur auxiliaire qui sera affiché.
printf("Cs Hello ! t2=%d\n", t2);
on affiche Hello et le compteur auxiliaire.
Sauvegardez le document main.c.
Ce programme reflète le comportement souhaité pour la carte Fruit dans notre premier exemple : une carte qui permettra d'agir sur la LED et qui affichera un message. Il faut maintenant vérifier qu 'il est correctement écrit et l'inscrire dans la mémoire du micro-processeur.
Revenons au patch premierPatchFraise.pd
.
Dans l'objet fruit/fruit
, cliquez sur utils
.
Le bouton MAKE
permet de demander la compilation. La compilation vérifie l'exactitude syntaxique du programme et le transforme en programme binaire exécutable. Dans le dossier pgmCI
, un fichier pgmCI.hex
a été généré. Les éventuelles erreurs de compilation apparaissent dans la fenêtre PD
. Les erreurs de compilation ne relèvent pas de ce document ; vérifiez le programme.
Si la compilation est réussie, les tailles de la RAM (mémoire vive ; mémoire de travail) et de la ROM (mémoire morte ; mémoire non volatile) sont affichées ainsi que l'espace mémoire du micro-processeur. Cela permet de vérifier que le programme n'est pas trop gros pour être installé sur le micro-processeur.
Ce que nous avons présenté dans cette section sert à construire le programme installé dans le micro-processeur, c'est à dire les fonctionnalités de la carte. Dans ce premier exemple, les fonctionnalités de la carte Fruit sont plutôt réduites mais nous enrichirons cela lorsque nous présenterons les modules qui permettent de brancher des moteurs, servo-moteurs, capteurs...
Nommage, flashage et identification
Le flashage, l'identification et surtout le renommage ne sont pas des modifications anecdotiques qu'on réalise fréquemment. On écrira différents patchs utilisant la carte, parfois on devra changer son identifiant pour la brancher avec d'autre cartes (qui utiliseraient déjà cet ID), mais on modifiera plus rarement les fonctionnalités de la carte (son programme) et on modifiera encore plus rarement son nom. Ces informations (nom, identifiant, programme) sont mémorisés dans le micro-processeur.
Plaçons-nous dans le patch premierPatchFraise.pd
. Rappelons que pour l'instant, nous avons inscrit les paramètres de nom, d'identifiant et de configuration dans l'objet fruit/fruit
, mais que ces paramètres ne sont pas encore inscrits dans le micro-processeur. Pour nommer effectivement le micro-processeur de la carte, cliquez sur utils
de la carte Fruit.
Pour effectuer le nommage, on clique sur RENAME
et dans les 10 secondes qui suivent, il faut réaliser une réinitialisation de la carte, c'est à dire un reset. Pour faire le reset, court-circuitez temporairement les deux broches RST
de la carte Fruit à l'aide d'un petit tournevis.
Donc cliquez sur RENAME
et dans les 10 secondes qui suivent, appliquez le tournevis sur les broches RST
et retirez-le.
Pendant que vous prenez le tournevis, l'attente s'affiche dans la fenêtre PD. Si vous dépassez le délai maximum, le renommage sera abandonné ; la réussite du renommage apparaît comme ceci:
Avec le bouton MAKE
, vous avez construit un programme exécutable. Le bouton PROGRAM
transfère ce programme exécutable dans la mémoire du micro-processeur.
Pour le tout premier programme que vous inscrivez dans le micro-processeur, vous devez effectuer un reset (par la suite le reset sera lancé automatiquement par le programme déjà en place). La barre de défilement indique la progression du transfert et devient verte si le transfert s'est bien déroulé.
Donc cliquez sur PROGRAM et, à l'aide du tournevis, faites le reset.
Une fois que le programme est installé, cliquez sur ASSIGN
afin d'attribuer l'identifiant au micro-processeur.
Pour vérifier si la carte Pied reconnaît bien la carte Fruit, on peut cocher la case on
; si les cartes sont en communication, on obtient
Pour l'instant, nous pouvons décocher la case on
.
Par la suite, si vous désirez modifier les fonctionnalités de la carte, modifiez le programme dans main.c
; compilez-le avec la commande MAKE
et transférez-le avec la commande PROGRAM
. Il n'est plus nécessaire de faire de reset, sauf si le programme que vous avez installé est erroné et "plante"! Dans ce cas le reset vous sauvra.
Si vous désirez changer le nom du micro-processeur, modifiez le nom dans le patch Pd, puis cliquez sur RENAME
et faites le reset dans les 10 secondes.
Si vous voulez changer l'identifiant, modifiez-le dans le patch, puis cliquez sur ASSIGN
.