[RESOLU (ou FAIL)] Gérer le RFID-RC522 sur Pi b+

Portail, portes, volets et stores de terrasse obéiront aux ordres du Raspberry Pi

Modérateur : Francois

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Gérer le RFID-RC522 sur Pi b+ ou zero

Message par vague nerd » mer. 11 mai 2016 18:03

Le GIT c'est pas degeu; ce n'est qu'un outil :mrgreen:
Oui, bien d'accord, GIT n'est qu'une repository.
C'est la solution qui est dégeu ! Enfin, au vu du :mrgreen: , vous plaisentiez peut-être.
Dsl... je dors pas beaucoup en ce moment... ya un module qui me fait *****biiiiiiip****. :lol:
Cordialement,

Vague Nerd

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Gérer le RFID-RC522 sur Pi b+ ou zero

Message par vague nerd » jeu. 12 mai 2016 05:57

Bon allez, je sort le fer à souder !
Je compte monter le connecteur coudé sur la face arrière du module, mais à l'envers, c'est à dire les pins vers vers l'intérieur du module.

J'espère que les fils qui y seront branchés ne vont pas générer d’interférences au niveau de la bobine du lecteur... :?

EDIT : 'tainnnnn. J'ai flingué quelque chose qui fait qu'aptitude ne fonctonne plus correctement avec mes manip précédentes. Ca fait 1 heure que j'essaie de réparer sans succès.
Je suis en train de recharger la sd.... grrrrrr. :twisted: :twisted: :twisted: :twisted:
Cordialement,

Vague Nerd

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Gérer le RFID-RC522 sur Pi b+ ou zero

Message par vague nerd » jeu. 12 mai 2016 08:25

Ceci à fonctionné direct (en moins de 5 minutes, solution degeu, donc).

Hard: (Noté Rasp 2, mais réalisé sur b+, même GPIOs)
Image

Soft:

Code : Tout sélectionner

sudo apt-get install python-dev

Code : Tout sélectionner

git clone https://github.com/lthiery/SPI-Py
sudo python setup.py install

Code : Tout sélectionner

git clone https://github.com/mxgxw/MFRC522-python
et enfin lancement de l'eemple de lecture :

Code : Tout sélectionner

sudo python Read.py
Pfffff.

Sources
Tutos sources (entre autres) :
Dans une langue chantée, genre espagnol, vieux truc mais adapté à mon B+ de test
Sur instructables.com, en anglich ou ici, pour le début du post
Même chose en version pi2 (avec le GIT des tutos précédant repris par un autre)

La distance de détection me fait un peu peur quand même. C'était destiné à être recouvert de quelque chose d'étanche, genre boite au lettre...
Cordialement,

Vague Nerd

spourre
Raspinaute
Messages : 735
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

Re: Gérer le RFID-RC522 sur Pi b+ ou zero

Message par spourre » jeu. 12 mai 2016 09:54

vague nerd a écrit :Ceci à fonctionné direct (en moins de 5 minutes, solution degeu, donc).
...
La distance de détection me fait un peu peur quand même. C'était destiné à être recouvert de quelque chose d'étanche, genre boite au lettre...
Bonjour,

Félicitations !
Il ne faut surtout pas considérer le RFID comme une solution de sécurité.
Cordialement

-
Sylvain

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: [RESOLU (ou FAIL)] Gérer le RFID-RC522 sur Pi b+

Message par vague nerd » jeu. 12 mai 2016 11:33

Il ne faut surtout pas considérer le RFID comme une solution de sécurité.
C'est clair ! Enfin, surtout de la manière dont je compte l'utiliser :lol:
Après, on peut sécuriser un minimum, en y stockant un maximum d'info "cryptés"
Cordialement,

Vague Nerd

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: [RESOLU (ou FAIL)] Gérer le RFID-RC522 sur Pi b+

Message par vague nerd » lun. 16 mai 2016 16:59

Pour ceux que ça intéresse :
-J'ai branché une led verte sur le pin 37 et une rouge sur le pin 40.
-Le programme python si dessous allume la led verte si :
--l'uid est correctement lu
--l'uid est présente dans un fichier json nommé uids.json
-Le programme python si dessous allume la led rouge si :
--l'uid est correctement lu
--l'uid n'est pas présente dans un fichier json nommé uids.json
-Le programme se quitte en appuyant sur ctrl+c

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf8 -*-

import RPi.GPIO as GPIO
import MFRC522
import signal
import time
import json

continue_reading = True

# Capture SIGINT for cleanup when the script is aborted
def end_read(signal,frame):
    global continue_reading
    print "Ctrl+C captured, ending read."
    continue_reading = False
    GPIO.cleanup()

def check_uid(uid):
	global uids
	#print uid
	if uid in uids:
		return True
	else:
		return False

def read_uids():
	global uids
	uids = json.load(open('uids.json'))


uids = []
read_uids()

# Hook the SIGINT
signal.signal(signal.SIGINT, end_read)

# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()

# Welcome message
print "Press Ctrl-C to stop."

GPIO.setmode(GPIO.BOARD)
GPIO.setup(37, GPIO.OUT)
GPIO.setup(40, GPIO.OUT)

GPIO.output(37, False)
GPIO.output(40, False)

# This loop keeps checking for chips. If one is near it will get the UID and authenticate
while continue_reading:
    
    # Scan for cards    
    (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)

    # If a card is found
    #if status == MIFAREReader.MI_OK:
    #    print "Card detected"
    
    # Get the UID of the card
    (status,uid) = MIFAREReader.MFRC522_Anticoll()

    # If we have the UID, continue
    if status == MIFAREReader.MI_OK:
		if check_uid(uid):
				GPIO.output(37, True)
		else:
			GPIO.output(40, True)
		time.sleep(1)
		GPIO.output(37, False)
		GPIO.output(40, False)

#GPIO.cleanup()
Par contre, le programme boucle sans temporisation (sleep). Je me demande s'il ne serait pas judicieux d'en ajouter un (très faible pour ne pas que ça se remarque), pour que le pi ne soit pas tout le temps occupé à faire des if qui seront le plus souvent insatisfait. Genre time.sleep(0.1). Qu'en pensez-vous ?

Cdt.
Cordialement,

Vague Nerd

spourre
Raspinaute
Messages : 735
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

Re: [RESOLU (ou FAIL)] Gérer le RFID-RC522 sur Pi b+

Message par spourre » lun. 16 mai 2016 19:04

vague nerd a écrit : ...
Par contre, le programme boucle sans temporisation (sleep). Je me demande s'il ne serait pas judicieux d'en ajouter un (très faible pour ne pas que ça se remarque), pour que le pi ne soit pas tout le temps occupé à faire des if qui seront le plus souvent insatisfait. Genre time.sleep(0.1). Qu'en pensez-vous ?

Cdt.
Bonjour,

Merci du feed-back qui me permet de découvrir les possibilités du python (je suis un fossile vivant, élevé à l'UNIX System 3 et au C de Ritchie & Kernighan ) .
Ma remarque suivante n'est donc pas basée sur l'expérience du Raspberry et du python.
Quelque soit le langage utilisé (interprété, compilé), j'ai toujours eu horreur de la boucle infinie (while true) et de l'appel système sleep.
Un programme qui boucle en attendant un événement comme une action humaine ou un périphérique, nefait rien d'autre pendant ce temps. Par contre, il consomme de la ressource peu être difficile à swapper (selon les algorytmes utilisés) car, en général, le swap intervient sur un défaut d'IO (et sur un % de CPU utilisé (légèrement modifiable par la commande nice)).
AMHA, la solution élégante est l'utilisation des interruptions. J'ai un peu googolé et cela semble possible sur le GPIO du Raspberry:
http://raspberrywebserver.com/gpio/usin ... -gpio.html
Reste à savoir si ta carte lecteur RFID fournit une interruption. Au siècle dernier, j'avais réalisé un clavier I2C en utilisant 2 PCF8574. Ce circuit génère une interruption sur changement d'état (le clavier était une matrice de 8x8 touches, pour une face avant déportable pour un projet d'émetteur/récepteur).
Le programme devait faire plein d'autres choses et ne pouvait passer son temps à attendre une action de l'opérateur (humain = lent). le micro-controlleur était un kit à base de 80C51 (un ancêtre aussi) et l'OS (en fait un interpréteur basic) n'était pas multitache :
http://www.ti.com/product/PCF8574
Vu la puissance faramineuse du Raspberry, cette approche n'est peut-être plus nécessaire mais, apparemment, le besoin existe
encore puisque certains se sont donné le mal d'implémenté la fonctionnalité dans une bibliothèque.
Cordialement

Sylvain

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: [RESOLU (ou FAIL)] Gérer le RFID-RC522 sur Pi b+

Message par vague nerd » lun. 16 mai 2016 19:16

AMHA, la solution élégante est l'utilisation des interruptions.
AMHA aussi, mais je n'ai pas trouvé comment faire... mais je n'ai pas beaucoup cherché. En plus, il y a un pin inutilisé sur le module, c'est peut-être à cela qu'il sert (et là, pas regardé du tout).
Cdt.

EDIT : bingo ! Le dernier pin est marqué IRQ !
Reste à comprendre comment l'utiliser en python.
EDIT 2 : facile (pas testé).

Code : Tout sélectionner

GPIO.add_event_detect(24, GPIO.RISING, callback=my_callback)
Merci pour m'avoir chalangé !

EDIT 3 : testé en y branchant une led. la led ne s'allume pas. Soit il faut activer le truc, soit le up puis down va trop vite pour une led...

Edit 4 : A la lecture du datasheet, on et en 3V sur le pin irq en sortie. Je vais donc tenter de cabler pour voir si j'arrive à gérer l'interuption...
J'espère rien bruller...
Cordialement,

Vague Nerd

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: [RESOLU (ou FAIL)] Gérer le RFID-RC522 sur Pi b+

Message par vague nerd » lun. 16 mai 2016 23:56

Je tente donc la nouvelle idée (les interuptions).
Le [urlhttp://www.nxp.com/documents/data_sheet/MFRC522.pdf]datasheet[/url] parle de 3V pour quelques mA en sortie sur le pin irq.
Je l'ai donc branché sur un grio du pi.
En python :

Code : Tout sélectionner

receivedCount = 0
def checkInput(arg):
	global receivedCount
	receivedCount = receivedCount+1
	print "(" + str(receivedCount) + ")received !"
GPIO.setup(38, GPIO.IN)
GPIO.add_event_detect(38, GPIO.RISING, callback=checkInput)
Sans time.sleep(), rien.
Avec time.sleep(1) :
[code](1)received !
(2)received !
(3)received !
(4)received !
(5)received !
...
(96)received !
(97)received !
(98)received !
(99)received !
(100)received !
La valeur retournée est toujours la mêeme : 38 (en int). Il s'agit du pin générant l'interution, mais c'est peut-être un hazard (je crois pas beaucoup au hazard).
Cdt.
Cordialement,

Vague Nerd

spourre
Raspinaute
Messages : 735
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

Re: [RESOLU (ou FAIL)] Gérer le RFID-RC522 sur Pi b+

Message par spourre » lun. 16 mai 2016 23:58

vague nerd a écrit : ...
Merci pour m'avoir chalangé !
...
Edit 4 : A la lecture du datasheet, on et en 3V sur le pin irq en sortie. Je vais donc tenter de cabler pour voir si j'arrive à gérer l'interuption...
J'espère rien bruller...
Bonsoir,

C'est bien ce contrôleur qui est utilisé sur ta carte:
http://www.nxp.com/documents/data_sheet/MFRC522.pdf
l'IRQ est clairement prévue et conseillée pour améliorer les performances du logiciel.
J'ai lu en diagonale et en anglais ;-)
Mon problème, comme déjà indiqué, est que je ne possède pas la carte (et donc la bibliothèque) pour tester.
Même si le circuit permet l'activation de l'IRQ, il n'est pas certain que la bibliothèque perl python que tu as installée, permette de transmettre la configuration de façon valide.
Il est évident que je n'aurais pas mis un newby sur la piste IRQ, je ne suis pas sadique à ce point :mrgreen:
Petit scarabée, tu as raison de t'accrocher mais la route est longue :ugeek:
Cordialement

Sylvain

Répondre

Retourner vers « Gestion centralisée ouverture/fermeture »