This is an old revision of the document!


Senzor de parcare

Autor: Grigoras Theodor-Andrei

Introducere

Proiectul consta in implementarea unui sistem care simuleaza functionalitatea senzorilor de parcare de pe masinile moderne. Sistemul are la baza trei senzori ultrasonici de distanta care scaneaza trei zone diferite, iar cand un obiect se afla la o distanta seminficativ de mica, utilizatorul va fi anuntat.

Descriere generală

Senzorul Ultrasonic de distanta HC-SR04 este un sensor cu un timp de raspuns foarte mic, dar in cazul in care obiectul se afla la o distanta foarte mica, rezultatele obtinute sunt invalide. In cadrul proiectului, am folosit trei astfel de senzori, conectivitatea cu placa Arduino facandu-se cu ajutorul unui Breadboard. Senzorul este format din 4 pini: VCC, GND, Echo si Trigger. Pentru a functiona, Trigger Pin-ul senzorului are nevoie de un implus de cel putin 10µS, moment in care senzorul va trimite 8 impulsuri de 40KHz care formeaza “unda ultrasonica”. In momentul in care unda intalneste un obiect in calea ei, se reflecta, iar aceasta unda este receptata de catre Pin-ul ECHO, dupa o durata de timp, care va fi transformata in distanta.

Matricea de LED-uri 8×8, vine impreuna cu un modul MAX7291, pentru a minimiza numarul de pini folositi si pentru a putea folosi o biblioteca aditionala Arduino (LedControl.h). Modulul foloseste 5 pini: VCC, GND, DIN, CS si CLK care sunt legati de placa Ardunio cu ajutorul unui Breadboard.

Schema bloc

Hardware Design

Componente utilizate:

  • Arduino Uno
  • Breadboard
  • 3x Ultrasonic Sensor HC-SR04
  • 8×8 LED Matrix (+ MAX7291 Module)
  • Active Buzzer

Schema electrica

Software Design

Am utilizat Arduino IDE pentru partea de software și o librărie externă:

  • LedControl.h (pentru a putea controla matricea de LED-uri intr-un mod usor)

Funcțiile principale sunt setup() si loop(), la care am adăugat doua functii auxiliare

  • SonarSensor
  • printByte

SonarSensor este o funcție care calculează distanta pana cel mai apropiat obiect pentru un senzor anume. printByte este o funcție care afișează o matrice de 8×8 biți (afișarea se face linie cu linie).

#include <LedControl.h>

const int echoPinRight = 8;
const int trigPinRight = 9;

const int echoPinLeft = 10;
const int trigPinLeft = 11;

const int echoPinBack = 2;
const int trigPinBack = 3;

const int BUZZER = 12;

const int DIN =  7;
const int CS = 6;
const int CLK = 5;

LedControl lc = LedControl(DIN, CLK, CS, 0);

long duration;
int distance;

int distanceRight;
int distanceLeft;
int distanceBack;

int safetyDistance = 3;

void setup() {
  // put your setup code here, to run once:
  pinMode(echoPinRight, INPUT);
  pinMode(trigPinRight, OUTPUT);

  pinMode(echoPinLeft, INPUT);
  pinMode(trigPinLeft, OUTPUT);

  pinMode(echoPinBack, INPUT);
  pinMode(trigPinBack, OUTPUT);

  pinMode(BUZZER, OUTPUT);

  lc.shutdown(0, false);
  lc.setIntensity(0, 1);
  lc.clearDisplay(0);
  
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  byte initial[8] = {0b11111111, 0b10000001, 0b10000001, 0b10000001, 0b10000001, 0b10000001, 0b10000001, 0b10000001};

  // obtain the distance from every sensor
  SonarSensor(trigPinLeft, echoPinLeft);
  distanceLeft = distance;

  SonarSensor(trigPinRight, echoPinRight);
  distanceRight = distance;

  SonarSensor(trigPinBack, echoPinBack);
  distanceBack = distance;

  // check the distance
  if(distanceBack < safetyDistance || distanceRight < safetyDistance || distanceLeft < safetyDistance) {
    digitalWrite(BUZZER, HIGH);
  } else {
    digitalWrite(BUZZER, LOW);
  }

  // set distance matrix according to all sensors
  if(distanceBack < 7) {
    initial[1] = initial[0];
  }
  if(distanceBack < safetyDistance) {
    initial[2] = initial[0];
  }

  if(distanceLeft < 7) {
    for(int i = 0; i < 8; i++) {
      initial[i] = initial[i] | 0b01000000;
    }
  }

  if(distanceLeft < safetyDistance) {
    for(int i = 0; i < 8; i++) {
      initial[i] = initial[i] | 0b00100000;
    }
  }

  if(distanceRight < 7) {
    for(int i = 0; i < 8; i++) {
      initial[i] = initial[i] | 0b00000010;
    }
  }

  if(distanceRight < safetyDistance) {
    for(int i = 0; i < 8; i++) {
      initial[i] = initial[i] | 0b00000100;
    }
  }


  // print the matrix on LED Matrix
  printByte(initial); 
}

void SonarSensor(int trigPin,int echoPin) {
  // disable the trigger pin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  // enable the trigger pin for 10 microseconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // receive the duration
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;
}


void printByte(byte character []) {
  int i = 0;
  for(i = 0; i < 8; i ++) {
    lc.setRow(0, i, character[i]);
  }
}

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2022/arosca/senzorparcare.1653325376.txt.gz · Last modified: 2022/05/23 20:02 by theodor.grigoras
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0