samedi 29 juillet 2017

La machine à Ottawa

Ces jours-ci, deux créations de la compagnie française La Machine déambulent dans les rues d'Ottawa, dans le cadre des célébrations du 150e anniversaire du Canada:  Long Ma le dragon-cheval, et Kumo l'araignée géante.

Les voici sur deux petites vidéos que j'ai tournées plus tôt aujourd'hui.




P.S.:  Je suis conscient d'être un peu hors-sujet mais:
  1. C'est les vacances!
  2. Y a-t-il quelque part un maker qui ne rêve pas de construire un jour un truc de ce genre?

Yves Pelletier   (TwitterFacebook)


jeudi 27 juillet 2017

Module Bluetooth HC-06 et STM32 Nucleo (mbed)

Aujourd'hui, je vous explique comment établir une connexion bluetooth avec une carte STM32 Nucleo équipée d'un module HC-06.

(Si vous souhaitez utiliser le HC-06 avec un Arduino, un Raspberry Pi , un PIC ou un MSP430 Lauchpad, vous pouvez vous référer à d'autres billets sur ce blog. )

Pour réaliser cet expérience, vous aurez besoin d'une carte STM32 Nucleo (j'ai utilisé le modèle F030R8), d'un module bluetooth HC-06, et d'un autre appareil qui supporte le protocole bluetooth, que ce soit un téléphone, une tablette ou un ordinateur (j'ai utilisé une tablette android).

Connexions

Au dos de mon module HC-06, on indique que le niveau logique est de 3,3 V (ce qui est parfait pour le Nucleo), et que l'alimentation doit se situer entre 3,6 V et 6 V (nous utiliserons donc la sortie 5 V de la carte Nucleo).

Le module HC-06 envoie par bluetooth tout ce que le microcontrôleur lui envoie par liaison série (UART), et il envoie au microcontrôleur tout ce qu'il reçoit par bluetooth.

On pourrait croire que les broches à utiliser pour la communication série sont D0 et D1, comme pour l'Arduino (d'autant plus que ces broches sont clairement identifiées "TX" et "RX" sur la carte), mais ce n'est pas le cas:  par défaut, les broches D0 et D1 du Nucleo sont désactivés car l'UART qui leur est associé est utilisé pour la communication avec l'ordinateur (par USB).  Si vous tenez à activer ces deux broches (afin d'utiliser un shield Arduino, par exemple), vous devrez sortir votre fer à souder et modifier quatre des ponts de soudure situés au verso de la carte.

Je ne me suis pas donné cette peine puisque le Nucleo comporte deux autres canaux de communication série.  J'ai utilisé les broches D8 (TX) et D2 (RX).

Les connexions sont donc:


  • VCC du module HC-06 :  5V du Nucleo
  • GND du module HC-06: GND du Nucleo
  • TXD du module HC-06:  D2 du Nucleo
  • RXD du module HC-06:  D8 du Nucleo


Notez que le TX (transmission) du HC-06 est branché au RX (réception) du Nucleo, et vice-versa.



Lorsque le module HC-06 est alimenté, une LED rouge se met à clignoter, ce qui indique l'absence de liaison bluetooth avec un deuxième appareil (une fois cette connexion établie, la LED restera allumée, sans clignoter).

Couplage avec un appareil hôte

S'il s'agit de la première utilisation de ce module HC-06 avec le deuxième appareil (smartphone, tablette, ordinateur) il faut coupler les deux dispositifs.  Voici la procédure pour l'appairage avec un appareil android (c'est similaire si vous utilisez autre chose qu'un appareil android).

Dans Paramètres, Bluetooth, assurez-vous d'abord que Bluetooth est activé.  S'il est alimenté, le module HC-06 devrait figurer dans la liste des appareils disponibles.



Cliquez sur le nom du module. Le mot de passe par défaut est "1234" (si ce mot de passe ne vous plaît pas, il est possible de le modifier).


Si tout se passe bien, le HC-06 apparaît ensuite dans la liste des périphériques couplés.



À cette étape, la LED rouge du module HC-06 continue de clignoter.  Ce n'est que lorsque la connexion sera établie avec une application de l'appareil android qu'elle demeurera allumée de façon continue.

Appli bluetooth

Il existe tout plein d'applications android permettant la communication bluetooth.  Pour effectuer mes tests, j'ai utilisé avec succès Serial Bluetooth Terminal par Kai Morich, mais plusieurs autres options sont possibles.  Vous pouvez même utiliser l'application réalisée dans cet article au moyen de MIT App Inventor.

Après avoir démarré Serial Bluetooth Terminal, il est important d'établir la communication bluetooth avec le Nucleo en cliquant sur le bouton illustré ci-dessous:


Lorsque la communication est établie, le bouton change de forme, et la LED rouge du module HC-06 cesse de clignoter.

Un premier script pour le Nucleo:  un compteur (communication unidirectionnelle)

Ce premier script est particulièrement utile pour vérifier rapidement si la communication bluetooth fonctionne.  Le Nucleo envoie des nombres croissants.  Évidemment, si tout va bien, ces nombres seront affichée par l'application android.



Voici le résultat à l'écran de Serial Bluetooth Terminal:



Un deuxième script pour le Nucleo:  contrôler deux LEDs branchées au Nucleo

Dans le script précédent, la communication était strictement unidirectionnelle (du Nucleo vers l'autre appareil).  Essayons maintenant une communication bi-directionnelle.

Nous branchons deux LEDs au Nucleo (sorties D3 et D4), tel qu'illustré ci-dessous.   On envoie le message "a", "b", "c", "d" ou "e" au moyen de l'appareil android.  Sur réception du message, le Nucleo allume ou éteint les LEDs appropriées, et retourne un message précisant l'état actuel des deux LEDs.





Lorsque vous envoyez le message "a" au moyen de Serial Bluetooth Terminal, la LED branchée à D3 s'allume, et le message "LED 1 allumee, LED 2 eteinte" s'affiche à l'écran.  Le Nucleo devrait réagir aux commandes "a", "b", "c", "d" et "e".


Yves Pelletier   (TwitterFacebook)



mardi 18 juillet 2017

Afficheur 8 chiffres, 8 LEDs, 8 boutons TM1638 et Arduino

Vous pouvez facilement trouver sur eBay des modules constitués de 8 afficheurs 7 segments, 8 LEDs et 8 boutons, dont la pièce maîtresse est un circuit intégré TM1638 (mon modèle porte la mention "LED AND KEY").

Même s'il est peu probable que vous ayez besoin de la totalité des composants qu'il contient, un tel module peut grandement faciliter la mise au point d'un prototype, d'autant plus qu'il n'accapare que 3 entrées/sorties de votre microcontrôleur.

Ce court tutoriel vous indiquera comment brancher un tel module à votre carte Arduino, et comment utiliser les différents éléments qui le composent.

Connexions

Le module comporte 5 connecteurs, qui seront branchés à l'Arduino de la façon suivante:

VCC du module TM1638 :  5V de l'Arduino
GND du module TM1638:  GND de l'Arduino
STB* (strobe) du module TM1638:  pin 4 de l'Arduino
CLK* (clock) du module TM1638:  pin 2 de l'Arduino
DIO* (digital input output) du moduleTM1638:  pin 3 de l'Arduino

*: Les connecteurs STB, CLK et DIO peuvent être branchés à d'autres pins de l'Arduino si désiré:  il s'agira de modifier les sketches proposés ci-dessous pour en tenir compte.



Installation de la bibliothèque

Nous allons utiliser la bibliothèque conçue par Ricardo Batista spécialement pour ce type de module. Il y a évidemment une page github d'où on peut télécharger la bibliothèque, afin de l'installer dans l'IDE Arduino.

Pendant que vous y êtes, le wiki de cette même page github dresse la liste de toutes les fonctions (ou devrais-je dire "méthode"?) de cette bibliothèque.

Initialisation de la bibliothèque

Dans chaque sketch qui utilise cette bibliothèque, on créé un objet de type "TM1638" en précisant, dans l'ordre, le numéro de la pin reliée à DIO, CLK et STB.

Puisque nous avons branché DIO à 3, CLK à 2 et STB à 4, je peux donc utiliser la syntaxe suivante:

TM1638 afficheur(3, 2, 4);

...où "afficheur" est le nom que j'ai choisi pour désigner cet objet.

Afficher des nombres

La bibliothèque TM1638 met à notre disposition plusieurs fonctions permettant d'afficher des nombres grâces aux 8 afficheurs à 7 segments:

setDisplayToDecNumber:  pour afficher un nombre décimal positif
setDisplayToSignedDecNumber: pour afficher un nombre décimal positif ou négatif
setDisplayToBinNumber:  pour afficher un nombre binaire
setDisplayToHexNumber:  pour afficher un nombre hexadécimal
setDisplayToString:  pour afficher des lettres plutôt que des nombres
clearDisplay:  pour effacer ce qui était précédemment affiché

Il est également possible de réglez un des 8 chiffres en particulier (plutôt que l'ensemble du nombre à 8 chiffres) en utilisant setDisplayDigit et clearDisplayDigit.

Penchons-nous sur la fonction "setDisplayToDecNumber", puisque c'est celle qui me semble la plus utile.  Elle comporte 3 arguments:
  1.  un ombre de type "long" qui est le nombre à afficher
  2.  un byte indiquant le ou les points décimaux qui doivent être  allumés
  3.  un booléen indiquant si les zéros qui précèdent le nombre doivent être affichée (True) ou non (False).
Par exemple:

"afficheur.setDisplayToDecNumber(12345, 0, true);"     affichera "00012345"
"afficheur.setDisplayToDecNumber(12345, 0, false);"     affichera "12345"
"afficheur.setDisplayToDecNumber(12345, 0b0001000 , false);"     affichera "12.345"
"afficheur.setDisplayToDecNumber(12345, 0b11111111 , true);"     affichera "0.0.0.1.2.3.4.5."

C'est dommage que la bibliothèque n'offre pas une fonction qui permettrait d'afficher un nombre décimal (float) sans qu'on soit forcé de placer nous-mêmes le point décimal à l'endroit approprié.

L'exemple ci-dessous est un simple compteur dont la valeur augmente d'une unité à chaque seconde.

Allumer des LEDs

La fonction "setLED" comporte deux arguments:

  1. La couleur de la LED:  TM1638_COLOR_RED, TM1638_COLOR_GREEN ou TM1638_COLOR_NONE (LED éteinte).  Sur certains module, les LEDs peuvent s'allumer en rouge ou en vert.  Mon module ne comporte que des LEDs rouges.
  2. Le numéro de la LED qu'on désire allumer ou éteindre, de 0 à 7 (La LED 0 est celle qui est située à gauche du module).

L'exemple ci-dessous allume successivement chaque LED, de gauche à droite.

Lire l'état des boutons

La fonction "getButtons" retourne un octet qui décrit l'état de chaque bouton.  Le bit est à 1 si le bouton correspondant est enfoncé, et à 0 s'il ne l'est pas.

Par exemple, si vous appuyez sur le deuxième bouton à partir de la gauche (S2), getButtons retourne la valeur binaire "01000000".  Grâce à la fonction bitRead (qui est une fonction régulière Arduino et non une fonction spécifique à la bibliothèque), il est facile de vérifier l'état de chaque bouton.

L'exemple ci-dessous indique dans le moniteur série le numéro du bouton enfoncé.


À lire également:

Yves Pelletier
   (TwitterFacebook)