<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ID-12 Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/id-12/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/id-12/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Sat, 27 Aug 2022 10:12:10 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://logicaprogrammabile.it/wp-content/uploads/2017/11/cropped-logicaprogrammabile-logo-02-32x32.png</url>
	<title>ID-12 Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/id-12/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Arduino leggere tag rfid con ID-12</title>
		<link>https://logicaprogrammabile.it/arduino-leggere-tag-rfid-id-12/</link>
					<comments>https://logicaprogrammabile.it/arduino-leggere-tag-rfid-id-12/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Fri, 19 Sep 2014 08:00:32 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[ID-12]]></category>
		<category><![CDATA[RFID]]></category>
		<category><![CDATA[Tag]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=4307</guid>

					<description><![CDATA[<p>Come acquisire un tag rfid tramite lettore ID12 In un vecchio articolo avevamo visto come utilizzare il lettore ID-12 impiegando la scheda Netduino, per acquisire il codice di un tag 125KHz. Ho ricevuto diverse richieste per creare un piccolo tutorial che prevedesse l&#8217;uso di una...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-leggere-tag-rfid-id-12/">Arduino leggere tag rfid con ID-12</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Come acquisire un tag rfid tramite lettore ID12</h1>
<p>In <a href="https://logicaprogrammabile.it/netduino-gestire-lettore-rfid-id-12/">un vecchio articolo</a> avevamo visto come <a href="https://amzn.to/3QWlRqf" target="_blank" rel="noopener">utilizzare il<strong> lettore ID-12</strong></a> impiegando la scheda Netduino, per acquisire il codice di un<strong> tag 125KHz</strong>. Ho ricevuto diverse richieste per creare un piccolo tutorial che prevedesse l&#8217;uso di una scheda <strong>Arduino</strong>.<br />
La parte teorica, relativa alla tecnologia rfid e alle caratteristiche del lettore ID-12, rimane pressoché invariata. Anche lo schema elettrico è identico dato che il Netduino possiede la stessa disposizione dei pin <a href="https://amzn.to/3ALRIU3" target="_blank" rel="noopener">come una Arduino UNO</a>.</p>
<p>Per chiarezza riporto comunque i collegamenti tra la UNO ed il lettore di tag.</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2014/09/ArduinoID12.gif"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-4308" src="https://logicaprogrammabile.it/wp-content/uploads/2014/09/ArduinoID12.gif" alt="Arduino ID-12LA" width="562" height="402" /></a></p>
<p>Nella tabella seguente trovate l&#8217;elenco dei collegamenti tra Arduino UNO e lettore ID-12:</p>
<table border="0">
<tbody>
<tr>
<td>Pin Arduino UNO</td>
<td>pin ID-12</td>
</tr>
<tr>
<td> 5V dc</td>
<td> pin 11 (Vcc)</td>
</tr>
<tr>
<td> Gnd</td>
<td> pin 1 (Gnd)</td>
</tr>
<tr>
<td> 5V dc</td>
<td>pin 2 (Res)</td>
</tr>
<tr>
<td>pin 0 (RX)</td>
<td>pin 9 (D0)</td>
</tr>
<tr>
<td>Gnd</td>
<td>pin 7 (+/-)</td>
</tr>
<tr>
<td></td>
<td>pin 10 (Led)</td>
</tr>
</tbody>
</table>
<p>il pin 10 (led) del<strong> lettore ID-12</strong> può essere collegato ad un <strong>led</strong> o ad un piccolo <strong>buzzer</strong>. Ogni volta che avvicineremmo un tag rfid, sul pin 10 avremmo un segnale ad onda quadra che permette appunto di illuminare un led o di far suonare un piccolo buzzer.</p>
<h3>Il codice dello sketch</h3>
<p>A questo punto dovremmo scrivere alcune righe di codice che ci permetteranno semplicemente di leggere i byte in arrivo sulla seriale della UNO.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="c">void setup()
{
  //init seriale a 9600 bps
  Serial.begin(9600);
}

void loop()
{
  //verifico la presenza di dati in arrivo
  if (Serial.available() == 16) 
  {
    //leggo i dati presenti sulla seriale e
    //gli invio sul serial monitor
    for (int i = 0; i &lt; 16; i++) 
    {
      Serial.print(Serial.read());
      Serial.print(" ");
    }
    Serial.println();
  }
}</pre>
<p>per verificare tutto il sistema apriamo il serial monitor, impostiamo la velocità di trasmissione a 9600 baud, e avviciniamo un tag rfid al lettore. Se non ci sono stati errori otterremo l&#8217;accensione del led collegato all&#8217;ID-12 e la rappresentazione sul serial monitor di un codice alfanumerico. Avvicinando più volte il tag dovremmo ottenere sempre lo stesso codice.</p>
<p>Il codice precedente non considera però i caratteri speciali che vengono inviati dal lettore ID-12, infatti se modifichiamo il codice in modo da restituire tutti i valori che arrivano sulla porta seriale di Arduino UNO ci accorgeremmo che oltre al codice del tag sono presenti anche dei caratteri speciali aggiuntivi, che il serial monitor non mostra:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="c">void setup()
{
  //init seriale a 9600 bps
  Serial.begin(9600);
}

void loop()
{
  //verifico la presenza di dati in arrivo
  if(Serial.available() &gt; 0)
  {
    //leggo e spedisco al serial monitor tutto cio
    //che arriva alla porta seriale
    //ad ogni lettura invio anche un ritorno a capo
    //in modo da mostrare tutti i singoli valori
    //uno in ogni riga 
    Serial.println(Serial.read());
  }
}</pre>
<p>avvicinando nuovamente il tag rfid otteniamo dei valori decimali che rispecchiano questo schema:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2011/05/DataStructureID121.gif"><img decoding="async" class="aligncenter size-full wp-image-1052" src="https://logicaprogrammabile.it/wp-content/uploads/2011/05/DataStructureID121.gif" alt="Struttura dati ID-12 reader" width="650" height="61" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/05/DataStructureID121.gif 650w, https://logicaprogrammabile.it/wp-content/uploads/2011/05/DataStructureID121-300x28.gif 300w" sizes="(max-width: 650px) 100vw, 650px" /></a></p>
<p>nella figura seguente viene mostrato il serial monitor con tutti i byte letti dal lettore:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2014/09/Rfid.gif"><img decoding="async" class="aligncenter size-full wp-image-4323" src="https://logicaprogrammabile.it/wp-content/uploads/2014/09/Rfid.gif" alt="schema rfid" width="409" height="405" /></a></p>
<p>il primo carattere che viene inviato all&#8217;Arduino UNO è sempre identico per ogni tag rfid letto e ha il valore decimale 2, successivamente vengono spediti 10 caratteri che formano il codice del tag rfid, poi vengono spediti 2 caratteri che permettono di verificare il dato letto, tramite un semplice calcolo crc.<br />
Infine viene spedito un carattere di ritorno a capo e di nuova linea, e per ultimo il carattere di chiusura 3 decimale.</p>
<p>Questo piccolo sistema ci permette di creare applicazioni più evolute e utili. Ad esempio per creare un piccolo sistema di controllo, per il quale se il tag rfid corrisponde ad un dato codice viene attivata un&#8217;uscita di Arduino UNO (per accendere una lampada o attivare un relè), possiamo modificare il codice in questo modo:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="c">byte datarfid[16];
byte index = 0;

String tag ="";

void setup()
{
  //init seriale a 9600 bps
  Serial.begin(9600);

  delay(100);
}

void loop()
{
  //attendo la presenza di tutti e 16 byte provenienti
  //dal lettore id-12
  if(Serial.available() &gt;= 16)
  {
    //leggo ogni byte e lo memorizo nell'array
    //precedentemente definito
    for(index = 0; index &lt;= 15; index++)
    {
      datarfid[index] = Serial.read();
    }

    //ora ricavo i 10 byte che compongono il codice del tag
    //e li concateno in un ogetto stringa
    //da notare la conversione dei byte in char
    for(index = 1; index &lt;= 10; index++)
    {
      //concateno la stringa convertendo i byte in char
      tag += (char)datarfid[index];
    }

    //ora verifico se il codice del tag corrisponde
    //a quello memorizzato nel sistema
    if(tag == "44118837F4")
    {
      //se il codice è identico allora esegui qualcosa!
      Serial.println("Codice OK");
      tag="";
    }
  }
}</pre>
<p>La gestione di tag rfid sta diventando sempre più massiccia e credo che diverrà un perno delle applicazioni legate all&#8217;IOT. L&#8217;implementazione di questi sistemi è semplice ed anche il costo dei tag e dei lettori è molto economico.</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-leggere-tag-rfid-id-12/">Arduino leggere tag rfid con ID-12</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-leggere-tag-rfid-id-12/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Controllo accessi rfid con Netduino</title>
		<link>https://logicaprogrammabile.it/controllo-accessi-rfid-netduino/</link>
					<comments>https://logicaprogrammabile.it/controllo-accessi-rfid-netduino/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Wed, 13 Jun 2012 13:04:09 +0000</pubDate>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Tutorial Netduino]]></category>
		<category><![CDATA[Controllo Accessi]]></category>
		<category><![CDATA[ID-12]]></category>
		<category><![CDATA[RFID]]></category>
		<category><![CDATA[Tag]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=2837</guid>

					<description><![CDATA[<p>Realizzare un semplice apri porta utilizzando tag rfid La realizzazione di sistemi basati sulla tecnologia rfid è oggi alla portata di tutti vista la disponibilità di componenti a basso costo necessaria alla produzione di un prodotto completo. Il prototipo che ho realizzato per questo articolo...</p>
<p>The post <a href="https://logicaprogrammabile.it/controllo-accessi-rfid-netduino/">Controllo accessi rfid con Netduino</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Realizzare un semplice apri porta utilizzando tag rfid</h3>
<p>La realizzazione di sistemi basati sulla <strong>tecnologia rfid</strong> è oggi alla portata di tutti vista la disponibilità di componenti a basso costo necessaria alla produzione di un prodotto completo. Il prototipo che ho realizzato per questo articolo si basa principalmente su un Netduino, versione standard, e sul lettore rfid<strong> ID-12</strong> della <strong>Innovations</strong>, utilizzato in un <a title="Netduino gestire lettore RFID ID-12" href="https://logicaprogrammabile.it/netduino-gestire-lettore-rfid-id-12/">precedente articolo</a>.</p>
<p>Lo scopo del progetto è quello di permettere l&#8217;accesso controllato in una particolare area utilizzando unicamente il <strong>Netduino</strong> per memorizzare una lista di utenti autorizzati. In caso di riconoscimento il circuito azionare un classico relè che potrebbe essere collegato ad un apri porta elettromeccanico tipico dei sistemi citofonici.</p>
<p><span id="more-2837"></span></p>
<p>Il circuito è il seguente:</p>
<p style="text-align: center;"><a href="https://logicaprogrammabile.it/controllo-accessi-rfid-netduino/apriportasalaapp_bb-2/" rel="attachment wp-att-2844"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2844" title="ApriportaSalaApp_bb" src="https://logicaprogrammabile.it/wp-content/uploads/2012/06/ApriportaSalaApp_bb1.png" alt="" width="478" height="492" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/06/ApriportaSalaApp_bb1.png 478w, https://logicaprogrammabile.it/wp-content/uploads/2012/06/ApriportaSalaApp_bb1-291x300.png 291w" sizes="auto, (max-width: 478px) 100vw, 478px" /></a></p>
<p>Per quanto riguarda il codice caricato sul Netduino osserviamo che i codici dei tag rfid sono memorizzati in un array di stringhe. Questi valori vengono confrontati con il codice ottenuto dal lettore ID-12 e quando si verifica un&#8217;uguaglianza viene attivato il relè che andrà a comandare l&#8217;apri porta.<br />
Nel codice è presente anche il calcolo del crc che permette di ottenere una maggiore sicurezza nella lettura ed interpretazione del codice del tag.</p>
<p>[csharp]<br />
public static Byte ConvHexToByte(String Value)<br />
{<br />
  if (Value.Length == 2)<br />
  {<br />
    String str1 = Value.Substring(0, 1);<br />
    String str2 = Value.Substring(1, 1);</p>
<p>    if (str1.ToUpper() == &quot;A&quot;)<br />
      str1 = &quot;10&quot;;</p>
<p>    if (str1.ToUpper() == &quot;B&quot;)<br />
      str1 = &quot;11&quot;;</p>
<p>    if (str1.ToUpper() == &quot;C&quot;)<br />
      str1 = &quot;12&quot;;</p>
<p>    if (str1.ToUpper() == &quot;D&quot;)<br />
      str1 = &quot;13&quot;;</p>
<p>    if (str1.ToUpper() == &quot;E&quot;)<br />
      str1 = &quot;14&quot;;</p>
<p>    if (str1.ToUpper() == &quot;F&quot;)<br />
      str1 = &quot;15&quot;;</p>
<p>    //###########################<br />
    if (str2.ToUpper() == &quot;A&quot;)<br />
      str2 = &quot;10&quot;;</p>
<p>    if (str2.ToUpper() == &quot;B&quot;)<br />
      str2 = &quot;11&quot;;</p>
<p>    if (str2.ToUpper() == &quot;C&quot;)<br />
      str2 = &quot;12&quot;;</p>
<p>    if (str2.ToUpper() == &quot;D&quot;)<br />
      str2 = &quot;13&quot;;</p>
<p>    if (str2.ToUpper() == &quot;E&quot;)<br />
      str2 = &quot;14&quot;;</p>
<p>    if (str2.ToUpper() == &quot;F&quot;)<br />
      str2 = &quot;15&quot;;</p>
<p>    //converto i singoli caratteri in valori byte<br />
    Byte b1 = Byte.Parse(str1);<br />
    Byte b2 = Byte.Parse(str2);<br />
    //onverto i duebyte in un valore hex<br />
    Byte cv = (Byte)(b1 * 16 + b2);</p>
<p>    //Debug.Print(cv.ToString());<br />
    return cv;</p>
<p>  }</p>
<p>  return 0;</p>
<p>}</p>
<p>public static void Main()<br />
{</p>
<p>  String[] Codice = { &quot;06003906B1&quot;,<br />
                      &quot;060030EF42&quot;,<br />
                      &quot;060039EF42&quot;,<br />
                      &quot;060038EF42&quot;,<br />
                      &quot;060037EF42&quot;,<br />
                      &quot;060036EF42&quot;,<br />
                      &quot;060035EF42&quot;,<br />
                      &quot;060034EF42&quot;,<br />
                      &quot;060033EF42&quot;,<br />
                      &quot;060032EF42&quot;,<br />
                      &quot;060031EF42&quot;,<br />
                      &quot;060038EF02&quot;,<br />
                      &quot;060038EF92&quot;,<br />
                      &quot;060038EF82&quot;,<br />
                      &quot;060038EF72&quot;,<br />
                    };</p>
<p>  //Creao un oggetto per lavorare con<br />
  //la porta seriale<br />
  SerialPort sp = new SerialPort(&quot;COM1&quot;, 9600, Parity.None, 8, StopBits.One);<br />
  OutputPort led = new OutputPort(Pins.ONBOARD_LED, false);<br />
  OutputPort Porta = new OutputPort(Pins.GPIO_PIN_D7, false);<br />
  OutputPort LedAut = new OutputPort(Pins.GPIO_PIN_D8, false);<br />
  OutputPort LedNoAut = new OutputPort(Pins.GPIO_PIN_D9, false);</p>
<p>  //Apro la porta<br />
  sp.Open();</p>
<p>  while (true)<br />
  {<br />
    //Attesa di 200 millisecondi<br />
    Thread.Sleep(200);</p>
<p>    //aspetto la lettura di tutti i 16 byte<br />
    if (sp.BytesToRead == 16)<br />
    {<br />
      led.Write(true);<br />
      //creo un buffer di 16 byte<br />
      Byte[] b = new Byte[sp.BytesToRead];<br />
      Byte[] crcTag = new Byte[2];<br />
      Byte[] tag = new Byte[10];<br />
      Byte Hex01, Hex02, Hex03, Hex04, Hex05, crcRfid, crc;</p>
<p>      //leggo dalla seriale i dati inviati dall&#8217;ID-12<br />
      sp.Read(b, 0, b.Length);</p>
<p>      //copio i 10 byte dell&#8217;ID del tag in un array dedicato<br />
      Array.Copy(b, 1, tag, 0, 10);<br />
      Array.Copy(b, 11, crcTag, 0, 2);</p>
<p>      //converto i byte in una stringa ASCII<br />
      String ValoriAsc = new String(UTF8Encoding.UTF8.GetChars(tag));<br />
      String ValoreCrc = new String(UTF8Encoding.UTF8.GetChars(crcTag));</p>
<p>      //ottengo i valori esadecimali dalla coppia di byte Ascii<br />
      Hex01 = ConvHexToByte(ValoriAsc.Substring(0, 2));<br />
      Hex02 = ConvHexToByte(ValoriAsc.Substring(2, 2));<br />
      Hex03 = ConvHexToByte(ValoriAsc.Substring(4, 2));<br />
      Hex04 = ConvHexToByte(ValoriAsc.Substring(6, 2));<br />
      Hex05 = ConvHexToByte(ValoriAsc.Substring(8, 2));<br />
      crcRfid = ConvHexToByte(ValoreCrc.Substring(0, 2));</p>
<p>      //calcolo il crc mettendo in xor i valori hex<br />
      crc = (byte)(Hex01 ^ Hex02 ^ Hex03 ^ Hex04 ^ Hex05);</p>
<p>      //printo il valore di crc<br />
      Debug.Print(crcRfid.ToString());<br />
      Debug.Print(crc.ToString());</p>
<p>      if (crcRfid == crc)<br />
      {<br />
        //eseguo un ciclo che mi printa tutti i singoli<br />
        //byte del buffer<br />
        Int32 strNumber;<br />
        Int32 strIndex = 0;<br />
        Boolean Acc = false;</p>
<p>        for (strNumber = 0; strNumber &lt; Codice.Length; strNumber++)<br />
        {<br />
          strIndex = Codice[strNumber].IndexOf(ValoriAsc);<br />
          if (strIndex &gt;= 0)<br />
          {<br />
            Porta.Write(true);<br />
            Thread.Sleep(100);<br />
            Porta.Write(false);</p>
<p>            LedAut.Write(true);<br />
            Thread.Sleep(200);<br />
            LedAut.Write(false);</p>
<p>            Acc = true;</p>
<p>            break;</p>
<p>          }<br />
        }</p>
<p>        if (Acc == false)<br />
        {<br />
          LedNoAut.Write(true);<br />
          Thread.Sleep(200);<br />
          LedNoAut.Write(false);<br />
        }</p>
<p>      }<br />
      Debug.Print(ValoriAsc);</p>
<p>      Thread.Sleep(150);<br />
      led.Write(false);<br />
    }<br />
  }<br />
}</p>
<p>[/csharp]</p>
<p>Il codice per far funzionare il sistema è molto semplice. Con poco hardware è con una spesa inferiore ai 100€ possiamo costruire veramente prodotti basati su tecnologia rfid. Sostituendo il Netduino con il fratello maggiore (Netduino Plus) potremmo dotare il sistema di una memoria SD per il log degli accessi ed un webserver per leggere i file di log.</p>
<p>The post <a href="https://logicaprogrammabile.it/controllo-accessi-rfid-netduino/">Controllo accessi rfid con Netduino</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/controllo-accessi-rfid-netduino/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Come calcolare il crc del tag con Netduino e lettore RFID ID-12</title>
		<link>https://logicaprogrammabile.it/calcolare-il-crc-tag-netduino-lettore-rfid-id12/</link>
					<comments>https://logicaprogrammabile.it/calcolare-il-crc-tag-netduino-lettore-rfid-id12/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Thu, 13 Oct 2011 16:48:11 +0000</pubDate>
				<category><![CDATA[Tutorial Netduino]]></category>
		<category><![CDATA[ID-12]]></category>
		<category><![CDATA[Lettore ID-12]]></category>
		<category><![CDATA[Netduino]]></category>
		<category><![CDATA[RFID]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=2080</guid>

					<description><![CDATA[<p>Utilizzare il Netduino per calcolare il crc del tag rfid Nell&#8217;articolo scritto qualche tempo, che mostrava come impiegare un Netduino ed un lettore rfid ID-12 della Innovations, ho descritto solamente la parte che acquisiva l&#8217;id del tag, senza analizzare come calcolare il crc indispensabile per...</p>
<p>The post <a href="https://logicaprogrammabile.it/calcolare-il-crc-tag-netduino-lettore-rfid-id12/">Come calcolare il crc del tag con Netduino e lettore RFID ID-12</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Utilizzare il Netduino per calcolare il crc del tag rfid</h1>
<p><a title="Netduino gestire lettore RFID ID-12" href="https://logicaprogrammabile.it/netduino-gestire-lettore-id-12/">Nell&#8217;articolo scritto qualche tempo</a>, che mostrava come impiegare un <strong>Netduino</strong> ed un lettore <strong>rfid ID-12</strong> della Innovations, ho descritto solamente la parte che acquisiva l&#8217;id del tag, senza analizzare come calcolare il crc indispensabile per avere la certezza che il dato letto fosse corretto.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1051" title="DataStructureID12" src="https://logicaprogrammabile.it/wp-content/uploads/2011/05/DataStructureID12.gif" alt="" width="650" height="61" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/05/DataStructureID12.gif 650w, https://logicaprogrammabile.it/wp-content/uploads/2011/05/DataStructureID12-300x28.gif 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></p>
<p>Riprendo questo argomento su segnalazione di una gentilissima visitatrice <a href="http://community.dotnetwork.it/Sabrina/default.aspx" target="_blank">Sabrina Cosolo</a>, che ringrazio per avermi fatto notare un errore nell&#8217;illustrazione del <a href="http://it.wikipedia.org/wiki/Cyclic_redundancy_check" target="_blank">calcolo del crc</a>, infatti scrissi che i due byte del crc fossero ottenuti ponendo in OR i 10 byte dell&#8217;id del tag.<br />
Questo non è vero in quanto bisogna mettere in XOR i valori esadecimali ottenuti dalla conversione in ASCII dei byte letti dal lettore.</p>
<p><span id="more-2080"></span>Mi spiego meglio impiegando l&#8217;illustrazione seguente</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2083" title="Calcolo CRC lettore tag RFFID ID-12" src="https://logicaprogrammabile.it/wp-content/uploads/2011/10/ID12_CRC.gif" alt="calcolare il crc lettore Innovations ID-12" width="638" height="380" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/10/ID12_CRC.gif 638w, https://logicaprogrammabile.it/wp-content/uploads/2011/10/ID12_CRC-300x178.gif 300w" sizes="auto, (max-width: 638px) 100vw, 638px" /></p>
<p>i 10 byte rappresentano l&#8217;id del tag, mentre i due byte rappresentano il valore di crc. Il calcolo viene eseguito convertendo i singoli byte in valori ASCII, per ottenere 5 valori esadecimali prendendo 2 byte alla volta, come visibile in figura. Eseguendo un calcolo XOR di questi valori esadecimali otteniamo il calore del CRC.</p>
<p>Ora la difficoltà che ho riscontrato è quella di convertire un byte in un valore esadecimale, semplicissimo da fare con il .Net framework ma non altrettanto con la versione micro (non sono riuscito a trovare delle risorse che svolgessero questo compito!), quindi ho scritto un po di codice per arrangiarmi, mi rendo conto che non è il massimo ma diciamo che per questo esempio funziona!!</p>
<p>Ho commentato il codice per spiegare meglio il funzionamento.</p>
<pre class="lang:c# decode:true ">using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;

using System.IO.Ports;
using System.Text;

namespace Netduino_ID12Reader
{
public class Program
{
    public static Byte ConvHexToByte(String Value)
    {
      if (Value.Length == 2)
      {
        String str1 = Value.Substring(0, 1);
        String str2 = Value.Substring(1, 1);

        if (str1.ToUpper() == "A")
          str1 = "10";

        if (str1.ToUpper() == "B")
          str1 = "11";

        if (str1.ToUpper() == "C")
          str1 = "12";

        if (str1.ToUpper() == "D")
          str1 = "13";

        if (str1.ToUpper() == "E")
          str1 = "14";

        if (str1.ToUpper() == "F")
          str1 = "15";

        //###########################
        if (str2.ToUpper() == "A")
          str2 = "10";

        if (str2.ToUpper() == "B")
          str2 = "11";

        if (str2.ToUpper() == "C")
          str2 = "12";

        if (str2.ToUpper() == "D")
          str2 = "13";

        if (str2.ToUpper() == "E")
          str2 = "14";

        if (str2.ToUpper() == "F")
          str2 = "15";

        //converto i singoli caratteri in valori byte
        Byte b1 = Byte.Parse(str1);
        Byte b2 = Byte.Parse(str2);
        //onverto i duebyte in un valore hex
        Byte cv = (Byte)(b1 * 16 + b2);

        //Debug.Print(cv.ToString());

        return cv;

      }

      return 0;
    }

    public static void Main()
    {
      SerialPort sp = new SerialPort("COM1", 9600, Parity.None, 8);
      OutputPort led = new OutputPort(Pins.ONBOARD_LED, false);
      UTF8Encoding asen = new UTF8Encoding();

      //apro la oprta seriale per acquisire i dati dal lettore id-12
      sp.Open();

      while (true)
      {
        Thread.Sleep(200);
        led.Write(false);

        //controllo ciclicamente che arrivino tutti i
        //byte dal lettore
        if (sp.BytesToRead == 16)
        {
          Byte[] b = new Byte[sp.BytesToRead];
          Byte[] tag = new Byte[10];

          Byte Hex01, Hex02, Hex03, Hex04, Hex05, crc;

          //leggo tutti i byte provenienti dal lettore
          sp.Read(b, 0, b.Length);

          //copio i 10 byte dell'ID del tag in un array dedicato
          Array.Copy(b, 1, tag, 0, 10);

          //converto i byte in una stringa ASCII
          String ValoriAsc = new String(UTF8Encoding.UTF8.GetChars(tag));

          //ottengo i valori esadecimali dalla coppia di byte Ascii
          Hex01 = ConvHexToByte(ValoriAsc.Substring(0, 2));
          Hex02 = ConvHexToByte(ValoriAsc.Substring(2, 2));
          Hex03 = ConvHexToByte(ValoriAsc.Substring(4, 2));
          Hex04 = ConvHexToByte(ValoriAsc.Substring(6, 2));
          Hex05 = ConvHexToByte(ValoriAsc.Substring(8, 2));

          //calcolo il crc mettendo in xor i valori hex
          crc = (byte)(Hex01 ^ Hex02 ^ Hex03 ^ Hex04 ^ Hex05);

          //printo il valore di crc
          Debug.Print(crc.ToString());

          if (b[0] == 0x02 &amp;&amp; b[13] == 0xD &amp;&amp; b[14] == 0xA &amp;&amp; b[15] == 0x03)
            led.Write(true);

        }

      }

    }
}
}</pre>
<p>&nbsp;</p>
<p>Il calcolo del crc può risultare utile nel caso di applicazioni dove la certezza di aver letto bene l&#8217;id del tag è fondamentale, come, per esempio in applicazioni come alcune delle applicazioni illustrate <a href="http://it.wikipedia.org/wiki/Radio_Frequency_IDentification#Applicazioni_RFID">nella pagina di wikipedia</a> dedicata al sistema RFID.</p>
<p>Per considerazioni e spiegazioni aggiuntive vi invito a scrivermi nei commenti o tramite mail</p>
<p>al prossimo articolo&#8230;</p>
<p>The post <a href="https://logicaprogrammabile.it/calcolare-il-crc-tag-netduino-lettore-rfid-id12/">Come calcolare il crc del tag con Netduino e lettore RFID ID-12</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/calcolare-il-crc-tag-netduino-lettore-rfid-id12/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Netduino gestire lettore RFID ID-12</title>
		<link>https://logicaprogrammabile.it/netduino-gestire-lettore-rfid-id-12/</link>
					<comments>https://logicaprogrammabile.it/netduino-gestire-lettore-rfid-id-12/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 02 May 2011 10:16:05 +0000</pubDate>
				<category><![CDATA[Tutorial Netduino]]></category>
		<category><![CDATA[Controllo Accessi]]></category>
		<category><![CDATA[ID-12]]></category>
		<category><![CDATA[RFID]]></category>
		<category><![CDATA[Tag]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=1022</guid>

					<description><![CDATA[<p>Esperimenti con il lettore Innovations RFID ID-12. L&#8217;identificazione a frequenza (RFID) è un sistema molto interessante che permette, appunto, di identificare gli oggetti a distanza, in modo automatico. Questa tecnologia si basa sull&#8217;uso di transponder, definiti tag, che permettono di trasmettere al lettore (nel nostro...</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-gestire-lettore-rfid-id-12/">Netduino gestire lettore RFID ID-12</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Esperimenti con il lettore Innovations RFID ID-12.</h1>
<p>L&#8217;identificazione a frequenza (RFID) è un sistema molto interessante che permette, appunto, di identificare gli oggetti a distanza, in modo automatico. Questa tecnologia si basa sull&#8217;uso di transponder, definiti tag, che permettono di trasmettere al lettore (nel nostro caso il reader RFID ID-12), tramite onde radio, i dati contenuti al loro interno.</p>
<p>Possiamo pensare a questa tecnologia come un&#8217;evoluzione dei codici a barre, ma che presenta notevoli vantaggi come, la lettura simultanea di tag (anche 200 tag al secondo), una maggiore resistenza all&#8217;usura e la capacità di memorizzare diverse informazioni nel loro chip integrato.</p>
<p>I tag presenti in commercio sono di diverso tipo e si presentano spesso come smart card, portachiavi e bande adesive. La figura seguente mostra come è strutturato un tag RFID</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1029 size-full" title="TagRfid" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/TagRfid.jpg" width="181" height="185" /><span id="more-1022"></span>La frequenza di funzionamento dei tag può essere tipicamente di 125KHz o 13.56MHz, ma esistono modelli che utilizzano frequenze dell&#8217;ordine dei GHz (&gt;2.4GHz).<br />
Le parti principali che lo compongono sono l&#8217;antenna è il microchip. L&#8217;antenna ha il compito di alimentare il microchip sfruttando il campo elettromagnetico generato dal lettore, e di veicolare verso il lettore il segnale del microchip.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1028 size-full" title="ID12RFIDReader" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/ID12RFIDReader.jpg" alt="ID-12 lettore rfid" width="387" height="197" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/ID12RFIDReader.jpg 387w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/ID12RFIDReader-300x152.jpg 300w" sizes="auto, (max-width: 387px) 100vw, 387px" /></p>
<p>In commercio esistono vari dispositivi evoluti che permettono con poca spesa di creare il proprio sistema RFID. Il dispositivo ID-12 con cui ho avuto esperienza è prodotto dalla Innovations, ha un costo di circa 25-30€ è il suo impiego risulta semplice ed intuitivo. Di seguito la pin function del dispositivo:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1032 size-full" title="ID-12_Pin_Function" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/ID-12_Pin_Function.gif" width="357" height="239" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/ID-12_Pin_Function.gif 357w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/ID-12_Pin_Function-300x200.gif 300w" sizes="auto, (max-width: 357px) 100vw, 357px" /></p>
<p>Nel lettore <strong>ID-12</strong> abbiamo un&#8217;antenna integrata che genera un segnale capace di fornire l&#8217;alimentazione al tag. Quando avviciniamo il tag al lettore, il microchip viene alimentato ed invia il suo identificativo.<br />
Per lavorare con il lettore possiamo collegare l&#8217;<strong>ID-12</strong> in questo modo</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1033 size-full" title="UsoID12" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/UsoID12.gif" alt="Utilizzo del reader ID-12" width="383" height="306" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/UsoID12.gif 383w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/UsoID12-300x239.gif 300w" sizes="auto, (max-width: 383px) 100vw, 383px" /></p>
<p>L&#8217;alimentazione di 5Vdc viene fornita tramite i pin 11 e la massa tramite il pin1. Il pin2 (Reset) viene collegato alla 5Vdc, ponendolo a massa otteniamo il reset dell&#8217;ID-12.<br />
Il pin10 (LED/Beeper) viene utilizzato per pilotare un bepper(cicalino); questa funzione è molto interessante poiché il segnale viene generato solo quando il tag è letto correttamente.<br />
Il pin7 (Format Selector) gestisce il formato del dato in uscita al pin10; nel mio caso collegandolo a massa ottengo un uscita ASCII (gli altri formati supportati sono Magnet Emulation, collegando il pin7 al pin10 e Wiegand26 collegando il pin7 alla 5Vdc)<br />
Sul pin9 (data pin D0) è disponibile il segnale TTL contenente il dato memorizzato nel tag. Il pin8 (data pin D1) fornisce lo stesso dato ma il segnale è RS232 compatibile, ed quindi possibile collegare questo pin direttamente alla porta seriale del pc.</p>
<p>La portata dell&#8217;antenna integrata dell&#8217;ID-12 è di qualche centimetro, sufficiente per il nostro esperimento (ma è possibile portare il range di lettura a circa 10-12 cm collegando un&#8217;antenna esterna sui pin 3 e 4).<br />
Lo schema successivo mostra i collegamenti da effettuare con il Netduino:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1040 size-full" title="NetduinoID12_bb" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/NetduinoID12_bb.jpg" alt="Netduino ID12 Reader" width="409" height="348" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/NetduinoID12_bb.jpg 409w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/NetduinoID12_bb-300x255.jpg 300w" sizes="auto, (max-width: 409px) 100vw, 409px" /></p>
<p>Il circuito è identico allo schema base visto precedentemente, l&#8217;uscita dell&#8217;ID-12 (pin9) è collegata al pin0 (UART RX) del <strong>Netduino</strong>.</p>
<p>Alimentiamo il Netduino e proviamo ad avvicinare un tag al dispositivo per verificare che il led sul pin10 si accenda, dandoci conferma della corretta lettura del tag.<br />
Il formato ASCII del dato restituito dal lettore ID-12 è composto da 16 byte ed è rappresentato in figura:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1052 size-full" title="DataStructureID12" src="https://logicaprogrammabile.it/wp-content/uploads/2011/05/DataStructureID121.gif" alt="Struttura dati ID-12 reader" width="650" height="61" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/05/DataStructureID121.gif 650w, https://logicaprogrammabile.it/wp-content/uploads/2011/05/DataStructureID121-300x28.gif 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></p>
<ul>
<li>Il primo byte rappresenta lo <strong>Start TX</strong> e vale 0x02</li>
<li><strong>Data</strong> è composto da 10 byte che rappresentano l&#8217;<strong>ID</strong> del tag</li>
<li><strong>Checksum</strong> vale 2 byte e si ottiene ponendo in XOR i 10 byte di dati</li>
<li>Il byte 14 è un <strong>Carrier Return</strong> e vale 0x13</li>
<li>il byte 15 è un <strong>Line Feed</strong> e vale 0x10</li>
<li>il byte 16 rappresenta l&#8217;<strong>End TX</strong> e vale 0x03</li>
</ul>
<p>Ora passiamo scrivere il codice C# per questo circuito</p>
<pre class="lang:c# decode:true ">Int32 Ciclo = 0;
//Creao un oggetto per lavorare con
//la porta seriale
SerialPort sp = new SerialPort("COM1", 9600, Parity.None, 8);

//Apro la porta
sp.Open();

while (true)
{
//Attesa di 200 millisecondi
Thread.Sleep(200);

//aspetto la lettura di tutti i 16 byte
if (sp.BytesToRead == 16)
{
//creo un buffer di 16 byte
Byte[] b = new Byte[sp.BytesToRead];

//leggo dalla seriale i dati inviati dall'ID-12
sp.Read(b, 0, b.Length);

//eseguo un ciclo che mi printa tutti i singoli
//byte del buffer
for (Ciclo = 0; Ciclo &lt; b.Length; Ciclo++)
{
Debug.Print(b[Ciclo].ToString());
}
}
}</pre>
<p>&nbsp;</p>
<p>Il codice precedente ha evidenziato come leggere i dati provenienti dal lettore ID-12. L&#8217;esempio è molto semplice e non ha bisogno di grosse descrizioni.<br />
In questo modo possiamo realizzare qualsiasi applicazione basata sulla tecnologia RFID.</p>
<p>&nbsp;</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-gestire-lettore-rfid-id-12/">Netduino gestire lettore RFID ID-12</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/netduino-gestire-lettore-rfid-id-12/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
