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
Program
Transmitter
#include <nRF24L01.h>
#include <RF24.h>
const byte address[6] = "00001";
char xyData[32] = "";
String xAxis, yAxis;
{
Serial.begin(9600);radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop()
{
xAxis = analogRead(A1); // Read Joysticks X-axisyAxis = 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 <nRF24L01.h>
#include <RF24.h>
#define enA 2
#define in1 3
#define in2 4
#define enB 7
#define in3 5
#define in4 6
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 arrayxAxis = 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 backwarddigitalWrite(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);
}
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 valueint xMapped = map(xAxis, 470, 0, 0, 255);
// Move to left - decrease left motor speed, increase right motor speed
motorSpeedA = motorSpeedA + xMapped;motorSpeedB = motorSpeedB - xMapped;
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 valueint 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
}