edge lab LIVE! starts Tuesday in Munich. Grab a workshop seat and take home the board you build on. Code FRIEND-HACKSTER saves 20%. () Learn more!
Christian Osorio
Published

Automatic Parking

A accurate, quick and automatic parking sensor that quickly backs up your car and leaves enough space for your car and others.

IntermediateShowcase (no instructions)5 hours40
Automatic Parking

Things used in this project

Hardware components

Grove - Ultrasonic Ranger
Seeed Studio Grove - Ultrasonic Ranger
×1
Arduino Nano R3
Arduino Nano R3
×1
Buzzer
Buzzer
×1
Dual H-Bridge motor drivers L293D
Texas Instruments Dual H-Bridge motor drivers L293D
×1
Toggle Switch, Toggle
Toggle Switch, Toggle
×1
DC Motor, 12 V
DC Motor, 12 V
×2
4xAA battery holder
4xAA battery holder
×1
AA Batteries
AA Batteries
×1
Breadboard (generic)
Breadboard (generic)
×1

Software apps and online services

Arduino IDE
Arduino IDE
Tinkercad
Autodesk Tinkercad

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)

Story

Read more

Custom parts and enclosures

3D Print File

Schematics

Circuit Diagram

Code

Parking Sensor Code

C/C++
#include <NewPing.h>

// Ultrasonic sensor pins
#define TRIGGER_PIN 9
#define ECHO_PIN 10
#define MAX_DISTANCE 400
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

// Motor A connections
int enA = 8;
int in1 = 7;
int in2 = 6;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;

// Piezo speaker pin
#define BUZZER_PIN 2

// Distance thresholds (in cm)
const float slowDistance = 7 * 2.54;  // 7 inches β†’ ~17.78 cm
const float stopDistance = 2 * 2.54;  // 2 inches β†’ ~5.08 cm

unsigned long previousBeepMillis = 0;
bool buzzerState = false;

void setup() {
  Serial.begin(9600);

  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);

  stopMotors();
}

void loop() {
  unsigned int distance = sonar.ping_cm();

  // Display on Serial Monitor
  Serial.print("Distance = ");
  Serial.print(distance);
  Serial.println(" cm");

  unsigned long currentMillis = millis();

  if (distance == 0 || distance > slowDistance) {
    // Full speed, no beep
    moveMotors(255);
    digitalWrite(BUZZER_PIN, LOW);
  }
  else if (distance <= slowDistance && distance > stopDistance) {
    // Slow inching with intermittent beep
    int motorSpeed = map(distance, stopDistance, slowDistance, 80, 150);
    moveMotors(motorSpeed);

    // Intermittent beep frequency scales with distance
    int beepFreq = map(distance, stopDistance, slowDistance, 2000, 800);
    if (currentMillis - previousBeepMillis >= 200) { // 200ms interval
      previousBeepMillis = currentMillis;
      buzzerState = !buzzerState;
      if (buzzerState) manualBeep(beepFreq, 100); // 100ms beep
      else digitalWrite(BUZZER_PIN, LOW);
    }
  }
  else if (distance <= stopDistance) {
    // Stop motors and hold long beep 2 seconds
    stopMotors();
    manualBeep(1500, 2000); // 2-second beep
    digitalWrite(BUZZER_PIN, LOW);
  }

  delay(50); // Small loop delay
}

// Move motors forward at given speed
void moveMotors(int speed) {
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, speed);

  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, speed);
}

// Stop motors
void stopMotors() {
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 0);

  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enB, 0);
}

// Generate a square wave on the piezo
void manualBeep(int frequency, int duration_ms) {
  long delayValue = 1000000L / frequency / 2; // half-period in microseconds
  long cycles = (long)frequency * duration_ms / 1000;
  for (long i = 0; i < cycles; i++) {
    digitalWrite(BUZZER_PIN, HIGH);
    delayMicroseconds(delayValue);
    digitalWrite(BUZZER_PIN, LOW);
    delayMicroseconds(delayValue);
  }
}

Credits

Christian Osorio
1 project β€’ 0 followers

Comments