How to connect Adafruit NFC Shield to a Mac, via libnfc
Intro
I’ve recently been experimenting with NFC projects.
The first test was done using an Adafruit NFC Shield for Arduino. I was able to get my code working with the default setup (that is using the shield with an Arduino).
However, as I need to test Peer-to-Peer mode (P2P for short) in NFC, I quickly found out that this is not something easy to do with an Arduino.
While the PN532 chip on the shield do have such capability, the Arduino libraries are far from being mature and don’t support this, yet :-(
So, I decided, I should first try out libnfc and if it works, I could replace my Arduino with a Raspberry Pi.
First of all, please note that these instructions are for the NFC shield and not the NFC breakout board which is easier to use/connect than the shield.
Following Adafruit’s guides, I tried to properly hook up the shield to the mac via an FTDI board I already had.
Turned out there are plenty of things that can go wrong:
- the silkscreen on Adafruit NFC shield has a mistake:
SEL0
is actuallySEL1
and vice-versa, - the default timeouts in the pn532 driver are not long enough and unless you patch the driver, the NFC reader won’t show up!
- if some configuration files and directories are missing, the tools/examples will fail silently, giving you nearly no clue to what’s wrong!
Recap of things to do in order to make this work:
- download libnfc, configure it and install it,
- create a directory named
/usr/local/etc/nfc/devices.d
, - copy
libnfc.conf.sample
into/usr/local/etc/nfc/libnfc.conf
and modify it in order to manually declare your device, like so:device.name = "UartSBee" device.connstring = "pn532_uart:/dev/tty.usbserial-A100MZ0L"
- use an FTDI board @5V (3.3V won’t work with the shield),
- connect
5V
andGND
from the FTDI board to the shield, connectRX
from the FTDI board toA4
on the shield and finally connectTX
on the FTDI board toA5
on the shield, - on the Adafruit shield, add a blob of solder in order to close
SEL0
, so do it for the jumper labeledSEL1
instead as they are inverted!, - download the latest libnfc distribution and edit
libnfc/drivers/pn532_uart.c
, do a search forOx55
and add plenty of properly formated0x00
in order to increase the timeout:
const uint8_t pn532_wakeup_preamble[] = { 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Now nfc-poll and nfc-list should just work fine!