jeudi 19 juillet 2018

Bluetooth et MPLAB Xpress Evaluation Board

Voici un petit tutoriel qui pourrait vous être utile si vous désirez envoyer ou recevoir de l'information par bluetooth avec une carte MPLAB Xpress Evaluation Board (ou un autre microcontrôleur PIC).

Pour ce faire, nous utiliserons un module bluetooth HC-06 et, bien entendu, un appareil pouvant converser en bluetooth (télépĥone, tablette...).

Avant d'aller plus loin, je vous mentionne tout de suite que si vous désirez plutôt communiquer en bluetooth avec un Raspberry Pi, un Arduino, un MSP430 Launchpad ou un STM32 Nucleo, vous trouverez sur ce blog des tutos spécialement conçus pour votre plateforme de développement préférée!  Si vous voulez programmer vous-même l'application android qui conversera avec votre carte, c'est déjà couvert aussi.

Connexions

Nous allons régler la carte MPLAB Xpress Evaluation Board afin qu'elle émette un signal UART par sa broche RB1, et qu'elle le reçoive sur sa broche RB0.  Par conséquent, les quatre connexions sont:
  • RXD du module HC-06 ----- RB1 de la carte MPLAB Xpress
  • TXD du module HC-06 ----- RB0 de la carte MPLAB Xpress
  • GND du module HC-06 ----- GND de la carte MPLAB Xpress
  • VCC du module HC-06 ----- 5 V de la carte MPLAB Xpress
(Je crois que certains modules HC-06 sont conçus pour une alimentation de 3,3 V.  Le mien indique clairement "Power 3.6 V - 6 V" même si le niveau logique est de 3.3 V.)




Exemple 1: transmission d'information (carte MPLAB Xpress vers téléphone)

Dans ce premier exemple, la carte MPLAB Xpress va émettre par bluetooth une série de messages qui pourront être captés par un téléphone ou une tablette.

Configuration dans MCC

Après avoir créé un nouveau projet dans l'IDE en ligne MPLAB Xpress, nous ouvrons le logiciel MPLAB Xpress Code Configurateur, afin d'effectuer quelques réglages.

Nous devons d'abord ajouter un module "EUSART" à notre projet.  Pour ce faire, nous cliquons deux fois sur "EUSART" dans la liste "Device Resources"...


On coche les cases "Enable Transmit" et "Redirect STDIO to EUSART". Si votre module HC-06 est réglé à une vitesse autre que 9600 bauds, vous en profitez pour modifier ce paramètre aussi.



On clique ensuite sur les petits cadenas correspondant au port B0 pour EUSART RX, et au port B1 pour EUSART TX.


Ne pas oublier de cliquer sur le bouton "Generate" afin que ces réglages soient transmis à MPLAB Xpress.

Script

Le script ci-dessous (à insérer dans le fichier main.c de votre projet), permet d'émettre un message par bluetooth chaque seconde.



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 généralement "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é Serial Bluetooth Terminal par Kai Morich.

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.

Résultats

Les messages émis de façon répétitive par la carte MPLAB Xpress s'affichent à l'écran de la tablette.



Exemple 2: réception d'information (téléphone vers carte MPLAB Xpress)

Dans ce deuxième exemple, nous contrôlerons les 4 LEDs intégrées à la carte MPLAB Xpress par bluetooth, à partir d'un téléphone ou d'une tablette.

Configuration dans MCC

Il s'agit des mêmes réglages que pour le premier exemple, sauf qu'il n'est pas nécessaire de cocher la case "Enable Transmit". De plus, dans la zone des cadenas, il est important de définir les ports A0, A1, A2 et A3 comme des sorties:  "GPIO output" (elles sont reliées aux  LEDs de la carte).


Script

On peut ensuite utiliser le script ci-dessous (à coller dans le fichier main.c).  Si on reçoit par bluetooth le message "a", on allume la première LED. Si on reçoit le message "b", on allume la deuxième, etc.



Résultats

La zone située dans le bas de l'écran de l'appli Serial Bluetooth Terminal permet d'envoyer un message. Si vous écrivez la lettre a, puis cliquez sur le bouton de droite, la première LED de la carte MPLAB Xpress Evaluation Board s'allume.


Yves Pelletier   (TwitterFacebook)

lundi 16 juillet 2018

Contrôle d'un servomoteur avec MPLAB Xpress Evaluation Board


Je continue ma série de tutoriels concernant la programmation de la carte MPLAB Xpress Evaluation Board de Microchip, tout en vous rappelant que ces tutos sont facilement utilisables avec d'autres microcontrôleurs PIC.  Au programme aujourd'hui: le contrôle d'un servomoteur.



Servomoteur et PWM

Pour contrôler la position angulaire d'un servomoteur, vous devez le soumettre à un signal modulé en largeur d'impulsion (PWM) dont la fréquence est typiquement de 50 Hz (période de 20 ms). Le servomoteur occupe la position centrale pour une impulsion d'une durée d'environ 1,5 ms, alors que les deux positions extrêmes sont atteintes pour une impulsion de 1 ms (dans une direction) ou 2 ms (dans l'autre direction).

Ceci étant dit, il semble bien établi qu'il n'est pas obligatoire que la fréquence du signal soit de 50 Hz: la plupart des servomoteurs fonctionnent très bien pour une plage de fréquences assez large. De plus, les valeurs de 1 ms et 2 ms ne sont qu'approximatives et varient d'un servomoteur à l'autre.

Pour ce tuto, je vais malgré tout respecter la fréquence de 50 Hz (période de 20 ms),  cette valeur étant confirmée dans la fiche technique du servomoteur que j'ai utilisé, soit le modèle Tower Pro SG90.

Circuit

Le circuit est donc constitué de la carte MPLAB XPress Evaluation Board et d'un petit servomoteur branché à sa propre alimentation continue de 5 V.  Ce servomoteur sera contrôlé par la sortie RA0 (vous pouvez évidemment choisir une autre sortie de la carte et en tenir compte dans les réglages décrits plus loin dans ce billet).



Remarquez qu'un servomoteur de faible puissance peut très bien être alimenté par la sortie 5 V de votre carte; l'alimentation externe devient nécessaire si vous avez plusieurs servomoteurs sur la même carte, ou si vous utilisez un servomoteur plus gourmand en puissance.

Réglages dans MPLAB Xpress Code Configurator

Après avoir créé un nouveau projet vierge dans MPLAB Xpress, nous ouvrons MPLAB Xpress Code Configurator (si vous n'êtes pas familier avec ces outils, ce serait une bonne idée de consulter d'abord ce billet).

Je crois n'avoir rien changé concernant l'oscillateur, dans la fenêtre "System Module", mais je partage quand même son contenu, au cas où il ne s'agirait pas des valeurs par défaut.


Lorsqu'on veut utiliser un module PWM, il faut obligatoirement l'associer à un timer (2, 4 ou 6). Dans la fenêtre "Device Resources", nous cliquons deux fois sur TMR4.


Nous avons quelques modification à apporter dans les paramètres du timer numéro 4:

  • Assurez-vous que "Enable Timer" est bien coché (il devrait déjà l'être par défaut).
  • "Clock Source" doit être réglé à FOSC/4.  
  • "Prescaler" doit être réglé à 1:32 (afin qu'une période de 20 ms soit possible)
  • Vous remplacez la valeur qui se trouve dans "Timer Period" par 20 ms.

Assurez-vous ensuite que "Actual Period" affiche environ 20 ms (19.928 ms pour être précis).

Ajoutons maintenant un module PWM, en cliquant deux fois sur PWM6 dans la fenêtre "Device Resources":

On associe PWM6 au Timer4 ("Select a Timer") et on s'assure que l'option "Enable PWM" est cochée.  La valeur du "Duty Cycle" peut être réglée à une valeur située entre 5% et 10%  (entre 1 ms et 2 ms, donc)


Remarquez les informations situées au bas de la fenêtre: la période PWM est bien de 20 ms, la fréquence PWM est de 50 Hz, et la résolution PWM est de 9 bits.

Il ne reste plus qu'à indiquer à quelle sortie de la carte ce signal PWM sera acheminé. J'ai choisi le port A0, puisque le servomoteur est branché à la sortie RA0.


Pour terminer avec MPLAB XPress Code Configurator, on clique sur le bouton "Generate" dans la zone "Project Resources", afin que les fichiers appropriés soit ajoutés dans notre projet MPLAB Xpress récemment créé.


Script

Voici un script qui place le servomoteur à sa position minimale, attend une seconde, le place à sa position médiane, attend une seconde, le place à la position maximale, attend une seconde...

Attention: les valeurs utilisées comme argument pour PWM6_LoadDutyValue() sont celles qui correspondent le mieux au servomoteur que j'ai utilisé pour mes tests, et il sera probablement approprié de les modifier pour utilisation avec un autre servomoteur.

Si j'ai bien compris, la valeur maximale de l'argument de PWM6_LoadDutyValue() dépend de la résolution de notre signal PWM. À la fréquence de 50 Hz, cette résolution est de 9 bits, donc la valeur maximale est de 29 = 512.

La valeur médiane devrait être atteinte pour un temps de 1,5 ms correspondant à un rapport cyclique de 7,5%, donc 38; toutefois, mon servomoteur était mieux centré avec une valeur de 50.


Vidéo

Pour terminer: un courte vidéo du résultat.



Yves Pelletier   (TwitterFacebook)

dimanche 8 juillet 2018

Capteur de force résistif et Arduino


Un capteur de force résistif (aussi appelé "résistance à capteur de force" ou FSR pour "force sensing resistor") est un petit dispositif dont la résistance électrique varie selon la pression qui lui est appliquée (à ne pas confondre avec un capteur piézoélectrique qui, lui, génère une tension lorsqu'on le soumet à une pression).

Fabriqué à partir d'un polymère conducteur, un tel capteur est facile à utiliser puisque sa résistance varie de façon importante avec la force (contrairement à une jauge de contrainte, dont l'utilisation nécessite un pont de Wheatstone capable de détecter de très faibles variations de résistance).  De plus, ces capteurs sont très petits, minces et flexibles.  Ils ne sont toutefois pas appropriés pour des mesures de précision (on parle au mieux d'une précision de 5% à 10%) et chaque capteur doit être calibré individuellement (soumis à la même force, deux capteurs de même modèle n'auront pas nécessairement la même résistance).

Grâce à ce genre de capteur, on peut construire, par exemple, un instrument de musique sensible à la force exercée par les doigts de musicien: le son pourra être différent selon que vous appuyez fortement ou pas sur la touche.

J'ai fait quelques tests avec le modèle RP-C7.6-LT (choisi à cause de son prix très modique).  Je n'ai pas trouvé de fiche technique complète mais, selon les informations fournies par le vendeur, ce capteur est conçu pour réagir à des forces situées entre 20 grammes et 1500 grammes.

Il est habituellement déconseillé de souder les connecteurs de ce genre de capteur, car la chaleur pourrait abîmer sa partie active.  J'ai d'abord essayé d'insérer les broches du capteur directement dans une breadboard, mais le contact se faisait mal et les broches ressortaient d'elles-mêmes (broches trop courtes, peut-être).  J'ai obtenu de meilleurs résultats en insérant les broches du capteur dans un bornier à vis, lui-même placé sur une breadboard.

J'ai ensuite utilisé un multimètre afin d'observer comment varie la résistance de mon capteur lorsque je le soumet à différentes forces.


Lorsqu'aucune force n'est exercée sur le capteur, le multimètre indique une résistance infinie.  Une légère pression sur le capteur produit une résistance plutôt instable qui peut tourner autour de 20 kΩ à 25 kΩ.   La résistance est ensuite de plus en plus faible à mesure qu'on augmente la force, jusqu'à atteindre une valeur minimale d'environ 1,5 kΩ.

Pour brancher le capteur sur un microcontrôleur (une carte Arduino, par exemple), il faut que cette résistance variable provoque une tension variable.  Pour ce faire, nous allons construire le traditionnel circuit diviseur de tension, en plaçant notre capteur de force en série avec une résistance fixe, et en branchant la jonction des deux résistances à une entrée analogique de l'Arduino:

Deux versions sont possibles, selon nos besoins: dans le circuit A, la tension mesurée à l'entrée A0 augmente à mesure qu'on augmente la force sur le capteur (puisque cette augmentation de force a pour effet de diminuer la résistance du capteur), alors que dans le circuit B, la tension mesurée à l'entrée A0 diminue à mesure qu'on augmente la force sur le capteur.

Il nous reste à choisir la valeur de la résistance fixe.  En général, on souhaite que la variation de résistance de notre capteur cause une forte variation de tension à l'entrée analogique du microcontrôleur.  La plus grande variation de tension est obtenue pour une résistance fixe égale à la racine carrée du produit des résistances extrêmes pouvant être atteintes par le capteur:

Rfixe = (Rmin * Rmax)1/2

(Si vous vous y connaissez un peu en calcul différentiel, il s'agit de la valeur pour laquelle la dérivée de la variation de la tension est nulle).

Dans mon cas, en considérant que la résistance de mon capteur peut varier entre Rmin  = 1,5 kΩ et Rmax = 25 kΩ, la résistance fixe pour laquelle la variation de tension est la plus grande est d'environ 6 kΩ:

Rfixe = (Rmin * Rmax)1/2 = (1,5 * 25)1/2 = 6 kΩ

Toutefois:  même si ce n'est pas spécifié dans les informations fournies par le vendeur de mon capteur, on conseille généralement de ne pas dépasser un courant maximal d'environ 1 mA par cm2 de surface utile du capteur (il s'agit de la région circulaire qui porte un motif constitué de droites parallèles).  Sur mon capteur, ce cercle a un diamètre de 6 mm, donc une aire de 0,3 cm2...il ne faudrait pas que le courant traversant le capteur dépasse significativement 0,3 mA!

Avec une tension de 5 V, la résistance totale doit être d'au moins 16,7 kΩ pour que le courant ne dépasse pas 0,3 mA.  Puisque la résistance du capteur ne descend pas en dessous de 1,5 kΩ, j'ai donc besoin d'au moins 15 kΩ comme résistance fixe: c'est ce que j'ai utilisé.  La variation de tension ne sera pas aussi grande que si j'avais utilisé une résistance fixe de 6 kΩ , mais je m'assure que le courant ne dépassera pas la valeur maximale admissible.

Il va sans dire que vous devrez faire vos propre calculs en utilisant les valeurs extrêmes du capteur de force que vous utiliserez.

Voici donc mon circuit: un capteur de force résistif, une résistance de 15 kΩ, et une carte Arduino.



On peu ensuite utiliser le sketch "AnalogReadSerial", disponibles dans le menu Exemples, pour afficher les valeurs dans le moniteur série.





Le reste dépend de votre imagination: la force exercée sur le capteur peut servir à allumer des LEDs, faire tourner un servomoteur, modifier la fréquence d'un son...


Yves Pelletier   (TwitterFacebook)