Table of Contents

Robotic Flower

Introducere

Proiectul constă în realizarea unei flori robotice interactive, care se deschide automat atunci când detectează prezența unei persoane în apropiere, și se închide în absența acesteia. Scopul său este de a simula comportamentul natural al unei plante sensibile la mediu, oferind o experiență vizuală interesantă și educativă.

Floarea reacționează la apropierea unui om, deschizându-se ca și cum ar „înflori”, iar în lipsa mișcării se retrage într-o stare de repaus.

Ideea a pornit de la dorința de a crea un proiect care să îmbine estetică, interactivitate și funcționalitate.

Descriere generală

Floarea se deschide și se închide automat în funcție de prezența unei persoane, iar printr-un buton suplimentar poate fi activat un mod special de „dans” al petalelor:



Componenta Rol
Arduino Nano (ATmega328p) Controlează întregul sistem și coordonează toate componentele
16 Channel Driver Controlează simultan cele 4 servomotoare
Ultrasonic Sensor HC-SR04 Detectează prezența persoanei din apropiere
4 x Servos MG 996R Mișcă „petalele” florii pentru a o deschide și închide
Buton Dance Mode Permite mișcarea petalelor într-un mod de „dans”
Breadboard Platformă pentru conexiuni rapide între componente

Hardware Design

Lista componentelor:

Pini Arduino Componenta Rol
D12 Buton Declanșează modulul de „dans” al petalelor
D10 HC-SR04 (Echo) Recepție semnal ultrasonic (distanță)
D9 HC-SR04 (Trig) Declanșare semnal ultrasonic
A4 (SDA) PCA9685 (SDA) Comunicare I2C cu driverul de servomotoare
A5 (SCL) PCA9685 (SCL) Comunicare I2C – ceas semnal PCA9685
D3 RX (DFPLayer) TX software către DFPlayer RX
GND GND buton + senzor Masă comună pentru toate componentele
VIN / 5V PCA9685, HC-SR04 etc. Alimentare generală module (5V)

Software Design

Mediul de dezvoltare

Platforma folosită: Arduino IDE Limbaj: C++ (stil Arduino)

Biblioteci/Surse third-party Folosite
Nume Motivația
Wire.h folosită pentru comunicația I2C.
Adafruit_PWMServoDriver.h bibliotecă third-party de la Adafruit pentru controlul servo-motoarelor prin interfața I2C folosind driverul PCA9685.
interrupt.h Permite utilizarea și configurarea întreruperilor hardware, inclusiv definirea ISR-urilor.
Algoritmi și structuri implementate:

Măsurare distanță cu senzor ultrasonic:

Se utilizează impulsuri ultrasonice pentru a calcula distanța până la un obstacol.

Controlul petalelor cu servomotoare:

Petalele se “deschid” sau “închid” în funcție de distanța măsurată.

Pozițiile servomotoarelor sunt controlate prin driverul PCA9685.

Secvență de dans (randomizare):

Când se apasă butonul, începe o secvență aleatorie de mișcări ale servomotoarelor timp de 10 secunde.

Filtrarea valorilor senzorului ultrasonic:

Se folosește un filtru de medie mobilă (moving average) pentru a reduce zgomotul din datele brute returnate de HC-SR04.

Controlul servomotoarelor
Stadiul actual al implementării
Funcție Rol
setup() Inițializarea componentelor hardware
loop() Bucla principală, apelează funcțiile de control
checkDistance() Măsoară și filtrează distanța ultrasonică
checkButton() Detectează apăsarea butonului
performDance() Controlează mișcarea aleatoare a servomotoarelor
open() Deschide petalele treptat
close() Închide petalele treptat
Filtrarea datelor de la sensor

Senzorul ultrasonic HC-SR04 este predispus la valori fluctuante cauzate de:

Soluția: Filtrare de medie mobilă, pentru a evita deschiderea/închiderea accidentală a petalelor cauzată de citiri eronate ale senzorului.

#define FILTER_SIZE 5
float distanceBuffer[FILTER_SIZE];
int bufferIndex = 0;
bool bufferFilled = false;

void checkDistance() {
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  duration_us = pulseIn(ECHO_PIN, HIGH);
  float raw_distance = 0.017 * duration_us;

  // Adaugă valoarea în buffer
  distanceBuffer[bufferIndex] = raw_distance;
  bufferIndex = (bufferIndex + 1) % FILTER_SIZE;
  if (bufferIndex == 0) bufferFilled = true;

  // Calculează media valorilor din buffer
  float sum = 0;
  int count = bufferFilled ? FILTER_SIZE : bufferIndex;
  for (int i = 0; i < count; i++) {
    sum += distanceBuffer[i];
  }
  distance_cm = sum / count;

  Serial.print("Filtered Distance: ");
  Serial.println(distance_cm);
}
Legătura cu laboratoarele

Proiectul concepte studiate în laboratoarele următoare:

Rezultate Obţinute

Proiectul se află în stadiul de prototip funcțional, cu toate componentele hardware montate și testate pe breadboard.

Proiectul final:

Starile florii Closed si Open:

Concluzii

Repo

Repo Github

Jurnal

Task Status
Setare mediu de lucru Complet
Adaugare mod dans Complet
Adaugare buton Complet
Creare prototip Complet
Adaugare difuzor In progress
Aspect fizic In progress

Bibliografie/Resurse

Resurse Hardware Lista Componente