Pour éditer le wiki, il faut demander un compte à un Lapin !
Difference between revisions of "LeLoopRFID rue Chapon"
(→LeLoopRFID.pde, code source embarqué dans l'Arduino) |
m (Text replace - "</tt>" to "</code>") |
||
(8 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | + | LeLoopRFID, c'est notre propre système RFID qu'on pose là où on veut. Des fois on arrive dans un lieu déjà équipé en [[:Category:RFID|contrôle d'accès par RFID]], mais celui-là c'est mon mien à moi. | |
− | + | Pour la petite histoire, c'est ce système qui a été utilisé [[:Category:Chapon|rue Chapon]]. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
== RFID Reader == | == RFID Reader == | ||
Line 19: | Line 15: | ||
* one LED on PIN D8 and GND | * one LED on PIN D8 and GND | ||
* one SPK on PIN D9 and GND | * one SPK on PIN D9 and GND | ||
− | * door line on PIN | + | * door line on PIN D2 and GND |
== Code == | == Code == | ||
− | + | * Github : https://github.com/LeLoop/LeLoopRFID | |
− | + | * Gitorious : https://gitorious.org/~le-loop/le-loop-rfid | |
− | === | + | === LeLoopRFID.pde === |
− | + | Code source embarqué dans l'Arduino. | |
Il commence par 5 fonctions de contrôle de l'environnement : | Il commence par 5 fonctions de contrôle de l'environnement : | ||
− | * les beeps, | + | * les beeps, <code>death_beep()</code>, <code>coin_beep()</code>, <code>mushroom_beep()</code>, <code>high_beep()</code> |
− | * l'allumage de la diode | + | * l'allumage de la diode <code>set_led()/reset_led()</code> et |
− | * l'ouverture de la porte | + | * l'ouverture de la porte <code>open_door()</code>. |
− | Ensuite on retrouve la fonction, de setup du réseau, | + | Ensuite on retrouve la fonction, de setup du réseau, <code>ether_setup()</code>, qui initialise la shield Ethernet et ouvre une socket serveur (192.168.42.242:4242). La LED est allumée au démarrage pendant l'initialisation du réseau. |
Enfin, arrivent les deux fonctions de base d'un sketch Arduino : | Enfin, arrivent les deux fonctions de base d'un sketch Arduino : | ||
− | * | + | * <code>setup()</code> |
− | qui va initialiser la connexion série pour le debug et appeler | + | qui va initialiser la connexion série pour le debug et appeler <code>ether_setup()</code>. |
− | * et | + | * et <code>loop()</code> |
qui va écouter sur la socket locale pour savoir si une requete est dans le buffer, et si tel est le cas, lire un caractère sur le buffer : | qui va écouter sur la socket locale pour savoir si une requete est dans le buffer, et si tel est le cas, lire un caractère sur le buffer : | ||
** si ce caractère est '1' : on ouvre la porte avec un mushroom beep et la diode clignote une fois, | ** si ce caractère est '1' : on ouvre la porte avec un mushroom beep et la diode clignote une fois, | ||
− | ** si ce caractère est '0' : on lance un | + | ** si ce caractère est '0' : on lance un <code>death_beep()</code> et la diode clignote deux fois. |
Puis va demander à la lib rfid si un tag est passé, et si tel est le cas, se connecter au serveur distant et lui soumettre l'identifiant du tag. | Puis va demander à la lib rfid si un tag est passé, et si tel est le cas, se connecter au serveur distant et lui soumettre l'identifiant du tag. | ||
− | + | === leloop_rfid_model.py === | |
+ | |||
+ | bibliothèque servant de lien avec la base de données | ||
On y retrouve "MembersDB" qui est l'objet de lien. Cet objet a trois méthodes : | On y retrouve "MembersDB" qui est l'objet de lien. Cet objet a trois méthodes : | ||
− | * db = MembersDB(filename) initialise la connexion à la db ; filename est le chemin où stocker le fichier de base de données | + | * <code>db = MembersDB(filename)</code> initialise la connexion à la db ; filename est le chemin où stocker le fichier de base de données |
− | * db.add_user(nick,id) ajoute un user en db, avec nick et id le pseudo et son tag associé | + | * <code>db.add_user(nick,id)</code> ajoute un user en db, avec nick et id le pseudo et son tag associé |
− | * db.get_user(id) retourne un nick en fonction d'un id de tag. En cas d'échec retourne None. | + | * <code>db.get_user(id)</code> retourne un nick en fonction d'un id de tag. En cas d'échec retourne None. |
− | + | === leloop_rfid_add.py === | |
+ | |||
+ | pour ajouter un utilisateur en db. | ||
se contente d'implémenter MembersDB et prend l'argument 1 en pseudo et l'argument 2 en id de tag rfid : | se contente d'implémenter MembersDB et prend l'argument 1 en pseudo et l'argument 2 en id de tag rfid : | ||
Line 63: | Line 63: | ||
leloop_rfid_add.py toto 101010 | leloop_rfid_add.py toto 101010 | ||
− | + | === leloop_rfid_open_door.py === | |
− | bibliothèque et commande pour déclencher l'ouverture de la porte. Il suffit d'exécuter ce script pour que la porte soit ouverte. Mais on peut en exporter les deux fonctions open_door() et deny_entrance() pour les appeler à partir d'un autre code. | + | bibliothèque et commande pour déclencher l'ouverture de la porte. Il suffit d'exécuter ce script pour que la porte soit ouverte. Mais on peut en exporter les deux fonctions <code>open_door()</code> et <code>deny_entrance()</code> pour les appeler à partir d'un autre code. |
− | + | === leloop_check_entrance.py === | |
Crée un serveur TCP sur 192.168.42.42:4242 et attend qu'y soit écrit des tags sous la forme : | Crée un serveur TCP sur 192.168.42.42:4242 et attend qu'y soit écrit des tags sous la forme : | ||
Line 73: | Line 73: | ||
CARD 101010 | CARD 101010 | ||
− | vérifie auprès de la db si l'identifiant est bien enregistré, puis logue sur stdout et appelle open_door() défini dans leloop_rfid_open_door.py si tel est le cas, deny_entrance() du meme module sinon. | + | vérifie auprès de la db si l'identifiant est bien enregistré, puis logue sur stdout et appelle <code>open_door()</code> défini dans leloop_rfid_open_door.py si tel est le cas, <code>deny_entrance()</code> du meme module sinon. |
Ce script est aussi exécuté en daemon à partir du script init /etc/init.d/leloop-rfid sur le serveur. | Ce script est aussi exécuté en daemon à partir du script init /etc/init.d/leloop-rfid sur le serveur. | ||
− | = | + | == Todo == |
− | + | * agrémenter le code et les commandes associées | |
− | + | ** implémenter ArgParse, créer une méta commande de contrôle... | |
− | + | * écrire une API RESTful (vive bottle.py) | |
− | * | + | * écrire un bot IRC (non-public) ? |
− | * | + | * ajouter des photos du montage ici |
− | + | ||
− | * | + | |
− | * | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | == Voir aussi == | |
− | + | ||
− | + | ||
+ | * [[LeLoopRFID au Château]] | ||
− | [[Category:RFID]] [[Category:Projets]] | + | [[Category:RFID]] |
+ | [[Category:Projets]] | ||
+ | [[Category:Arduino]] | ||
+ | [[Category:Chapon]] |
Latest revision as of 22:31, 12 April 2013
LeLoopRFID, c'est notre propre système RFID qu'on pose là où on veut. Des fois on arrive dans un lieu déjà équipé en contrôle d'accès par RFID, mais celui-là c'est mon mien à moi.
Pour la petite histoire, c'est ce système qui a été utilisé rue Chapon.
Contents
RFID Reader
- Stronglink SL030
- Black -> GND
- Vcc -> 3.3V (other end of the bus)
- CLK -> A4
- Data -> A3
Electronics
- one LED on PIN D8 and GND
- one SPK on PIN D9 and GND
- door line on PIN D2 and GND
Code
- Github : https://github.com/LeLoop/LeLoopRFID
- Gitorious : https://gitorious.org/~le-loop/le-loop-rfid
LeLoopRFID.pde
Code source embarqué dans l'Arduino.
Il commence par 5 fonctions de contrôle de l'environnement :
- les beeps,
death_beep()
,coin_beep()
,mushroom_beep()
,high_beep()
- l'allumage de la diode
set_led()/reset_led()
et - l'ouverture de la porte
open_door()
.
Ensuite on retrouve la fonction, de setup du réseau, ether_setup()
, qui initialise la shield Ethernet et ouvre une socket serveur (192.168.42.242:4242). La LED est allumée au démarrage pendant l'initialisation du réseau.
Enfin, arrivent les deux fonctions de base d'un sketch Arduino :
-
setup()
qui va initialiser la connexion série pour le debug et appeler ether_setup()
.
- et
loop()
qui va écouter sur la socket locale pour savoir si une requete est dans le buffer, et si tel est le cas, lire un caractère sur le buffer :
- si ce caractère est '1' : on ouvre la porte avec un mushroom beep et la diode clignote une fois,
- si ce caractère est '0' : on lance un
death_beep()
et la diode clignote deux fois.
Puis va demander à la lib rfid si un tag est passé, et si tel est le cas, se connecter au serveur distant et lui soumettre l'identifiant du tag.
leloop_rfid_model.py
bibliothèque servant de lien avec la base de données
On y retrouve "MembersDB" qui est l'objet de lien. Cet objet a trois méthodes :
-
db = MembersDB(filename)
initialise la connexion à la db ; filename est le chemin où stocker le fichier de base de données -
db.add_user(nick,id)
ajoute un user en db, avec nick et id le pseudo et son tag associé -
db.get_user(id)
retourne un nick en fonction d'un id de tag. En cas d'échec retourne None.
leloop_rfid_add.py
pour ajouter un utilisateur en db.
se contente d'implémenter MembersDB et prend l'argument 1 en pseudo et l'argument 2 en id de tag rfid :
leloop_rfid_add.py toto 101010
leloop_rfid_open_door.py
bibliothèque et commande pour déclencher l'ouverture de la porte. Il suffit d'exécuter ce script pour que la porte soit ouverte. Mais on peut en exporter les deux fonctions open_door()
et deny_entrance()
pour les appeler à partir d'un autre code.
leloop_check_entrance.py
Crée un serveur TCP sur 192.168.42.42:4242 et attend qu'y soit écrit des tags sous la forme :
CARD 101010
vérifie auprès de la db si l'identifiant est bien enregistré, puis logue sur stdout et appelle open_door()
défini dans leloop_rfid_open_door.py si tel est le cas, deny_entrance()
du meme module sinon.
Ce script est aussi exécuté en daemon à partir du script init /etc/init.d/leloop-rfid sur le serveur.
Todo
- agrémenter le code et les commandes associées
- implémenter ArgParse, créer une méta commande de contrôle...
- écrire une API RESTful (vive bottle.py)
- écrire un bot IRC (non-public) ?
- ajouter des photos du montage ici