Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino Mega 2560 Controlled Robotic Vehicle with TCS230 Color Sensing and Ultrasonic Obstacle Avoidance

View and Edit Project In Cirkit DesignerImage of Arduino Mega 2560 Controlled Robotic Vehicle with TCS230 Color Sensing and Ultrasonic Obstacle Avoidance

Circuit Documentation

Summary

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.

Component List

Wiring Details

L298N DC Motor Driver

Motor and Wheels

TCS230 Color Sensor

Rocker Switch

Photocell (LDR)

HC-SR04 Ultrasonic Sensor

Tower Pro SG90 Servo

Li-ion Battery 7.4V 3000mAh

TP4056 Charging Module

Resistor

BC547 Transistor

Buzzer

Documented Code

#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,