This circuit is designed to control a vehicle with motorized wheels, using an Arduino Mega 2560 as the central processing unit. It features a TCS230 color sensor for detecting color changes, an HC-SR04 ultrasonic sensor for distance measurement, a Tower Pro SG90 servo for steering, and an L298N DC motor driver for controlling the motors. The circuit is powered by a 7.4V li-ion battery, and it includes a TP4056 charging module for battery management. A photocell (LDR) is used for light detection, and a buzzer is included for audio feedback. The circuit is switched on and off using a rocker switch.
#include <Servo.h>
Servo servo1;
// TCS Colour sensor pins
const int S0 = 36;
const int S1 = 32;
const int S2 = 30;
const int S3 = 34;
const int OUT = 4;
// Color frequency variables
int red_frequency;
int green_frequency;
int blue_frequency;
// L298N MOTOR DRIVER pins
const int IN1 = 22;
const int IN2 = 24;
const int IN3 = 26;
const int IN4 = 28;
const int ENA = 2;
const int ENB = 3;
// Ultrasonic sensor pins
const int trig_up = 40;
const int echo_up = 42;
// Ultrasonic sensor variables
long duration_up;
int distance_up;
int tolerance = 3;
// Servo pin
const int pin = 48;
void setup() {
// Initialize TCS230 Color sensor
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(OUT, INPUT);
// Initialize L298N MOTOR DRIVER
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
// Initialize Ultrasonic sensor
pinMode(trig_up, OUTPUT);
pinMode(echo_up, INPUT);
// Initialize Servo
pinMode(pin, INPUT);
servo1.attach(pin);
// Start serial communication
Serial.begin(9600);
// Set frequency scaling to 20%
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
// Read initial color frequencies
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
red_frequency = pulseIn(OUT, LOW);
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
green_frequency = pulseIn(OUT, LOW);
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
blue_frequency = pulseIn(OUT, LOW);
}
void loop() {
// Read color frequencies
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
red_frequency = pulseIn(OUT, LOW);
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
green_frequency = pulseIn(OUT, LOW);
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
blue_frequency = pulseIn(OUT, LOW);
// Color detection logic
if (red_frequency == 255 && green_frequency == 255 && blue_frequency == 255) {
slow();
} else {
// Movement logic based on color detection
if (red_frequency == red && green_frequency == green && blue_frequency == blue) {
go();
} else {
right();
delay(750);
updateColorFrequencies();
if (red_frequency != red || green_frequency != green || blue_frequency != blue) {
left();
delay(1500);
updateColorFrequencies();
if (red_frequency != red || green_frequency != green || blue_frequency != blue) {
stop();
} else {
go();
}
} else {
go();
}
}
}
// Ultrasonic sensor logic
measureDistance();
if (distance_up <= 6 + tolerance) {
stop();
delay(5000);
servo1.write(45);
measureDistance();
if (distance_up >= 6 + tolerance) {
right();
delay(500);
left();
delay(500);
go();
}
}
}
// Function definitions for motor control
void go() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 200);
analogWrite(ENB, 200);
}
void back() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA,