samedi 30 août 2014

Pinguino: fabrication et utilisation

Créé en 2008 par Jean-Pierre Mandon pour les étudiants de l'école internationale d'art d'Aix-en-Provence, Pinguino propose des cartes de prototypage et un environnement de programmation (IDE) open source très similaire à l'Arduino.  La différence principale entre Pinguino et Arduino, c'est que les cartes Pinguino sont construites autour d'un microcontrôleur PIC de la compagnie Microchip plutôt qu'un microcontrôleur Atmega de la compagnie Atmel.

Dans cet article, je partage mes premières expériences avec Pinguino:

- fabrication de cartes Pinguino
- installation de l'IDE sous Windows et Linux
- réalisation d'un projet simple, en guise de premier test

De la même façon que le site arduino.cc est le principal endroit à visiter lorsque vous cherchez des informations, le site pinguino.cc est le site de référence numéro 1 en matière de Pinguino:   vous y trouverez l'IDE (disponible pour Windows, Mac et Linux), une boutique permettant d'acheter des cartes toutes faites, des schémas permettant de fabriquer vos propres cartes, un forum de discussion (avec une section en français), etc.


Fabrication de cartes

Les cartes Pinguino sont basées sur un microcontrôleur PIC capable de gérer l'USB sans nécessiter le moindre convertisseur série-USB externe.   Cette caractéristique rend la fabrication de cartes en DIY extrêmement simple:  un microcontrôleur PIC (en format dip), un connecteur USB, un cristal de quartz, quelques condensateurs, résistances et LEDs indicatrices et vous obtenez très rapidement une carte de prototypage complète prête à être connectée au port USB d'un ordinateur.

J'ai fabriqué deux cartes 8-bits différentes:  le Pinguino 4550 (basé sur un microcontrôleur PIC 18F4550), et le Pinguino 26J50 (basé surle microcontrôleur PIC 18F26J50).

Entre les deux, j'aurais tendance à suggérer le modèle 4550 car il comporte plus d'entrées/sorties (29, dont 8 entrées analogiques) et puisque le microcontrôleur fonctionne bien sous 5 V, vous n'avez pas à prendre de précautions pour abaisser la tension fournie par USB.

Le modèle 26J50, un peu plus économique, fonctionne bien aussi, mais il comporte un peu moins d'entrées/sorties (17, dont 5 entrées analogiques) et il faut abaisser à 3,3 V l'alimentation USB (dans le schéma officiel, c'est fait au moyen d'une diode Zener).

Pour les schémas de circuits et instructions pour la fabrication, je vous réfère aux pages pertinents sur pinguino.cc, c'est très bien fait:  Pinguino 4550  et  Pinguino 26J50.

Installation du bootloader


Peu importe le modèle de Pinguino que vous choisissez de construire, il faut charger le bootloader dans le micocontrôleur.  Pour ce faire, vous devez disposer d'un programmateur conçu pour les microcontrôleurs PIC, comme par exemple le PICkit 2 (c'est ce que j'ai utilisée) ou le PICkit 3.

(Méfiez-vous des programmateurs génériques et très économiques qu'on trouve sur eBay:  celui que j'avais depuis quelques années ne supporte pas le 26J50 et, même si en principe il aurait dû supporter le 4550, l'opération a lamentablement échoué.)

Si vous êtes équipé d'un programmateur de PIC, la gravure du bootloader est facile et rapide:  vous vous procurez le bootloader qui correspond à votre modèle de Pinguino et vous le chargez  le fichier .hex dans le microcontrôleur.

Si vous ne disposez pas d'un programmateur pour microcontrôleurs PIC, il ne vous reste plus qu'à trouver un ami qui en a un, ou encore à acheter un Pinguino en kit ou déjà monté.  Si vous avez l'intention de programmer des PICs régulièrement, l'achat d'un tel programmateur devient intéressant, mais si votre objectif est de construire un seul Pinguino, ça fait monter la facture de façon assez spectaculaire...

Installation de l'IDE

L'environnement de programmation (IDE) Pinguino est disponible pour Windows, Mac et Linux (on peut se le procurer ici).

J'ai installé l'IDE sous Windows 7:  tout fonctionne à merveille.  Le script d'installation s'occupe d'installer les pilotes USB automatiquement (la procédure était plus compliquée il y a quelques mois) ainsi que Python 2.7 s'il n'est pas déjà présent sur l'ordinateur (car l'IDE a été programmé en Python).

J'ai aussi installé l'IDE sous Linux Mint;  au début, rien ne fonctionnait, mais j'ai pu régler le problème grâce à l'aide obtenue sur le forum francophone de pinguino.cc .

Je l'ai même installé avec succès sur le Raspberry Pi, mais c'est un peu lent...

Utilisation de l'IDE...comme Arduino, en mieux

Sans être identique, l'IDE Pinguino s'utilise de façon similaire à celui de l'Arduino.  La partie droite de l'écran nous permet de naviguer dans les exemples, qui sont regroupés par catégories.  Sans trop de surprise, on trouve un exemple intitulé "Blink" dans la catégorie "Basics"...



Avant de compiler, on doit s'assurer de sélectionner le bon type de carte, la bonne version du bootloader.  Et avant de télécharger le sketch dans la carte, il est impératif d'appuyer sur le bouton "reset" de la carte:  contrairement à l'Arduino, le reset ne se fait pas automatiquement.


Sous certains aspects, l'IDE Pinguino est mieux conçu que l'IDE Arduino.  Par exemple, il propose une liste de fonctions commençant par les lettres que vous avez tapées:  il s'agit de cliquer le bon mot dans la liste pour que le reste de la fonction s'écrive de façon automatique.


J'aime bien aussi qu'il écrive automatiquement la parenthèse fermante lorsqu'on écrit une parenthèse ouvrante.

En cas de bug dans le sketch, les lignes problématiques sont mises en couleur.  Et les messages d'erreurs me semblent souvent plus appropriés que ceux, souvent nébuleux, qu'affiche l'IDE Arduino.



Après avoir exécuté l'exemple "Blink", j'ai testé ce petit circuit de base dans lequel 3 LEDs sont commandées par 3 boutons:







Comme vous pouvez le constater, le même sketch pourrait être téléchargé dans un Arduino sans la moindre modification.  D'autres syntaxes auraient pu être utilisées à la place (voir à ce sujet 5 façon de faire clignoter une LED).  Notez également que, contrairement à l'Arduino, les Pinguinos ne comportent pas de résistance de tirage interne:  pour les boutons, nous devons impérativement utiliser des résistances (c'est loin d'être un inconvénient majeur en ce qui me concerne: j'oublie presque toujours d'utiliser les résistances de tirage internes de l'Arduino...).

Conclusion

Pour une première initiation aux microcontrôleurs, Arduino me semble un meilleur choix que Pinguino à cause de l'énorme masse d'utilisateurs, des informations facilement disponibles, etc.

Pour quelqu'un qui a déjà un peu d'expérience avec l'Arduino, Pinguino constitue une option intéressante, au même titre qu'Energia, STM32 Nucleo, etc.  L'option est particulièrement pertinente si vous désirez fabriquer vos propres cartes et possédez déjà un programmateur pour microcontrôleurs PIC.

En  ce qui me concerne, je suis bien heureux d'avoir ajouté Pinguino à mon arsenal de développement.  J'ai bien l'intention de continuer à l'utiliser dans l'avenir, pour des projets plus ambitieux.

Yves Pelletier (Twitter:  @ElectroAmateur)

mardi 12 août 2014

Codeur rotatif et Arduino

Aujourd'hui, je partage avec vous mes récentes expérimentations avec des codeurs rotatif (rotary encoders).

Codeur rotatif vs potentiomètre

Un codeur rotatif vous permet d'intégrer aux dispositifs que vous construisez un bouton que l'utilisateur tournera pour modifier un paramètre.   Il peut s'agir, par exemple, d'un bouton qu'on tourne pour modifier le volume d'une chaîne stéréo.  Du point de vue de l'utilisateur, donc, il y a peu de différences entre un codeur rotatif et un potentiomètre (sauf que, contrairement au potentiomètre, le codeur rotatif peut être tourné à l'infini, sans qu'on atteigne un point où il refuse de tourner davantage).

Du point de vue du concepteur de l'appareil, toutefois, le codeur rotatif est très différent du potentiomètre.  Lorsque vous tournez le bouton d'un potentiomètre, la résistance de ce dernier change progressivement, ce qui vous permet d'envoyer à l'Arduino un signal analogique qui varie de façon continue entre 0 et 5 V.  Mais lorsque vous tournez le bouton d'un codeur rotatif, il se comporte comme un assemblage de deux interrupteurs qui s'ouvrent et se ferment plusieurs fois par tours:  l'Arduino recevra donc une suite de valeurs logiques alternant entre 0 et 5 V.

Utilisation du codeur avec des résistances de tirage externes

Utilisons d'abord un encodeur avec des résistances de tirage (pullup resistors), question de bien comprendre comment ça marche (nous verrons un peu plus loin comment remplacer ces résistances externes par les résistances de tirage internes de l'Arduino).

Lorsqu'il s'agit d'un simple interrupteur, on procède de cette façon:


Lorsque le bouton n'est pas enfoncé, aucun courant ne peut circuler dans la résistance.  La chute de potentiel dans la résistance est donc nulle (U  = RI), et l'Arduino se trouve à un potentiel de 5 V.  Lorsqu'on presse le bouton, l'Arduino est directement en contact avec la masse et se trouve donc à un potentiel nul (pendant ce temps, un courant traverse la résistance qui est soumise â une différence de potentiel de 5 V:  cette résistance est nécessaire pour éviter un court circuit lorsqu'on presse le bouton!).

Comme je l'ai déjà mentionné, le codeur rotatif se comporte comme deux interrupteurs qui s'ouvrent et se ferme pendant qu'on tourne le bouton.   Sur la figure située au tout début de cet article, les pins A et GND forment un premier interrupteur, alors que les pins B et GND en forment un deuxième (les deux interrupteurs partagent la même masse).

Nous pouvons donc câbler notre codeur rotatif de cette façon:


Voyons voir...  Lorsqu'il y a contact entre la pin A et la pin GND du codeur rotatif, la pin 2 de l'Arduino est à 0 V, alors qu'elle est à 5 V pendant qu'il n'y a pas de contact.  Pendant qu'il y a contact entre la pin B et la pin GND du codeur, la pin 3 de l'Arduino est à 0 V alors qu'elle est à 5 V en absence de contact.

... Mais pourquoi deux interrupteurs plutôt qu'un seul, dites-vous?  C'est pour déterminer le sens de la rotation du bouton.  Tel qu'illustré ci-dessous, le signal produit par la pin B est légèrement décalé par rapport au signal produit par la pin A (ils sont en quadrature).


Supposons qu'on programme une interruption qui s'exécutera chaque fois que le signal de la pin A passe de 0 à 5 V.  Si le bouton tourne dans le sens horaire (gauche à droite sur le schéma), la pin B, au même moment, est toujours à 5 V.  Si le bouton tourne dans le sens antihoraire (droite à gauche sur le schéma), la pin B est toujours à 0 V lorsque la pin A passe de 0 à 5 volts.

Et voici un sketch qui fonctionne exactement de cette façon:


Utilisation du codeur avec les résistances de tirage internes de l'Arduino

Vous pouvez simplifier le circuit en utilisant les résistances de tirage internes de l'Arduino.  Ça se branche comme ça:



...et il faut ajouter deux lignes de code supplémentaires dans la partie "setUp" du sketch ci-haut pour activer les résistances de tirage:

   digitalWrite (PinA, HIGH);
   digitalWrite (PinB, HIGH);

Puisque PinA et PinB ont été définies comme des entrées, digitalWrite a pour effet d'activer leur résistance de tirage interne.


Utilisation d'un breakout KY-040

Vous pouvez trouver sur eBay, en échange d'un peu de menue monnaie, des codeurs rotatifs "KY-040"  qui comportent déjà des résistances de tirage (donc vous n'activez pas les résistances de tirage interne de l'Arduino).  Vous les branchez de cette façon:

CLK (clock)  ---  Arduino 2  (c'est la pin A)
DT (data)  ---  Arduino 3 (c'est la pin B)
SW (switch) --- Arduino 4 (bouton poussoir)
GND  -----  Arduino GND
+  ----   Arduino 5 V

Ajout de condensateurs, pour l'anti-rebond

On conseille souvent l'ajout de deux condensateurs de 0,47 μF comme dispositif anti-rebond:



Je dois avouer que j'ai obtenu des résultats assez similaires avec ou sans condensateurs:  ça fonctionne relativement bien, à la condition de ne pas tourner le bouton trop vite, mais les résultats ne sont pas parfaits.

Les instructions pour l'utilisation du KY-040 ont été prises sur le forum Arduino.

Yves Pelletier (Twitter:  @ElectroAmateur)

dimanche 3 août 2014

Carte d'anniversaire musicale avec ATTiny85

C'est bientôt l'anniversaire de mon beau-frère, qui collectionne tout ce qui se rapporte à Pink Floyd.  Cette année, j'ai décidé de mettre à profit mes connaissances acquises récemment concernant la programmation de l'ATTiny pour lui fabriquer une carte d'anniversaire musicale personnalisée.

Au départ, j'imaginais une carte de dimensions conventionnelles, munie d'un tout petit haut-parleur (ou d'un simple piézo) dissimulé quelque part.  Mais lors des essais sur breadboard, j'ai constaté que le niveau sonore était bien meilleur si j'utilisais un véritable haut-parleur de 8 cm de diamètre, ce qui est quand même un peu trop gros pour dissimuler dans une carte... J'ai donc redéfini mon projet:  la carte allait assez grande pour comporter ce haut-parleur.  Et puisque la thématique allait être Pink Floyd, nul besoin de dissimuler ce haut-parleur:  il allait être mis bien en évidence dans le design de la carte.

Lorsqu'on appuie sur l'interrupteur, la carte joue une mélodie:  la chanson "Money" de Pink Floyd.  Un dessin présente les deux têtes de l'album "Divison  Bell":  leurs yeux ont été remplacés par des LEDs qui clignotent au rythme de la musique (deux autres LEDs clignotent également, car il me restait des pins inutilisées sur l'ATTiny).  De plus, l'aiguille d'une horloge se met à tourner, pour représenter la chanson "Time".  Voici ce que ça donne (la carte n'est pas encore terminée à 100%:  il me reste à écrire "Joyeux Anniversaire"):



L'horloge

L'aiguille mobile de l'horloge doit tourner, mais à une vitesse raisonnable qui nous permet de la voir:  j'ai donc utilisé un moteur à courant continu muni d'un petit engrenage, qui fait tourner un engrenage compatible mais qui comporte 6 ou 7 fois plus de dents (l'aiguille de l'horloge tournera donc 6 ou 7 fois moins vite que le moteur).  Ils sont maintenus sur un petit support en bois grâce grâce à une généreuse portion de colle époxy (le support est plutôt fragile, mais puisqu'il s'agit de faire tourner une très légère aiguille d'horloge, ça fait parfaitement l'affaire).


Cet ensemble moteur-engrenage est collé à l'arrière du panneau.  L'aiguille de l'horloge (qui est un simple fil électrique de calibre AWG 22) est collée au gros engrenage et passe par un trou pratiqué dans le panneau.

Puisque je disposais d'un interrupteur DPST (bipolaire, une direction), il m'a semblé pertinent d'isoler le moteur du reste du circuit.  Le circuit du moteur de l'horloge est donc constitué du moteur, de l'interrupteur, d'une pile AA (1,5 volt) et d'une résistance de 33 Ω (dont la fonction est de limiter le courant dans le moteur pour que celui-ci tourne le plus lentement possible).

Rien de bien révolutionnaire ici, vous en conviendrez...



Musique et lumière:  l'ATTiny85

C'est l'ATTiny85 qui s'occupe de jouer la mélodie à travers le haut-parleur et de faire clignoter les 4 LEDs. Le circuit est schématisé ci-dessous.




La deuxième moitié de l'interrupteur DPST utilisé dans le circuit du moteur permet de relier l'ATTiny a son alimentation.  L'ATTiny peut fonctionner sous une tension continue de 2,7 à 5,5 V.  Au départ, j'avais pensé utiliser une pile-bouton de 3 V, mais le son émis était de faible intensité (surtout que le moteur fait pas mal de bruit).  Puisque les résultats sont bien meilleurs à une tension de 5 V, j'ai finalement opté pour une batterie de 9 V jumelée à un régulateur de tension 7805.  Le condensateur de 10 microfarads s'est avéré nécessaire pour éviter des baisses de tension qui interrompaient le fonctionnement du microcontrôleur.

Programmation de l'ATTiny

J'ai programmé l'ATTiny85 au moyen d'un Arduino Uno en mode ISP.  Pour la procédure détaillée, je vous réfère à mon article précédent sur la programmation d'un ATTiny.  Assurez-vous d'utiliser la version "Arduino-Tiny" plutôt que celle du MIT Media Lab (qui ne supporte pas la fonction "Tone").  De plus, vous devez réglez l'horloge interne de votre ATTiny85 à 8 MHz (il s'agit de sélectionner "ATtiny85 @ 8MHZ" comme type de carte, puis choisir "Graver la séquence d'initialisation" dans le menu 'Outils" avant de télécharger le sketch dans l'ATTiny85.

Voici le sketch:


(Surtout, ne dites rien à mon beau-frère:  c'est une surprise...)

Yves Pelletier (Twitter:  @ElectroAmateur)