So, basically I am using an Arduino Nano and an L298 motor driver to make a line follower using basic code. To make it more interesting though and make it a little bit more controllable by using an IR controller and receiver to change it's speed when it is line following on a track. I made four different speed settings for the motors by doing this:
//Speed settings for line follower
int speeds[] = {90, 130, 170, 220};
I also got the Hexadecimal codes for my IR controller by making a simple circuit.
Here is the code I did in the end for the IR control:
//IR CONTROLLER SETUP//
const int RECV_PIN = 9;
IRrecv irrecv(RECV_PIN);
decode_results results;
const int US = 0xFF629D; // UP SPEED
int SHState = 0;
const int DS = 0xFFA857; //DOWN SPEED
int SLState = 0
const int LL = 0xFF22DD; //LEFT LANE
int LLState = 0
const int RL = 0xFFC23D; //RIGHT LANE
int RLState = 0
const int STOP = 0xFF02FD;
int RESULTS;
Overall I just want to use two buttons on the IR controller to change up and down between the speeds I have set for the line follower. Here is my code overall I hope you can make sense of it:
#include <IRremote.h>
#include <IRremoteInt.h>
//Define the sensor
#define RS 12
#define LS 13
#define MS 14
//Define the left motor
#define LM1 5
#define LM2 7
#define enL 6
//Define the right motor
#define RM1 10
#define RM2 15
#define enR 8
//IR CONTROLLER SETUP//
const int RECV_PIN = 9;
IRrecv irrecv(RECV_PIN);
decode_results results;
const int US = 0xFF629D; // UP SPEED
int SHState = 0;
const int DS = 0xFFA857; //DOWN SPEED
int SLState = 0
const int LL = 0xFF22DD; //LEFT LANE
int LLState = 0
const int RL = 0xFFC23D; //RIGHT LANE
int RLState = 0
const int STOP = 0xFF02FD;
int RESULTS;
//Speed settings for line follower
int speeds[] = {90, 130, 170, 220};
void setup()
{
Serial.begin(9600);
IR.enableIRIn();
pinMode(RS, INPUT);
pinMode(LS, INPUT);
pinMode(MS, INPUT);
pinMode(LM1, OUTPUT);
pinMode(LM2, OUTPUT);
pinMode(RM1, OUTPUT);
pinMode(RM2, OUTPUT);
pinMode(enL, OUTPUT);
pinMode(enR, OUTPUT);
digitalWrite(enL, HIGH);
digitalWrite(enR, HIGH);
delay(500);
}
void loop()
{
if(irrecv.decode(&results))
{
RESULTS = results.value;
if(RESULTS == US)
{
irrecv.resume();
}
}
}
//Defining the lineFollow command.
void lineFollow(){
if((digitalRead(RS)==LOW)&&(digitalRead(LS)==LOW)&&(digitalRead(MS)==HIGH))
{
MoveForward();
}
if((digitalRead(RS)==HIGH)&&(digitalRead(LS)==HIGH)&&(digitalRead(MS)==HIGH))
{
Stop();
}
if((digitalRead(RS)==LOW)&&(digitalRead(LS)==HIGH))
{
TurnLeft();
}
if((digitalRead(RS)==HIGH)&&(digitalRead(LS)==LOW))
{
TurnRight();
}
}
//Define conditions to move forward
void MoveForward()
{
digitalWrite(LM1, HIGH);
digitalWrite(LM2, LOW);
digitalWrite(RM1, LOW);
digitalWrite(RM2, HIGH);
analogWrite(enL, speeds[]);
analogWrite(enR, speeds[]);
delay(20);
}
//Define conditions to stop
void Stop()
{
digitalWrite(LM1, LOW);
digitalWrite(LM2, LOW);
digitalWrite(RM1, LOW);
digitalWrite(RM2, LOW);
analogWrite(enL, 0);
analogWrite(enR, 0);
delay(20);
}
//Define Turn Left
void TurnLeftA()
{
digitalWrite(LM1, HIGH);
digitalWrite(LM2, LOW);
digitalWrite(RM1, LOW);
digitalWrite(RM2, LOW);
analogWrite(enL, speeds[]);
analogWrite(enR, 0);
delay(20);
}
//Define Turn Right
void TurnRightA()
{
digitalWrite(LM1, LOW);
digitalWrite(LM2, LOW);
digitalWrite(RM1, LOW);
digitalWrite(RM2, HIGH);
analogWrite(enL, 0);
analogWrite(enR, speeds[]);
delay(20);
}