dimanche 29 janvier 2012

Faire clignoter des LEDs avec le Launchpad (MSP430)

Voici un petit exercice d'exploration de mon nouveau Launchpad de Texas Instruments:  faire clignoter 6 LEDs l'une à la suite de l'autre, question de comprendre comment modifier l'état de chaque sortie numérique du microcontrôleur.

Je dois dire que je suis encore à la recherche d'une source de documentation qui m'expliquerait clairement les bases de la programmation de mon Launchpad.  Le site de TI explique comment le commander et comment installer les logiciels, et ensuite ça devient plutôt confus.  Les tutoriels sur internet  ne sont pas si nombreux, et réfèrent parfois à des fichiers qui ne sont plus disponibles sur le site de TI!

Le Launchpad MSP430 est muni d'entrées-sorties numériques numérotées P1.0 à P1.7, puis P2.0 à P2.5 .  Mon but était de faire clignoter l'une après l'autre 6 LEDs branchées aux ports P1.0 , P1.1 , P1.2 , P1.3, P1.4, et P2.5.

Dans un premier temps, il faut activer les sorties.  Sur Arduino, il s'agit d'écrire "pinMode(13, OUTPUT);" si on veut, par exemple, que le port numérique numéro 13 soit défini comme une sortie.

Pour le MSP430, c'est un petit peu plus compliqué:  les 8 sorties de la sortie P1 dépendent de l'état de chaque bit d'un nombre binaire stocké dans la variable P1DIR:

  • Si P1DIR vaut 00000000, alors tous les ports P1 sont des entrées.
  • Si P1DIR vaut 00000001, alors seul le port P1.0 est une sortie.
  • Si P1DIR vaut 00000010, alors seul le port P1.1 est une sortie.
  • Si P1DIR vaut 00001111, alors les ports P1.0 , P1.1, P1.2  et P1.3 sont des sorties.
C'est le même principe pour régler l'état (haut ou bas de chaque sortie).  Sur Arduino, on écrit "digitalWrite(13, HIGH);" ou ""digitalWrite(13, LOW);".  Sur le Launchpad, on règle à 0 ou 1 chaque bit d'un nombre binaire:
  • Si P1OUT vaut 00010000, alors le port P1.4 est haut, tous les autres sont bas
  • Si P1OUT vaut 11111111 alors tous les ports P1 sont hauts
  • Si P1OUT vaut 10101010 alors les ports P1.1, P1.3, P1.5 et P1.7 sont hauts.
Mais dans le programme, ce nombre doit être écrit en hexadécimal (du moins je n'ai pas trouvé de façon d'utiliser directement la version binaire).  Pour ce faire, on peut utiliser un des nombreux convertisseurs disponibles sur le web.  Ainsi, pour allumer la LED reliée à P1.0, le nombre binaire 00000001 devient 0x01.  Pour allumer la LED reliée à P1.4, le nombre binaire 00010000 devient 0x10...

L'avantage, c'est qu'on peut déterminer l'état des 8 ports en même temps au moyen d'une directive très courte.  L'inconvénient (irritant majeur en ce qui me concerne), c'est que l'écriture et la lecture du programme par un être humain devient assez arride.

Quand je programme mon Arduino, ou quand je lis un sketch Arduino réalisé par quelqu'un d'autre, j'ai l'impression de lire des instructions en Anglais qui ne sont pas très éloignées de la communication humaine:
        digitalWrite(13, HIGH);
        delay(1000);
        digitalWrite(13, LOW); 
        delay(1000); 
...Un peu comme si je disais à quelqu'un "SVP, pourrais-tu allumer la lumière numéro 13?  Attend un peu... Maintenant, éteint-là, et attend encore...

Alors que P1OUT = 0x10; suivi d'une instruction de calcul répétitif car il n'existe même pas de fonction "delay", ça me semble beaucoup moins clair...

Je continue donc d'en arriver à la même conclusion:  je préfère mon Arduino!

Ci-dessous, mon programme complet pour faire clignoter 6 LEDs:




/****************************************************************
6 LEDs clignotent en alternance.
*****************************************************************/

#include  

void delai(void)
 {
    volatile unsigned int i;
    i = 50000;        // Delai
    do (i--);
    while (i != 0);
 }


void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;         // Stop watchdog timer

  P1DIR |= 0xFF;  // toutes les sorties 1.x sont output car FF 
                  // est l'équivalent de 11111111
  P2DIR |= 0xFF;  // toutes les sorties 2.x sont output car FF 
                  // est l'équivalent de 11111111
    
  for (;;)
  {
    
    P1OUT = 0x01;       // Équivalent de 00000001  Seule la sortie 
                        // 1.0 est haute, les autres sont basses
    P2OUT = 0x00;       // Toutes les sorties 2.x sont basses
    delai();

    P1OUT = 0x02;       // Équivalent de 00000010  Seule la sortie 
                        // 1.1 est haute, les autres sont basses
    P2OUT = 0x00;       // Toutes les sorties 2.x sont basses
    delai();

    P1OUT = 0x04;       // Équivalent de 00000100  Seule la sortie 
                        // 1.2 est haute, les autres sont basses
    P2OUT = 0x00;       // Toutes les sorties 2.x sont basses
    delai();

    P1OUT = 0x08;       // Équivalent de 00001000  Seule la sortie 
                        // 1.3 est haute, les autres sont basses
    P2OUT = 0x00;       // Toutes les sorties 2.x sont basses
    delai();
    P1OUT = 0x10;       // Équivalent de 00010000  Seule la sortie 
                        // 1.4 est haute, les autres sont basses
    P2OUT = 0x00;       // Toutes les sorties 2.x sont basses
    delai();
    P1OUT = 0x00;       // Toutes les sorties 1.x sont basses
    P2OUT = 0x20;       // La sortie 2.5 est haute
    delai();
                  
  }
}








Yves Pelletier (Twitter: @ElectroAmateur)

mardi 24 janvier 2012

Le Launchpad de TI, suite: réception et installation

J'ai bien reçu les deux exemplaires du Launchpad de Texas Instruments dont je parlais il y a quelques jours, livrés en moins de 48 heures par les bons soins de la compagnie FedEx.  Comme c'est toujours le cas avec ces services de messagerie, le livreur vient sonner à ma porte pendant que je suis au travail (donc absent de chez moi), et laisse une note à ma porte pour m'aviser qu'il me reste 5 jours pour aller récupérer le colis à un nébuleux comptoir situé à 20 km de chez moi, ouvert essentiellement pendant mes heures de travail, dans un quartier où je ne vais jamais...  (Si le colis avait été expédié par la poste, je l'aurais récupéré dans une boîte postale située à 30 secondes de marche de mon domicile).

J'ai eu le privilège de recevoir la toute nouvelle version du Launchpad, disponible depuis quelques semaines seulement, qui est accompagnée de deux microntrôleurs plus performants que ceux qui venaient avec la version précédente (les modèles MSP430G2553 et MSP430G2452), et doté de connecteurs mâles déjà soudés à la carte.  Oui:  des connecteurs mâles, donc pas question d'y brancher des shields pour Arduino.

Étape suivante:  télécharger le logiciel de développement Code Composer Studio.  C'est gratuit, mais il faut d'abord promettre que nous n'utiliserons pas le logiciel pour collaborer avec les cubains ou les iraniens!  Ils sont un peu paranos, chez Texas Instruments, je crois...

J'ai fait l'erreur de démarrer l'installation de la version complète de Code Composer Studio version 5.  Quelques minutes plus tard, j'ai vu qu'on me conseillait plutôt une version limitée de la version 4.  Trop tard:  l'installation ne pouvait pas être interrompue; elle s'est terminée plus de deux heures plus tard, occupant beaucoup trop d'espace sur mon disque dur!  Désinstallation de la version trop gourmande, installation de la version plus frugale (qui demande quand même 1 Go de RAM!):  on peut enfin commencer!

Comme le veut la tradition, mon premier projet consiste à faire clignoter les deux LEDs qui se trouvent sur la carte.  Il a fallu que je cherche un bon moment.  Oubliez les exemples clairs de l'environnement Arduino, facilement accessibles à partir d'un menu.  Pour le launchpad, il faut télécharger les fichiers d'exemple à part, en prenant soin de choisir la série qui correspond à notre numéro de microcontrôleur, et localiser le fichier "msp430g2xx3_1.c" (et je suis supposé trouver évident que  "Software Toggle" est la description d'une routine permettant de faire clignoter une LED)!!!

Ça fonctionne, bien sûr.  Le programme n'est pas très long, mais c'est beaucoup plus aride qu'un sketch d'Arduino:  les sorties sont numérotées en hexadécimal  ("P1DIR |= 0x01;"), la variable est un "volatile unsigned int",  le clignotement s'effectue au moyen d'un ou exclusif ("P1OUT ^= 0x01;")...

Je vais continuer d'explorer ça mais, pour l'instant, je continue de trouver mon Arduino beaucoup plus sympathique!

mardi 17 janvier 2012

Le Launchpad de Texas Instruments: un Arduino pour $4,30?

LaunchPad wireframeAvec plus d'un an de retard, je m'intéresse finalement au Launchpad de Texas Instruments:  une plate-forme de développement pour le microcontrôleur MSP430, offert au prix incroyable de $4,30 (frais de ports inclus!).  Pour mes lecteurs européens (vous êtes en majorité): $4,30 correspond à 3,38 euros!

Pour le prix de deux cafés, on obtient ainsi la carte (genre Arduino), accompagnée de deux microcontrôleurs, un câble USB et deux logiciels (Windows seulement).

De toute évidence, Texas Instrument s'attaque au marché des amateurs et tente de concurrencer l'Arduino (y parviendra-t-il?  Les avis semblent partagés).  Ironiquement, la page de commande de la boutique en ligne de Texas Instruments a été conçue en fonction d'une clientèle corporative:  pour vous inscrire (et commander le produit), vous devez obligatoirement inscrire le nom de votre compagnie, et même l'adresse de son site web...étrange façon d'accueillir les amateurs!

Je viens d'en commander deux.  Je vous en donnerai des nouvelles...

Ci-dessous, un employé de Texas Instrument nous montre avec enthousiasme le contenu de la boîte...



Yves Pelletier (Twitter: @ElectroAmateur)

samedi 14 janvier 2012

Amplificateur audio stéréophonique (LM386)

Ma première réalisation d'amplificateur audio répondait à un besoin précis:  je disposais d'une part d'un vieux synthétiseur ne comportant pas de haut-parleurs internes, et d'autre part d'une paire d'enceintes issue d'une mini-chaîne stéréo.  Entre les deux, il me manquait un amplificateur.


La réalisation a été rapide et facile.  N'ayant pas besoin d'une énorme puissance, j'ai utilisé deux circuits intégrés LM386.  Je me suis basé sur le schéma de montage proposé sur la datasheet de Texas Instruments, mais en remplaçant les potentiomètres par des résistances fixes, puisque le synthétiseur est déjà muni d'un contrôle de volume (en fait, je crois que j'aurais pu simplement omettre ces résistances).

J'ai aussi ajouté un condensateur de couplage à chaque entrée, mais je n'ai constaté aucune différence après les avoir ajoutés.

L'amplificateur étant alimenté par une alimentation de tension continue externe, je n'ai pas eu à me préoccuper de cette partie.



Yves Pelletier (Twitter: @ElectroAmateur)

mercredi 11 janvier 2012

Livre: Arduino, Maîtrisez sa programmation et ses cartes d'interface

Ce livre publié chez Dunod en 2011 s'adresse avant tout à ceux qui débutent avec l'Arduino.  Puisqu'il ne s'agit pas de ma première lecture à ce sujet, j'étais déjà au courant d'une large part des informations contenues dans ce livre.

J'ai quand même appris pas mal de choses, par exemple  comment brancher plusieurs boutons-poussoir sur la même entrée analogique (grâce à un astucieux agencement de résistances, le voltage reçu est différent selon le bouton qu'on presse), l'utilisation d'une hystérésis pour éviter qu'un capteur oscille inutilement entre le niveau logique haut et le niveau bas, l'utilisation de de la bibliothèque "keypad", etc.

Le livre offre aussi une explication détaillée sur la commande de moteurs, qu'ils s'agisse de servos, de moteurs pas à pas ou de simples moteurs à courant continu, en plus de consacrer un chapitre entier aux interfaces séries synchrones et asynchrones, I2C, SPI et Bus "un fil".

samedi 7 janvier 2012

Véhicule piloté au moyen d'un joystick

Ce projet consistait à brancher un joystick à ma base de robot de façon à contrôler son mouvement.

Il s'agissait de ma première expérience avec un joystick.  Rien de bien compliqué:  il s'agit simplement de deux potentiomètres actionnés par une même manette.  L'inclinaison de la manette dans une direction (gauche ou droite) contrôle un premier potentiomètre, alors que son inclinaison dans l'autre direction (avant ou arrière) contrôle un deuxième potentiomètre.  Lorsque le joystick est à sa position médiane, les deux potentiomètres ont la moitié de leur résistance maximale.

J'avais acheté un petit joystick (genre PlayStation 2) sur eBay.  Pour que ce soit plus pratique je l'ai installé sur une carte perforée, et pour acheminer le signal jusqu'à l'Arduino (qui se trouve sur la base de robot), j'ai choisi un câble de téléphone résidentiel d'environ 1 mètre (le câble comporte 4 conducteurs, ce qui répondait parfaitement à mes besoins).  Ce n'est pas tout à fait aussi pratique qu'un véhicule téléguidé, puisqu'il faut constamment le suivre en évitant que le câble s'emmêle...


Mon programme consiste donc à faire tourner les moteurs en marche avant lorsque la manette est poussée vers l'avant (avec une vitesse maximale quand la manette est poussée à fond), à faire tourner les moteurs en marche arrière lorsque la manette est tirée vers l'arrière. Pour faire tourner le véhicule, il s'agit évidemment pousser la manette vers la gauche ou vers la droite:  les roues tournent alors à des vitesses différentes de façon à obliger le véhicule à tourner dans la direction désirée.



Mise à jour (août 2012):  le véhicule est maintenant téléguidé par ondes radio (sans fil).


mardi 3 janvier 2012

Débuts en robotique

Je commence tout juste à faire quelques expériences avec une base de robot (munie de deux roues motrices, chacune étant actionnée indépendamment par son propre moteur).  


Pour l'instant, mon "robot" n'est muni d'aucun capteur, mais il peut avancer, reculer et tourner en suivant un sketch préétabli (c'est un début!).


Pour piloter les deux moteurs, mon Arduino est branché à un circuit intégré L293D soudé sur une plaque perforée pour faciliter un peu les branchements (je n'ai pas fait eu la patience de construire un shield superposable cette fois-ci).


L'illustration ci-dessous montre comment le L293D est branché à l'Arduino, aux moteurs et à la pile qui alimente les moteurs (cliquez sur l'image pour l'agrandir).





Finalement, voici le sketch qui vérifie que tout fonctionne correctement:  le robot avance pendant quelques secondes, tourne sur lui même (les deux roues tournent en sens contraire), puis recule un peu.


Prochaines étapes:  contrôler mon véhicule au moyen d'un joystick, ajouter des capteurs pour en faire un suiveur de ligne, éviter les obstacles au moyen d'un capteur à ultrasons...

À lire également

Concernant le contrôle de moteurs à courant continu avec un Arduino, d'autres options s'offrent à vous: utilisation du L298Nutilisation du L9110Sutilisation du L6205utilisation d'un pont en H de fabrication maison, et utilisation d'un relais DPDT.

De plus, le L293D dont on parle dans le présent billet peut également être utilisé pour contrôler un moteur pas à pas.

De façon plus générale, vous trouverez sur cette page tous les articles du blog concernant l'utilisation de moteurs de toutes sortes (incluant les servomoteurs et les moteurs pas à pas).

Yves Pelletier   (TwitterFacebook)

lundi 2 janvier 2012

7 kg de composants électroniques (en vrac)

Je me suis procuré sur eBay cette grande boîte remplie de composants électroniques:  "15 pounds grab bag":   environ 7 kg de composants électroniques mélangés et poussiéreux.

Contrairement aux trousses de démarrage (starter kits) qui proposent un échantillonnage varié et préalablement classé de composants susceptibles d'être utiles pour un débutant, les grab bags s'adressent à un public plus téméraire:  l'acheteur ne sait pas à l'avance ce qu'il y trouvera; sa seule certitude, c'est qu'il recevra un très grand nombre de composants pour un prix beaucoup moins élevé que s'il les avait achetées individuellement.  Pour le vendeur, c'est l'occasion rêvée de se débarrasser d'articles qui encombrent son entrepôt, soit parce que la demande pour ses articles est largement inférieure à la quantité disponible, ou parce que la quantité restante est trop faible pour continuer à les offrir dans son catalogue, ou parce que tout est déjà mélangé et personne ne veut se donner la peine de faire le tri...


C'est donc le vendeur, et non l'acheteur, qui décide du contenu de la boîte.   Le lot que je viens d'acquérir contient surtout des condensateurs:  au total, il y en a plus de 1600!  Le problème, c'est que certaines valeurs sont sur-représentées:  qu'est-ce que je vais bien faire de mes 257 condensateurs de 1 nF, de mes 277 condensateurs de 22 nF, et de mes 251 condensateurs de 100 nF???  De toute évidence, les acheteurs de grab bags doivent avoir accès à un réseau d'échange qui leur permettra d'écouler une partie de leur matériel excédentaire!

D'autres composants, en revanche, sont sous-représentés:  des résistances (il y en a 350, mais souvent de valeurs pas très utiles, inférieures à 100 Ω), des transistors (une vingtaine), des diodes (une trentaine), des LEDs (aucune!).  Ces 4 éléments constituaient pourtant la plus grande partie d'un autre lot que j'avais acheté l'an dernier (et qui contenait relativement peu de condensateurs).

La boîte contenait aussi une centaine de circuits intégrés (dont 25  exemplaires du XR-2207CP, un oscillateur contrôlé par tension), 44 potentiomètres à longue tige de bonne qualité, 75 trimpots, 25 régulateurs 5 volts, une douzaine d'interrupteurs variés, 9 buzzers, 18 jacks audio (genre guitare électrique), deux petits transformateurs, un moteur DC (du genre qu'on retrouvait dans les vieux magnétophones à cassette), et plein d'autres choses, incluant certains trucs que je suis incapable d'identifier.

Tout ça pour $60, frais d'expédition inclus (les frais d'expédition représentent environ la moitié du total), donc environ $4 la livre.  Les autres grab bags annoncés sur internet (et pouvant être expédiés au Canada) sont généralement significativement plus chers:  au moins $20 la livre en comptant les frais d'expédition!

Et est-ce que ça vaut la peine?  Ça dépend.   Bien sûr, tout ça m'aurait coûté beaucoup plus cher si je les avais achetés individuellement (mais j'aurais seulement acheté ce dont j'ai besoin!).

Il faut aimer trier pendant plusieurs heures.  Il faut être en mesure d'identifier des composants qui ne sont pas étiquetés (et aimer le faire!).  Il faut réaliser beaucoup de projets variés, et avoir une façon d'écouler le matériel excédentaire (en l'échangeant ou le revendant).    Il faut savoir apprécier les surprises et avoir un certain goût du risque...

Dans le même ordre d'idée, il y a le Great Internet Migratory Box Of Electronics Junk, qui consiste à faire circuler par la poste une boîte remplie de bidules électroniques:  vous gardez ce qui vous intéresse, vous ajoutez autre chose dans la boîte et vous l'envoyez au suivant.  Je n'y ai encore jamais participé:  le concept est intéressant, mais le contenu des boîtes vues sur internet me semble souvent décevant.