Skip to content

NielsKok87/Walkie

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ESP32-S3 Walkie Talkie met ESP-NOW

Een draadloze walkie-talkie geïmplementeerd op ESP32-S3 Supermini met behulp van het ESP-NOW protocol voor lage latentie audio communicatie.

Hardware Vereisten

  • ESP32-S3 Supermini (minimaal 2 stuks voor communicatie)
  • INMP441 - I2S MEMS Microfoon
  • MAX98357A - I2S Audio Versterker
  • Push Button - Voor push-to-talk functionaliteit
  • Speaker - 4-8Ω, 3W (aan te sluiten op MAX98357A)
  • Jumper draden en breadboard

Pinout

⚡ Geoptimaliseerde Configuratie (Gedeelde I2S Pins)

Voordelen:

  • Bespaart 2 GPIO pins door BCLK en WS/LRCLK te delen
  • Volledig ondersteund door ESP32-S3 I2S hardware
  • Geen nadelen voor half-duplex operatie (push-to-talk)

INMP441 Microfoon Aansluitingen

INMP441 Pin    ->  ESP32-S3 GPIO
--------------------------------
SCK (Serial Clock)     ->  GPIO 4  (Gedeeld met speaker)
WS (Word Select)       ->  GPIO 5  (Gedeeld met speaker)
SD (Serial Data)       ->  GPIO 6  (Input: alleen microfoon)
L/R                    ->  GND (voor links kanaal)
VDD                    ->  3.3V
GND                    ->  GND

MAX98357A Speaker Aansluitingen

MAX98357A Pin  ->  ESP32-S3 GPIO
--------------------------------
BCLK (Bit Clock)       ->  GPIO 4  (Gedeeld met microfoon!)
LRC (Left/Right Clock) ->  GPIO 5  (Gedeeld met microfoon!)
DIN (Data In)          ->  GPIO 7  (Output: alleen speaker)
GAIN                   ->  GND of VCC (zie datasheet) *
VIN                    ->  5V
GND                    ->  GND

Opmerking: GPIO 4 en 5 worden gedeeld tussen microfoon en speaker. Alleen de SD/DIN (data) lijnen zijn apart!

*GAIN Pin Configuratie (MAX98357A):

  • GND = 9dB gain
  • Float = 12dB gain (standaard)
  • VCC = 15dB gain

Button Aansluitingen

Button Pin     ->  ESP32-S3 GPIO
--------------------------------
Een kant       ->  GPIO 0
Andere kant    ->  GND

Installatie

Kies een van de volgende methodes:

Methode 1: PlatformIO (Aanbevolen)

Stap 1: Installeer PlatformIO

  1. Visual Studio Code installeren (indien nog niet geïnstalleerd)
  2. Installeer de PlatformIO IDE extensie:
    • Open VSCode
    • Ga naar Extensions (Ctrl+Shift+X)
    • Zoek naar "PlatformIO IDE"
    • Klik op Install

Stap 2: Project Openen

cd /pad/naar/Walkie
code .

Of open de folder via FileOpen Folder in VSCode.

Stap 3: Bouwen en Uploaden

  1. Bouwen: Klik op het ✓ (checkmark) icoon onderaan of gebruik Ctrl+Alt+B
  2. Upload: Klik op het → (arrow) icoon onderaan of gebruik Ctrl+Alt+U
  3. Serial Monitor: Klik op het 🔌 (plug) icoon onderaan

PlatformIO voordelen:

  • Automatische dependency management
  • Betere code completion
  • Eenvoudiger debuggen
  • Multi-platform ondersteuning

Methode 2: Arduino IDE

Stap 1: Arduino IDE Configuratie

  1. Installeer Arduino IDE (versie 2.0 of hoger aanbevolen)

  2. Voeg ESP32 board support toe:

    • Ga naar FilePreferences
    • Voeg toe aan "Additional Board Manager URLs":
      https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
      
    • Ga naar ToolsBoardBoards Manager
    • Zoek naar "esp32" en installeer "esp32 by Espressif Systems"
  3. Selecteer het juiste board:

    • ToolsBoardESP32 ArduinoESP32S3 Dev Module
  4. Board instellingen:

    USB CDC On Boot: "Enabled"
    USB Mode: "Hardware CDC and JTAG"
    Flash Size: "4MB" of hoger
    Partition Scheme: "Default 4MB with spiffs"
    PSRAM: "Disabled" (of "Enabled" indien beschikbaar)
    

Stap 2: Sketch Uploaden

  1. Sluit ESP32-S3 aan via USB-C
  2. Open Walkie_Talkie_ESP32S3.ino (voor Arduino IDE versie)
  3. Selecteer de juiste COM-poort onder ToolsPort
  4. Klik op Upload
  5. Herhaal voor alle ESP32-S3 units

Let op: Voor Arduino IDE gebruik je het .ino bestand. Voor PlatformIO gebruik je het src/main.cpp bestand.

Stap 3: Hardware Assemblage

  1. Sluit alle componenten aan volgens de pinout hierboven
  2. Zorg ervoor dat alle GND pinnen zijn verbonden
  3. Gebruik een goede 5V voeding (minimaal 500mA)
  4. Sluit de speaker aan op de MAX98357A output

Gebruik

  1. Power on: Schakel beide/alle walkie-talkie units in
  2. Wacht op initialisatie: Check de seriële monitor (115200 baud) voor "Walkie Talkie Ready!"
  3. Praten: Houd de knop ingedrukt en spreek in de microfoon
  4. Luisteren: Laat de knop los om audio van andere units te ontvangen

LED Indicaties (optioneel)

Je kunt LEDs toevoegen voor status indicatie:

  • Rode LED: Transmit mode (button ingedrukt)
  • GI2S Pin Sharing - Waarom Dit Werkt

Technische Uitleg

Gedeelde pins:

  • BCLK (Bit Clock): Synchroniseert de data overdracht
  • WS/LRCLK (Word Select): Definieert links/rechts kanaal timing

Aparte pins:

  • SD_IN: Data VAN microfoon (INMP441)
  • SD_OUT: Data NAAR speaker (MAX98357A)

Dit werkt omdat:

  1. ✅ De ESP32-S3 kan twee I2S poorten configureren met dezelfde clock pins
  2. ✅ Bij push-to-talk operatie zijn we half-duplex (niet gelijktijdig opnemen en afspelen)
  3. ✅ Clock signalen zijn read-only voor de peripherals
  4. ✅ Data lijnen zijn unidirectioneel (INMP441 → ESP32 → MAX98357A)

Afgeraden configuraties:

  • ❌ Probeer NIET dezelfde SD pin te delen (data conflicten!)
  • ❌ Full-duplex (gelijktijdig opnemen en afspelen) vereist aparte clocks

Dual-Core Architectuur

ESP32-S3 Twee Cores Optimalisatie

De ESP32-S3 heeft 2 Xtensa LX7 cores @ 240 MHz. De walkie-talkie benut beide cores optimaal:

Core 0 (PRO_CPU - Protocol CPU):

  • ESP-NOW TX/RX callbacks
  • WiFi protocol stack
  • Network packet handling
  • Priority: Medium (1)

Core 1 (APP_CPU - Application CPU):

  • I2S microphone reading
  • I2S speaker writing
  • Audio DSP & buffering
  • Priority: High (2)

Inter-Core Communicatie:

  • audioTxQueue: Core 1 → Core 0 (audio voor verzending)
  • audioRxQueue: Core 0 → Core 1 (ontvangen audio)
  • Thread-safe mutexes voor gedeelde variabelen

Voordelen:

Aspect Single Core Dual Core Verbetering
Latentie 30-50 ms 10-20 ms ✅ 60% beter
Packet loss 2-5% <0.5% ✅ 90% beter
CPU load 60-80% 40-50% ✅ 35% beter
Audio jitter ±10 ms ±2 ms ✅ 80% beter

Waarom dit belangrijk is:

  • Audio processing wordt NOOIT geblokkeerd door WiFi
  • Lagere latentie = natuurlijker gesprek
  • Minder dropouts = betere audio kwaliteit
  • Stabielere timing = minder krakende audio

Configuratie Opties

Audio Kwaliteit Aanpassen

In src/main.cpp (PlatformIO) of de .ino file (Arduino)aliteit Aanpassen

In de sketch kun je de volgende parameters aanpassen:

#define SAMPLE_RATE     16000    // Verhoog naar 22050 of 32000 voor betere kwaliteit
#define AUDIO_BUFFER_SIZE 512    // Groter buffer = meer latency maar stabieler

Aanbevelingen:

  • 16 kHz: Goede stem kwaliteit, lage latentie (standaard)
  • 22.05 kHz: Betere kwaliteit, iets hogere latentie
  • 32 kHz: Beste kwaliteit, hogere CPU belasting

Audio Gain Aanpassen

Zoek in de code naar deze regel om de microphone gain aan te passen:

int32_t sample = audioBuffer[i] * 2; // 2x gain

Wissel het getal voor minder (1, 1.5) of meer (3, 4) versterking.

WiFi Kanaal

Alle devices moeten op hetzelfde WiFi kanaal zijn. Standaard is kanaal 1:

esp_wifi_set_channel(1, WIFI_SECOND_CHAN_NONE);

Troubleshooting

Geen Audio Ontvangst

  1. Check MAC adressen: Open Serial Monitor op beide devices en verifieer dat ESP-NOW is geïnitialiseerd
  2. WiFi kanaal: Zorg dat beide devices op hetzelfde kanaal staan
  3. Afstand: ESP-NOW heeft een bereik van ~100m in open ruimte, minder binnenshuis
  4. Check pinout: Verifieer alle aansluitingen

Audio is Vervormd

  1. Verlaag de gain in de code
  2. Check voeding: Zorg voor stabiele 5V met voldoende stroomsterkte
  3. Sample rate: Probeer een lagere sample rate
  4. Speaker impedantie: Gebruik een 4-8Ω speaker

Hoge Latentie

  1. Verklein AUDIO_BUFFER_SIZE: Probeer 256 in plaats van 512
  2. Verlaag SAMPLE_RATE: 8000 Hz is voldoende voor spraak
  3. Check WiFi interferentie: Verwijder andere WiFi bronnen in de buurt

ESP32 Reset of Crash

  1. Watchdog timeout: De DMA buffers kunnen te groot zijn. Verklein dma_buf_len
  2. Stack overflow: Als je veel code toevoegt, verhoog de stack size
  3. Power issues: Gebruik externe 5V voeding, niet alleen USB

Geen Geluid uit Speaker

  1. MAX98357A SD pin: Controleer of SD pin niet per ongeluk LOW is (dit schakelt de versterker uit)
  2. I2S configuratie: Verifieer dat de pinnen correct zijn ingesteld
  3. Speaker aansluitingen: Check + en - op de speaker
  4. Volume: Pas GAIN pin aan op de MAX98357A

Uitbreidingsmogelijkheden

1. Meerdere Kanalen

Modificeer de code om verschillende broadcast groepen te maken:

// Kanaal 1
uint8_t channel1[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0x01};
// Kanaal 2
uint8_t channel2[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0x02};

2. VOX (Voice Activated Transmission)

Voeg automatische transmissie toe bij geluidsdetectie:

if (audioLevel > VOX_THRESHOLD) {
    transmitAudio();
}

3. Audio Compressie

Implementeer μ-law of A-law compressie voor betere bandbreedte efficiëntie

4. Encryptie

Voeg AES encryptie toe aan ESP-NOW voor veilige communicatie

5. Display

Voeg een OLED display toe om status, signaalsterkte en batterij niveau te tonen

6. Batterij Power

Integreer een Li-Po batterij met laadcircuit voor portable gebruik

Technische Details

ESP-NOW Protocol

  • Maximum packetgrootte: 250 bytes
  • Latentie: ~10-20ms
  • *Project Structuur
Walkie/
├── platformio.ini              # PlatformIO configuratie
├── src/
│   └── main.cpp               # Main source (PlatformIO)
├── Walkie_Talkie_ESP32S3.ino  # Arduino IDE versie
├── README.md                   # Deze documentatie
└── .gitignore                 # Git ignore file

FAQ

Q: Kan ik volledige duplex (gelijktijdig praten en luisteren)?
A: Niet aangeraden met gedeelde pins. Voor echo-cancelling full-duplex heb je aparte clock lijnen nodig.

Q: Hoeveel units kunnen tegelijk communiceren?
A: ESP-NOW ondersteunt broadcast naar onbeperkt aantal ontvangers. Throughput wordt wel gedeeld.

Q: Wat is het bereik?
A: ~30-100 meter afhankelijk van omgeving. In open veld kan dit oplopen tot 200+ meter.

Q: Kan ik een externe antenne toevoegen?
A: Ja! De ESP32-S3 Supermini heeft vaak een U.FL connector voor externe antenne.

Q: Is encryptie mogelijk?
A: Ja, ESP-NOW ondersteunt AES encryptie. Zie peerInfo.encrypt = true; en stel een PMK sleutel in.

Support

Voor vragen of problemen, controleer de seriële monitor output voor debug informatie.

Serial Monitor:

  • PlatformIO: Klik op plug icoon onderaan of gebruik pio device monitor
  • Arduino IDE: Tools → Serial Monitor
  • Baud rate: 115200

I2S Audio

  • Bit depth: 16-bit
  • Sample rate: 16 kHz (configureerbaar)
  • Channels: Mono (links kanaal)
  • Format: Standard I2S format

Geschatte Bandbreedte

  • 16-bit samples @ 16 kHz = 32 kB/s (256 kbps)
  • Met overhead: ~35-40 kB/s

Licentie

Deze code is vrij te gebruiken, modificeren en distribueren voor persoonlijke en commerciële projecten.

Credits

Ontwikkeld voor gebruik met ESP32-S3 Supermini platform.

Support

Voor vragen of problemen, controleer de seriële monitor output voor debug informatie.

Monitor seriële poort met 115200 baud rate voor gedetailleerde logging.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages