Libnfc:Arduino

From NFC Tools
(Difference between revisions)
Jump to: navigation, search
Line 1: Line 1:
 
'''How to use a PN532 board with Arduino to make a reader compatible with libnfc'''
 
'''How to use a PN532 board with Arduino to make a reader compatible with libnfc'''
  
=Libnfc=
+
=Prepare Libnfc=
 
Download libnfc 1.7.1
 
Download libnfc 1.7.1
 
{{#fileanchor: libnfc_arduino.sh}}
 
{{#fileanchor: libnfc_arduino.sh}}
Line 86: Line 86:
 
Check if '''/dev/ttyACM0''' is well your Arduino port, else adapt this script.
 
Check if '''/dev/ttyACM0''' is well your Arduino port, else adapt this script.
  
=Arduino=
+
=Prepare Arduino=
==download==
+
Download:
(we only need the arduino files)
+
<source lang=bash>
 
+
svn checkout http://mfocuino.googlecode.com/svn/trunk/nfcreader/arduino/ uartnfc
svn checkout http://mfocuino.googlecode.com/svn/trunk/nfcreader/arduino/ uartnfc
+
</source>
 
+
 
now you have the lib and the sketch for your arduino :)
 
now you have the lib and the sketch for your arduino :)
  
<br>
+
Change baudrate in the '''uartnfc.ino''' file:
==change baudrate==
+
<source lang=c>
in the '''uartnfc.ino''' file:
+
void setup(void)
 
+
{
void setup(void)
+
  Serial.begin('''230400'''); //115200, 230400(, 460800, 921600)
{
+
  Serial.flush();
  Serial.begin('''921600'''); //460800, 115200
+
  nfc.begin();
  Serial.flush();
+
}
  nfc.begin();
+
</source>
}
+
 
+
change to:
+
 
+
void setup(void)
+
{
+
  Serial.begin('''230400'''); //115200, 230400(, 460800, 921600)
+
  Serial.flush();
+
  nfc.begin();
+
}
+
  
<br>
+
Upload the sketch to the Arduino, e.g. via the Arduino IDE.
==upload==
+
I used the Arduino IDE.
+
  
<br>
+
=Prepare hardware=
==pins==
+
Check if your PN532 board needs some soldering to activate the SPI, then wire it to the Arduino as following:
maybe some solder work should be done to use SPI, if not this should work:
+
  
 
   Arduino      PN532 board (SPI)
 
   Arduino      PN532 board (SPI)
Line 130: Line 116:
 
   3,3V    <-->  3,3V (VCC)
 
   3,3V    <-->  3,3V (VCC)
  
<br>
 
 
=Test=
 
=Test=
  
Line 142: Line 127:
 
       SAK (SEL_RES): 08   
 
       SAK (SEL_RES): 08   
  
<br>
 
 
=Links=
 
=Links=
  
http://code.google.com/p/mfocuino/<br>
+
* http://code.google.com/p/mfocuino/
http://www.libnfc.org/community/topic/1169/how-to-connect-a-pn532-nfc-modul-to-an-arduino-to-use-libnfc-with-it/<br>
+
* http://www.libnfc.org/community/topic/1169/how-to-connect-a-pn532-nfc-modul-to-an-arduino-to-use-libnfc-with-it/
http://regnerischernachmittag.wordpress.com/2013/05/13/libnfc-mit-arduino-nfc-shield-nutzen/ (german)<br>
+
* http://regnerischernachmittag.wordpress.com/2013/05/13/libnfc-mit-arduino-nfc-shield-nutzen/ (german)
http://robospatula.blogspot.de/2014/01/configure-install-libnfc-linux-PN532-breakout-board.html<br>
+
* http://robospatula.blogspot.de/2014/01/configure-install-libnfc-linux-PN532-breakout-board.html
http://www.elechouse.com/elechouse/index.php?main_page=product_info&cPath=90_93&products_id=2205<br>
+
* http://www.elechouse.com/elechouse/index.php?main_page=product_info&cPath=90_93&products_id=2205
  
 
[[Category:Libnfc]]
 
[[Category:Libnfc]]
 
[[Category:Libnfc:Examples]]
 
[[Category:Libnfc:Examples]]

Revision as of 18:53, 6 March 2014

How to use a PN532 board with Arduino to make a reader compatible with libnfc

Contents

Prepare Libnfc

Download libnfc 1.7.1

git clone https://code.google.com/p/libnfc/
cd libnfc
git checkout libnfc-1.7.1

Download this patch:

--- libnfc/drivers/pn532_uart.c	(unpatched)
+++ libnfc/drivers/pn532_uart.c	(patched)
@@ -48,7 +48,7 @@
 #include "chips/pn53x-internal.h"
 #include "uart.h"
 
-#define PN532_UART_DEFAULT_SPEED 115200
+#define PN532_UART_DEFAULT_SPEED 230400
 #define PN532_UART_DRIVER_NAME "pn532_uart"
 
 #define LOG_CATEGORY "libnfc.driver.pn532_uart"
@@ -306,6 +306,7 @@ pn532_uart_wakeup(nfc_device *pnd)
   const uint8_t pn532_wakeup_preamble[] = { 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
   int res = uart_send(DRIVER_DATA(pnd)->port, pn532_wakeup_preamble, sizeof(pn532_wakeup_preamble), 0);
   CHIP_DATA(pnd)->power_mode = NORMAL; // PN532 should now be awake
+  sleep(4);
   return res;
 }

This can be done with

wget --content-disposition "http://nfc-tools.org/index.php?title=Libnfc:Arduino&action=raw&anchor=pn532_uart.patch"

Then apply it:

patch -p0 < pn532_uart.patch

Compile with pn532_uart driver (or all drivers if you remove "--with-drivers=..."):

autoreconf -vis
./configure --with-drivers=pn532_uart --sysconfdir=/etc --prefix=/usr
make clean all

and install it on your system:

sudo make install

(if libnfc was installed before, it should be deleted before installing it)

Set configuration:

sudo mkdir -p /etc/nfc/devices.d
cat << EOF |sudo tee /etc/nfc/libnfc.conf >/dev/null
# Allow device auto-detection (default: true)
# Note: if this auto-detection is disabled, user has to set manually a device
# configuration using file or environment variable
allow_autoscan = false
 
# Allow intrusive auto-detection (default: false)
# Warning: intrusive auto-detection can seriously disturb other devices
# This option is not recommended, user should prefer to add manually his device.
allow_intrusive_scan = false
 
# Set log level (default: error)
# Valid log levels are (in order of verbosity): 0 (none), 1 (error), 2 (info), 3 (debug)
# Note: if you compiled with --enable-debug option, the default log level is "debug"
log_level = 2
 
# Manually set default device (no default)
# To set a default device, you must set both name and connstring for your device
# Note: if autoscan is enabled, default device will be the first device available in device list.
device.name = "PN532 NFC Board on Arduino"
device.connstring = "pn532_uart:/dev/ttyACM0:230400"
EOF

Above steps are available in this script libnfc_arduino.sh

Check if /dev/ttyACM0 is well your Arduino port, else adapt this script.

Prepare Arduino

Download:

svn checkout http://mfocuino.googlecode.com/svn/trunk/nfcreader/arduino/ uartnfc

now you have the lib and the sketch for your arduino :)

Change baudrate in the uartnfc.ino file:

void setup(void)
{
  Serial.begin('''230400'''); //115200, 230400(, 460800, 921600)
  Serial.flush();
  nfc.begin();
}

Upload the sketch to the Arduino, e.g. via the Arduino IDE.

Prepare hardware

Check if your PN532 board needs some soldering to activate the SPI, then wire it to the Arduino as following:

 Arduino       PN532 board (SPI)
 Pin 13  <-->  SCK
 Pin 12  <-->  MISO
 Pin 11  <-->  MOSI (/SDA/TX)
 Pin 10  <-->  SS   (/NSS/SCL/RX)
 GND     <-->  GND
 3,3V    <-->  3,3V (VCC)

Test

root@kali:~# nfc-list
nfc-list uses libnfc libnfc-1.7.0-91-g491db20
NFC device: pn532_uart:/dev/ttyACM0 opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04  
       UID (NFCID1): a5  09  fd  e5  
      SAK (SEL_RES): 08  

Links

Personal tools
Namespaces

Variants
Actions
Navigation
Documentation
Misc
Toolbox
Partners