vendredi 28 avril 2017

Télémètre à ultrasons HC-SR04 et STM32 Nucleo


Le télémètre à ultrasons HC-SR04 permet de mesurer la distance du plus proche obstacle se trouvant devant lui.  Par exemple, il peut servir de capteur pour un robot qui évite les obstacles, pour un dispositif d'aide au stationnement d'un véhicule, pour un système d'alarme détectant la présence d'un intrus, etc.


Dans ce court article, nous branchons un télémètre HC-SR04 à une carte STM32 Nucleo.

Si vous préférez, d'autres articles expliquent comment utiliser le HC-SR04 avec un Arduino ou avec un Raspberry Pi.


Principe de fonctionnement


Le télémètre HC-SR04 est un sonar:  il émet des ultrasons, et capte leur écho.  Plus l'obstacle est éloigné, plus le délai entre l'émission de l'ultrason et la réception de l'écho sera long.

Lorsque la pin "Trig" du module est brièvement soumise à un signal logique haut, une brève impulsion ultrasonore est émise.

Lorsqu'un écho est capté, la pin "Echo" prend l'état logique haut pendant une durée égale à la durée du trajet aller-retour de l'ultrason.

Le circuit

Le module HC-SR04 fonctionne à 5 V, mais il interprétera correctement le signal numérique de 3,3 V que lui enverra le Nucleo sur la pin "Trig".  Par contre, j'ai préférer utiliser un 4050 pour abaisser à 3,3 V le signal de 5 V émis par la sortie "Echo" (il semble que les entrées du Nucleo sont conçues pour tolérer les tensions de 5 V, cette précaution est peut-être donc superflue).




En résumé, il faut brancher les choses de cette façon:

Pin Vcc du HC-SR04 -------  Pin 5 V du Nucleo
Pin Trig du HC-SR04 ------- Pin D8 du Nucleo
Pin Echo du HC-SR04 ------Pin 3 du CD4050
Pin Gnd du HC-SR04 ------ Pin GND du Nucleo

Pin 1 du CD4050 ------- Pin 3V3 du Nucleo
Pin 2 du CD4050  ------ Pin PWM/D9 du Nucleo
Pin 8 du CD4050 ------- Pin GND du Nucleo

Un petit script à utiliser sur mbed

Voici finalement un script qui affichera dans un moniteur série (celui de l'IDE Arduino, par exemple), la distance d'un obstacle, en centimètres.


/*******************************************************************
Utilisation d'un télémètre HC-SR04 avec une carte STM32 Nucleo
https://electroniqueamateur.blogspot.com/2017/04/telemetre-ultrasons-hc-sr04-et-stm32.html
********************************************************************/
#include "mbed.h"
Serial pc(USBTX,USBRX); // pour envoi de données par communciation série 9600 bauds
DigitalOut trig(D8); // pin trigger du HC-SR04 branchée à D8
DigitalIn echo(D9); // pin echo du HC-SR04 branché à D9
Timer t; //chronomètre
#define vitesse_son 343.595*100; // vitesse du son en cm/s
int main() {
double time, distance;
while(1) {
t.reset(); //chronomètre à zéro
trig = 1; // émission de l'ultrasons
time = 0;
wait_us(10);
trig = 0;
if (echo == 1) { //réception d'un écho
t.start(); // démarrage du chronomètre
while(1){
if(echo == 0) {
t.stop(); // arrêt du chronomètre
time = t.read(); // lecture du chronomètre
distance = time / 2.0 * vitesse_son; // conversion en cm
pc.printf("%1.1f cm\n\r",distance); // envoie sur résultat par communication série
t.reset(); // chronomètre à zéro
wait(1); // une mesure par seconde
break;
}
}
}
}
}

(Basé sur un script par T Nara.)


À lire également:

Vous trouverez aussi sur ce blog des conseils pour utiliser le télémètre HC-SR04 avec un Arduino Unoavec un Raspberry Piavec un ATTiny85,  avec un microcontrôleur PIC et avec un micro:bit.

Yves Pelletier   (TwitterFacebook)

mercredi 19 avril 2017

Analyseur logique: installation de sigrok PulseView sous Windows

Il y a quelques semaines, je me suis procuré un analyseur logique sur eBay, un modèle ultra-économique vendu au prix de 7 euros environ.

Dans ce court article, je vous montre comment j'ai installé le logiciel sigrok Pulseview sur Windows afin d'effectuer un premier test rapide confirmant le fonctionnement correct de l'appareil.

Je tiens à préciser que je n'avais jamais eu l'occasion d'utiliser un analyseur logique auparavant.  Il serait donc illusoire d'attendre de ma part une minutieuse comparaison avec d'autres analyseurs logiques disponibles sur le marché, ou encore un cours complet sur l'art d'utiliser efficacement ce genre d'appareil.

Il s'agit donc d'un minuscule dispositif (5 cm X 2,5 cm X 1 cm) qui se branche sur le port USB d'un ordinateur.   C'est un analyseur 8 bits, ce qui signifie qu'on peut observer jusqu'à 8 signaux logiques simultanément, à une fréquence d'acquisition maximale de 24 MHz.



Mon exemplaire était accompagné d'un câble mini-USB et de 10 câbles Dupont femelles (ce qui ne constitue pas le meilleur type de connecteur, dans les circonstances).

Évidemment, à ce prix, nous ne serons pas surpris de constater que le fabricant n'a pas été spécialement pointilleux en matière de propriété intellectuelle.  Bien que ce ne soit pas indiqué sur le boîtier  (ni dans la description sur eBay), la mention "usb Saleae  V1.1"  est clairement visible sur le circuit imprimé:  il s'agit donc d'une copie d'un analyseur conçu par la compagnie américaine Saleae.



Vice de conception assez rigolo: une LED rouge s'allume pour indiquer que l'analyseur est sous tension, mais puisque cette LED est enfermée à l'intérieur d'un boîtier opaque, il est impossible de savoir si elle est allumée ou non...  On peut voir sur le circuit imprimé qu'une deuxième LED a été omise (dans le circuit d'origine, cette LED verte sert à indiquer s'il y a de l'activité sur les canaux numériques).

Côté logiciel, deux choix s'offrent à vous:
  • sigrok:  Un logiciel libre spécialement conçu pour être utilisé avec une vaste gamme d'analyseurs logiques.  C'est la voie que je vous propose ici:  ça nous permettra peut être de nous sentir un peu moins coupables d'avoir encouragé la contrefaçon...
Nous nous dirigeons donc vers la page de téléchargement de sigrok dédiée à Windows (d'autres plate-formes sont bien sûr disponibles:  Mac, Linux, Android, etc.).  Pour ma part, je l'ai installé sous Windows 7.

On nous donne le choix entre Pulseview (interface graphique) ou sigrok-cli (interface en lignes de commandes):  j'ai choisi Pulseview,


Après avoir téléchargé le programme d'installation, bien entendu, on installe le logiciel.

MAIS CE N'EST PAS TERMINÉ...

Si vous branchez l'analyseur logique dans un port USB de l'ordinateur, Windows va tenter sans succès d'installer un pilote de périphérique.  Vous devez vous-même faire l'installation de ce pilote, grâce au logiciel "Zadig", qui a été installé en même temps que Pulseview.

Dans le menu Démarrer de Windows, vous ouvrez donc Zadig, qui se trouve à l'intérieur du répertoire sigrok/PulseView.


Pendant que Zadig est ouvert, vous branchez l'analyseur logique à un port USB de l'ordinateur.  Zadig devrait le détecter ("Unknown Device #1).  Vous cliquez ensuite sur le bouton "Install Driver".


Cette fois, le pilote devrait s'installer correctement.



Nous pouvons maintenant démarrer le logiciel PulseView.  Dans un premier temps, il faut établir la connexion avec l'analyseur logique.

Vous cliquez donc sur le bouton "Connect to Device"...


...et vous choisissez le pilote "fx2lafw (generic driver for FX2 based LAs) (fx2lafw)", l'interface USB, et vous cliquez sur le bouton "Scan for devices using driver above".

La mention "Saleae Logic with 8 channels" devrait apparaître dans la case du bas.  Il ne reste plus qu'à cliquer sur le bouton "OK".


Petit test impliquant les sorties PWM d'une carte Arduino

Comme prétexte pour utiliser mon analyseur logique, j'ai activé 5 sorties PWM de l'Arduino en utilisant plusieurs rapports cycliques différents.


J'ai branché l'analyseur logique de la façon suivante:

  • Canal 0:  Pin 3
  • Canal 1:  Pin 9
  • Canal 2:  Pin 10
  • Canal 3:  Pin 11
  • Canal 4:  Pin 5
  • Canal 5:  Pin 6


Puis j'ai exécuté le sketch suivant:

/*
On s'amuse avec le PWM, surtout pour vérifer
de fonctionnement de mon analyseur logique
https://electroniqueamateur.blogspot.com/2017/04/analyseur-logique-installation-de.html
*/
void setup() {
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
analogWrite(3, 50);
analogWrite(9, 100);
analogWrite(10, 150);
analogWrite(11, 200);
analogWrite(5, 100);
analogWrite(6, 150);
}
void loop() {
}
view raw pwm_mania.ino hosted with ❤ by GitHub

Voici le résultat, dans la fenêtre principale de PulseView:



On peut remarquer le rapport cyclique de plus en plus élevé sur les canaux 0, 1, et 2.  De plus, les canaux 3 et 4 (qui correspondent aux pins 5 et 6 de l'Arduino) ont une fréquence deux fois plus élevée que les autres.

À lire également

Quelques articles du blog dans lesquels j'ai utilisé l'analyseur logique et le logiciel Sigrok Pulseview:  analyse d'une communication I2C, analyse d'une communication SPI, analyse d'une communication UART.

Yves Pelletier   (TwitterFacebook)

lundi 17 avril 2017

Module RFID RC522 et Raspberry Pi (Python)


Cet article a été mis à jour le 30 décembre 2020, afin d'assurer la compatibilité avec Python 3.

Pour la quatrième fois depuis le début du mois, je vous propose de lire le numéro de série d'un tag RFID au moyen d'un module RC522.  Cette fois, c'est un Raspberry Pi qui aura l'honneur de piloter notre module RC522, grâce à un script rédigé en Python (les articles précédents mettaient plutôt en scène un Arduino, un MSP430 Launchpad et un STM32 Nucleo).

Si vous n'êtes pas déjà l'heureux propriétaire d'un module RC522, des commerçants chinois se feront un plaisir de vous en vendre un (accompagné d'un ou deux tags RFID) pour moins de 2 euros.


Activation de SPI sur le Rasbperry Pi

Le module RC522 utilise le protocole de communication SPI.  Vous devez donc vous assurer que le SPI est activé sur votre Raspberry Pi.  Pour ce faire, vous choisissez "Configuration du Raspberry Pi" dans le menu "Préférences"...


...et vous vous assurez que SPI est activé.



Installation de la bibliothèque pi-rc522

Nous utiliserons la bibliothèque pi-rc522 par ondryaso.  Pour ce faire, la façon la plus simple (à mon avis), est d'utiliser pip:

sudo pip3 install pi-rc522


Circuit (connexions)

Les connexions à effectuer sont:
  • Broche SDA du RC522 --- Broche #24 (GPIO 8) du Raspberry Pi
  • Broche SCK du RC522 --- Broche #23 (GPIO 11) du Raspberry Pi
  • Broche MOSI du RC522 --- Broche #19 (GPIO 10) du Raspberry Pi
  • Broche MISO du RC522 --- Broche #21 (GPIO 9) du Rasbperry Pi
  • Broche IRQ du RC522 --- Broche#18 (GPIO 24) du Raspberry Pi
  • Broche GND du RC522 --- Une des Broche GND du Raspberry Pi
  • Broche RST du RC522 --- Broche #22 (GPIO 25) du Raspberry Pi
  • Broche 3V3 du RC522 --- Broche 3V3 du Raspberry Pi
  • LED verte (et résistance) --- Broche #15 (GPIO 22) du Raspberry Pi
  • LED rouge (et résistance) --- Broche #16 (GPIO 23) du Rasbperry Pi



Script pour récupérer l'UID

Voici un premier script en Python qui affiche  dans le terminal l'UID (numéro de série) d'un tag RFID qu'on approche du module RC522.


#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Lecture de l'UID d'un tag RFID au moyen
d'un module RC522.
Utilisation de la bibliothèque pi-rc522.
Plus de détails:
https://electroniqueamateur.blogspot.com/2017/04/module-rfid-rc522-et-raspberry-pi-python.html
'''
from pirc522 import RFID
import time
rc522 = RFID()
while True:
rc522.wait_for_tag()
(error, tag_type) = rc522.request()
if not error:
(error, uid) = rc522.anticoll()
if not error:
print("UID: " + str(uid))
time.sleep(1)
view raw RFID1.py hosted with ❤ by GitHub


Sur la capture d'écran ci-dessus, vous pouvez constater que l'UID de la carte que j'ai utilisée est constituée des valeurs 144, 207, 148, 117 et 190.  Ces nombres seront utilisés dans le prochain script.


Script qui accepte ou rejette l'UID

L'idée est d'accomplir une action seulement si l'utilisateur présente un tag RFID dont l'UID est approuvé.  Avec ce script en Python, la LED verte s'allume uniquement lorsqu'on approche un tag RFID portant le bon UID.  Si on approche un tag RFID portant un autre UID, c'est la LED rouge qui s'allume.

Avant d'utiliser le script, n'oubliez pas de remplacer le contenu de la variable "bonUID" par l'UID de votre carte.

Vous pourrez ensuite modifier ce script de base pour en faire quelque chose de plus utile ou plus spectaculaire (actionner une serrure, mettre à jour une base de donnée consignant l'heure d'entrée et sortie des employés, etc.).


#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Lecture de l'UID d'un tag RFID au moyen
d'un module RC522 branché à un Rapberry Pi.
Une LED verte s'allume si le tag est accepté,
sinon c'est une LED rouge qui s'allume.
Utilisation de la bibliothèque pi-rc522.
Pour plus d'informations:
https://electroniqueamateur.blogspot.com/2017/04/module-rfid-rc522-et-raspberry-pi-python.html
'''
from pirc522 import RFID # pour le RFID
import time # pour les delais
import RPi.GPIO as GPIO # pour l'allumage des LEDs
bonUID = [144,207,148,117] # a remplacer par l'UID correct
LEDverte = 15 # LED verte branchee pin 15
LEDrouge = 16 # LED rouge branchee pin 16
rc522 = RFID()
GPIO.setup(LEDverte,GPIO.OUT)
GPIO.setup(LEDrouge,GPIO.OUT)
while True:
refus = 0
rc522.wait_for_tag()
(error, tag_type) = rc522.request()
if not error:
(error, uid) = rc522.anticoll()
if not error:
for i in range(0, 4):
if uid[i] != bonUID[i]:
refus = refus + 1
if refus == 0:
GPIO.output(LEDverte,GPIO.HIGH)
time.sleep(2)
GPIO.output(LEDverte,GPIO.LOW)
else:
GPIO.output(LEDrouge,GPIO.HIGH)
time.sleep(2)
GPIO.output(LEDrouge,GPIO.LOW)
view raw RFID2.py hosted with ❤ by GitHub

Yves Pelletier   (TwitterFacebook)

samedi 15 avril 2017

Module RFID RC522 et STM32 Nucleo (mbed)


Après avoir expérimenté mon module RFID RC522 avec une carte Arduino et avec une carte MSP430 Launchpad, c'est maintenant au tour de ma carte STM32 Nucleo...

Tout comme ce fut le cas avec les deux autre microcontrôleurs, nous verrons comment récupérer l'UID (numéro de série) d'un tag RFID, puis nous élaborerons un dispositif qui allume une LED verte lorsque l'UID est accepté, et une LED rouge lorsque l'UID n'est pas accepté.

Le circuit

Le module RC522 utilise le protocole SPI pour communiquer avec le  microcontrôleur.  Son niveau logique de 3,3 V correspond parfaitement à celui du SMT32 Nucleo.

Les branchements appropriés sont:
  • Pin SDA du RC522 --- Pin PWM/CS/D10 du Nucleo
  • Pin SCK du RC522 --- Pin SCK/D13 du Nucleo
  • Pin MOSI du RC522 --- Pin PWM/MOSI/D11 du Nucleo
  • Pin MISO du RC522 --- Pin MISO/D12 du Nucleo
  • Pin IRQ du RC522 --- Pas branchée
  • Pin GND du RC522 --- Pin GND du Nucleo
  • Pin RST du RC522 --- Pin D8 du Nucleo
  • Pin 3V3 du RC522 --- Pin 3V3 du Nucleo
  • LED verte (et résistance) --- Pin D2 du Nucleo
  • LED rouge (et résistance) --- Pin D3 du Nucleo
Remarquez que, du côté Nucleo, nous utilisons les connecteurs femelles compatibles Arduino.

Importation du programme RC522_LF dans embed

Dans mbed, j'ai importé un programme intitulé "RC522_LF", dont l'auteur est "Team FRA221:A" (bouton "Import").


Ce programme permet de récupérer l'UID d'un tag RFID amené à proximité du module RC522.  De plus, il contient la bibliothèque MFRC522 qui nous sera bien utile pour la réalisation de nos propres programmes.

Récupération de l'UID

Pour connaître l'UID de vos tags RFID, il s'agit de compiler sans modification le programme "RC522_LF", et de le téléverser dans la carte Nucleo.  Vous ouvrez ensuite sur l'ordinateur un terminal permettant la communication série (j'ai utilisé le moniteur série de l'IDE Arduino), réglé à 57600 bauds.  L'UID et le type de cartes s'affichent chaque fois que vous approchez un tag RFID.


Petit inconvénient:  le programme insère inutilement le nombre "02" à la fin de chaque octet constituant l'UID.  Ainsi, pour le premier tag que j'ai approché du module, il m'affiche comme UID "9002 CF02 9402 7502", ce qui signifie que l'UID est, en fait "90 CF 94 75" (en hexadécimal).  Vous pouvez facilement modifier le programme pour corriger le problème, ou simplement ne pas tenir compte des "02" superflus.

Un script qui approuve ou rejette un UID

Pour faire nos propres programmes, il s'agit de faire une copie du projet "RC522_LF" (incluant sa bibliothèque) et de modifier le fichier "main.cpp".  Le script ci-dessous allume la LED verte lorsque l'UID est approuvé, et allume la LED rouge quand il s'agit d'un autre UID.

Évidemment, vous devez d'abord remplacer le contenu de la constante "bonUID" par la valeur récupérée à l'étape précédente.  Remarquez que, puisque les octets sont en hexadécimal, chaque valeur est précédée du symbole "0x".

// Module RFID-RC522 et SMT32 Nucleo / mbed
// Utilisation de la bibliothèque MFRC522 par Martin Olejar
// La LED verte s'allume si l'UID est accepté, la LED rouge s'allume si l'UID est refusé.
// Plus d'infos:
// https://electroniqueamateur.blogspot.com/2017/04/module-rfid-rc522-et-stm32-nucleo-mbed.html
#include "mbed.h"
#include "MFRC522.h"
#define MF_RESET D8 // pin du Nucleo branchée à la pin RST du RC522
const char bonUID[4] = {0x90, 0xCF, 0x94, 0x75};
MFRC522 RfChip (SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS, MF_RESET);
DigitalOut led_1(D2); // LED verte à la pin D2
DigitalOut led_2(D3); // LED rouge à la pin D3
int main(void) {
RfChip.PCD_Init();
while (true) {
int refus = 0; // demeure nul si l'UID est bon
if ( ! RfChip.PICC_IsNewCardPresent())
{
wait_ms(500);
continue;
}
if ( ! RfChip.PICC_ReadCardSerial())
{
wait_ms(500);
continue;
}
for (uint8_t i = 0; i < RfChip.uid.size; i++)
{
if (RfChip.uid.uidByte[i] != bonUID[i]) {
refus++;
}
}
if (refus == 0) // UID accepté
{
// on allume la LED verte pendant quelques secondes
led_1 = 1; // On allume la LED 1
wait_ms(5000);
led_1 = 0; // On éteint la LED 1
}
else { // UID refusé
// on allume la LED rouge pendant quelques secondes
led_2 = 1;
wait_ms(5000);
led_2 = 0;
}
}
}
view raw RFID_Nucleo.cpp hosted with ❤ by GitHub


N.B.: Ce projet a également été réalisé avec Arduino, Raspberry Pi et MSP430 Launchpad.

Yves Pelletier   (TwitterFacebook)

dimanche 9 avril 2017

Module RFID-RC522 et MSP430 Launchpad (Energia)

Il y a quelques jours, je vous ai présenté un petit projet réalisé au moyen d'un module RFID RC522 couplé à une carte Arduino Uno. Aujourd'hui, je vous présente une réalisation identique, mais adaptée à une carte MSP430 Launchpad de Texas Instruments.

Installation de la bibliothèque CardReader RFID RC522

Pour faciliter la programmation au maximum, nous allons utiliser l'IDE Energia, ainsi que la bibliothèque CardReader_RFID_RC522 par fmilburn3.  Assurez-vous d'installer cette bibliothèque avant d'aller plus loin.

Circuit

Un avantage du Launchpad, comparativement à l'Arduino Uno, c'est qu'il fonctionne avec un niveau logique de 3,3 V qui convient parfaitement à notre module RC522.   Puisque nous n'avons pas à nous préoccuper d'abaisser le niveau logique, le circuit s'en trouve grandement simplifié.

Notez que j'ai utilisé le launchpad MSP-EXP430G2 Rev 1.5 comportant un microcontrôleur 2553. Les pins MISO et MOSI, par exemple, sont inversées sur d'autres cartes.



Les connexions sont donc:
  • SDA du RC522:  P2_0 du Launchpad 
  • SCK du RC522 : P1_5 du Launchpad
  • MOSI du RC522:  P1_7 du Launchpad
  • MISO du RC522:  P1_6 du Launchpad
  • IRQ du RC522:  Pas utilisé
  • GND du RC522:  GND du Launchpad
  • RST du RC522:  P2_2 du Launchpad
  • 3.3V du RC522:  VCC du Launchpad
De plus, pour utiliser le sketch que je propose un peu plus loin, vous reliez une LED vers à la pin P1_4, et une LED rouge à la pin P1_2.  (La LED verte intégrée à la carte étant liée à la pin P1_6, déjà utilisée, on ne peut pas l'utiliser pour cette fonction).

Connaître l'UID de votre tag

Chaque tag RFID comporte un numéro unique:  l'UID.  Pour connaître l'UID de votre tag, vous pouvez utiliser l'exemple "CardReader" fourni avec la bibliothèque.


Après avoir téléversé cet exemple dans le Launchpad, ouvrez le moniteur série d'Energia, et placez le tag RFID à proximité du module RC522.  L'UID de la carte devrait s'afficher.


Dans mon cas, les 5 parties de l'UID étaient:  144, 207, 148, 117 et 190.

Sketch

Le sketch ci-dessous allume la LED verte pendant 2 secondes lorsqu'on approche un tag RFID ayant un UID admissible, alors que c'est la LED rouge qui s'allume si on approche un autre tag.

Avant de l'utiliser, vous devez évidemment remplacer l'UID apparaissant au tout début du sketch (variable "bonUID").

/****************************************************************
Ce sketch utilise la bibliothèque CardReader_RFID_RC522 par fmilburn3.
Lorsqu'on approche le bon tag RFID, une LED verte s'allume.
Si on approche un autre tag RFID, c'est la LED rouge qui s'allume.
Plus de détails:
https://electroniqueamateur.blogspot.com/2017/04/module-rfid-rc522-et-msp430-launchpad.html
**********************************************************************/
#include "Mfrc522.h"
#include <SPI.h>
// mettre ici l'UDI qui sera accepté (LED verte):
unsigned char bonUID[5]={144, 207, 148, 117, 190};
const int SDA_PIN = P2_0;
const int RST_PIN = P2_2;
const int pinLEDVerte = P1_4; // LED verte
const int pinLEDRouge = P1_0; // LED rouge
Mfrc522 Mfrc522(SDA_PIN, RST_PIN);
unsigned char serNum[5];
void setup()
{
SPI.begin();
digitalWrite(SDA_PIN, LOW);
Mfrc522.Init();
pinMode(pinLEDVerte, OUTPUT);
pinMode(pinLEDRouge, OUTPUT);
}
void loop()
{
unsigned char status;
unsigned char str[MAX_LEN];
status = Mfrc522.Request(PICC_REQIDL, str);
if (status == MI_OK)
{
status = Mfrc522.Anticoll(str);
memcpy(serNum, str, 5);
if (status == MI_OK)
{
if (serNum[0] == bonUID[0] && serNum[1] == bonUID[1] && serNum[2] == bonUID[2] && serNum[3] == bonUID[3] && serNum[4] == bonUID[4])
{
// on allume la LED verte pendant 2 secondes
digitalWrite(pinLEDVerte, HIGH);
delay(2000);
digitalWrite(pinLEDVerte, LOW);
}
else
{
// on allume la LED rouge pendant 2 secondes
digitalWrite(pinLEDRouge, HIGH);
delay(2000);
digitalWrite(pinLEDRouge, LOW);
}
}
}
Mfrc522.Halt();
}

Bien entendu, ce sketch peut facilement être modifié pour en faire quelque chose de plus utile (serrure électrique, système d'alarme, etc.).

N.B.: Ce projet a également été réalisé avec ArduinoRaspberry Pi et STM32 Nucleo.

Yves Pelletier   (TwitterFacebook)

mercredi 5 avril 2017

Module RFID-RC522 et Arduino

Je me suis récemment procuré (pour moins de 2 €) un petit kit comportant:

- un module RFID-RC522
- un tag RFID prenant la forme d'une carte
- un tag RFID prenant la forme d'un porte-clés

Le module est presque prêt à l'emploi, mais il faut soi-même souder une barrette de 8 connecteurs (ce qui n'a rien de bien difficile).

Dans ce petit tutoriel, nous allons réaliser un montage constitué d'une carte Arduino Uno et d'un module RFID-RC522.  Lorsqu'un tag RFID comportant un code admissible sera détecté, une LED verte va s'allumer.  Lorsqu'un tag comportant un code inadmissible sera détecté, c'est plutôt une LED rouge qui s'allumera.




Installation de la bibliothèque MFRC522

Nous allons utiliser la bibliothèque MFRC522, qui a été développée par Miguel Balboa.  Il est donc nécessaire d'installer cette bibliothèque dans votre environnement de programmation Arduino.

Le circuit 

Le module RFID-RC522 communique au moyen du protocole SPI, avec un niveau logique de 3,3 V. Bien que la plupart des tutoriels que j'ai vus sur internet semblent omettre cette précaution, j'ai choisi d'utiliser un convertisseur de niveaux logiques CD4050 pour éviter que les signaux émis par l'Arduino (à un niveau logique de 5 V) n'abîment le module RC522.

Les 8 connecteurs du RC522 sont donc branchés de la façon suivante:
  • SDA:  Arduino 10, après avoir été abaissé par le 4050
  • SCK: Arduino 13, après avoir été abaissé par le 4050
  • MOSI:  Arduino 11, après avoir été abaissé par le 4050.
  • MISO:  Arduino 12
  • IRQ:  Pas utilisé
  • GND:  Arduino GND
  • RST:  Arduino 9, après avoir été abaissé par le 4050
  • 3.3V:  Arduino 3.3V
(À noter que SDA et RST peuvent être branché sur une autre pin de l'Arduino au besoin, il s'agira de modifier le sketch en conséquence).

Quant aux deux LEDs indicatrices, elle seront branchées aux pins 6 (rouge) et 7 (verte) de l'Arduino.



Premier sketch:  récupérer l'UID du tag

Dans un premier temps, il faut connaître l'UID, qui est le code unique écrit sur notre carte.  Le sketch ci-dessous affiche dans le moniteur série  l'UID de tout tag qu'on approche du module RC-522.


/**************************************************************
Ce sketch permet de connaître l'IUD d'un tag RFID.
Utilisation de la bibliothèque MFRC522 par Miguel Balboa
Plus d'infos:
https://electroniqueamateur.blogspot.com/2017/04/module-rfid-rc522-et-arduino.html
*****************************************************************/
#include <SPI.h>
#include <MFRC522.h>
const int pinRST = 9; // pin RST du module RC522
const int pinSDA = 10; // pin SDA du module RC522
MFRC522 rfid(pinSDA, pinRST);
void setup()
{
SPI.begin();
rfid.PCD_Init();
Serial.begin(9600);
}
void loop()
{
if (rfid.PICC_IsNewCardPresent()) // on a dédecté un tag
{
if (rfid.PICC_ReadCardSerial()) // on a lu avec succès son contenu
{
Serial.println("Voici l'UID de ce tag:");
Serial.print("const byte bonUID[");
Serial.print(rfid.uid.size);
Serial.print("] = {");
for (byte i = 0; i < rfid.uid.size; i++)
{
Serial.print(rfid.uid.uidByte[i]);
if (i < rfid.uid.size - 1)
{
Serial.print(", ");
}
else
Serial.println("};");
}
Serial.println();
delay (2000);
}
}
}
view raw lectureUID.ino hosted with ❤ by GitHub

Après avoir téléversé ce sketch dans l'Arduino, ouvrez le moniteur série et approchez un tag RFID à proximité du module RC-522.  La capture d'écran ci-dessous montre le résultat lorsque j'ai approché ma carte blanche  (const byte bonUID[4] = {144, 207, 148, 117}), puis mon porte-clé  (const byte bonUID[4] = {131, 133, 4, 107}).  Évidemment, les valeurs numériques diffèrent selon le tag utilisé.

Copiez le code de votre tag, afin de le coller dans le sketch principal ci-dessous.




Sketch principal

Avant d'utiliser ce sketch, vous devez remplacer la ligne " (const byte bonUID[4] = {144, 207, 145, 117})" par celle qui correspond à votre tag, et que vous avez précédemment copiée du moniteur série grâce au premier sketch.


/*******************************************************************************
RFID LEDs
Exemple d'utilisation de la bibliothèque MFRC522 par Miguel Balboa
Lorsque le tag RFID est accepté, une LED verte s'allume pendant 3 secondes
Lorsque le tag RFID est refusé, une LED rougeo s'allume pendant 3 secondes
Pour plus de détails:
https://electroniqueamateur.blogspot.com/2017/04/module-rfid-rc522-et-arduino.html
***********************************************************************************/
#include <SPI.h>
#include <MFRC522.h>
// copier ici le résultat du sketch "lectureUID.ino":
const byte bonUID[4] = {144, 207, 148, 117};
const int pinLEDVerte = 7; // LED verte
const int pinLEDRouge = 6; // LED rouge
const int pinRST = 9; // pin RST du module RC522
const int pinSDA = 10; // pin SDA du module RC522
MFRC522 rfid(pinSDA, pinRST);
void setup()
{
SPI.begin();
rfid.PCD_Init();
pinMode(pinLEDVerte, OUTPUT);
pinMode(pinLEDRouge, OUTPUT);
}
void loop()
{
int refus = 0; // quand cette variable n'est pas nulle, c'est que le code est refusé
if (rfid.PICC_IsNewCardPresent()) // on a dédecté un tag
{
if (rfid.PICC_ReadCardSerial()) // on a lu avec succès son contenu
{
for (byte i = 0; i < rfid.uid.size; i++) // comparaison avec le bon UID
{
if (rfid.uid.uidByte[i] != bonUID[i]) {
refus++;
}
}
if (refus == 0) // UID accepté
{
// on allume la LED verte pendant trois secondes
digitalWrite(pinLEDVerte, HIGH);
delay(3000);
digitalWrite(pinLEDVerte, LOW);
}
else { // UID refusé
// on allume la LED rouge pendant trois secondes
digitalWrite(pinLEDRouge, HIGH);
delay(3000);
digitalWrite(pinLEDRouge, LOW);
}
}
}
}
view raw RFID_LEDS.ino hosted with ❤ by GitHub


Vidéo du montage

Voici, pour finir, une vidéo montrant le montage en action.  La LED verte s'allume lorsque j'approche la carte blanche (code accepté), mais c'est la LED rouge qui s'allume lorsque j'approche le porte-clé (code refusé).




N.B.: Ce projet a également été réalisé avec  Raspberry Pi, STM32 Nucleo et MSP430 Launchpad.

Yves Pelletier   (TwitterFacebook)

dimanche 2 avril 2017

Communication série USB entre Arduino et tablette Android

Aujourd'hui, je vous relate une expérimentation visant à établir une communication bidirectionnelle entre une carte Arduino et une tablette Android, par l'entremise d'un câble USB.

Matériel:

Une tablette ou un téléphone Android (j'ai utilisé une tablette Samsung Galaxy Tab A), une carte Arduino (dans mon cas, comme d'habitude, un clone Uno chinois d'origine douteuse), le câble USB habituel de votre Arduino et un câble adaptateur "micro-USB OTG" conçu pour brancher des périphériques USB à votre appareil mobile.

Notez que ce câble sert non seulement à la transmission des données entre les deux appareils, mais aussi à l'alimentation de l'Arduino:  si votre carte reste branchée un long moment à votre appareil Android, la pile de ce dernier risque de s'épuiser rapidement.

(Dans bien des cas, une liaison bluetooth sera plus pratique).

Sketch de l'Arduino:

Puisque je voulais tester la communication dans les deux directions, j'ai installé dans l'Arduino un sketch qui demande le nom de l'utilisateur, et qui demande des instructions afin d'allumer ou d'éteindre la LED intégrée à la carte (reliée à la pin 13).  Puisqu'il s'agit d'une communication série, c'est exactement la même procédure que lors d'une interaction avec le moniteur série de l'IDE Arduino.

/***********************************************************
Conversation série bi-directionnelle
Prévue pour une communication USB entre Arduino et
appareil mobile Android.
Inspiré d'un sketch trouvé ici:
https://forum.arduino.cc/index.php?topic=288234.0
Pour plus de détails:
https://electroniqueamateur.blogspot.com/2017/04/communication-serie-usb-entre-arduino.html
*************************************************************/
const byte numChars = 32;
char messageRecu[numChars], leNom[numChars];
boolean newData = false;
int etape = 1;
void setup() {
Serial.begin(19200);
pinMode(13, OUTPUT);
delay(1000);
Serial.println("Bonjour, je suis Arduino...");
delay(500);
Serial.println("Quel est votre nom?");
delay(500);
}
void loop() {
receptionDonnes();
if (newData == true) {
switch (etape) {
case 1:
Serial.print("Bonjour ");
delay(100);
Serial.print(messageRecu);
delay(100);
Serial.println(", je suis ravi de faire votre connaissance!");
delay(100);
Serial.print("Aimeriez-vous que j'allume une LED, ");
delay(100);
Serial.print(messageRecu);
delay(100);
Serial.println(" ?");
delay(100);
Serial.println("(Veuillez repondre par oui ou non)");
delay(100);
etape = 2;
break;
case 2:
if (!strcmp(messageRecu, "oui")) {
delay(100);
digitalWrite(13, true);
delay(100);
Serial.print("Oui? D'accord, je l'allume... ");
delay(100);
Serial.println("Maintenant, aimeriez-vous que je l'eteigne?");
delay(100);
etape = 3;
}
if (!strcmp(messageRecu, "non")) {
delay(100);
Serial.print("Non? D'accord, je la laisse eteinte... ");
delay(100);
Serial.println("Maintenant, aimeriez-vous que je l'allume?");
delay(100);
}
break;
case 3:
if (!strcmp(messageRecu, "oui")) {
digitalWrite(13, false);
delay(100);
Serial.print("Oui? D'accord, je l'eteint... ");
delay(100);
Serial.println("Et maintenant, aimeriez-vous que je l'allume?");
delay(100);
etape = 2;
}
if (!strcmp(messageRecu, "non")) {
delay(100);
Serial.print("Non? D'accord, je la laisse allumee... ");
delay(100);
Serial.println("Maintenant, voulez-vous que je l'eteigne?");
delay(100);
}
break;
}
newData = false;
}
}
void receptionDonnes() {
static byte ndx = 0;
char endMarker = '\n';
char rc;
while (Serial.available() > 0 && newData == false) {
rc = Serial.read();
if (rc != endMarker) {
messageRecu[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
messageRecu[ndx] = '\0';
ndx = 0;
newData = true;
}
}
}


Les nombreux délais ont semblé améliorer la qualité de la communication (sans ces délais, il arrivait que certaines lignes ne soient pas affichées par la tablette).

Ça donnera comme résultat un dialogue de ce genre:


(Admettez qu'il est poli et serviable, cet Arduino...)

Logiciels:

J'ai testé avec un égal succès deux applications spécialement conçues pour la communication série à travers le port USB: Serial USB Terminal par Kai Morich et Usb terminal par Lior Hass.  Il en existe d'autres:  j'ai choisi celles-ci sur la base des commentaires positifs des utilisateurs sur Google Play, qui mentionnaient explicitement la communication avec Arduino.

Peu importe l'application que vous utiliserez, la carte Arduino sera automatiquement détectée aussitôt que vous la brancherez à l'appareil mobile.

Utilisation de Serial USB Terminal, par Kai Morich

Supposons dans un premier temps que vous optez pour l'application Serial USB Terminal. Avant de pouvoir établir une communication correcte avec l'Arduino, il faut régler quelques paramètres. Pour ce faire, déployez le menu en utilisant le bouton qui a la forme de 3 traits horizontaux superposés, dans le coin supérieur droit de l'écran, et choisissez "Settings".


Il faut bien sûr sélectionner la vitesse de transmission (baud rate) qui correspond à celle qui a été spécifiée dans le sketch de l'Arduino.  Ici, c'est 19200.  

S'il s'agissait d'une communication unidirectionnelle de l'Arduino vers la tablette, cet unique ajustement serait probablement suffisant.  Mais puisque nous voulons aussi envoyer des données de la tablette vers l'Arduino, et que l'Arduino doit correctement interpréter à quel moment le message qu'il reçoit est complet, il faut régler NewLine à LF (et non à CR+LF) dans la section "Send" (attention:  il y a aussi un Newline dans la section "Receive"; sur la capture d'écran ci-dessous, le paramètre dont je parle est situé sur la toute dernière ligne en bas).


De retour au terminal.  Pour établir la communication, il faut taper sur l'icône qui représente deux connecteurs qui ne sont pas connectés:

Vous devrez probablement aussi appuyer sur le bouton reset de l'Arduino, qui a envoyé son message initial alors que nous n'étions pas prêts à l'écouter.






Utilisation de Usb terminal par Lior Hass

Passons maintenant à l'autre option, une application très similaire: Usb terminal par Lior Hass.

Ici encore, quelques paramètres doivent d'abord être réglés pour que la communication s'établisse correctement.  Vous déployez le menu grâce au bouton situé en haut à droite (3 points superposés), et vous choisissez "Settings".



Assurez-vous de sélectionner le même baud rate que celui qui a été spécifié dans le sketch (c'est à dire 19200).

Puisque notre petite expérience nécessite l'envoi de messages constitués de plusieurs caractères vers l'Arduino, cochez également "Use dedicated field for keyboard input" et "Data is sent when Enter is pressed".  Il faut aussi régler l'option "Enter key sends" à LF (sinon, l'Arduino ne réussira pas à interpréter correctement vos réponses).



Retour au menu:  pour établir la communication, vous choisissez "Connect USB device".

Puisque l'Arduino a amplement eu le temps d'envoyer son message initial avant que nous ne soyons prêts à l'écouter, appuyez sur le bouton reset de l'Arduino.

Attention:  envoyez vos réponse en utilisant la touche "enter" du clavier, et non le bouton "Send".



Voilà!  En ce qui me concerne, chacun des deux logiciels fait parfaitement l'affaire.

Maintenant que nous savons comment procéder, il ne nous reste plus qu'à appliquer le principe à quelque chose de plus utile: ajouter temporairement des capteurs supplémentaires à notre appareil mobile, par exemple.

Yves Pelletier   (TwitterFacebook)