/*ARDUINO JOYSTICK CONTROLLED CAR (RECEIVER)
YOU HAVE TO INSTALL THE RF24 LIBRARY BEFORE UPLOADING THE CODE
https://github.com/tmrh20/RF24/
*/
#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
const int relay_pin1 = 3; // Change this to your relay pin number
const int relay_pin2 = 4;
const int relay_pin3 = 5;
const int relay_pin4 = 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);
pinMode(relay_pin1, OUTPUT);
pinMode(relay_pin2, OUTPUT);
pinMode(relay_pin3, OUTPUT);
pinMode(relay_pin4, 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(relay_pin3, HIGH);
digitalWrite(relay_pin4, 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);
//motorSpeedA = 255;
//motorSpeedB = 255;
}
else if (yAxis > 550) {
// Set Motor A forward
digitalWrite(relay_pin3, LOW);
digitalWrite(relay_pin4, 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);
// motorSpeedA = 255;
// motorSpeedB = 255;
}
// If joystick stays in middle the motors are not moving
else {
//motorSpeedA = 0;
//motorSpeedB = 0;
digitalWrite(relay_pin3, LOW);
digitalWrite(relay_pin4, LOW);
}
// X-axis used for left and right control
if (xAxis < 470) {
digitalWrite(relay_pin1, HIGH);
digitalWrite(relay_pin2, LOW);
// Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
//int xMapped = map(xAxis, 470, 0, 0, 255);
//int xMapped = 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;
else 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);
//int xMapped = 255;
digitalWrite(relay_pin1, LOW);
digitalWrite(relay_pin2, HIGH);
// 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;
}
else {
//motorSpeedA = 0;
//motorSpeedB = 0;
digitalWrite(relay_pin1, LOW);
digitalWrite(relay_pin2, LOW);
}
//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
}