The nRF905 is a small low cost, single chip, transceiver which can be used to send low bandwidth digital data. My intent is to explore how this radio works to see what limitations exist. It will not be sending any high bandwidth information such as video but should be able to send control signals and receive sensor data over a short range in which I may be operating my robot vehicle. Below is an image of the nRF905 mounted on a 1-1/4 by 3/4 inch breakout board which includes a 14 pin connector and antenna. Further nRF905 specifications are provided.
For an initial demonstration of the nRF905 capability, we are going to configure it to work with a Arduino UNO for transmitting of data only to another nRF905. The pinout pattern for the nRF905 breakout board is shown below along with a table for hookup of the nRF905 to the Arduino UNO pins.
It is important to note that the nRF905 uses 3.3 volt logic. Directly connecting the nRF905 to the UNO may result in damage since the UNO uses 5 volt logic. To insure successful operation and to prevent potential for damage, a voltage divider is required on TXE, CE, PWR, SI, SCK, and CSN pins to level convert logic levels from 5 volts on the UNO to to 3.3 volts on the nRF905. A later project may use the a 3.3 volt UNO such as the Arduino Pro 328, which is a 3.3 volt device, for implementing a transceiver solution for true bi-directional operation.
For the voltage divider I used 1K and 47 Ohm resisters with the 47 Ohm resistor on the UNO side and the 1K Ohm resistor on the Ground side. The required nRF905 connections are made to the junction of the resistors.
The following shows the labels associated with the connectors found on the nRF905.
The following shows the wiring hookup needed between the nRF905 and the Arduino UNO. Remember it is necessary to include a voltage divider or other voltage limiting circuit to prevent damage to the nRF905. I have seen various circuits of this type wired directly between the Arduino and nRF905 but for protection and best reliability it should be wired with a voltage divider.
The following shows the completed hardware setup. Zak Kemble has also completed a Fritzling drawing. Two setups are required for this demonstration.
Each device pair has a receiver address and a transmitter address. This is mentioned in Table 12 of the specifications and then in further detail in section 9.5 Register Contents. The transmit and receive address is 4 bytes long. In our software we will set the transmitter address to (0x58, 0x6f, 0x2e, 0x10) and the receiver address to (0xFE, 0x4C, 0xA6, 0xE5).
Libraries that are used include the standard SPI library provided in the Arduino IDE. We will also use the nRF905.h library developed by Zak Kemble. Zak’s nRF905 library will initialized power, provide the communication addresses, and place the device initially into a receive mode.
For the transmitter; dummy data is provided for the demonstration in a data array of 32 bytes. Data is sent to the nRF905 using a library function and then another function directs the nRF905 to start transmitting.
For the receiver; the code will loop until the data buffer is full and then it will display to the serial port before returning to the receive mode.
Final Setup and Demonstration
- Hookup two identical Arduino UNO/nRF905 setups as described in the Hardware Setup section above.
- Using the Arduino Interface Development Environment (IDE), attach the Transmitter to the USB and copy the Transmitter Code. After the code has been copied disconnect the USB cable. Label this setup the Transmitter.
- Attach the Receiver to the computer using the USB interface. Copy the Receiver Code. Label it the Receiver.
- Open the Serial Monitor to allow viewing of data sent by the Transmitter.
- Power can be provided to the transmitter using a 9 volt battery connected directly to the Arduino UNO. This will allow you to move the Transmitter a reasonable distance away from the receiver while you monitor the operating distance and data sent.
- The Transmitter may need to be Reset to start the program and send the data.
- The Transmitter will complete a loop and repeatedly send data which can be viewed on the Serial Monitor of the Receiver as shown below.
The following results will be displayed as expected on the Serial Display of the Receiver. It will continue to loop indefinitely as long as data is available to be sent by the Transmitter.
Documentation and References
Explore integrating the nRF905 with a 3.3 volt Arduino which may not require a voltage divider.