Joystick Controlled Robot

Description

      Guys, In this project we are going to build a robot which can be controlled by a Joystick Module. Here the rotation of gear motors can be controlled by joystick module and using L298N Motor Driver.For this we need a tramsmitter and a receiver section. Okey let's start.

Components Required

 1. Arduino Nano  * 2
 2. L298N Motor Driver Module  * 1
 3. Gear Motor * 4
 4. Rubber Wheels  * 4
 5. Joystick Module * 1
 6. NRF24L01 Radio Module * 2
 7. Pref Board     * 2
 8. Acrylic Sheet    * 1
 9. 18650 Li-ion Battery * 4
10. 18650 Li-ion Battery Holder * 2
11. Jumper Wires * 1

Circuit Diagram

Transmitter

Receiver 
 









Program

Transmitter
 
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
 
RF24 radio(8,9); // CE, CSN
const byte address[6] = "00001";
char xyData[32] = "";
String xAxis, yAxis;
 
void setup()
                    {
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
 }
void loop()
                     {
  xAxis = analogRead(A1); // Read Joysticks X-axis
  yAxis = analogRead(A0); // Read Joysticks Y-axis
  // X value
  xAxis.toCharArray(xyData, 5); // Put the String (X Value) into a character array
  radio.write(&xyData, sizeof(xyData)); // Send the array data (X value) to the other                                                                                NRF24L01 module
  // Y value
  yAxis.toCharArray(xyData, 5);
  radio.write(&xyData, sizeof(xyData));
  delay(20);
  }
 Receiver 
 
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define enA 2  
#define in1 3
#define in2 4
#define enB 7   
#define in3 5
#define in4 6
 
RF24 radio(8, 9); // CE, CSN
const byte address[6] = "00001";
char receivedData[32] = "";
int  xAxis, yAxis;
int motorSpeedA = 0;
int motorSpeedB = 0;
 
void setup()
                    {
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}
void loop()
                    {
  if (radio.available())
                      {   // If the NRF240L01 module received data
    radio.read(&receivedData, sizeof(receivedData)); // Read the data and put it into                                                                                                      character array
    xAxis = atoi(&receivedData[0]); // Convert the data from the character array (received                                                                  X value) into integer
    delay(10);
    radio.read(&receivedData, sizeof(receivedData));
    yAxis = atoi(&receivedData[0]);
    delay(10);
  }
  
  // Y-axis used for forward and backward control
  if (yAxis < 470)
                       {
    // Set Motor A backward
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
   
                        // Set Motor B backward
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
   
                       // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255                           value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  }
  else if (yAxis > 550)
 
{
    // Set Motor A forward
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
 
                       // Set Motor B forward
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
   
                      // Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to                             255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 550, 1023, 0, 255);
    motorSpeedB = map(yAxis, 550, 1023, 0, 255);
  }
  // If joystick stays in middle the motors are not moving
  else
                      {
    motorSpeedA = 0;
    motorSpeedB = 0;
   }
  // X-axis used for left and right control
  if (xAxis < 470)
                       {
    // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
    int xMapped = map(xAxis, 470, 0, 0, 255);
   
                        // Move to left - decrease left motor speed, increase right motor speed
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
   
 
// Confine the range from 0 to 255
    if (motorSpeedA < 0)
                        {
      motorSpeedA = 0;
    }
    if (motorSpeedB > 255)
                         {
      motorSpeedB = 255;
      }
   }
  if (xAxis > 550)
                        {
    // Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value
    int xMapped = map(xAxis, 550, 1023, 0, 255);
   
                        // Move right - decrease right motor speed, increase left motor speed
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
 
                        // Confine the range from 0 to 255
    if (motorSpeedA > 255)
 
{
      motorSpeedA = 255;
    }
    if (motorSpeedB < 0)
                         {
      motorSpeedB = 0;
      }
    }
  // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
  if (motorSpeedA < 70)
                       {
    motorSpeedA = 0;
     }
  if (motorSpeedB < 70)
                        {
    motorSpeedB = 0;
       }
  analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
  analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}