Introduction: NRF24 Two-Way Radio for Telemetry
Hi guys, my name is Pedro Castelani and I'm bringing you my first instructable: building a two way radio with arduino for, well, whatever you need it for.
In this project, we will make two seperate circuits which will act as both reciever and transmitter. The most important components are two arduino boards (all of them work) and two nrf24 transciever modules. In my case, I control a servo with a potentiometer from the other arduino and send the voltages of a two cell lipo battery back to the first one.
I intend to use it as an add-one for my drone, which does not possess telemetry nor servo gimbal control. You can, however, use it for other things, such as building your own quadcopter, plane, rc car, etc. From the code supplied you can also make any modifications you want according to your needs. I will also try to explain how to modify it correctly (which took me some time to learn by myself, as I was accustomed to another kind of use for the nrf24 chip).
Step 1: Materials
To begin our project, we need to know all the parts needed. Below is a list of the basic ones needed. I bought most of them at a local electronics shop where I live, so I wont be able to recommend you any place to buy them. You could try Amazon, or any other place. I am not saying you should order them there, but its just a suggestion.
- Two Arduino boards (anyone should work. I have two arduino pro mini, which I like a lot because they have 13 digital pins and 8 analog, while the Uno only has 6 analog ones).
- Two Nrf24 modules. There are some with external antennas which have greater transmission range. Choose the ones you most like.
- Female-Female and Female-Male jumper cables.
- Prototyping board.
- Arduino Programmer (for arduino pro mini, if you have one with usb connection you wont need it).
- Arduino IDE (Software). Download from here.
- In my case, I also used:
- Servo. Anyone you can get. I like the SG90, a small one designed for arduino.
- Potentiometer (between 10k and 20k ohms). Can be bought at a local electronics shop or you can use the joystick made for arduino. There are a few images of the ones I have. I also got one from a broken drone rc controller, just to give you a few ideas
- 4 equal normal resistors. I used 10k ones I got from my grandfather's house. I am using them as voltage dividers.
- Small copper pad perfboard (which I also got from my grandpa) for soldering the resistors together.
- Pins. Used to connect the jumper cables from the arduino to the resistors easily.
- 2s lipo battery. I use it to power one of my arduinos. The resistors are connected to it and read its voltages. I intend my arduino to be connected to my drone's 2s battery, since it wont need an external power source and at the same time tell me how much battery is remaining.
- Soldering Iron and solder. Needed to solder the resistors, the perfboard and the pins together.
Step 2: Function and Code
Once all the materials have been mentioned, let's start talking about the function of the modules.
- How it works: Lets call one arduino "A" and the other one "B". In my case, after programming both, I connected them to their corresponding radio chip and added the potentiometer to arduino A and the resistors and servo to arduino B. Module A sends values to B and moves the Servo. B reads the voltages of the 2s battery and sends them back to A. Then the whole circle begins again. Since A recieves values that are not expressed mechanicaly, it is connected to the programmer, through which we can read them with a serial monitor (included in the Arduino IDE).
- Code: I call the sketch for arduino A (connected with the programmer and the potentiometer) TwoWayRadio_1, and the sketch for arduino B TwoWayRadio_2WithServo.
TwoWayRadio_1 and TwoWayRadio_2WithServo can be found just below this paragraph. There is an explanation inside each code just to make everything easier to understand.
Step 3: Soldering Modules: Voltage Divider and Potentiometer
This step is optional, since you might just want to use the potentiometer-joystick designed specifically for arduino and use another module instead of the voltage divider. I, however, planned everything (codes included) for these modules.
- Potentiometer:
- This part is just about the easiest one in the soldering step. You will just have to solder some jumper cables to your potentiometer. If you want, you can first solder the potentiometer to the perfboard and then solder some of the pins. When you need to use it, just connect the jumper cables to the arduino and then to the pins on the perfboard. When not in use, you may remove the cables and use them for another project. If, however, you do as I did, you can leave the potentiometer soldered directly to the cables.
- If you are doing as I did, get three female-female jumper cables, cut of one of the tips and remove the insulation there, leaving a small piece of copper wiring on each wire.
- Heat up your soldering iron and solder the modified jumpers to you potentiometers pins. If you can, try to get different colors so that you can remeber which one is vcc, gnd and the "signal" one (the middle one). Connect these cables to the corresponding analog pins on the arduino. There are some images at the beginning of the step on how it ended looking. The potentiometer is not a regular one, it is actually a small wheel which had five pins. Took me some time to find out which was which. Try to do it easier and use a regular potentiometer as shown in the MATERIALS step.
- If you are soldering it to a perfboard, get the potentiometer and the perfboard and solder them together with your soldering iron.
- Get the pins (three) and place them in the most convenient way. Use solder to make a connection between each pin and the potentiometer pins. Do not make a connection between more than two pins or it will not work (it will act as a short circuit).
- Get some female-female or female-male jumper wires and connect them from your arduino to your new potentiometer module (remember which is which).
2. Voltage Divider:
- This part is a bit more complicated. You will need to get the four resistors, five pins and the perfboard. I designed the code to be used for a 2s battery (two cell), but you could also use it for a 1s by changing the arduino sketch a bit and the hardware. I included pictures of two voltage dividers I made, one with only 2 resistors (for 1s batteries) and one with four (you guessed it: 2s batteries).
- Let's start with the 2s one. I do not have images of the building process since I started witing this instructable a good while after having finished soldering it. I do include images of the final result, so I will try to be as clear as possible.
- Start by getting the perfboard and 5 pins. Solder them close to the side and do not let them touch each other.
- Solder the resistors as shown in the last image at the start of the step (the small circuit diagram). The connections between each resistor and pin is made with solder. Try to occupy the least space possible.
- When you are done, it should look something like the pictures of the finished voltage divider I posted above.
- The 1s Voltage divider is basically the same, with the exception that you only use three pins and two resistors. I included images of how it looks when finished. Just look at the diagram for the 2s one and imagine it without the signal wire 1, the middle wire, and resistors r2 and r3 and there, you have it!
- So, if you want a 1s voltage divider, it might just be a little more complicated than just using a 2s one.
Step 4: Programming Your Arduino
- We are almost finished!
- After having downloaded the Arduino IDE software from the site linked in the MATERIALS step, download the sketches from the FUNCTION AND CODE step.
- Next, open them in the Arduino IDE.
- Open "Tools" in any of both tabs and click "Boards". Choose your board from the list. Click "Processor" and then "Programmer", selecting each one according to your board. Then return to the sketch. It is quite convenient to look the information of your board on the Internet. Just look up the name and see the specs.
- Click on "sketch" (up top), then "include library", then "manage libraries". A small window should open at the center of the screen. Enter in the search option "rf24". Download the library you want. It will be necessary to be able to upload the code to the arduino board.
- Just to make sure, click on the "Tick" symbol (up left) to verify it does not have any mistakes. Then proceed to upload it by pressing the arrow pointing to the right, beside the "Tick" symbol.
- If your board is a Pro Mini, I will explain in a while how to connect everything. If it is not, just upload it and, when finished programming both arduinos, pass to the next step, after reading the warning below.
- Since you have two boards, REMEMBER which code each was programmed with, to avoid any future problems.
- So, if you have a Pro Mini, you will need a programmer. There are two kinds of programmers: 5 pin and 6 pin ones. I will focus on 5 pin ones since they are the ones I have. The connections are as followed (first pin is from programmer, then arduino): Gnd--Gnd; 5v-Vcc (except if your Pro Mini is a 3.3v, in which case it is 3.3v--Vcc); Rxd--Txo; Txd--Rxi. I included an image of both board and programmer, just in case you need to check.
- Connect your arduino to the programmer and the programmer to your computer. Open the IDE and click the upload button. If you look at the left bottom of the screen, you will see a message that says "compiling". The moment this message turns into "uploading", press the reset button on the arduino Pro Mini. After a while, the sketch will finish and a message will appear saying "Done uploading". Once this happens, you are done and ready to pass to the next step.
Step 5: Connecting Everything
- After having programmed both arduinos, we need to connect everything to get it work. Here we are going to need everything mentioned before: the arduinos, nrf24 modules, cables, servo, programmer, voltage divider, potentiometer, etc.
- We are first going to connect the arduino which works with the programmer. At the beginning of the step are the images of the connections of the nrf24. The irq pin, which is said to go to pin 8 on the arduino, is not connected at all. The rest is just as in the image for both arduinos (you can read the notes inside the images for more info)
- The Vcc for the radio may be connected to 3.3 or 5v. Sometimes it only works with one of them. Try with 3.3 and then 5 if it wont work. For 3.3, use the 3.3v pin o the programmer. I had to do this, as you will see in the images of the finished product.
- Connect the programmer to the arduino as said in the previous step.
- Connect the potentiometer's "signal" cable to analog pin A0.
- Connect the potentiometer's "Positive" to Vcc (only 5v, not 3.3) and "Negative" to Gnd.
- Pass to the other arduino.
- Connect the radio as said before, according to the images.
- Connect the servo's signal cable (orange-yellow-white. Check the specifications for the servo) to digital pin 2, and its gnd to the arduino's Gnd, and its positive to the arduino's Vcc.
- Connect signal cable 1 from the voltage divider to pin A0 and signal wire 2 to pin A1.
- Connect, using the protoboard, the voltage divider's negative cable, the arduino's gnd and the battery's gnd (black cable on the jst plug).
- Connect the "middle cable" from the voltage divider to the battery's middle one, between the red and black cables of the jst plug (white color).
- Connect the 'positive" cable from the voltage divider to the battery's positive terminal and to the arduino's Raw. Do not connect directly to Vcc, since this pin is specifically for 5v. Raw pin uses any voltage above 3.3 or 5v to 12v and regulates it. Vcc pins then become outputs with 5v.
Your almost done! Your finished products should look as the images above. Recheck every connection to avoid short circuits.
Step 6: Power Up Your Project
- Your arduino with the servo got powered the last step when you connected the battery to the whole circuit. So, you just need to connect the other arduino to an usb port and you are finished!
- Move the potentiometer and you should see how the servo also moves. In my case, the servo is attached to a 1 axis camera gimbal, which limited the angle, so I had to adjust the parameters. You will find that in the code, anyway.
- To see the voltages, once you have connected the programmer to the computer, open the arduino software and press "Ctrl+Shift+m". A window which says "Serial Monitor" will open. At the bottom of this window is an option which reads "(number) baud". Click on it and select "9600". Close the monitor and open it again by pressing the same keys and you should start seeing a lot of values coming in. You will not be able to see what these values are because of the speed at which they are coming, but if you disconnect the programmer they will stop and you can read them. I am trying to get something with which to automatically graph them to view the voltages or represent them with leds, but that is still in process.
- Even though you might not see the values clearly, since they are passing so quickly, just know that it finally works and that you can modify it to accommodate your needs!
Step 7: Demo
Well, this is the video of me powering it up and using it just a bit to show you how it should work.
Step 8: More Ideas on How to Use This Project
Here are some ideas which you can build using this as the base. Tell me if you make one of them or if you try and cannot so I can help!
- Instead of reading voltages, modify the code so that it sends back the temperature, pressure, height, etc. I found the BMP180 chip quite useful for this.
- Measure distances with the HC-SR04 module and send them back to the first arduino. Use the servo to point the sensor anywhere you want.
- Add another servo channel to move a camera up and sideways; for example, on an rc car.
- Add three other servo channels (or more!) and make your own rc transmitter and receiver for a quadcopter, airplane, helicopter, rc car, etc!
- Change the servo for a searchlight and add it to your drone! You will also be able to control the intensity of the light (might need some transistors and some code changing)
- Instead of reading the voltages on a computer, get creative and add an lcd module, or you can make a 6-led board (two green, two yellow and two red) which will turn them off one by one as the battery gets lower and will start flashing when the battery level drops below your chosen voltage. I made this small board and posted an image at the beginning of the step.
Just to make everything clear, if you are going to make one of these projects, have in mind that you are going to have to modify both codes and maybe some connections. Please try to remember not to fry your board doing something stupid.
If you have anymore ideas or need help carrying one of these projects out, please post in the question section!
Step 9: Troubleshooting
To say the truth, most of the problems I have encountered so far were related to the sketch part, which you already have solved. I will try to tell you as many problems as I can in order to help you the most.
- First, if you are trying to upload the sketch and you cannot, try this:
Make sure you downloaded the necessary libraries (and the correct ones!).
Make sure you have chosen the correct board, processor and programmer.
Make sure the connection between the pc and the programmer and the programmer and the arduino is good.
If you are using a pro mini, try pressing the reset button as soon as you can after the "uploading" message appears.
All these things are spoken of in the PROGRAMING YOUR ARDUINO step.
- Second, check all the connections between everything:
If your arduino does not power up, it is clearly a voltage problem. Check if the cables are not connected properly and if there is a short circuit.
If it does power up but does not function, make sure all the connections are where they should be, that the arduino programmed to be connected to the servo and voltage divider is really connected the them (in other words, make sure you did not mix them up), try pressing the reset button on both of them and see what happens. In extremely rare cases, the whole blame can be on the NRF24 module. I found one of mine that only works on 5 volts and another that works only on 3.3v. Check if this solves anything. It also happened to me that only one arduino worked with the 3.3v radio and the other one only worked with the 5v one. Surprising, isn't it?
- Third, if you can move the servo but the voltages are wrong, check the connections to the voltage divider are as in the diagram in step 3, and the connection to the arduino. If, on the other hand, you get the voltages but you cannot move the servo correctly, check the potentiometer and its connections, the servo's connection to the digital pin and to the Vcc and Gnd, and if the servo is stuck, broken or in a short circuit. Try changing it with another servo. Make sure the digital pin is the same as the one specified in the code.
Well, those are just about all the things that could come to my mind about the problems you might encounter. Hope they never happen and Happy Projects!
Thank you for reading my Instructable! Please share and vote it for the FIRST TIME AUTHOR Contest!

Participated in the
First Time Author
7 Comments
3 years ago
Great project!! Well done!! One thing in he voltage divider schematics, shouldn't the negative from the voltage divider be connected to the arduino as well?
Reply 3 years ago
Considering that I'm powering the Arduino with the same battery, it already shares the Gnd without adding any extra cables. I could have mentioned it but I probably forgot
Reply 3 years ago
Hi Pedro, I was experimenting with a 16x2 i2c lcd over the weekend and used some code from another project to get it going. Bare in mind I'm not much of a code writer so here's what i came up with. It's showing the 2s voltage. Thank you again for sharing.
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>//includes libraries needed for the project. remeber to download them from the library manager. if you make a new project which uses other libraries, include them here
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#define CE_PIN 9
#define CSN_PIN 10//defines the digital pins on the arduino connected to the ce and csn pins on the nrf24 module. the other radio pins are 11, 12
//and 13. you may change 9 and 10 for any other pins that are not used. remember which is which or it might not work
int val = 0;//analog pin connected to potentiometer. is called val in the rest of the program. you may change the pin to any other analog one not in use
int updateval = analogRead(val);//starts reading val to send a value to the other arduino
const byte slaveAddress[5] = {'R','x','A','A','A'};
const byte masterAddress[5] = {'T','X','a','a','a'};//radio addresses. matches those on the other arduino
RF24 radio(CE_PIN, CSN_PIN);//creates radio
float dataReceived[2];//values to be received from the other radio (voltages). the number [2] says how many different info "parts" are going to be received from the other arduino.
//it should match dataToSend on the other sketch
int replyData = {updateval};//data to send to the other radio. if you want to add a value to be sent, do as above. you will have to add the number inside
//the brackets on both codes and add the name of the part after a semicolon. should match dataReceived on the other code.
bool newData = false;
unsigned long currentMillis;
unsigned long prevMillis;
unsigned long txIntervalMillis = 100;//doesnt matter. dont change
void setup() {
Serial.begin(9600);//starts serial baud in order to be able to connect to serial monitor
Serial.println("SlaveSwapRoles Starting");//just to make sure the arduino is programmed correctly
radio.begin();//starts the radio
radio.setDataRate( RF24_250KBPS );//speed at which the info is transmitted
radio.openWritingPipe(masterAddress);
radio.openReadingPipe(1, slaveAddress);//doesnt matter. dont change
radio.setRetries(3,5);
radio.startListening();//starts hearing for transmission from the other module
lcd.init();
lcd.backlight();
lcd.print("2S BATTERY METER");
//lcd.print("Voltage: ");
}
void loop() {
getData();
showData();
send();
}//dont change, unless you add another void function
void getData() {
if ( radio.available() ) {
radio.read( &dataReceived, sizeof(dataReceived) );
newData = true;
}
}//receives the data sent by the other radio. dont change
void showData() {
if (newData == true) {
Serial.print("Voltage: ");
Serial.println(dataReceived[1]);
Serial.print("Voltage 1s: ");
Serial.println(dataReceived[0]);
Serial.print("Voltage 2s: ");
Serial.println(dataReceived[1]-dataReceived[0]);//since we are only reading the whole voltage and the voltage of the first cell, we need to substract from the whole the part
delay(1500);
lcd.setCursor(0, 1);
lcd.print("Voltage: ");
lcd.println(dataReceived[1]);
}
}//shows the data received through the serial monitor. open it by connecting the borad through the programmer or cable and pressing Ctrl+Shift+m. select baud rate 9600.
//If you wish to change the kind of values you are transmitting, modify this part so that it prints them in the correct way.
void send() {
if (newData == true) {
radio.stopListening();
bool rslt;
rslt = radio.write( &replyData, sizeof(replyData) );
radio.startListening();
Serial.print("Reply Sent ");
Serial.println(replyData);
if (rslt) {
Serial.println("Acknowledge Received");
updateReplyData();
}
else {
Serial.println("Tx failed");
}
Serial.println();
newData = false;
}
}//sends replyData to the other arduino. dont change
void updateReplyData() {
replyData = analogRead(val);//reads new value from potentiometer
}//if you wish to modifyyour project, this is the part where the sensor/s gets the information from their surroundings. remeber that.
Reply 3 years ago
No worries. Works either way for me and thank you for sharing!!! I'm trying to adapt the receiver code for use with 20x4 LCD so I could attach it to the radio. I'm not in any way a software and code guy, just like trying new things. I'll share the code as soon as I get it going. Thanks again Pedro!!
4 years ago
Very well written - thanks for including so many details!
4 years ago
Great first Instructable. Good luck in the contest.
Reply 4 years ago
Thanks a lot! Hope its useful!