Servos failing to move using NRF24L01 Rx and Tx, and Analog Joysticks


I guess this is a 2 part question: The first one on a specific design problem and the second one is more general:

  1. My Servos fail to move when sending signal succesfully through NRF24L01 from a transmitter Tx which has 2 analog joysticks that write the signal to an arduino UNOtx, the signal is sent and succesfully recieved by arduino UNO on the reciever side Rx. I serialprint the values on the reciever that are suposedly being written on my output pins for the servos which are connected to working 5V supply (Ive tried directly f arduino, and external supply)… Here is the code for my reciever.

I am wondering if someone could help me identify my problem.
The servos work by themselves when I send wired signal and Servo.h library
Now I am using the SoftwareServo.h library to write on the servos.

  1. My goal is to write these instructions to ESCs and control brushless motors but I am doing it this way first.
    Any suggestions?

Thank you very much, help would be very much appreciated

RxNRF24L01_V2.ino (4.08 KB)

   1 - GND
   2 - VCC 3.3V !!! NOT 5V
   3 - CE to Arduino pin 8
   4 - CSN to Arduino pin 10
   5 - SCK to Arduino pin 13
   6 - MOSI to Arduino pin 11
   7 - MISO to Arduino pin 12
   8 - UNUSED


/*-----( Import needed libraries )-----*/

#include <SoftwareServo.h>  // Regular Servo library creates timer conflict!

#include <RHReliableDatagram.h>
#include <RH_NRF24.h>

#include <SPI.h>

/*-----( Declare Constants and Pin Numbers )-----*/
#define CLIENT_ADDRESS     1
#define SERVER_ADDRESS     2

#define ServoHorizontalPIN 3   //Pin Numbers
#define ServoVerticalPIN   5

#define ServoMIN_H  0  // Don't go to very end of servo travel
#define ServoMAX_H  160 // which may not be all the way from 0 to 180. 
#define ServoMIN_V  0  // Don't go to very end of servo travel
#define ServoMAX_V  140 // which may not be all the way from 0 to 180. 

/*-----( Declare objects )-----*/
SoftwareServo HorizontalServo;
SoftwareServo VerticalServo;  // create servo objects to control servos

// Create an instance of the radio driver
RH_NRF24 RadioDriver;

// Create an instance of a manager object to manage message delivery and receipt, using the driver declared above
RHReliableDatagram RadioManager(RadioDriver, SERVER_ADDRESS);

/*-----( Declare Variables )-----*/
int HorizontalJoystickReceived; // Variable to store received Joystick values
int HorizontalServoPosition;    // variable to store the servo position

int VerticalJoystickReceived;   // Variable to store received Joystick values
int VerticalServoPosition;      // variable to store the servo position

uint8_t ReturnMessage[] = "JoyStick Data Received";  // 28 MAX
// Predefine the message buffer here: Don't put this on the stack:
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];

//--------------------------------( SETUP Runs ONCE )-----------------------------------------------------
void setup()

  /*-----( Set up servos )-----*/
  HorizontalServo.attach(ServoHorizontalPIN);  // attaches the servo to the servo object
  VerticalServo.attach(ServoVerticalPIN);      // attaches the servo to the servo object


  if (!RadioManager.init()) // Initialize radio. If NOT "1" received, it failed.
    Serial.println("init failed");
  // Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm
} // END Setup

//--------------------------------( LOOP runs continuously )-----------------------------------------------------
void loop()
  if (RadioManager.available())
   // Wait for a message addressed to us from the client
    Serial.print("  RADIO MANAGER AVAILABLE : ");

    uint8_t len = sizeof(buf);
    uint8_t from;
    if (RadioManager.recvfromAck(buf, &len, &from))
 //Serial Print the values of joystick
      Serial.print("got request from : 0x");
      Serial.print(from, HEX);
      Serial.print(": X = ");
      Serial.print(" Y = ");

      // Send a reply back to the originator client, check for error
      if (!RadioManager.sendtoWait(ReturnMessage, sizeof(ReturnMessage), from))
        Serial.println("sendtoWait failed");
    }// end 'IF Received data Available
  }// end 'IF RadioManager Available
    SoftwareServo::refresh();//refreshes servo to keep them updating
    HorizontalJoystickReceived  = buf[1];  // Get the values received
    VerticalJoystickReceived    = buf[0]; 

    // scale it to use it with the servo (value between MIN and MAX)
    HorizontalServoPosition  = map(HorizontalJoystickReceived, 0, 255, ServoMIN_H , ServoMAX_H);
    VerticalServoPosition    = map(VerticalJoystickReceived,   0, 255, ServoMIN_V , ServoMAX_V);
    Serial.print("HorizontalServoPosition : ");
    Serial.print("  VerticalServoPosition : ");
    // tell servos to go to position

    delay(250);                      // wait for the servo to reach the position

}// END Main LOOP

Don't the servos need to be updated every 20ms?
(sorry, I haven't used SoftwareServo for a very long time)

I got my nRF24s working with this Tutorial

I suggest you use the TMRh20 version of the RF24 library - it solves some problems from the ManiacBug version

I am not aware that it conflicts with the regular Servo library.