La RFID est une technologie merveilleuse. Avec lui, nous pouvons déclencher des événements sans fil à l’aide de cartes et de porte-clés qui n’ont pas besoin d’alimentation, et réagir simplement lorsqu’ils sont placés à proximité d’un lecteur. Cousez un porte-clés dans votre veste et déclenchez n’importe quoi !
Les lecteurs RFID ont besoin de très peu de puissance de traitement, ce qui signifie que le Raspberry Pi Pico à 4 $ est le moyen idéal pour bricoler avec cette technologie de changement de projet. Dans ce projet, nous utiliserons différentes cartes RFID pour déclencher des effets sur une série de LED NeoPixel. Une carte provoquera un changement de couleur arc-en-ciel tandis qu’une autre déclenchera des couleurs aléatoires dans des positions aléatoires le long de la chaîne de LED. Il suffit à l’utilisateur de montrer la carte au lecteur et cela déclenche l’événement.
Pour ce projet, vous aurez besoin
- Un Raspberry Pi Pico
- Lecteur RFID RFID-RC522
- Cartes / porte-clés RFID compatibles pour le lecteur
- Planche à pain
- NéoPixels
- 7 x fils de liaison mâle à mâle
Câblage du projet
Il y a deux parties à ce projet. Le premier est le lecteur RFID, un RFID-RC522 couramment utilisé avec les Arduinos. Ce lecteur est bien supporté sur le Raspberry Pi Pico et nous pouvons interfacer le lecteur à un Pico en utilisant le GPIO. Le lecteur est alimenté à l’aide de la sortie 3,3 V du Pico et dispose d’une série de broches de données utilisées pour communiquer avec le lecteur, avec un accès en lecture et en écriture possible. La deuxième partie du projet est les NeoPixels. Ceux-ci sont alimentés via la sortie brute 5V du Pico et se connectent au GP28 du Pico.
Connexions RFID-RC522 vers Raspberry Pi Pico
- SCK à GP2
- MOSI vers GP3
- MISO à GP4
- RST vers GP0
- CS/SDA à GP1
- 3.3V à 3V3_OUT (Broche 36)
- GND à n’importe quel GND
Connexions NeoPixel
- VCC vers VBUS (broche 40)
- GND à n’importe quel GND
- DI (entrée de données) vers GP28
Écriture du code du projet
Avant de commencer ce projet, il serait avantageux de suivre notre guide pour vous assurer que votre Raspberry Pi Pico exécute la dernière version de MicroPython.
1. Ouvrez une fenêtre de navigateur et visitez Dépôt Pi Pico P NeoPixel GitHub de Blaž Rolih. Cliquez sur Code et sélectionnez Télécharger ZIP.
2. Extrayez l’archive ZIP sur le bureau.
3. Ouvrez une fenêtre de navigateur et visitez le MicroPython MFRC522 de Daniel Perron
Dépôt GitHub. Cliquez sur Code et sélectionnez Télécharger ZIP.
4. Extrayez l’archive ZIP sur le bureau.
5. Connectez votre Raspberry Pi Pico à l’ordinateur.
6. Ouvrez Thonny et votre Raspberry Pi Pico se connectera automatiquement. S’il n’y a pas de connexion, cliquez sur le bouton Arrêter pour forcer une connexion.
sept. Ouvrez Thonny et cliquez sur Afficher >> Fichiers pour afficher l’explorateur de fichiers.
8. Dans la fenêtre du haut, accédez au dossier de code pi_pico_neopixel-main.
9. Faites un clic droit sur neopixel.py et sélectionnez Télécharger vers /. Cela copiera la bibliothèque NeoPixel à la racine du stockage du Raspberry Pi Pico.
10. Dans la fenêtre du haut, accédez au dossier micropython-mfrc522-master.
11. Faites un clic droit sur mfrc522.py et sélectionnez Télécharger vers /. Cela copiera la bibliothèque MFRC522 à la racine du stockage du Raspberry Pi Pico.
12. Cliquez sur Fichier >> Nouveau et créez un nouveau fichier.
13. Importez quatre bibliothèques Python. Le premier permet à Python de fonctionner avec le lecteur RFID. Nous importons ensuite la bibliothèque NeoPixel avant d’importer des bibliothèques pour travailler avec des nombres aléatoires (entiers) et pour un contrôle au niveau de la milliseconde de notre code.
from mfrc522 import MFRC522
from neopixel import Neopixel
from random import randint
import utime
14. Créer un objet, lecteur, qui liera notre code au lecteur RFID. Nous passons des arguments lors de la création de l’objet pour indiquer au code quelles broches GPIO nous utilisons.
reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)
15. Créez un nouvel objet, numpix et stockez à l’intérieur de l’objet le nombre de NeoPixels qui se trouvent dans votre chaîne. Pour notre exemple, c’était 25 dans une matrice 5 x 5.
numpix = 25
16. Créez un objet, des pixels, et utilisez la bibliothèque NeoPixel avec des arguments pour définir le nombre de NeoPixels, la broche GPIO à laquelle il est connecté (GP28) et le format de la LED, dans ce cas GRB. Les LED peuvent être rouges, vertes, bleues (RGB) ou vertes, rouges, bleues (GRB). Vous pouvez le déterminer à partir de la fiche technique / page du produit où vous les avez achetés.
pixels = Neopixel(numpix, 0, 28, "GRB")
17. Appeler l’objet pixels et transmettez-lui une instruction pour désactiver toutes les LED (0,0,0), puis utilisez « show » pour voir les résultats. La « couleur » de la LED est définie à l’aide de la valeur RVB, stockée dans un tuple. Peu importe que nos LED soient RVB ou GRB, nous envoyons toujours les données de couleur en RVB et la bibliothèque gère le reste.
pixels.fill((0,0,0))
pixels.show()
18. Écrivez une instruction rapide à l’utilisateur. Ceci est imprimé dans le shell Python lorsque le code démarre.
print("")
print("To activate, show RFID card to the reader")
print("")
19. Créez une boucle pour exécuter le code du projet.
while True:
20. Démarrer la connexion au lecteur RFID et demander l’état actuel du lecteur.
reader.init()
(stat, tag_type) = reader.request(reader.REQIDL)
21. Créez un test de condition if, cela vérifie la valeur stockée dans stat, si le lecteur est ok, le code avance.
if stat == reader.OK:
22. Créer un objet, une carte, qui stockera les données d’une carte/étiquette RFID. Imprimez ensuite les détails de la carte dans le shell Python. Les détails de la carte sont enregistrés sous forme d’entier et en imprimant les détails, nous pouvons capturer le numéro de carte pour toutes nos cartes/étiquettes RFID.
card = int.from_bytes(bytes(uid),"little",False)
print(card)
23. Créer un test de condition if pour vérifier le numéro de carte par rapport à une valeur connue. La première fois que vous utiliserez votre lecteur, vous ne connaîtrez aucun des numéros de carte, mais chaque fois que vous numériserez une carte, elle sera imprimée sur le shell Python.
if card == 611994825:
24. Imprimer un message à l’utilisateur. Dans ce cas, il indique que les LED passeront en mode disco, où les LED changent de couleur de manière aléatoire.
print("Disco Mode Activated")
25. Créez une boucle for qui sera itérée 25 fois.
for i in range(25):
26. Créez quatre variables, x,r,g,b pour stocker une LED choisie au hasard (x) et des valeurs de couleur choisies au hasard (r,g,b). Avec cela, nous pouvons définir de manière aléatoire la couleur de n’importe quelle LED à chaque itération de la boucle.
x = randint(0,24)
r = randint(0,254)
g = randint(0,254)
b = randint(0,254)
27. Réglez la couleur de la LED choisie au hasard, ensuite attendez 1/10 de seconde avant que la boucle ne se répète.
pixels.set_pixel(x, (r,g,b))
pixels.show()
utime.sleep_ms(100)
28. Ajoutez une pause supplémentaire d’une seconde.
utime.sleep_ms(1000)
29. Créez une condition elif (else if), qui recherche un autre numéro de carte.
elif card == 1595186834:
30. Imprimer un message à l’utilisateur. Dans notre exemple, nous avons utilisé un porte-clés RFID.
print("Fob Mode Activated")
31. Créez un objet, teinte, pour stocker la valeur de la couleur.
hue = 0
32. Créez une boucle for qui itère 1000 fois.
for i in range(1000):
33. À l’aide d’un objet, d’une couleur, définissez la couleur des LED à l’aide de la valeur de teinte et définissez la saturation sur 255 et valeur à 150. Nous utilisons des valeurs HSV pour contrôler la couleur de la LED, cela signifie que nous avons besoin de la teinte, de la saturation et de la valeur (luminosité).
color = pixels.colorHSV(hue, 255, 150)
34. Demander aux LED de se remplir avec la couleur actuellement sélectionnée, stocké dans « couleur ». Utilisez show pour écrire l’instruction aux LED.
pixels.fill(color)
pixels.show()
35. Mettez à jour la valeur stockée dans hue par 150.
hue += 150
36. Créez une condition else pour gérer toutes les cartes inconnues.
else:
37. Imprimer un message à l’utilisateur. Dans ce cas, nous voyons « CARTON ROUGE » imprimé sur le shell Python.
print("RED CARD")
38. Créez une boucle for qui itère trois fois.
for i in range(3):
39. Demandez aux LED de devenir rouges, puis d’afficher le changement de couleur avant de faire une pause de 100 millisecondes.
pixels.fill((128,0,0))
pixels.show()
utime.sleep_ms(100)
40. Éteignez les LED et faites une pause de 100 millisecondes.
pixels.fill((0,0,0))
pixels.show()
utime.sleep_ms(100)
41. Ajouter une condition else, qui permet au code de continuer à boucler même s’il y a un problème. Cette condition else correspond à la première condition if que nous avons créée, mettant ainsi fin à ce test conditionnel.
else:
pass
42. Ajoutez enfin une pause de 50 millisecondes avant que le code ne revienne au début.
utime.sleep_ms(50)
43. Enregistrer le code au Raspberry Pi Pico comme card_details.py.
44. Cliquez sur le bouton Exécuter pour démarrer le code. Présentez une série de cartes RFID au lecteur et le shell Python affichera les numéros de carte, utilisez-les pour remplacer les numéros de carte utilisés dans les instructions conditionnelles if et elif.
45. Appuyez sur Stop pour arrêter le code en cours d’exécution et reconnectez-vous au Pico. Enregistrer les changements de numéro de carte et cliquez sur le bouton Exécuter pour exécuter le code avec vos numéros de carte. Présenter la carte au lecteur et regardez comment les NeoPixels réagissent.
Nous avons maintenant des NeoPixels contrôlés par RFID, et plus vous avez de cartes / porte-clés RFID, plus vous pouvez ajouter d’effets au projet.
Liste complète des codes
from mfrc522 import MFRC522
from neopixel import Neopixel
from random import randint
import utime
reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)
numpix = 25
pixels = Neopixel(numpix, 0, 28, "GRB")
pixels.fill((0,0,0))
pixels.show()
print("")
print("To activate, show RFID card to the reader")
print("")
while True:
reader.init()
(stat, tag_type) = reader.request(reader.REQIDL)
if stat == reader.OK:
(stat, uid) = reader.SelectTagSN()
if stat == reader.OK:
card = int.from_bytes(bytes(uid),"little",False)
print(card)
if card == 611994825:
print("Disco Mode Activated")
for i in range(25):
x = randint(0,24)
r = randint(0,254)
g = randint(0,254)
b = randint(0,254)
pixels.set_pixel(x, (r,g,b))
pixels.show()
utime.sleep_ms(100)
utime.sleep_ms(1000)
elif card == 1595186834:
print("Fob Mode Activated")
hue = 0
for i in range(1000):
color = pixels.colorHSV(hue, 255, 150)
pixels.fill(color)
pixels.show()
hue += 150
else:
print("RED CARD")
for i in range(3):
pixels.fill((128,0,0))
pixels.show()
utime.sleep_ms(100)
pixels.fill((0,0,0))
pixels.show()
utime.sleep_ms(100)
else:
pass
utime.sleep_ms(50)