CardReader



Cet exemple implémente un lecteur de cartes à puce sous divers configurations.


Voici une petite vidéo d'illustration : https://youtu.be/z-JG1IUT-2k


1) Lecteur de carte à puce RS232 sur un Wemos D1, système autonome




a) Matériel : Wemos D1 et lecteur de tag RDM6300


Lecteur de tag :

WeMos



Connections :


Wemos d1 port D2 (GPIO 4) vers RDM6300 Pin 1 (TX)

Wemos d1 port D3 (GPIO 0) vers RDM6300 Pin 2 (RX)

Alimentation du RDM6300 (GND et 5V)





b) Principe :


Le lecteur de carte envoie les ID des cartes à puce sur le Wemos, qui compare l'ID avec les ID autorisés et ouvre un relai si l'ID est présent.


De plus, une 'super-card' permet d'ajouter une carte supplémentaire



c) Le Config :


[General]

Device=CardReader1

Wifi_ssid=mySSID

Wifi_password=myPass


NTP_Server=0.fr.pool.ntp.org


FW_Server=fw.mirtos.org

FW_Port=8080


Led_enabled=1


RS232=1

RS232_STX=2

RS232_ETX=3


[Device]

Type=WEMOS

i2c_scl_pin=255

i2c_sda_pin=255


btn_count=0

btn_IO_1=255

        

rs2_in_pin=4

rs2_out_pin=0

rs2_on_hw=0


relay_count=1

relay_IO_1=5


[GVar]


Supercard=0300918BDBC2



Dans le config, on spécifie les IO utilisés et les diverses configurations.


Le module RS envoie le symbole 0x02 comme symbole de Start et 0x03 comme symbole de fin. Nous spécifions donc les deux symboles dans le config (RS232_STX=2 et RS232_ETX=3)


Dans le config, je mets aussi une variable globale pour l'ID de la 'Super Card' qui permet l'ajout de nouvelles cartes


Remarque : Si aucun Wifi n'est disponible (cas d'un lecteur isolé), l'information du Wifi (Wifi_ssid) peut être omise. Dans ce cas, l'heure ne sera pas disponible.

De plus, dans ce cas, c'est le fichier ap.xml qui sera appelé, au lieu du fichier main.xml.



d) le main.xml et/ou ap.xml:



<Sys>

    <Start>Display(Hello world);</Start>

</Sys>

<B1>

    <P>Display(Pressed);MI(RY(1,1);DP(Open);ST(1,5,s));</P>

    <R>Display(Released);</R>

</B1>


<T>

       <T01>RY(1,0);DP(Close);</T01>

</T>


<RS>

       <M_..>IF(SEQ(GS(lastRSMsg),GG(Supercard)),AE(Card,Add),AE(Card,Check));</M_..>

</RS>



<Card>

       <Add>IF(OR(SEQ(GS(prevRSMsg),GG(Supercard)),FII(card.txt,GS(prevRSMsg))),DP(Not added),FAD(card.txt,GS(prevRSMsg)));</Add>

       <Check>IF(FII(card.txt,GS(lastRSMsg)),MI(RY(1,1),DP(Open),ST(1,5,s)),DP(Card KO));</Check>

</Card>




Le main.xml (ou l'ap.xml) devra répondre aux événements de la RS232 :

- Si un message arrive (quel qu'il soit => M_.. ) on vérifie         s'il s'agit de la super-card :

       IF(SEQ(GS(lastRSMsg),GG(Supercard)),AE(Card,Add),AE(Card,Check));


En fait je compare le dernier message reçu (GetSystem(LastRSMsg)) avec la variable globale (définie dans le config) de l'ID de la SuperCard. Si c'est las supercard, alors j'ajoute un événement pour l'ajout (Source 'Card' et event 'Add), sinon je check la carte (Ajout de l'événement Card/Check)


J'ai donc deux nouveaux événements :


- Add  : 

<Add>

       IF(OR(SEQ(GS(prevRSMsg),GG(Supercard)),FII(card.txt,GS(prevRSMsg))),

DP(Not added),

FAD(card.txt,GS(prevRSMsg)));</Add>


Dans ce cas, je contrôle si la carte précédente (GS(prevRSMsg)) était soit la super carte (SEQ(GS(prevRSMsg),GG(Supercard))), soit déjà présente dans le fichier de carte (FII(card.txt,GS(prevRSMsg))), dans ce cas, je ne l'ajoute pas, sinon, je l'ajoute : FAD(card.txt,GS(prevRSMsg)) .

 

- Check :

<Check>

IF(FII(card.txt,GS(lastRSMsg)),MI(RY(1,1),DP(Open),ST(1,5,s)),DP(Card KO));

</Check>


Dans ce cas, je cherche dans le fichier la dernière carte (FII(card.txt,GS(lastRSMsg))), si elle est présente, je fais une action multiple (MI) où j'ouvre le relay no 1 (RY(1,1)) , j'affiche 'Open' (DP(Open)) et je starte un timer de 5 sec pour refermer le relay à l'échéance du timer (ST(1,5,s)).

Si la carte n'est pas trouvée, alors j'affiche Carte KO (DP(Card KO));



Comme un timer a été crée, j'ajoute l'événemetn <T><T0> pour le traitement de ce timer :


<T>

       <T01>RY(1,0);DP(Close);</T01>

</T>

 

à L'échéance du timer, je referme le relai (RY(1,0);) et j'affiche 'Close' (DP(Close);


Dans cet exemple, les événements liés aux sources 'Sys' et 'B1'  ne sont pas utilisés et peuvent être retirés. Néanmoins le bouton B1, même s'il n'est pas cablé, peut être utilisé comme source d'événement (ainsi une page Web pourrait provoquer l'ouverture avec <a href="/EVENT?source=B1&event=P">event B1.P</a> )



Il est toujours possible d'éditer le fichier de carte dans l'interface Web :





e) index.htm


Il est possible d'offrir plus d'information sur la page web. Voici un exemple :


<html>

<head>

<link rel="icon" href="/favicon.ico" type="image/x-icon" />

<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">

<meta http-equiv='refresh' content='10; URL=/' />

</head>

       <body bgcolor='#CE6211' text='white' >

       <font color='white' face='arial'> 


       <H2>My Door</H2></P>


       Device:%S/Device%<BR><BR>

       <a href="/EVENT?source=B1&event=P">Open</a><BR><BR>

       

       <BR/><B>File system usage </B><BR/>

       FS total Bytes:%S,FStB%<BR/>

       FS used Bytes:%S,FSuB%<BR/>

       FS free Bytes:%S,FSfB%<BR/>

       <a href="/FILE">File access</a><BR/><BR/>

       

       <BR/><B>Others</B><BR/>

       <a href="/RESET">Reset!</a><BR/>

       HW:%S,HW%<BR/>

       SW:%S,SW%<BR/>

       Version:%S,Version%<BR/><BR/>

       Boot cnt:%S,BootCnt% <a href="/EXEC?fct=RBC();">raz</a><BR/>

       

       

       IP:%S,IP%<BR/>

       MAC:%S,MAC%<BR/>

       AP:%S,SSID%<BR>

       BootPath:%S,BootPath%<BR><BR>

       LastEvent:%S,LastEvent%<BR>

       LastEventMsg:%S,LastEventMsg%<BR>

       WIE Card:%S,LastWIEMsg%<BR>

       RS Card: %S,lastRSMsg% / %S,prevRSMsg% <BR><BR>


       <BR/><B>Memory </B><BR/>

       FreeHeap:%S,FreeHeap%<BR/>

       ContStack:%S,ContStack%<BR/>

       HFrag:%S,HFrag%<BR/>

       FrBlkSize:%S,FrBlkSize%<BR/>

       RstInfo:%S,RstInfo%<BR/><BR/>


       



       </font>

       </body>

</html>


Il est bon de mettre dans le config que la page à appeler lors de event/exec soit aussi index.htm :


[GVar]

...

event.htm=index.htm

exec.htm=index.htm





Améliorations possibles :


- Ajout du traitement d'un bouton pour l'ouverture de la porte (type 'sortie')

- Renvoi à une centrale par MQTT des passages et/ou des ajouts de cartes

- Dans un système connecté, on peut imaginer que le lecteur n'est pas l'ensemble des cartes initialement, si une carte non présente dans le fichier arrive, alors on demande en MQTT au central le passage, si c'est positif, un message MQTT ajoutera au fichier la carte qui sera alors connue localement

- Page web plus 'user friendly'




2) Lecteur de carte à puce RS232 sur un ESP32, système autonome



Ce système est identique au précédent avec uniquement un changement de processeur. Le processeur utilisé est un ESP32 




La connectique sera la même que pour l'exemple WeMos précédent, c'est à dire 

IO21 <=> D2 <=> vers RDM6300 Pin 1 (TX)

IO17 <=> D3 <=> vers RDM6300 Pin 2 (RX)


Le config sera alors changé ainsi :


rs2_in_pin=21

rs2_out_pin=17

rs2_on_hw=1


L'ESP32 bénéficie d'un second UART matériel, donc on l'utilise en spécifiant rs2_on_hw=1.


Ce qui donne :



[General]

Device=WeMos665


NTP_Server=0.fr.pool.ntp.org


Wifi_ssid=MySSID

Wifi_password=myPass


FW_Server=fw.mirtos.org

FW_Port=8080


RS232=1

RS232_STX=2

RS232_ETX=3


[Device]

Type=WEMOS_665

led_green_pin=2


btn_count=0

btn_IO_1=255


rs2_in_pin=21

rs2_out_pin=17

rs2_on_hw=1


relay_count=1

relay_IO_1=5


[GVar]

Supercard=0300918BDBC2



Le main.xml, lui, reste identique.


3) Lecteur de carte à puce RS232 sur un ESP32 (Wemos S2 mini), système autonome









Seule la config doit être adaptée par rapport à l'exemple précédent :


rs2_in_pin=33

rs2_out_pin=18



Le config, en entier, devient :


[General]

Device=S2Mini


NTP_Server=0.fr.pool.ntp.org


Wifi_ssid=MySSID

Wifi_password=MyPass

AP_password=MyPass


FW_Server=fw.mirtos.org

FW_Port=8080


RS232=1

RS232_STX=2

RS232_ETX=3


[Device]

Type=ESP32_S2

led_green_pin=15


btn_count=0

btn_IO_1=255


relay_count=0

relay_IO_1=255



rs2_in_pin=33

rs2_out_pin=18

rs2_on_hw=1



[GVar]

Supercard=0300918BDBC2


event.htm=index.htm

exec.htm=index.htm




Le main.xml, lui, reste identique.



4) Lecteur de carte à puce Wiegand sur un Wemos D1, système autonome


a) Matériel : Wemos D1 et lecteur de tag fournissant une interface Wiegad



b) Le principe est identique au lecteur RS232



c) Le Config :


[General]

Device=CardReader1

Wifi_ssid=mySSID

Wifi_password=myPass


NTP_Server=0.fr.pool.ntp.org


FW_Server=fw.mirtos.org

FW_Port=8080


Led_enabled=1



[Device]

Type=WEMOS

i2c_scl_pin=255

i2c_sda_pin=255


btn_count=0

btn_IO_1=255

        

wie_d0_pin=4

wie_d1_pin=0


relay_count=1

relay_IO_1=5


[GVar]


Supercard=00918BDB80

_rs_was=0300918BDBC2




Les lignes D0 et D1 du lecteur sont spécifiée sur wie_d0_pin=4 et wie_d1_pin=0


Attention, il y a une petite modification de forme de la lecture, il faut adapter le Supercard en conséquence.


d) main.xml devient (remplacement des RS en WIE) :



<Sys>

    <Start>Display(Hello world);</Start>

</Sys>

<B1>

    <P>Display(Pressed);MI(RY(1,1);DP(Open);ST(1,5,s));</P>

    <R>Display(Released);</R>

</B1>


<T>

       <T01>RY(1,0);DP(Close);</T01>

</T>


<WIE>

       <W_..>IF(SEQ(GS(lastWIEMsg),GG(Supercard)),AE(Card,Add),AE(Card,Check));</W_..>

</WIE>



<Card>

       <Add>IF(OR(SEQ(GS(prevWIEMsg),GG(Supercard)),FII(card.txt,GS(prevWIEMsg))),DP(Not added),FAD(card.txt,GS(prevWIEMsg)));</Add>

       <Check>IF(FII(card.txt,GS(lastWIEMsg)),MI(RY(1,1),DP(Open),ST(1,5,s)),DP(Card KO));</Check>

</Card>








Créé avec HelpNDoc Personal Edition: Créer des documents d'aide PDF facilement