NRF-Nano V3.0 development board, CH340, ATMega328p with
zoom_out_map
chevron_left chevron_right

Product images are for informational purposes only and may vary slightly depending on the batch and supplier. Product specifications and prices may be subject to change without notice. We do our best to provide accurate and complete product specifications, but they may not be completely accurate. If you encounter any such situation, please let us know.

The product is intended for specialists and requires qualified and authorized personnel. The product does not include assembly/use instructions . Putting the product into operation by unqualified persons leads to the loss of the warranty according to the Terms and Conditions on the site.

The specified technical parameters (current, power, etc.) represent maximum allowable values under ideal operating conditions. For safe use and optimal lifespan, it is recommended to operate the product continuously at no more than 50% of the specified maximum values.

NRF-Nano V3.0 development board, CH340, ATMega328p with NRF24L01, Type C

Compact Arduino Nano compatible development board, ideal for IoT projects and wireless communication, integrates NRF24L01 transceiver for fast and stable radio links, uses ATMega328P at 16MHz with 5V logic, keeps pinout identical to Nano V3 for easy integration, programming and power supply via USB Type C with CH340G.

69.51 RON Tax included

57.45 RON Tax excluded

(1/5) out of 1 total ratings
Read the reviews
1-2 zile
check In Stoc

Shipping by Wednesday 4 November

Buying this product earns you 3.48 RON in loyalty points.

Warranty: 24 months for individuals
INTERNATIONAL DELIVERY
International fast shipping within EU. Free Shipping for orders above 100 EUR in most EU countries.
FAST DISPATCH 24H
We ship from our stock within 24H
LOYALTY POINTS
You earn points with every order, worth 5%.

The NRF-Nano V3.0 development board combines on the same printed circuit board an ATmega328P microcontroller compatible with the Arduino Nano V3 and a 2.4 GHz nRF24L01+ radio transceiver, with a printed antenna. It is suitable for wireless sensor networks, remote controls, home automation, data transmission modules between two or more boards, and any project where you need a microcontroller and a radio link in a Nano format.

The ATmega328P microcontroller runs at 16 MHz, with 32 KB of Flash memory (of which 2 KB are occupied by the bootloader), 2 KB of SRAM and 1 KB of EEPROM, and the logic level is 5 V. Communication with the computer is done through the CH340G USB-to-serial converter, and the USB Type-C connector serves both for programming and power supply. The nRF24L01+ radio is connected to the microcontroller via SPI, with CE on D7 and CSN on D8, and pins D7, D8, D11, D12 and D13 can no longer be used for other functions.

Among the main features are the USB Type-C connector, the CH340G USB-to-serial converter, the radio’s printed antenna, the RESET button, the 3.3 V regulator that powers the radio, the test LED connected to D13, and two rows of 15 pins each with the same layout as the standard Nano V3. Power is supplied at 5 VDC via USB Type-C or at 7 - 12 VDC (recommended 9 VDC) on the VIN pin.

The board is programmed from the Arduino IDE as an Arduino Nano and is compatible with Arduino Nano V3 libraries and sketches. Through radio it communicates with other NRF-Nano boards or with any nRF24L01+ module connected to Arduino, ESP32, STM32 or Raspberry Pi, and through USB it can be connected to a computer.

 

Specifications:

Supply voltage: 7 - 12 VDC (recommended 9 VDC) on the VIN pin or 5 VDC via USB Type-C

Current per IO pin: 40 mA

Logic voltage: 5 V

Processor: ATmega328P

Additional integrated component: nRF24L01+ transceiver (2.4 GHz)

USB to Serial driver: CH340G

USB connector: Type-C

Digital I/O pins: 14, of which 6 PWM

Analog input pins: 6

Flash memory: 32 KB, of which 2 KB used for bootloader

SRAM: 2 KB

EEPROM: 1 KB

Frequency: 16 MHz

Radio pins: CE = D7, CSN = D8, MOSI = D11, MISO = D12, SCK = D13

Dimensions: 48 x 19 mm

 

Layout:

Element Function
USB Type-C connector Powers the board at 5 V and connects it to the computer for programming and serial communication via CH340G.
ATmega328P microcontroller Runs the user program and controls the radio via SPI.
Printed antenna The nRF24L01+ radio antenna for the 2.4 GHz band, made directly on the board’s PCB.
nRF24L01+ radio Integrated transceiver, connected to the microcontroller via CE = D7, CSN = D8 and SPI on D11, D12, D13.
RESET button A short press resets the microcontroller and restarts the program. After reset, the bootloader starts and then the uploaded program.
D13 test LED Lights up when pin D13 is HIGH and turns off when it is LOW. Because D13 is also the radio SCK line, the LED may blink during radio activity.
CH340G converter (on the back of the board) USB-to-serial converter used for programming and the serial monitor.
AMS1117-3.3 regulator (on the back of the board) Provides the 3.3 V needed by the nRF24L01+ radio.
Pin headers Two rows of 15 pins, with the same layout as on the Nano V3.

 

Pinout:

Pinout placa de dezvoltare NRF-Nano V3.0 ATmega328P cu nRF24L01+, CH340, USB Type-C

Conector Pin Funcție
VIN / D13 row VIN 7 - 12 VDC power input (recommended 9 VDC)
VIN / D13 row GND Ground
VIN / D13 row RST Reset (at LOW level resets the microcontroller)
VIN / D13 row 5V 5 V supply
VIN / D13 row A7, A6 Analog inputs (analog input only)
VIN / D13 row A5 - A0 Analog inputs, also usable as digital pins (A4 = SDA, A5 = SCL for I2C)
VIN / D13 row REF External analog reference
VIN / D13 row 3V3 3.3 V supply
VIN / D13 row D13 Digital pin, SPI SCK (used by radio), test LED
TX1 / D12 row TX1 Serial transmission (D1)
TX1 / D12 row RX0 Serial reception (D0)
TX1 / D12 row RST Reset
TX1 / D12 row GND Ground
TX1 / D12 row D2 Digital pin, external interrupt INT0
TX1 / D12 row D3 Digital pin with PWM, external interrupt INT1
TX1 / D12 row D4 Digital pin
TX1 / D12 row D5 Digital pin with PWM
TX1 / D12 row D6 Digital pin with PWM
TX1 / D12 row D7 CE of the nRF24L01+ radio (occupied)
TX1 / D12 row D8 CSN of the nRF24L01+ radio (occupied)
TX1 / D12 row D9 Digital pin with PWM
TX1 / D12 row D10 Digital pin with PWM, SPI SS
TX1 / D12 row D11 Digital pin with PWM, SPI MOSI (used by radio)
TX1 / D12 row D12 SPI MISO (used by radio)

 

Pin ATmega328P Pin nRF24L01+ Function
D7 CE Radio enable (receive or transmit mode)
D8 CSN SPI chip select
D11 MOSI Data from microcontroller to radio
D12 MISO Data from radio to microcontroller
D13 SCK SPI clock

 

Use:

Connect the board to the computer using a USB-A to USB Type-C cable that supports data transfer.

If the board is not recognized with the latest CH340 driver version (2023), install the driver from the Download section.

In Arduino IDE select the Arduino Nano board and the ATmega328P processor, and if uploading the program fails, choose the ATmega328P (Old Bootloader) processor.

Power the board either through USB Type-C at 5 VDC, or on the VIN pin at 7 - 12 VDC (recommended 9 VDC), respecting polarity.

Do not apply voltages above 5 V to the I/O pins and do not exceed 40 mA on a pin.

For radio communication, install the RF24 library and create the radio object with CE = 7 and CSN = 8, that is RF24 radio(7, 8).

Do not use pins D7, D8, D11, D12 and D13 for other functions, because they are occupied by the radio.

Briefly press the RESET button to restart the program, and after uploading a new program the board starts automatically.

To test the radio link, use two NRF-Nano boards with the same radio channel and with reversed addresses between them, then follow the result on the serial monitor.

For stable results, power the board from a good power supply, keep the printed antenna away from metal parts, and avoid covering the antenna area with metal cases or wires.

9159

Produs destinat utilizarii in proiecte electronice, automatizari, prototipare, educatie si cercetare.

Produsul trebuie utilizat numai conform specificatiilor tehnice mentionate in descriere si/sau in documentatia produsului.

Avertismente generale de siguranta:

Nu utilizati produsul la tensiuni, curenti sau temperaturi peste valorile specificate.

Montajul si conectarea trebuie realizate de persoane cu cunostinte tehnice minime in domeniul electric/electronic.

Evitati scurtcircuitele, inversarea polaritatii si conectarea gresita a alimentarii.

Nu lasati produsul alimentat nesupravegheat in timpul testelor.

Produsul nu este jucarie si nu este destinat copiilor.

Pentru modulele electronice, se recomanda utilizarea in carcase, panouri sau montaje protejate, dupa caz.

Identificare produs:

Denumirea produsului, codul/SKU-ul si caracteristicile tehnice sunt mentionate in pagina produsului si/sau pe eticheta ambalajului.

Producator / Importator / Distribuitor:

Sigmanortec S.R.L.

Calea Bucuresti nr. 9, Targu Jiu, Gorj, Romania

E-mail: [email protected]

Website: www.sigmanortec.ro

Persoana responsabila in UE:

Sigmanortec S.R.L.

Calea Bucuresti nr. 9, Targu Jiu, Gorj, Romania

E-mail: [email protected]

Documentatie si siguranta:

Pentru informatii suplimentare, fise tehnice, declaratii de conformitate sau instructiuni, ne puteti contacta la [email protected].

/*
  NRF-Nano V3.0 radio self-check

  Board in Arduino IDE: Arduino Nano (Tools > Board > Arduino AVR Boards > Arduino Nano)
  Processor: ATmega328P (if upload fails, use ATmega328P (Old Bootloader))
  Board package: Arduino AVR Boards (comes with Arduino IDE)

  Wiring: none, the board is powered and programmed through the USB Type-C connector.
  Built-in radio nRF24L01+: CE = D7, CSN = D8, MOSI = D11, MISO = D12, SCK = D13

  Library to install from Library Manager: RF24 by TMRh20 (version 1.4.0 or newer)
  SPI library comes with Arduino IDE.

  Open the Serial Monitor at 9600 baud. The sketch checks that the radio answers
  and prints its configuration.
*/

#include <SPI.h>
#include <RF24.h>
#include <printf.h>

// Radio pins on NRF-Nano V3.0
const uint8_t PIN_CE = 7;
const uint8_t PIN_CSN = 8;

RF24 radio(PIN_CE, PIN_CSN);

void setup() {
  // Start the serial monitor and enable printf for printDetails()
  Serial.begin(9600);
  printf_begin();
  Serial.println();
  Serial.println(F("NRF-Nano V3.0 radio self-check"));

  // Start the radio
  if (!radio.begin()) {
    Serial.println(F("Radio not responding. On older RF-Nano V1 or V2 try RF24 radio(10, 9)."));
    while (true) {
      // Stop here
    }
  }

  // Basic radio configuration
  radio.setPALevel(RF24_PA_LOW);
  radio.setChannel(76);
  radio.setDataRate(RF24_1MBPS);

  // Check the SPI connection to the nRF24L01+ chip
  if (radio.isChipConnected()) {
    Serial.println(F("nRF24L01+ chip detected."));
  } else {
    Serial.println(F("nRF24L01+ chip NOT detected."));
  }

  // Print all radio registers
  radio.printDetails();
}

void loop() {
  // Print a heartbeat once per second to show the program is running
  Serial.print(F("Running, channel = "));
  Serial.println(radio.getChannel());
  delay(1000);
}

This tutorial uses the NRF-Nano V3.0 board as the development board itself, programmed from Arduino IDE as an Arduino Nano, without any other Arduino board. The board combines an ATmega328P with a 2.4 GHz nRF24L01+ radio, so it is used for remote controls, sensor networks and any project where two or more boards must exchange data wirelessly.

We will build a radio test with two identical boards. Each board has a button and an LED connected, and each board sends the state of its button and lights the LED of the other board. Power and programming are done through USB Type-C from the computer.

NRF-Nano V3.0 development board, CH340, ATMega328p with NRF24L01, Type C

How it works:

The board has two parts that work together. The ATmega328P microcontroller runs the program, and the nRF24L01+ radio transmits and receives packets in the 2.4 GHz band. The two communicate over SPI, with CE on D7, CSN on D8, MOSI on D11, MISO on D12 and SCK on D13. For this reason, these five pins cannot be used for anything else.

The radio works on channels spaced 1 MHz apart, numbered from 0 to 125. The frequency of a channel is calculated as follows: frequency = 2400 MHz + channel number. For channel 76 used in the program, the result is 2400 + 76 = 2476 MHz. Both boards must use the same channel and the same data rate.

Each board has a 5-byte address. Board A sends to the address of board B and listens on its own address. Board B does the opposite. The radio uses automatic packet acknowledgement, so the write() function returns true only if the other board received the packet. A packet can have at most 32 bytes, and we send a single byte with the button state.

The button is read with INPUT_PULLUP. The internal resistor connects the pin to 5 V, and when pressed, the button connects it to GND, so the reading is LOW when the button is pressed. The LED has a 220 ohm resistor in series. The current through the LED is approximately (5 V - 2 V) / 220 ohms = 14 mA, well below the 40 mA limit of a pin.

Connection:

Power the board through USB Type-C from a USB port of the computer, at 5 V. The board logic is 5 V, and the radio is powered internally at 3.3 V by the regulator on the board, so no level converter and no separate power supply for the radio are needed. Mount the same components on both boards.

Product pin Connect to Role
USB Type-C USB port of the computer (USB-A to USB Type-C cable) 5 V power and programming
D2 6x6 mm button, pin 1 Input with INPUT_PULLUP, reads LOW when pressed
GND 6x6 mm button, pin 2 Button ground
D3 220 ohm resistor, end 1 Digital output for the LED
220 ohm resistor, end 2 5 mm red LED, anode (long leg) LED current limiting
GND 5 mm red LED, cathode (short leg) LED ground

NRF-Nano V3.0 connection with button on D2 and LED with 220 Ω resistor on D3, power via USB Type-C

Buttons, adjustments and indicators:

Element What it does How to use it
RESET button Resets the ATmega328P microcontroller Press briefly to restart the program from the beginning
Test LED D13 Lights up when pin D13 is HIGH Use it as an activity indicator on D13. Because D13 is the SCK line of the radio, in this program it can blink to show when the radio is working

The RESET button has no long press function. Press it once after you have connected the assembly, and you will see the startup message on the serial monitor, which confirms that the program has restarted.

The test LED on D13 requires no adjustment. In this tutorial we do not control it from the program, and it may blink slightly because D13 carries the SPI clock of the radio. This is normal.

The button on D2 and the LED on D3 are the components you mounted. Startup is done with the button released (HIGH reading) and the LED off. When the button is pressed on one board, the LED on the other board must light up.

Board and libraries:

In Arduino IDE, select Tools > Board > Arduino AVR Boards > Arduino Nano. The Arduino AVR Boards package comes with Arduino IDE and does not need to be installed separately. Under Tools > Processor, select ATmega328P, and if the upload gives an error, select ATmega328P (Old Bootloader). Under Tools > Port, select the newly appeared serial port.

From the Library Manager, install the RF24 library by TMRh20, version 1.4.0 or newer. The SPI library comes with Arduino IDE and does not need to be installed.

The code:

The same program is uploaded to both boards. The only difference is the value of NODE_ID at the beginning, which is 0 for the first board and 1 for the second.

/*
  NRF-Nano V3.0 radio test: two boards, each sends its button state
  and lights the LED of the other board.
  Board in Arduino IDE: Arduino Nano (Tools > Board > Arduino AVR Boards > Arduino Nano)
  Processor: ATmega328P (if upload fails, use ATmega328P (Old Bootloader))
  Board package: Arduino AVR Boards (comes with Arduino IDE)
  Library to install from Library Manager: RF24 by TMRh20 (version 1.4.0 or newer)
  SPI library comes with Arduino IDE.
  Wiring on each board:
    D2  -> push button pin 1 (button pin 2 -> GND), INPUT_PULLUP
    D3  -> resistor 220 ohm -> LED anode (LED cathode -> GND)
  Built-in radio nRF24L01+: CE = D7, CSN = D8, MOSI = D11, MISO = D12, SCK = D13
  Upload this same sketch to both boards.
  Set NODE_ID to 0 for the first board and to 1 for the second board.
*/
#include <SPI.h>
#include <RF24.h>
// Identity of this board: 0 for the first board, 1 for the second board
#define NODE_ID 0
// Pin definitions
const uint8_t PIN_BUTTON = 2;   // Push button to GND, read with internal pull-up
const uint8_t PIN_LED = 3;      // LED through 220 ohm resistor
const uint8_t PIN_CE = 7;       // Radio CE pin on NRF-Nano V3.0
const uint8_t PIN_CSN = 8;      // Radio CSN pin on NRF-Nano V3.0
// Timing settings in milliseconds
const unsigned long SEND_INTERVAL_MS = 100;    // How often the button state is sent
const unsigned long LINK_TIMEOUT_MS = 1000;    // Link is lost after this time without packets
const unsigned long PRINT_INTERVAL_MS = 500;   // How often the status is printed
// Radio object
RF24 radio(PIN_CE, PIN_CSN);
// One address for each board (5 characters plus the end of string)
const byte addresses[][6] = {"NODE0", "NODE1"};
// State variables
uint8_t localState = 0;        // 1 when the local button is pressed
uint8_t remoteState = 0;       // 1 when the button of the other board is pressed
bool lastSendOk = false;       // Result of the last transmission
bool everReceived = false;     // True after the first packet is received
unsigned long lastSend = 0;
unsigned long lastReceive = 0;
unsigned long lastPrint = 0;
// Prints the current status on the serial monitor
void printStatus() {
  bool linkOk = everReceived && (millis() - lastReceive < LINK_TIMEOUT_MS);
  Serial.print(F("Local: "));
  Serial.print(localState ? F("PRESSED") : F("RELEASED"));
  Serial.print(F(" | Sent: "));
  Serial.print(lastSendOk ? F("OK") : F("FAILED"));
  Serial.print(F(" | Remote: "));
  Serial.print(remoteState ? F("PRESSED") : F("RELEASED"));
  Serial.print(F(" | Link: "));
  Serial.println(linkOk ? F("OK") : F("LOST"));
}
void setup() {
  // Start the serial monitor
  Serial.begin(9600);
  // Configure the button with pull-up and the LED as output
  pinMode(PIN_BUTTON, INPUT_PULLUP);
  pinMode(PIN_LED, OUTPUT);
  digitalWrite(PIN_LED, LOW);
  // Start the radio and stop if it does not answer
  if (!radio.begin()) {
    Serial.println(F("Radio not responding. Check CE and CSN pins."));
    while (true) {
      // Wait here forever
    }
  }
  // Radio settings, they must be the same on both boards
  radio.setPALevel(RF24_PA_LOW);   // Low power is enough for a bench test
  radio.setChannel(76);            // 2400 + 76 = 2476 MHz
  // This board writes to the other board and listens on its own address
  const uint8_t ownIndex = NODE_ID;
  const uint8_t peerIndex = 1 - NODE_ID;
  radio.openWritingPipe(addresses[peerIndex]);
  radio.openReadingPipe(1, addresses[ownIndex]);
  // Listen by default
  radio.startListening();
  Serial.print(F("Radio ready on channel 76, node "));
  Serial.println(NODE_ID);
}
void loop() {
  unsigned long now = millis();
  // Read the button and send its state at a fixed interval
  if (now - lastSend >= SEND_INTERVAL_MS) {
    lastSend = now;
    localState = (digitalRead(PIN_BUTTON) == LOW) ? 1 : 0;  // LOW means pressed
    radio.stopListening();                                   // Switch to transmit mode
    lastSendOk = radio.write(&localState, sizeof(localState));
    radio.startListening();                                  // Back to receive mode
  }
  // Read every packet that arrived
  while (radio.available()) {
    radio.read(&remoteState, sizeof(remoteState));
    lastReceive = millis();
    everReceived = true;
  }
  // Turn the LED on only while the link is alive and the remote button is pressed
  bool linkOk = everReceived && (millis() - lastReceive < LINK_TIMEOUT_MS);
  digitalWrite(PIN_LED, (linkOk && remoteState) ? HIGH : LOW);
  // Print the status from time to time
  if (now - lastPrint >= PRINT_INTERVAL_MS) {
    lastPrint = now;
    printStatus();
  }
}

How the code works:

At the beginning we define NODE_ID, the pins PIN_BUTTON (D2), PIN_LED (D3), PIN_CE (D7) and PIN_CSN (D8), as well as the time intervals SEND_INTERVAL_MS, LINK_TIMEOUT_MS and PRINT_INTERVAL_MS. The radio object is created with RF24 radio(PIN_CE, PIN_CSN), and the addresses array contains the addresses of the two boards.

In setup() we start the serial port at 9600 baud, configure the button with INPUT_PULLUP and the LED as an output, then start the radio with radio.begin(). If the radio does not respond, the program displays a message and stops. Then we set channel 76, the power level RF24_PA_LOW, the writing address of the other board with openWritingPipe() and our own reading address with openReadingPipe(). Finally we call startListening(), so the board listens by default.

In loop() we send the button state every SEND_INTERVAL_MS. First we read the button into the localState variable, which is 1 if the button is pressed. We stop listening with stopListening(), send the byte with write(), store the result in lastSendOk and resume listening.

As long as radio.available() is true, we read the packet into remoteState and store the moment of reception in lastReceive. The LED on D3 follows the remoteState, and if nothing is received for more than LINK_TIMEOUT_MS, the LED turns off as a safety measure. Every PRINT_INTERVAL_MS, the printStatus() function displays the state of the local button, the result of the transmission, the state of the button on the other board and the state of the link.

Result:

Open Tools > Serial Monitor and set the speed to 9600 baud. After startup, the two boards display their status every half second. When you press the button on one board, the LED on the other lights up, and the line on the serial monitor shows RELEASED or PRESSED.

Radio ready on channel 76, node 0
Local: RELEASED | Sent: FAILED | Remote: RELEASED | Link: LOST
Local: RELEASED | Sent: OK | Remote: RELEASED | Link: OK
Local: RELEASED | Sent: OK | Remote: RELEASED | Link: OK
Local: PRESSED | Sent: OK | Remote: RELEASED | Link: OK
Local: PRESSED | Sent: OK | Remote: RELEASED | Link: OK
Local: RELEASED | Sent: OK | Remote: PRESSED | Link: OK
Local: RELEASED | Sent: OK | Remote: PRESSED | Link: OK
Local: RELEASED | Sent: OK | Remote: RELEASED | Link: OK

Common problems:

The board does not appear as a serial port. The cause is usually a cable that only charges, or the CH340 driver. Use a USB-A to USB Type-C cable with data transfer, and if the port still does not appear, install the driver from the Download section, because the latest version from 2023 may be incompatible with the board.

The upload stops with the error avrdude not in sync. The board has an older bootloader. Under Tools > Processor, select the ATmega328P (Old Bootloader) option and upload again.

The serial monitor shows a message that the radio does not respond. Check that you are using RF24 radio(7, 8), which is correct for V3.0. The older RF-Nano V1 and V2 boards use CE on D10 and CSN on D9, so for them try RF24 radio(10, 9). Also check that you have not connected anything to D7, D8, D11, D12 or D13.

The link state is always LOST. Check that NODE_ID is different on the two boards (0 and 1), that both use channel 76 and that both are powered. Bring the boards a few meters closer and move them away from metal objects.

The LED is always off or always on. Check the polarity of the LED (anode toward the resistor) and that the button is mounted across the diagonal, with one pin to D2 and the other to GND. With INPUT_PULLUP, the button must read LOW only when it is pressed.

The radio stops or resets randomly. The radio is sensitive to unstable power. Use a direct USB port of the computer or a good power source, not a weakly powered hub.

Limitations and tips:

Pins D7, D8, D11, D12 and D13 are occupied by the radio, so for sensors the free pins are D2 - D6, A0 - A7 (A6 and A7 are analog inputs only) and the serial pins D0 and D1. Each I/O pin supports at most 40 mA, so relays and motors should be driven through transistors or dedicated modules.

A radio packet has at most 32 bytes, and the range depends on the environment, on obstacles and on the power level set. The RF24_PA_LOW power is sufficient for bench tests, and for longer distances you can increase the level with setPALevel(), provided the power supply is stable.

Starting from this setup, you can build a remote control with several buttons, a temperature sensor that sends values to a central board, or a star network in which one board receives on multiple addresses from several transmitters.

You might also like