Table of Contents

Laser Microphone

Introducere

Microfon laser :

Descriere generală

.

Hardware Design

Listă de piese:

ESP32 DevKit1

2x Laser pointer roșu (alimentare 3–5V)

2x Fotodiodă (opt101)

Breadboard și fire de conexiune

Sursă de alimentare stabilizată 5V

3x led clasic (rosu , galben , verde)

3x rezistente 220ohmi

.

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:

Algoritmi și structuri:

Citire simultană a două canale analogice (OPT101)

Filtrare software: medie glisantă și mediană pe N eșantioane

Reducere zgomot prin diferență: semnal final = semnal1 − semnal2 (pentru semnale în opoziție de fază)

Transmisie date prin UART sau Wi-Fi către laptop

Funcționare:

setup():

Inițializează ADC (rezoluție 12 biți)

Configurează pinii pentru OPT101 (GPIO34, GPIO35)

Inițializează comunicația Serial/Wi-Fi

loop():

Citește ambele canale periodic

Stochează valorile în buffer circular

Aplică filtrul și calculează diferența

Trimite rezultatul prin Serial/Wi-Fi

COD SURSA :

CONST N_SAMPLES = 10

BUFFER1 = array de 10 elemente, inițializate cu 0

BUFFER2 = array de 10 elemente, inițializate cu 0

IDX = 0

FUNCȚIE setup:

  initializează comunicarea serială
  setează rezoluția ADC la 12 biți
  configurează pinul SELECT_GPIO ca intrare cu rezistență pull-up internă (dacă mai trebuie pentru alt scop)

FUNCȚIE average(buffer):

  sumă = 0
  pentru fiecare valoare din buffer:
      sumă = sumă + valoare
  returnează sumă împărțit la N_SAMPLES

FUNCȚIE loop:

  citește valoarea analogică de pe pinul OPT1_PIN
  salvează valoarea în BUFFER1[IDX]
  citește valoarea analogică de pe pinul OPT2_PIN
  salvează valoarea în BUFFER2[IDX]
  calculează media1 = average(BUFFER1)
  calculează media2 = average(BUFFER2)
  calculează semnal_filtrat = media1 - media2   // exemplu de calcul pentru atenuarea zgomotului
  afișează "Media senzor 1:" + media1
  afișează "Media senzor 2:" + media2
  afișează "Semnal filtrat:" + semnal_filtrat
  IDX = (IDX + 1) modulo N_SAMPLES
  așteaptă 10 milisecunde

Script Receiver Python :

DEFINE SERIAL_PORT = 'COM3' DEFINE BAUD_RATE = 115200 DEFINE BUFFER_SIZE = 100

INITIALIZE data_buffer ca coadă cu maxim BUFFER_SIZE elemente, toate inițializate cu 0

INITIALIZE grafic cu axele setate astfel:

  axa verticală: 0 până la 4095 (rezoluție ADC 12 biți)
  axa orizontală: 0 până la BUFFER_SIZE
  titlu: "Semnal de la ESP32"
  etichete: "Valoare ADC" pe verticală, "Timp (ultimele N puncte)" pe orizontală

DESCHIDE portul serial pe SERIAL_PORT cu BAUD_RATE și timeout de 1 secundă AȘTEAPTĂ 2 secunde (pentru a permite ESP32 să pornească)

FUNCȚIE update_plot(frame):

  încearcă să citească un rând din portul serial
  dacă rândul începe cu "CH":
      extrage valoarea numerică după ":"
      adaugă valoarea în data_buffer (se șterge cel mai vechi dacă s-a depășit dimensiunea)
      actualizează datele graficului cu valorile din data_buffer
  ignoră orice eroare la citirea sau conversia datelor
  returnează linia graficului actualizată

PORNEȘTE animația graficului care apelează update_plot la fiecare 50 ms

CÂND fereastra graficului se închide:

  ÎNCHIDE portul serial

Rezultate Obţinute

Din pacate , deoarece fotodioda alesa de mine are un amplificator integrat (care este facut pentru semnale lente si mari ~ stingi aprinzi lumina) nu am putut sa conectez aceasta dioda la amplificatorul MAX9814 , astfel ea nu a fost capabila sa capteze vibratiile mici alea geamului supus unor sunete . Dispozitivul poate insa capta miscari mai mari ale geamului insa nu la nivel de sunet .

Concluzii

Pentru a obtine rezultatul dorit ar trebui sa obtin o fotodioda separata si sa o leg la un MAX9814 , desi chiar si in acest caz nu sunt sigur daca un esp32 are puterea de procesare pentru a genera un fisier audio.

Insa a fost distractiv sa lucrez la acest proiect si am invatat multe despre programarea microprocesoarelor si despre cum functioneza semnalele analog , digitale si audio.

Overall , proiectul functioneaza mai mult ca un senzor de miscare (ar putea fii folosit drept deschizator automat de usi sau de bariere) sau ca detector de cutremur sau batai in usa. Nu chiar ceea ce imi doream dar pe acolo .

Download

https://github.com/iosif-stan/pm

Bibliografie/Resurse

Data sheet esp32 devkit 1 : https://roboeq.ir/files/id/4034/name/ESP32%20MODULE.pdf/

Inspiratie : https://www.youtube.com/watch?v=EiVi8AjG4OY&t=173s

Opt 101 data sheet : https://www.ti.com/lit/ds/symlink/opt101.pdf