|
| 1 | +--- |
| 2 | +layout: download |
| 3 | +board_id: "challenger_rp2040_nfc" |
| 4 | +title: "Challenger RP2040 NFC Download" |
| 5 | +name: "Challenger RP2040 NFC" |
| 6 | +manufacturer: "Invector Labs" |
| 7 | +board_url: |
| 8 | + - "https://ilabs.se/product/challenger-rp2040-nfc/" |
| 9 | +board_image: "challenger_rp2040_nfc.jpg" |
| 10 | +date_added: 2026-09-08 |
| 11 | +family: rp2040 |
| 12 | +features: |
| 13 | + - USB-C |
| 14 | + - Breadboard-Friendly |
| 15 | + - Feather-Compatible |
| 16 | + - Battery Charging |
| 17 | +--- |
| 18 | + |
| 19 | +The Challenger RP2040 NFC is an Adafruit Feather format board based on the Raspberry Pi RP2040, with an NXP PN7150 NFC controller on board. Unlike a simple NFC tag, the PN7150 is a full reader/writer: it polls for NFC-A, NFC-B, NFC-F and NFC-V targets and speaks NCI over I2C, so CircuitPython can read and write NDEF messages on NTAG/Ultralight, MIFARE Classic, DESFire and ISO15693 tags. |
| 20 | + |
| 21 | +It shares its layout with the rest of the Challenger RP2040 family (USB-C, 8 MByte of flash, a LiPo connector and charger, and a NeoPixel), so it drops into a Feather-shaped project like any other board in the series. |
| 22 | + |
| 23 | +### Using the NFC controller |
| 24 | + |
| 25 | +The PN7150 sits on its own I2C bus, exposed as `board.NFC_SDA` and `board.NFC_SCL`, with `board.NFC_IRQ` and `board.NFC_RESET` for the interrupt and VEN lines. That bus is internal to the board and does not appear on the headers; `board.I2C()` is the separate header bus on GPIO0/GPIO1. |
| 26 | + |
| 27 | +[circuitpython-pn7150](https://github.com/TheFilipcom4607/circuitpython-pn7150) is a single-file driver for the controller that imports nothing outside the core modules. It reads NTAG/Ultralight, Mifare Classic, DESFire/ISO-DEP, ISO15693 and FeliCa, decodes and writes NDEF, and can emulate a Type 4 tag so that tapping a phone on the board opens a URL. It recognises this board's pin names, so `PN7150.from_board(board)` wires itself up: |
| 28 | + |
| 29 | +```python |
| 30 | +import board |
| 31 | +from pn7150 import PN7150 |
| 32 | + |
| 33 | +nfc = PN7150.from_board(board) |
| 34 | +with nfc: |
| 35 | + for tag in nfc.scan(): |
| 36 | + print(tag.type, tag.uid_hex) |
| 37 | + if tag.ndef: |
| 38 | + print(" ->", tag.ndef.value) |
| 39 | +``` |
| 40 | + |
| 41 | +Install it with `circup bundle-add TheFilipcom4607/circuitpython-pn7150` followed by `circup install pn7150`, or copy `pn7150.mpy` from the latest release into `CIRCUITPY/lib/`. [ElectronicCats_CircuitPython_PN7150](https://github.com/ElectronicCats/ElectronicCats_CircuitPython_PN7150) is the other driver for this chip; it covers tag detection, and its example needs `frequency` lowered from 400000 to 100000 to run here. |
| 42 | + |
| 43 | +The on-board bus has no external pull-up resistors, so this board is built with `CIRCUITPY_I2C_ALLOW_INTERNAL_PULL_UP` and `busio.I2C` enables the RP2040's internal pull-ups on it. Those are weak, so **construct the NFC bus at 100 kHz**. 400 kHz will time out. Note also that `i2c.scan()` does not list the PN7150: it ignores the zero-length write that `scan()` uses and only answers real NCI frames. |
| 44 | + |
| 45 | +### Technical details |
| 46 | + |
| 47 | +- Raspberry Pi RP2040 dual core Cortex-M0+ @ 133 MHz |
| 48 | +- 264 KByte SRAM, 8 MByte flash |
| 49 | +- NXP PN7150 NFC controller with integrated firmware, on a dedicated I2C bus |
| 50 | +- Reader/writer for NFC-A, NFC-B, NFC-F and NFC-V targets |
| 51 | +- 1 hardware I2C, 1 hardware SPI and 1 hardware UART on the headers |
| 52 | +- 4 x 12-bit ADC inputs |
| 53 | +- NeoPixel and a red user LED |
| 54 | +- LiPo charger and standard LiPo battery connector |
| 55 | +- USB-C connector |
| 56 | + |
| 57 | +The board ships without an NFC antenna. iLabs sells it as a kit with one, or you can attach your own to the antenna pads. |
| 58 | + |
| 59 | +## Purchase |
| 60 | + |
| 61 | +* [Invector Labs](https://ilabs.se/product/challenger-rp2040-nfc/) |
0 commit comments