Project Overview

Bring together everything from the track to build a self-driving robot that navigates a room without hitting obstacles. The robot uses an HC-SR04 sensor to detect objects ahead, then executes a stop–reverse–turn–forward manoeuvre to navigate around them.

Bill of Materials

ComponentQtyNotes
Arduino Uno or Nano1
L298N motor driver1
DC gearmotor23–6V, included in most chassis kits
2-wheel chassis kit1Including battery holder
HC-SR041Mount on front of chassis
9V battery or 4×AA pack1For motors; USB for Arduino
Jumper wires

Wiring

Arduino → L298N                    Arduino → HC-SR04
  D6 (PWM) → ENA                    D10 → TRIG
  D7       → IN1   (left motor)     D9  → ECHO
  D8       → IN2
  D5 (PWM) → ENB
  D3       → IN3   (right motor)
  D4       → IN4

Share ground between Arduino, L298N, and battery pack.

State Machine Sketch

#include <NewPing.h> // install: "NewPing" by Tim Eckel — cleaner than pulseIn

#define TRIG 10
#define ECHO  9
#define MAX_DIST 200

NewPing sonar(TRIG, ECHO, MAX_DIST);

// Motor pins
const int ENA=6, IN1=7, IN2=8;
const int ENB=5, IN3=3, IN4=4;
const int SPEED = 180; // 0–255

enum State { FORWARD, STOP, REVERSE, TURN };
State state = FORWARD;
unsigned long stateStart = 0;

void setMotors(int l, int r) {
  // l, r: -255 (back) to 255 (forward)
  analogWrite(ENA, abs(l)); analogWrite(ENB, abs(r));
  digitalWrite(IN1, l > 0); digitalWrite(IN2, l < 0);
  digitalWrite(IN3, r > 0); digitalWrite(IN4, r < 0);
}

void setup() {
  int pins[] = {ENA,IN1,IN2,ENB,IN3,IN4};
  for (int p : pins) pinMode(p, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int dist = sonar.ping_cm();
  unsigned long now = millis();

  switch (state) {
    case FORWARD:
      setMotors(SPEED, SPEED);
      if (dist > 0 && dist < 20) {
        state = STOP; stateStart = now;
      }
      break;

    case STOP:
      setMotors(0, 0);
      if (now - stateStart > 300) { state = REVERSE; stateStart = now; }
      break;

    case REVERSE:
      setMotors(-SPEED, -SPEED);
      if (now - stateStart > 500) { state = TURN; stateStart = now; }
      break;

    case TURN:
      setMotors(-SPEED, SPEED); // spin right
      if (now - stateStart > 600) { state = FORWARD; }
      break;
  }

  Serial.print("State: "); Serial.print(state);
  Serial.print("  Dist: "); Serial.println(dist);
  delay(50);
}

Tuning Guide

ParameterEffectAdjust if…
dist < 20Trigger distanceRobot hits objects before stopping
STOP 300 msPause before reversingRobot jerks without stopping
REVERSE 500 msReverse distanceNot enough clearance from obstacle
TURN 600 msTurn angleNot turning far enough to clear
SPEEDMotor speedChassis moves too fast/slow on floor surface

Deliverables

  1. Working bot demo recorded on video
  2. Sketch (.ino file) with clear comments
  3. Short write-up (1 page): challenges faced, one improvement idea