mardi 24 septembre 2013

Utilisation d'un écran Nokia 5110 avec un Arduino pour jouer à Pong et Snake...

J'ai reçu la semaine dernière un petit écran LCD Nokia 5110 avec contrôleur Philips PCD8544 (résolution de 84 X 48 pixels).  Voici un compte-rendu de mes premières expérimentations.

Les branchements

Dans un premier temps, j'ai branché l'écran à l'Arduino en  suivant ce tutoriel d'Adafruit.  L'écran est conçu pour fonctionner à 3,3 V, et il est donc recommandé d'utiliser un convertisseur de niveau logique (comme un 4050) pour abaisser à 3,3 V les signaux provenant de l'Arduino.  Oui, je sais, quand on regarde sur le web on en arrive rapidement à la conclusion qu'au moins 80% des gens branchent l'écran directement à l'Arduino, sans utiliser de 4050.  Si j'en crois le site de Sparkfun, une telle pratique ne devrait pas endommager l'écran à court terme, mais risquerait de diminuer sensiblement sa durée de vie.

Voici donc à quoi est branché le 4050:




Il ne reste plus qu'à brancher la broche 1 (VCC) de l'écran au 3,3 V de l'Arduino, et la broche 2 (GND) de l'écran à une des broches GND de l'Arduino.  Si vous désirez allumer les LEDs de l'écran, branchez également la broche 8 (LED) de l'écran au 3,3 V de l'Arduino (personnellement, je préfère quand les LEDs sont éteintes).


La librairie d'Adafruit

Pour faciliter l'utilisation de l'écran Nokia avec un Arduino, Adafruit a mis au point les librairies Adafruit_PCD8544 et Adafruit_GFX.  Après les avoir installées, vous pouvez essayer le sketch intitulé "pcdtest" fourni avec la librairie PCD8544, ça donne une bonne idée des possibilités de ces librairies pour afficher du texte de différents formats, des images, des animations, etc.

La seule modification que j'ai dû apporter à ce sketch, c'est la ligne "display.setContrast(50);":  j'ai obtenu de bien meilleurs résultats en la remplaçant par "display.setContrast(60);".

Notez aussi que le "splash screen" qui apparaît au début pour montrer le logo d'Adafruit (et qui est appelé par la simple commande "display.display();",) est défini à l'intérieur de la librairie.  Je suppose que vous devez donc modifier la librairie si vous voulez afficher un "splash screen" montrant autre chose que le logo d'Adafruit?!?!

Snake

Un écran Nokia permet de transformer votre Arduino en mini-console de jeu... En ajoutant 5 boutons poussoirs branchés aux entrées analogiques 1, 2, 3, 4 et 5, vous pouvez jouer au jeu classique "Snake" grâce à ce sketch écrit par Ouarrak Ayoub (le sketch est commenté en italien).

Attention, pour utiliser le sketch avec le circuit que j'ai décrit plus haut, vous devez modifier l'assignation des broches:  la ligne "Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 7, 6);" devient "Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);".

De plus, j'ai dû ajouter une ligne pour ajuster le contraste:  "display.setContrast(60);"   (juste en dessous de la ligne "display.begin();", sinon rien n'apparaissait sur mon écran.

Pong

Vous pouvez aussi remplacer les 5 boutons poussoirs par deux potentiomètres (branchés aux entrées analogiques 0 et 1) et jouer à Pong grâce à ce sketch écrit par Onur Avun .  Pour utiliser le sketch avec mes branchements décrits au début de cet article, il faut modifier l'assignation des broches de la façon suivante:

     #define PIN_SCE   4
     #define PIN_RESET 3
     #define PIN_DC    5
     #define PIN_SDIN  6
     #define PIN_SCLK  7

Bien entendu, selon les standards de 2013, c'est un peu minimaliste comme console de jeu...  L'intérêt réside surtout dans la possibilité d'étudier ces sketches afin de les modifier et de créer vos propres jeux... (PacMan ou Tetris, ce serait pas mal...)

Yves Pelletier (Twitter:  @ElectroAmateur)

samedi 21 septembre 2013

Sauvetage d'un lecteur mp3 bon marché

Je m'étais procuré ce lecteur mp3 deux ans plus tôt et, avec le temps, il est devenu inutilisable: même après l'avoir laissé branché pendant plusieurs heures sur un port USB pour lui permettre de se recharger, il ne jouait plus qu'une dizaine de minutes avant de s'éteindre. J'ai ouvert le boîtier pour constater, sans surprise, que sa pile rechargeable interne avait rendu l'âme.

Ces appareils bon marché ont visiblement été conçus pour qu'on les jette à la poubelle lorsque leur pile est épuisée:  sinon, il faut trouver un modèle de pile équivalent, débourser un prix comparable à celui d'un appareil complet, souder la pile à l'endroit approprié dans le circuit...

Je ne disposais pas d'une pile comparable, mais j'avais vraiment envie de rendre mon lecteur mp3 à nouveau fonctionnel:  j'ai donc décider de l'alimenter au moyen de trois piles AA Ni-Mh rechargeables (3 piles de 1,2 volts à la place d'une seule de 3,7 volts).

Bien entendu, ces piles sont beaucoup trop volumineuses pour entrer dans le boîtier:  j'ai percé un petit trou à l'arrière du boîtier pour y faire passer les deux fils qui servaient à brancher la pile d'origine, et je les ai soudés à un support conçu pour 3 piles AA.

J'ai ensuite collé ce support à l'endos du lecteur mp3.

Résultat:  un lecteur mp3 à peu près 4 ou 5 fois plus volumineux qu'avant, ce qui ne constitue par un inconvénient important pour moi puisqu'il continue d'entrer très facilement dans ma poche:  je n'ai jamais eu besoin qu'il soit aussi petit!

Pour ce qui est de l'esthétisme...bof, ce n'est pas ma priorité.

Mon nouveau modèle comporte même certains avantages:  si les piles tombent à plats, je peux les remplacer immédiatement par un jeu de piles fraîchement chargés plutôt que devoir patienter pendant que l'appareil se recharge.

Je peux recommencer à écouter l'émission "The Amp-Hour" en podcast...

Yves Pelletier (Twitter:  @ElectroAmateur)

lundi 16 septembre 2013

Robot éviteur d'obstacles version 1.0

Voici un projet classique et pas trop compliqué qui figurait depuis longtemps sur ma liste de choses à essayer:  un robot à base d'Arduino qui utilise un capteur à ultrasons pour détecter la présence d'obstacles devant lui (et modifier sa trajectoire afin de les éviter).

Comportement du robot:

Le robot utilise constamment une sonde à ultrasons pour détecter la présence d'un obstacle devant lui.   Si aucun obstacle n'est détecté à moins de 30 cm devant lui, il continue d'avancer en ligne droite.  Si un obstacle est détecté à 30 cm ou moins, il tourne sur lui-même jusqu'à ce que la voie soit libre sur une distance d'au moins 30 cm.

Matériel:

Une base de robot à 2 roues motrices (chaque roue étant actionnée par son propre moteur électrique), un Arduino Uno, une sonde ultrasonore HC-SR04 (pour bien faire il en faudrait plus qu'une, tel que mentionné plus loin dans cet article), un contrôleur de moteur L293D, 6 piles AA rechargeables (NiMh) pour l'alimentation des moteurs et une pile 9 V pour l'alimentation de l'Arduino.

Le circuit:

Le schéma ci-dessous indique comment brancher les moteurs et l'Arduino au L293D.  Toutes les masses ("GND") doivent être reliées ensemble:  celles du L293D, de l'Arduino et du HC-SR04 ainsi que la borne négative de l'alimentation des moteurs.

J'ai branché la sonde ultrasonore HC-SR04 de la façon suivante:

          GND : Arduino GND
          Echo:  Arduino  11
          Trig: Arduino 12
          Vcc: Arduino 5V



Le sketch:

J'aurais certainement obtenu un algorithme plus performant si je m'étais donné la peine de m'inspirer d'un sketch produit par un de mes nombreux prédécesseurs.  Je ne suis néanmoins obstiné à rédiger mon propre sketch à partir de zéro, sans me préoccuper de ce que font ceux qui s'y connaissent mieux que moi en robotique.  Au départ, il arrivait assez souvent que mon robot modifie sa trajectoire alors qu'aucun obstacle ne se trouvait devant lui:  j'ai donc ajouté une seconde mesure à partir du capteur HC-SR04 afin de rejeter ces "faux positifs".


Aspects à améliorer dans une future version:

Il faudra ajouter des sondes ultrasonores supplémentaires:  le robot détecte bien la présence d'un mur situé droit devant lui, mais son champ de vision est beaucoup plus étroit que sa propre largeur:  par conséquent, il s'accroche à des obstacles situés sur les côtés.   Grâce à deux capteurs placés côte à côte, le robot pourra aussi faire la différence entre un obstacle situé à gauche ou à droite, et choisir le sens de son virage en conséquence.

Certains obstacles sont difficilement détectées par les sondes ultrasonores (des pattes de chaises, des obstacles très bas, etc.):  l'ajout de capteurs différents sera également utile (interrupteur se déclenchant lors d'un contact, capteur à effet Hall pour détecter qu'une roue ne tourne plus, etc.).

Une grande partie du plaisir de construire un robot consiste à améliorer progressivement ses performance; arriver à un essai optimal dès les premières tentatives aurait été un peu décevant, dans le fond...

Yves Pelletier   (Twitter:  @ElectroAmateur)

Note:  la suite de cet article a été publié le 21 avril 2014:  Robot éviteur d'obstacles version 2.0 .