Arduino Remote Control CAR.
Arduino Remote Control Car
Remote controlled toys have always captivated me. Thus, I decided to make a RC car of my own....π. It is pretty interesting to make, but a look at the basics first......
Item list - These can be easily picked from Amazon or other online stores
a. L298N Motor driver - Link
b. Joy stick - Link
c. Arduino uno - Link
d. 9v battery - Link
f. Jumper wires - Link
g. Mini breadboard - Link
Principle.
The two main functions on which our joy stick controlled car is based are the :- a. Forward & rearward controls. b. Right & left directional controls.
These two functions would determine the complete 360 degree movement of the vehicle. The first ☝( forward and rearward) function is achieved by changing the direction of the motors. The clockwise rotation of the motors would move the car forward and vice versa. To be able to execute this directional change in the motor while moving we must change the direction of current flowing through the motor spontaneously while in motion itself. This can be done using the simple principle of a H-bridge.
An H - bridge comprises of 4 switches arranged in an ‘H’ like pattern with the motor in the centre. In a H - bridge when two opposite switches are activated(closed) and the other pair of the opposite switches deactivated(open) then the motor receives current flow from one direction where as when the connections are reversed then the motor starts to receive current from the opposing direction and its rotation direction reverses.
The second✌(right and left) function of movement of the car, is achieved by regulating the speed of each of the motors. For the car to go right - the right motor must be slowed down and the speed of the left motor must be increased. Similarly, for the car to go left - the left motor must be slowed and the right motor must go faster.
Hence to achieve both the 1st & 2nd function. We will be using the l298n motor driver which has in it an H-bridge circuit and regulates the motor speed. there
Now to control the car with the joy stick, the component will have to be interfaced with our microcontroller(Arduino).
Also the motor driver to which the motor are connected must be interfaced with the Arduino. Thus when we would move the joystick, the microcontroller(Arduino) would read the input and then command the motor driver to function accordingly.
The microcontroller would also be required to be programmed for the output command it will give to the motor driver. For ever action on the joystick the microcontroller needs to be told the kind of output it must deliver.
Schematic :
Code. Here is the code....
- #define enA 9
- #define in1 4
- #define in2 5
- #define enB 10
- #define in3 6
- #define in4 7
- 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);
- }
- void loop() {
- int xAxis = analogRead(A0); // Read Joysticks X-axis
- int yAxis = analogRead(A1); // Read Joysticks Y-axis
- // 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
- }
Comments
Post a Comment
If you have any doubts, please let me know