This is an old revision of the document!
Schema bloc generală:
DISCLAIMER : DREPTUNGHIUL MIC CONECTAT LA DIFUZOR ESTE DFPLAYER-UL
Descriere module și interacțiuni:
Microcontroler ATmega328P, operare la 5 V, 14 pini digitali I/O (6 PWM), 6 pini analogici. Primește semnal de la senzor și comandă servomotoarele și modulul audio.
Rotație 0–180°, alimentare 4,8–6 V, cuplu ~1,8 kg·cm. Montate pe balamaua feței măștii; primesc poziție în grade prin semnale PWM de la Arduino.
Detectează distanțe între 2 și 400 cm, precizie ±3 mm. Conectat la Arduino (Trig→D2, Echo→D3); când distanța <30 cm, declanșează deschiderea măștii.
Modul MP3 cu DAC 24-bit și microSD (FAT16/FAT32 până la 32 GB), control UART (RX/TX). Redă fișiere `0001.mp3` (deschidere) și `0002.mp3` (închidere) la comanda `player.play(n)`.
Conectat la SPK1/SPK2 ale DFPlayer Mini. Oferă feedback sonor cu vocea „Jarvis”.
Sursă mobilă de alimentare pentru întregul sistem.
Modulul powerbank 18650 furnizeaza stabil 5V DC dintr-o singura baterie Li-Ion, fiind ideal pentru alimentarea placilor de dezvoltare Arduino sau Raspberry Pi.
Din pacate nu a ajuns DFplayer Mini si placa arduino asa ca am improvizat pe o placa esp32. Singurul lucru ramas este sa adaug acel DFPlayer.
= Software Design =
* 'Compilator
': AVR-GCC 7.3.0 pentru microcontroller ATmega328P
* 'Target Platform
': Arduino UNO R3 (ATmega328P @ 16MHz)
* 'Upload Protocol
': AVR109 (USB-to-Serial via CH340/FTDI)
* 'Debugging
': Serial Monitor la 9600 baud rate
<pre>
Compilator flags optimizate pentru performanță
#pragma GCC optimize(“O2”) Optimizare nivel 2
#define F_CPU 16000000UL Clock 16MHz
</pre>
—-
== Librării şi Surse 3rd-Party ==
=== Core Arduino Libraries ===
<code>
#include <Servo.h> v1.2.1 - Control PWM servomotoare
#include <SoftwareSerial.h> v1.0 - UART software pentru DFPlayer
</code>
=== External Libraries ===
<code>
#include <DFRobotDFPlayerMini.h> v1.0.6 - Control DFPlayer Mini
</code>
* 'Sursă
': DFRobot Official Library (GitHub: 2.1M downloads)
* 'Funcționalitate
': Control complet player audio MP3
* 'Protocoale
': Serial AT commands pentru control volum/track
<pre> Custom defines pentru abstractizare hardware #define TRIG_PIN 2 #define ECHO_PIN 3 #define SERVO1_PIN 9 #define SERVO2_PIN 10 #define DFPLAYER_RX 7 #define DFPLAYER_TX 8 </pre> —- == Algoritmi şi Structuri Implementate == === 1. Algoritm Măsurare Distanță (Time-of-Flight) === <pre> Algorithm: measureDistance() Input: None (GPIO control) Output: float distance [cm] Complexity: O(1) - constant time Pseudocode: 1. Generate 10µs TRIG pulse 2. Measure ECHO pulse duration 3. Apply formula: distance = (duration * 0.034) / 2 4. Validate result (timeout handling) </pre> === 2. State Machine pentru Proximity Detection === <pre> States: {IDLE, NEAR, FAR} Transitions: distance < 30cm → NEAR distance ≥ 30cm → FAR State Actions: - NEAR: servo.write(90°) + play(001.mp3) - FAR: servo.write(270°) + play(002.mp3) </pre> === 3. Interrupt Service Routine (ISR) === <pre> Algorithm: echoInterrupt() Trigger: CHANGE on Pin 3 (INT1) Features: - Debounce filtering (200ms window) - Volatile flag setting - Non-blocking execution (<10µs) </pre> === 4. PWM Control Algorithm === <pre> Function: moveServosTo(angle) Input: int angle [0-359°] Process: - Convert angle to PWM duty cycle - Simultaneous dual servo control - Non-blocking execution </pre> —- == Structuri de Date == === Global Variables === <pre> Volatile pentru ISR communication volatile bool proximityDetected = false; volatile unsigned long lastInterruptTime = 0;
State management float distance = 0; bool isClose = false; bool lastState = false; Configuration constants const float THRESHOLD_DISTANCE = 30.0; cm const unsigned long DEBOUNCE_TIME = 200; ms </pre>
<pre> Servo servo1, servo2; PWM control objects SoftwareSerial dfPlayerSerial(7, 8); UART software instance DFRobotDFPlayerMini dfPlayer; Audio player controller </pre> —- == Surse şi Funcţii Implementate (Etapa 3) == === Core Functions === ==== 1. Setup & Initialization ==== <pre> void setup() ├── Serial.begin(9600) Debug interface ├── GPIO_Config() Pin modes pentru TRIG/ECHO ├── PWM_Config() Servo attachment ├── Interrupt_Config() INT1 setup pe ECHO └── Audio_Init() DFPlayer initialization </pre>
<pre> float measureDistance() {
// Time-of-flight calculation // Input: GPIO pulse generation // Output: Distance în cm // Error handling: timeout protection
} </pre>
<pre> void moveServosTo(int angle) {
// Simultaneous dual servo control // PWM signal generation @ 50Hz // Angle range: 0-359° (cu overflow handling)
}
void activateProximityMode() {
// Composite action: PWM + Audio // Servo rotation: 0° → 90° // Audio trigger: 001.mp3
}
void deactivateProximityMode() {
// Composite action: PWM + Audio // Servo rotation: 90° → 270° (-90°) // Audio trigger: 002.mp3
} </pre>
<pre> void echoInterrupt() {
// ISR pentru ECHO pin change // Debounce protection // Flag setting pentru main loop // Execution time: <10µs
} </pre>
<pre> bool initializeDFPlayer() {
// DFPlayer initialization sequence // Volume configuration (0-30) // SD card validation // Error handling pentru connection
} </pre>
<pre> void printSystemInfo() {
// Debug information output // Pin configuration display // System status monitoring
}
bool validateDistance(float dist) {
// Input validation pentru măsurători // Range checking: 2-400cm // Invalid reading filtering
} </pre>
<pre> Flash Memory Usage Program Storage: ~18,432 bytes (56.9% of 32,256 bytes) Dynamic Memory: ~1,024 bytes (50.0% of 2,048 bytes) Execution Performance Setup Time: ~2 seconds (DFPlayer init) Loop Cycle: ~100ms (măsurare + processing) Interrupt Response: <50µs (hardware priority) </pre>
* 'measureDistance()
': O(1) - constant time
* 'State transitions
': O(1) - boolean comparison
* 'PWM generation
': O(1) - hardware timer
* 'ISR execution
': O(1) - direct flag setting
<pre> Hardware Events → ISR → Flag Setting → Main Loop Processing → Action Execution
↑ ↑ ↑ ↑ ↑ GPIO/Timer Interrupt Volatile State Machine PWM/Serial
</pre>
* 'Concurrent execution
': PWM, Audio, GPIO în paralel
* 'Interrupt priority
': Hardware events cu prioritate maximă
* 'Timer-based delays
': Evitarea blocking calls în loop principal
<pre> Timeout protection long duration = pulseIn(ECHO_PIN, HIGH, 30000); if (duration == 0) return 0; Invalid reading
Debounce filtering if (currentTime - lastInterruptTime < DEBOUNCE_TIME) return; DFPlayer connection validation if (!dfPlayer.begin(dfPlayerSerial)) {
Serial.println("DFPlayer Error!"); while(true) delay(0); // Safe halt
} </pre>
* 'Sensor failure
': Continue operation cu last known state
* 'Audio failure
': Maintain servo functionality
* 'Power fluctuations
': Automatic recovery după reset
{| class=“wikitable”
! Funcție !! Tip !! Complexitate !! Descriere
setup() | Initialization | O(1) | |||
loop() | Main Control | O(1) | |||
measureDistance() | GPIO | O(1) | |||
moveServosTo() | PWM | O(1) | |||
echoInterrupt() | ISR | O(1) | |||
activateProximityMode() | Composite | O(1) | |||
deactivateProximityMode() | Composite | O(1) | |||
initializeDFPlayer() | Audio | O(1) | |||
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.