This is an old revision of the document!


Laser Microphone

Introducere

Microfon laser :

  • Proiectul constă într-un sistem de spionaj acustic bazat pe un microfon laser, care captează vibrațiile sunetelor reflectate de pe suprafețe (ex: geamuri) folosind două fotodiode și două lasere. Semnalul este amplificat și poate fi ascultat în timp real printr-o ieșire jack pentru căști. În paralel, un microcontroler ESP32 procesează cele două semnale pentru a reduce zgomotul și a extrage o versiune mai clară a sunetului captat.
  • Scopul proiectului este explorarea principiilor fizice și electronice din spatele microfoniei laser, dar și aplicarea unor tehnici de prelucrare a semnalului (digital signal processing) pe un microcontroler embedded, în vederea obținerii unui sistem de ascultare pasivă cu performanță ridicată.
  • Ideea a pornit din curiozitatea față de modul în care pot fi captate sunetele de la distanță, fără contact direct, folosind doar lumina. Am vrut să reproducem și să îmbunătățim principiul din spatele microfonului laser folosit în securitate și spionaj, integrând și un modul de procesare digitală pentru a filtra zgomotul ambiental.
  • Proiectul este util pentru că oferă un exemplu aplicat de combinație între fizică, electronică analogică și procesare digitală a semnalului, fiind valoros atât educativ cât și tehnic. Pentru noi, reprezintă o provocare complexă care ne ajută să ne dezvoltăm abilitățile în embedded systems, filtrare digitală, și hardware design. Pentru alții, poate fi o unealtă de supraveghere pasivă sau un punct de plecare pentru cercetare în domeniul captării acustice non-invazive.

Descriere generală

.

Hardware Design

Listă de piese: ESP32 DevKit (cu Wi-Fi și capacitate de procesare DSP)

2x Laser pointer roșu (clasă II sau III, alimentare 3–5V)

2x Fotodiodă (ex: BPW34 sau similar)

2x Amplificator operațional (MAX7804)

Priză jack stereo de 3.5mm (pentru ieșire audio)

Breadboard și fire de conexiune

Sursă de alimentare stabilizată 5V

.

Software Design

Descrierea codului aplicației (firmware)

- Mediu de dezvoltare: PlatformIO

- Placă țintă: ESP32 DevKitC

- Firmware scris în C++ (Arduino Framework)

Biblioteci și surse 3rd-party folosite:

Arduino.h – suport de bază pentru ESP32

WiFi.h – pentru trimiterea datelor la PC (opțional)

MovingAverage.h (sau filtru mediană custom) – pentru atenuarea zgomotului

esp_adc_cal.h – pentru calibrarea ADC-ului

Algoritmi și structuri implementate:

Citirea a două canale analogice conectate la ieșirile a două module OPT101

Filtrare software:

moving average (medie glisantă)

mediana pe N eșantioane

Reducere zgomot prin comparație diferențială:

dacă semnalele sunt în opoziție de fază (unul e zgomot de fond, altul e reflexie utilă)

semnal final = semnal1 - semnal2

Transmisie UART / Wi-Fi la laptop pentru analiză sau redare

→ setup() inițializează ADC-urile (analogReadResolution(12))

configurează pinii OPT101 (analogRead(GPIO34) și analogRead(GPIO35))

inițializează comunicarea (USB Serial sau Wi-Fi)

→ loop() citește periodic ambele canale

adaugă valorile într-un buffer circular

aplică un filtru (

calculează diferența dintre canale

trimite rezultatul prin Serial/WiFi

COD SURSA :

#define OPT1_PIN 34 #define OPT2_PIN 35 #define SELECT_GPIO 13

#define N_SAMPLES 10

float buffer1[N_SAMPLES] = {0}; float buffer2[N_SAMPLES] = {0}; int idx = 0;

void setup() { Serial.begin(115200); UART - Laborator 1 analogReadResolution(12); ADC - Laborator 4

pinMode(SELECT_GPIO, INPUT_PULLUP); GPIO - Laborator 0 } float average(float* buf) { float sum = 0; for (int i = 0; i < N_SAMPLES; i++) sum += buf[i]; return sum / N_SAMPLES; } void loop() { bool useOpt1 = digitalRead(SELECT_GPIO); if (useOpt1) { buffer1[idx] = analogRead(OPT1_PIN); float avg = average(buffer1); Serial.print(“CH1: ”); Serial.println(avg); } else { buffer2[idx] = analogRead(OPT2_PIN); float avg = average(buffer2); Serial.print(“CH2: ”); Serial.println(avg); } idx = (idx + 1) % N_SAMPLES; delay(10); } </note> ===== Script Receiver Python : ===== <note tip> import serial import time from collections import deque import matplotlib.pyplot as plt import matplotlib.animation as animation SERIAL_PORT = 'COM3' # sau '/dev/ttyUSB0' pe Linux BAUD_RATE = 115200 BUFFER_SIZE = 100 data_buffer = deque([0]*BUFFER_SIZE, maxlen=BUFFER_SIZE) fig, ax = plt.subplots() line, = ax.plot([], [], lw=2) ax.set_ylim(0, 4095) # ADC pe 12 biți ax.set_xlim(0, BUFFER_SIZE) ax.set_title(“Semnal de la ESP32”) ax.set_ylabel(“Valoare ADC”) ax.set_xlabel(“Timp (ultimele N puncte)”) def update_plot(frame): global ser try: line_raw = ser.readline().decode().strip() if line_raw.startswith(“CH”): val = float(line_raw.split(”:”)[1]) data_buffer.append(val) line.set_data(range(len(data_buffer)), list(data_buffer)) except: pass return line, ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1) time.sleep(2) # Așteaptă pornirea ESP-ului ani = animation.FuncAnimation(fig, update_plot, interval=50) plt.tight_layout() plt.show() ser.close() </note> ===== Rezultate Obţinute ===== <note tip> Care au fost rezultatele obţinute în urma realizării proiectului vostru. </note> ===== Concluzii ===== ===== Download ===== <note warning> 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. </note> ===== Jurnal ===== not finished yet ===== Bibliografie/Resurse ===== not finished yet <html><a class=“media mediafile mf_pdf” href=”?do=export_pdf”>Export to PDF</a></html>

pm/prj2025/eradu/iosif.stan.1747837891.txt.gz · Last modified: 2025/05/21 17:31 by iosif.stan
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