mardi 19 septembre 2017

Déboguer l'ATTiny85 avec le moniteur série

Si vous êtes un tant soit peu familier avec la programmation d'une carte Arduino, vous savez à quel point le moniteur série peut s'avérer utile pour débusquer les erreurs dans votre sketch:  on affiche le contenu des variables à l'écran, ce qui permet souvent de trouver ce qui ne fonctionne pas correctement.

Lorsqu'on programme un ATTiny85 en utilisant une carte Arduino comme programmateur (Arduino as ISP), cette option n'est pas directement disponible puisque l'ATTiny85 ne dispose pas de ports UART hardware. Il est toutefois possible d'utiliser la bibliothèque "software serial" qui est distribuée par défaut avec l'IDE Arduino.

Je vais supposer que vous savez déjà comment utiliser une carte Arduino Uno comme programmateur de carte ATTiny (si ne n'est pas le cas, vous pouvez vous référez à cet article que j'ai récemment mis à jour).

Notez que j'utilise le core développé par David A. Mellis, avec une fréquence d'horloge de 1 MHz.

Pour transmettre les données de l'ATTiny vers l'ordinateur, j'utilise un convertisseur USB-TTL dont la broche "RX" est reliée au GPIO de l'ATTiny que j'ai choisi pour la communication série.



Je rappelle le pinout de l'ATTiny85, c'est toujours utile:



Première option:  affichage dans le moniteur série pendant que l'ATTiny demeure branché au programmateur Arduino

Cette option est pratique car vous pouvez téléverser votre sketch dans l'ATTiny et observer le résultat dans le moniteur série sans avoir à débrancher quoi que ce soit.  Elle n'est pas toujours réalisable, toutefois, car les GPIO 0, 1 et 2 de l'ATTiny sont déjà utilisées pour la programmation; vous devez donc dédier le GPIO 3 ou 4 à la transmission série, et un seul GPIO demeure disponible pour y brancher un capteur ou autre.

Sur le schéma ci-dessous, le GPIO 4 (qui est en fait la broche numéro 3 de l'ATTiny) est utilisé pour la transmission des données vers le moniteur série.  Les autres connexions sont celles qui sont requises pour programmer l'ATTiny au moyen de l'Arduino Uno.

La masse (GND) du convertisseur USB-TTL est reliée à la masse de l'ATTiny et à celle de la carte Arduino.



Puisque la carte Arduino et le convertisseur USB-TTL sont tous les deux branchés à l'ordinateur, je dois m'assurer de sélectionner le bon port dans le menu "Outil":  le port correspondant à l'Arduino lorsque je désire téléverser le sketch dans l'ATTiny, et le port correspondant au convertisseur Série-TTL lorsque je désire afficher le moniteur série.




Deuxième option:  affichage dans le moniteur série pendant que l'ATTiny n'est plus branché au programmateur Arduino

Puisque l'ATTiny85 comporte un nombre restraint de pins GPIO, il est souvent nécessaire de le débrancher de l'Arduino pour faire nos tests.  Vous pouvez alors utiliser n'importe lequel des GPIO pour la transmission des données, et utiliser les autres pour y brancher des capteurs, LEDs, etc.  Si désiré, le convertisseur USB-TTL peut servir à l'alimentation de votre circuit.



Un exemple de sketch

Aucune installation de bibliothèque n'est nécessaire, puisque "SoftwareSerial" est inclus avec l'IDE Arduino.  Les données sont transmise par le GPIO 4, ce qui correspond aux circuits illustrés plus haut.  Dans ce cas, puisque j'envoie des données vers l'ordinateur mais je ne désire pas en recevoir, j'ai assigné un numéro de GPIO bidon pour la pin RX.





Yves Pelletier   (TwitterFacebook)

jeudi 14 septembre 2017

Appli Android pour contrôler un moteur pas à pas par bluetooth (Arduino)

Vous désirez contrôler un moteur pas à pas par bluetooth au moyen de votre téléphone android? Ça tombe bien, c'est justement le sujet du billet d'aujourd'hui!

Côté récepteur, notre montage est constitué d'un moteur pas à pas bipolaire, d'une carte Arduino Uno, d'un module bluetooth HC-06, et d'un double pont en H L293D (un L298N aurait fait l'affaire aussi).

Côté émetteur, un appareil android qui exécutera une application que nous aurons nous-même conçue sur MIT App Inventor.

Cette activité suppose certaines connaissances préalables.  Si ce n'est pas déjà fait, je crois qu'il serait préférable de lire mon introduction au module bluetooth HC-06 avec Arduino, mes explications détaillées sur la façon de piloter un moteur pas à pas avec un L293D, mon introduction à la programmation d'une appli android avec MIT App Inventor 2 et, finalement, la programmation d'une appli androit pour communiquer en bluetooth avec MIT App Inventor 2!

Voici une vidéo du dispositif en action:



Connexions du L293D

Le circuit intégré L293D est branché de la même façon que dans ce précédent billet consacré au pilotage d'un moteur pas à pas.

  • Les broches 1, 9 et 16 du L293D sont branchées à la sortie 5 V de la carte Arduino.
  • Les broches 4, 5, 12 et 13 constituent la masse du L293D.  On doit y brancher la masse (GND) de l'Arduino, et la borne négative de la source d'alimentation du moteur pas à pas.
  • La borne positive de l'alimentation du moteur pas à pas est branché à la broche 8 du L293D.
  • Le moteur pas à pas est branché aux borches 3, 6, 11 et 14 du L293D
  • Les broches 2, 7, 10 et 15 du L293D sont branchées respectivement aux sorties 8, 9, 10 et 11 de l'Arduino.
Connexions du module bluetooth HC-06 et du CI 4050

Le module bluetooth HC-06 est conçu pour fonctionner à un niveau logique de 3,3 V.  Pour cette raison, l'utilisation d'un circuit intégré 4050 est conseillée pour abaisser le signal de 5 V émis par l'Arduino.

Voici les connexions du 4050; pour plus d'explications, référez-vous au billet sur l'utilisation d'un 4050 pour abaisser un niveau logique.

  • Broche 1 du 4050:  sortie 3,3 V de l'Arduino
  • Broche 2 du 4050:  entrée RXD du module HC-06
  • Broche 3 du 4050:  sortie Tx de l'Arduino (pin 1)
  • Broche 8 du 4050:  masse (GND de l'Arduino)


Le module HC-06, quant à lui, est branché de la façon suivante:


  • Vcc du HC-06 --- sortie 5 V de l'Arduino
  • GND du HC-06 --- GND de l'Arduino
  • TXD du HC-06 --- Rx de l'Arduino (pin 0)
  • RXD du HC-06 --- broche 2 du 4050

Vous pouvez bien sûr vous référer au billet Bluetooth et Arduino: le module HC-06 pour plus de détails.




Circuit complet

Voici donc le schéma complet, incluant la carte Arduino, le L293D, le 4050, le module HC-06 et le moteur pas à pas!



Sketch de l'Arduino

L'Arduino recevra par bluetooth un nombre entier situé entre 0 et 100.  Par défaut, on considère que la position angulaire initiale du moteur est 50.  À partir de cette position initiale, le moteur doit faire un demi-tour dans un sens pour atteindre la position 0, et un demi tour dans l'autre sens pour atteindre la position 100.




Réalisation de l'appli android avec MIT App Inventor 2

L'appli android comporte les boutons nécessaires pour établir une communication bluetooth, ainsi qu'un "ascenseur" que l'utilisateur déplace afin de faire tourner le moteur pas à pas à la position désirée.

L'interface comporte 8 éléments:



1)  Un rectangle "Arrangement horizontal", pris dans la catégorie "Disposition", qui permet de faire en sorte que les éléments 2, 3 et 4 seront disposés dans la fenêtre sur une même ligne horizontale.

2)  Un "Label" (disponible dans la catégorie "Interface Utilisateur").  Par défaut, ce label portait le nom "Label1", mais je l'ai renommé "StatutConnexion".  La mention "connecté" ou "déconnecté" s'affichera à cet endroit.

3)  Un "Sélectionneur de liste" (disponible dans la catégorie "Interface Utilisateur").  Lorsque l'utilisateur cliquera sur cet élément, la liste des appareils bluetooth disponibles s'affichera à l'écran. J'ai renommé cet élément "BoutonConnecter", et j'ai remplacé son texte par "Connecter".

4)  Un "Bouton" (disponible dans la catégorie "Interface Utilisateur") qui servira à interrompre la connexion avec l'Arduino.  J'ai renommé cet élément "BoutonDéconnecter", et j'ai remplacé son texte par "Déconnecter".

5)  Un deuxième "Label" (disponible dans la catégorie "Interface Utilisateur").  J'y ai inscrit le texte "Position".

6)  Un "Ascenseur" (disponible dans la catégorie "Interface Utilisateur").  Largeur:  80% de la fenêtre, valeur maximale:  100, valeur minimale:  0.

7) Un "Client Blutooth" (disponible dans la catégorie "Connectivité"), indispensable pour toute application qui communique avec bluetooth.

8)  Un "Notificateur" (disponible dans la catégorie "Interface Utilisateur"), qui permet d'afficher un message d'alerte si bluetooth n'a pas été activé sur l'appareil android.


Construction du programme

Passons maintenant en mode "Blocs".  Tout ce qui concerne le contenu le contenu de l'élément "Arrangement horizontal" est identique à ce que j'avais décrit dans le billet intitulé "Programmer une appli android pour communiquer en bluetooth":


Il ne reste plus qu'à gérer le comportement de notre ascenseur:  lorsqu'on le déplace, il envoie sa nouvelle position (un nombre situé entre 0 et 100) par l'entremise du client bluetooth:


Fichier .aia

Vous pouvez télécharger ici le programme complet:  Moteur_PAP.aia

Yves Pelletier   (TwitterFacebook)

jeudi 7 septembre 2017

Mesurer une température avec une carte STM32 Nucleo (mbed)

On a parfois besoin de mesurer une température au moyen d'un microcontrôleur (contrôle d'un système de chauffage ou de climatisation, station météorologique, expérience scientifique, etc.).

Je vous présente aujourd'hui quelques façons différentes de mesurer une température avec une carte STM32 Nucleo:  nous utiliserons successivement le capteur de température interne du STM32, un capteur numérique DS18B20, un capteur numérique BMP180, et un capteur analogique LM35.

(Si vous préférez mesurer une température au moyen d'une carte Arduino, consultez plutôt cet article).

Méthode 1:  Le capteur de température interne du STM32 (méthode déconseillée!)

Le microcontrôleur STM32 comporte un capteur de température intégré pouvant mesurer des températures situées entre -40°C et +125°C avec une résolution de 1,5°C.  L'avantage principal de cette méthode (et peut-être même le seul avantage), c'est que vous n'avez aucun composant externe à brancher au Nucleo.

Cette option n'est pas applicable à tous les projets, pour différentes raisons:  vous mesurez la température à l'intérieur du microcontrôleur, qui peut être sensiblement plus élevée que la température environnante, il n'est pas toujours possible de placer la totalité de votre carte Nucleo là où vous désirez connaître la température (dans un liquide, par exemple...), la résolution de 1,5°C peut être insuffisante pour ce que vous désirez faire...

Mais l'inconvénient majeur, c'est que pour fournir la température en degrés Celsius, chaque STM32 doit être individuellement calibré.  En d'autres mots, un script qui permet à votre carte Nucleo de lire la température avec une précision raisonnable pourra donner des résultats catastrophique sur une autre carte Nucleo!

Puisque le capteur de température est une caractéristique de l'ADC (convertisseur analogique/numérique) du STM32, vous lisez sa valeur exactement comme vous liriez une entrée analogique conventionnelle.   La seule différence, c'est que vous utilisez la constante "ADC_TEMP" plutôt que le numéro d'une entrée analogique.

Là où les choses se compliquent, c'est que cette lecture sera un nombre proportionnel à la température, situé entre 0 et 1,0 (0 à 100% de 3,3 V), et non une température en degrés Celsius.  Il faut donc faire une conversion.  (Notez que plus la température est élevée, plus la tension mesurée est faible, ce qui est quelque peu contre-intuitif.)

Le tableau ci-dessous provient de la fiche technique du STM32F030R8 (j'ai utilisé la carte NUCLEO-F030R8).


On y constate que la tension mesurée par mon Nucleo lorsque la température est de 30°C  peut prendre n'importe quelle valeur entre 1,34 V et 1,52 V (ça varie d'un exemplaire à l'autre).  De plus, pour chaque variation de température de 1 °C, la tension mesurée varie typiquement de 4,0 mV à 4,6 mV.

Si je connais ceux deux valeurs avec une précision raisonnable, c'est relativement facile de convertir la tension mesurée en degrés Celsius:


Supposons que j'ai mesuré 0,445, ce qui correspond à 1,47 V (44,5% de 3,3 V).  Si les caractéristique de mon Nucleo correspondent à la colonne "typique", la tension à 30°C est de 1,43 V, et la pente moyenne est de 4,3 mV/°C, ce qui donne une température de 20,7°C.


...mais si vous mesurez la même valeur de 1,47 V avec un Nucleo dont la tension à 30°C est de 1,34 V et la pente moyenne de 4,0 mV/°C, ça représente une température de -2,5°C:


...et si vous mesurez toujours 1,47 V, mais avec un Nucleo dont la tension à 30°C est de 1,52 V et la pente moyenne de 4,6 mV/°C, la température est plutôt de 40,9°C:


Conclusion:  pas question d'utiliser une simple approximation tirée de la fiche technique!  Vous devez connaître les paramètres précis de votre carte Nucleo!

Notez que, lors de la fabrication du microcontrôleur, la tension mesurée à 30°C (TS_CAL1) est enregistrée en mémoire.  Certains modèles de STM32 (mais pas mon F030R8) comportent aussi la température à 110°C (TS_CAL2).  L'utilisation de ces valeurs permettrait une mesure beaucoup plus fiable.   Cette méthode est inapplicable dans le cas de mon Nucleo F030R8:  connaître uniquement la valeur précise de la tension à 30°C est insuffisante pour me permettre de faire la conversion.

Je me suis donc résigné à produire une courbe d'étalonnage.  Pour ce faire, j'ai enfermé mon Nucleo et un thermomètre dans un même récipient de plastique fermé hermétiquement, que j'ai placé quelques minutes au congélateur. J'ai ensuite compilé la mesure brute du Nucléo et la température du thermomètre pendant que le contenu du récipient reprenait progressivement la température normale de la pièce.

À partir du graphique, on peut trouver une valeur raisonnablement précise pour la pente moyenne et la tension à 30°C (ou procéder autrement afin de convertir les données brutes en Celsius).

Ceci étant dit, tout ça me semble inutilement compliqué lorsqu'on considère qu'on peut se procurer un capteur de température déjà calibré en °C, facile à utiliser et pas cher du tout.

Voici quand même un script mbed qui affiche la valeur brute mesurée, pour ensuite la convertir en volts, puis en degrés Celsius (en supposant que connaissez la valeur exacte de la tension à 30°C et de la pente moyenne (Avg_slope):




Tout est beaucoup plus simple avec les 3 méthodes suivantes...

Méthode 2: le capteur de température DS18B20

Difficile de trouver des inconvénients au capteur DS18B20 de Maxim, qui peut mesurer des températures entre -55°C et +125°C, avec une résolution de l'ordre d'un demi degré.  Les connexions sont simples:

Vcc du DS18B20:  sortie 3V3 de la carte Nucleo
Data du DS18B20:  entrée A0 de la carte Nucleo*
GND du DS18B20:  GND de la carte Nucleo

Mais attention:  une résistance de 4,7 k doit obligatoirement être branchée entre la pin Vcc et la pin Data du DS18B20.

*:  Le DS18B20 étant un capteur numérique, l'entrée A0 est ici utilisée comme entrée numérique plutôt que comme entrée analogique.  Vous pouvez utiliser n'importe quelle autre entrée du Nucleo en modifiant légèrement le script proposé ci-dessous.

Si votre DS18B20 se trouve à l'intérieur d'une sonde hermétiquement fermée, Vcc est le fil rouge, GND est le fil noir, et Data est l'autre fil.


Ensuite, dans le compilateur mbed, vous pouvez importer le programme d'exemple réalisés par Erik Olieman.  Pour ce faire, vous pouvez cliquer sur le bouton "import", sélectionner l'onglet "Programs" et faire une recherche pour "ds18b20".  Vous pouvez alors sélectionner "DS1820_HelloWorld" par Erik Olieman (c'était le premier choix de la liste quand je l'ai fait).


Le Nucleo transmet à l'ordinateur, par communication série,  la température mesurée:


(c'était une chaude journée d'été, sans climatisation...)

Méthode 3: le capteur de pression BMP180

Même si le capteur BMP180 sert surtout à mesurer la pression atmosphérique, il mesure également la température.  Tout est déjà expliqué dans cet article sur l'utilisation du BMP180 avec la carte Nucleo.

Méthode 4:  le capteur de température LM35

Le capteur LM35 est analogique:  sa tension de sortie est proportionnelle à la température en degrés Celsius (10 mV par degré Celsius).  (Dans cette configuration simple, toutefois, il ne peut pas mesurer de températures plus basses que 2°C).  Tout comme le DS18B20, le LM35 comporte 3 fils:

Vcc du LM35:  sortie 3V3 de la carte Nucleo
Vout du LM35:  entrée A0 de la carte Nucleo
GND du LM35:  GND de la carte Nucleo

Si le signal en provenance du LM35 est acheminé par un câble de quelques dizaines de centimètres ou plus, le bruit pourrait être un problème (forte oscillation du signal mesuré).  Un condensateur placé entre Vout et GND devrait pouvoir atténuer ces fluctuations.





Yves Pelletier   (TwitterFacebook)

jeudi 31 août 2017

Capteur à infrarouge passif (PIR)

Je vous présente aujourd'hui une option fort intéressante pour détecter l'arrivée d'une personne ou d'un animal:  le capteur à infrarouge passif (souvent appelé capteur "PIR" pour "passive infrared").  Ce genre de capteur est typiquement utilisé dans des systèmes d'alarme, ou encore dans des systèmes d'éclairage qui s'allument automatiquement lorsque quelqu'un entre dans la pièce et qui s'éteignent lorsqu'il n'y a plus personne.

Un capteur PIR peut être branché à un Arduino, un Raspberry Pi ou autre mais, pour certaines applications, il est tout à fait possible de l'utiliser de façon autonome sans le moindre microcontrôleur.  Aujourd'hui, je me limiterai volontairement aux caractéristiques du capteur lui-même, et à quelques applications ne nécessitant pas de microcontrôleur.  L'utilisation d'un capteur PIR avec une carte Arduino a déjà été traitée (il y a 5 ans!), et son utilisation avec un Raspberry Pi ou un STM32 Nucleo seront abordées bientôt, dans des articles distincts.

Les capteurs PIR vendus sur internet sont généralement basés sur le modèle proposé par Adafruit, L'élément caractéristique qui permet de reconnaître ce genre de dispositif au premier coup d'oeil est un petit dôme hémisphérique blanc. Au verso de la carte, on remarque un circuit électronique assez complexe (un circuit intégré spécialisé BISS0001, et une assez grande quantité de résistances et de condensateurs).


Un capteur pyroélectrique se trouve sous le dôme (vous pouvez vérifier:  le dôme est amovible). Ce capteur pyroélectrique détecte le rayonnement infrarouge que vous émettez constamment, que vous le vouliez ou non.

Voilà pourquoi on parle de capteur à infrarouge "passif":  le capteur se contente de détecter le rayonnement infrarouge émis par son environnement.  Les capteurs actifs, quant à eux, vont plutôt émettre un rayonnement pour ensuite capter la partie transmise ou réfléchie de ce rayonnement (exemples de capteurs actifs:  une LED infrarouge couplée à un phototransistor, un télémètre Sharp, etc.).

Si vous vous déplacez dans l'environnement du capteur, il en résultera des variations du rayonnement infrarouge détecté.  Le reste du circuit est conçu pour réagir à ce changement.

Le dôme hémisphérique agit comme une lentille qui aide à rediriger le rayonnement infrarouge vers le capteur.  Ça permet de détecter le mouvement sur une distance allant jusqu'à environ 7 mètres, à l'intérieur d'un cône d'environ 120°.

Les connecteurs


Le module PIR comporte 3 connecteurs:

  • GND:  La masse, qu'on branche à la borne négative de la source d'alimentation.
  • OUT:  C'est la sortie du capteur.  Sa tension est nulle lorsqu'aucun mouvement n'est détecté, et elle passe à 3,3 V lorsqu'un mouvement est détecté.
  • +5V:  À brancher à la borne positive de la source d'alimentation.  5 V est l'idéal.  La présence d'un régulateur de tension sur la carte vous permet d'excéder cette valeur (jusqu'à 12 V en principe).  Vous ne pouvez pas utiliser une alimentation de 3,3 V, toutefois.



On peut voir tout de suite à quel point le capteur sera facile à utiliser avec un microcontrôleur:  une sortie de 5 V est disponible sur pratiquement toutes les cartes (même celles qui utilisent un niveau logique de 3,3 V).  Le signal de sortie de 3,3 V est parfaitement adapté au Raspberry Pi, mais est suffisamment élevé pour être correctement traité par l'Arduino Uno.

Les potentiomètres


Le module comporte également deux potentiomètres:  un pour la sensibilité, l'autre pour la durée.



Le potentiomètre de sensibilité (celui de gauche sur la photo ci-dessus) vous permet de modifier l'ampleur du mouvement qui sera nécessaire pour déclencher la sortie du capteur.  On augmente la sensibilité en tournant le potentiomètre dans le sens horaire.  Lorsque la sensibilité est réglée à un niveau élevé, le capteur est en mesure de détecter des mouvement plus subtils, situés plus loin du capteur (sans excéder 7 m environ), mais le risque de "faux positifs" est plus élevé.

Avec le potentiomètre de durée (celui de droite sur la photo), vous contrôlez le temps pendant lequel le signal de sortie du capteur demeurera élevé suite à la détection du mouvement.  Si votre signal est traité par un microcontrôleur, un signal très court est suffisant (ça permettra à votre capteur de se remettre immédiatement aux aguets, pour la détection d'un prochain mouvement).  Mais si le capteur commande directement un système d'éclairage, vous ne voulez peut-être pas que la lampe s'éteigne aussitôt que vous demeurez immobile pendant quelques secondes... Vous augmentez le temps en tournant le potentiomètre dans le sens horaire (à la position maximale, le signal demeure haut pendant quelques minutes).

Cavalier (jumper)

Juste à côté des potentiomètres, on remarque un groupe de 3 connecteurs, dont deux sont reliés par un cavalier (jumper).

La position par défaut du jumper est celle qui est la plus proche du coin (photo de gauche ci-dessous). Dans cette configuration, le signal de sortie demeure stable suite à la détection d'un mouvement.

Si vous déplacez le jumper de façon à l'éloigner du coin (photo de droite ci-dessous), le signal de sortie sera plutôt une succession rapide de signaux hauts et bas (je n'y vois personnellement aucune utilité).



Une LED, pour explorer

Une bonne façon de vérifier  le fonctionnement correct de votre module PIR est de brancher une LED à sa sortie (avec une résistance de protection, bien entendu).





La LED devrait s'allumer lorsque vous bougez devant le capteur, et s'éteindre si vous demeurez immobile, ou si vous vous éloignez à plus de 7 mètres.  Vous pouvez ajuster les potentiomètres à des positions qui conviennent à vos besoins.

Vous avez des enfants turbulents?  Le jeu de la statue les calmera:  ça consiste à demeurer immobile le plus longtemps possible devant le capteur, sans que la petite lumière s'allume...

Éclairage automatique

J'ai fait quelques tests très concluants pour contrôler une lampe (alimentée par le courant secteur) de façon à ce qu'elle s'allume automatiquement quand j'entre dans la pièce, et qu'elle s'éteigne lorsque la pièce est vide depuis plusieurs secondes.

Pour ce faire, j'ai utilisé la prise de courant secteur munie d'un relais que j'avais fabriquée en 2013.

Lorsque le signal de sortie du capteur PIR est haut, le relais devient conducteur et la lampe s'allume.

Évidemment, les projets impliquant les hautes tensions du réseau électrique résidentiel sont toujours dangereux:  si vous n'êtes pas sûrs de ce que vous faites, ne le faites pas!

Photographie automatique

Comme dernier projet aujourd'hui:  une caméra espion qui prend automatiquement une photo lorsqu'elle détecte une présence. Ce projet est souvent proposé avec un Raspberry Pi et son module camera, mais on peut se débrouiller avec pas mal moins de puissance de calcul...

J'ai utilisé un vieil appareil photo bas de gamme dont le bouton déclencheur a été remplacé par un transistor NPN (en 2014, j'avais trafiqué l'appareil photo de cette façon pour faire du time lapse).

Le collecteur et l'émetteur sont soudés de part et d'autre de l'interrupteur, alors que la base est reliée à la sortie du module PIR (insérer une résistance de 4,7 kΩ entre la base du transistor et la sortie du PIR).

Lorsqu'un intrus entre dans la pièce, la sortie du détecteur à infrarouge devient haute, ce qui rend conductrice la jonction collecteur-émetteur du transistor:  une photo est prise, comme si on avait appuyé sur le bouton.


Yves Pelletier   (TwitterFacebook)

samedi 26 août 2017

Modifier les paramètres du module bluetooth HC-06

Comme je l'ai déjà mentionné à quelques occasions, le module HC-06 constitue une façon simple et économique d'établir une communication bluetooth avec un Arduino, un Raspberry Pi, un STM32 Nucleo, un MSP430 Launchpad, etc.

Par défaut, le nom du module (tel que vu par les autres appareils bluetooth placés à proximité) est simplement "HC-06", le mot de passe (numéro d'identification PIN) est "1234" et le baud rate est 9600.

Bonne nouvelle:  chacun de ces trois paramètres peut être modifié au besoin, grâce à des commandes AT.

Au départ, mon module HC-06 comporte les paramètres par défaut.  Ci-dessous, l'écran de ma tablette Android, qui détecte la présence d'un périphérique bluetooth nommé "HC-06".


Pour établir un lien entre mon ordinateur et le HC-06. j'utilise un convertisseur USB/TTL fonctionnant à un niveau logique de 3,3 V.  Ces petits modules très économiques sont utiles pour programmer un ESP8266 ou un Arduino Pro Mini, par exemple.

Si vous ne disposez pas d'un convertisseur USB/TTL, il est possible d'utiliser une carte Arduino comme intermédiaire.  Voici un tutoriel qui vous explique comment faire.



Il faut connecter le HC-06 au convertisseur USB/TTL de la façon suivante:
  • VCC du HC-06 --- 5 V du convertisseur USB/TTL
  • GND du HC-06 --- GND du convertisseur USB/TTL
  • RXD du HC-06 --- TXD du convertisseur USB/TTL
  • TXD du HC-06 --- RXD du convertisseur USB/TTL
J'ai aussi besoin d'un logiciel de communication série comme, par exemple, Putty ou Termite.  J'ai choisi d'utiliser le moniteur série de l'IDE Arduino.  En plus de sélectionner le bon port série et le baud rate actuel de votre HC-06, assurez-vous de régler le moniteur série à "Pas de fin de ligne".


Pour vérifier la connexion, tapez "AT" dans le moniteur série, puis cliquez sur le bouton "Envoyer". Si tout est en règle, vous devriez voir apparaître la réponse "OK".

On peut aussi vérifier quelle est la version du firmware du HC-06, en écrivant "AT+VERSION". Ça m'a retourné "OK", puis "linvorV1.80".

Passons à quelque chose de plus utile.  Vous voulez modifier le nom de votre HC-06?  Il s'agit de taper la commande "AT+NAMEnouveaunom" (où vous remplacez "nouveaunom" par le nom que vous désirez donner à votre HC-06).  J'ai décidé de le renommer "ARDUINO", puisqu'il sera branché à un Arduino.  J'ai donc écrit "AT+NAMEARDDUINO".  Remarquez qu'il n'y a pas d'espace entre la commande AT et le nouveau nom.  Le HC-06 m'a répondu "OK", puis "setname".

Vous voulez modifier le mot de passe (PIN) du HC-06 pour autre chose que "1234"?  Il s'agit d'écrire "AT+PINnouveaucode" en remplaçant "nouveaucode" par un nouveau nombre de 4 chiffres.  J'ai écrit "AT+PIN8888", et ça m'a répondu "OK" et "setPIN".

Finalement, si vous désirez modifier le baud rate, vous écrivez une des commandes suivantes: "AT+BAUD1" (pour une vitesse de 1200 baud),  "AT+BAUD2"(pour une vitesse de 2400 baud), "AT+BAUD3" (4800), "AT+BAUD4" (9600), "AT+BAUD5 (19200), "AT+BAUD6" (38400), "AT+BAUD7" (57600), "AT+BAUD8"(115200), "AT+BAUD9" (230400), "AT+BAUDA" (460800), "AT+BAUDB" (921600) ou "AT+BAUDC" (1382400).

À l'écran du moniteur série, les réponses du HC-06 s'affichent l'une à la suite de l'autre, sans espace ni fin de ligne:



Maintenant, mon appareil Android détecte un périphérique bluetooth nommé "ARDUINO", et j'ai dû utiliser le code "8888" pour autoriser l'appairage.



Yves Pelletier   (TwitterFacebook)

vendredi 18 août 2017

Module bluetooth HC-06 et MSP430 Launchpad (Energia)

Maintenant que nous savons comment utiliser un module bluetooth HC-06 avec Arduino, Nucleo et Raspberry Pi, voyons comment procéder avec un MSP430 Launchpad de Texas Instruments (en utilisant l'IDE Energia, qui permet de programmer le Launchpad en utilisant les mêmes instructions que pour un Arduino).

En plus d'un MSP430 Launchpad  et d'un module HC-06, vous aurez besoin d'un autre dispositif capable de communiquer par Bluetooth comme, par exemple, un smartphone ou une tablette.

Connexion du module HC-06 au Launchpad

Les branchements sont les suivants:

  • VCC du HC-06 :  Vcc du Launchpad
  • GND du HC-06 : GND du Launchpad
  • TXD du HC-06 : P1.1 (RXD) du Launchpad*
  • RXD du HC-06:  P1.2 (TXD) du Launchpad*

* Attention:  j'ai utilisé un Launchpad comportant le microcontrôleur MSP430G2553;  sur d'autres modèles (MSP430G2452), les broches TXD et RXD sont inversées!


Il est indiqué au verso de mon module que l'alimentation doit se situer entre 3,6 V et 6 V. Toutefois, mon module fonctionne très bien avec la sortie 3,3 V du Launchpad.  Si ce n'est pas le cas chez vous, vous pouvez toujours utiliser la sortie 5 V "secrète", située sous le connecteur mini-USB du Launchpad (il faut souder une broche dans le trou TP1).


Aussitôt que 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. Par défaut, le mot de passe 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 exemple de sketch

Le sketch ci-dessous est conçu pour Energia (il pourrait donc être utilisé tel quel avec une carte Arduino).  Il s'agit d'un simple compteur:  le Lauchpad émet des nombres croissants qui, si tout se passe bien, devraient être captés via Bluetooth par l'autre appareil.






Comme exemple de communication bi-directionnelle, vous pouvez utiliser le sketch diffusé dans le billet sur l'utilisation du HC-06 et Arduino:  ce sketch permet d'allumer et éteindre une paire de LEDs branchée au Launchpad grâce à des commandes envoyés par le smartphone.  Bien que conçu pour l'Arduino, il devrait fonctionner tel quel sur Energia.

Yves Pelletier   (TwitterFacebook)


Related Posts Plugin for WordPress, Blogger...