Home Admin Informazioni su About

Un Walkie Talkie con ESP32

Cover Image

Un walkie-talkie basato sull'ESP32. Trasmette l'audio utilizzando UDP Broadcast o ESP-NOW.

Componenti hardware

x1

Breakout dell'amplificatore di classe D di Adafruit I2S 3W - MAX98357A
https://www.adafruit.com/product/3006

x1

I2S MEMS Microfono Breakout Bord
Utilizza l'INMP441 o la mia scheda ICS-43434

x1

Altoparlante generico da 4ohm o 8ohm
Disponibile da Amazon e altri negozi di hobby

x1

Scheda di sviluppo ESP32 generica
Praticamente qualsiasi scheda dovrebbe funzionare fintanto che ha sufficienti pin GPIO liberi

x1

Interruttore a pulsanteFacoltativo: puoi utilizzare l'interruttore integrato nella scheda di sviluppo.

Descrizione

Abbiamo realizzato un walkie-talkie utilizzando ESP32.

I dati audio vengono trasmessi tramite trasmissione UDP o ESP-NOW. Quindi il Walkie-Talkie funzionerà anche senza una rete WiFi!

L'ho basato su un microfono I2S e un amplificatore I2S, ma funzionerà ugualmente bene con microfoni e cuffie analogici con una piccola modifica al codice.

Dettagli

C'è un piccolo video qui che offre una panoramica del progetto.

Puoi accedere al progetto Fusion360 qui: https://a360.co/2PXgAUS , quindi sentiti libero di stampare la tua versione se lo desideri.

Per il microfono nel video, sto usando la mia scheda microfono ICS-43434 ma funzionerà altrettanto bene con la scheda microfono INMP441.

Questi sono entrambi microfoni I2S che si interfacciano direttamente con ESP32.

La scheda dell'amplificatore I2S 3W è di Adafruit e alimenta l'altoparlante. Anche questo si interfaccia direttamente con ESP32.

Per la scheda ESP32, sto usando un TinyPICO, ma qualsiasi scheda di sviluppo generica può essere utilizzata poiché non stiamo utilizzando alcuna funzionalità speciale in questo progetto.

Sto usando un PCB personalizzato - l'ho inventato dalle persone fantastiche di PCBWay - come al solito, hanno fatto un ottimo lavoro e sono davvero soddisfatto di come sono uscite le schede.

Ho molti progetti audio ed è davvero bello poter collegare le cose insieme e non doversi preoccupare che i cavi vadano ovunque. L'unica leggera omissione che ho fatto non è stata quella di rompere i restanti pin GPIO, quindi penso che farò presto una versione 2 della scheda.

Ecco un collegamento allo schema e al PCB su EasyEDA  e un collegamento per ordinare la scheda direttamente da PCBWay, se lo si desidera .

Detto questo, non hai davvero bisogno di un PCB, puoi semplicemente collegare tutto su breadboard - ed è esattamente quello che ho fatto quando stavo prototipando.

 

Lo schema è molto semplice: stiamo usando le schede I2S sia per il microfono che per l'altoparlante, il che rende il cablaggio di queste all'ESP32 molto semplice.

Ovviamente puoi modificare il codice per utilizzare l'ADC integrato per l'input e il DAC integrato per l'output. Molto utile se si desidera utilizzare schede microfoniche analogiche e un jack per cuffie per l'uscita.

Ho aggiunto un po 'di circuiti extra alla mia scheda per creare un alimentatore pulito per i microfoni. Se guardi alcuni dei miei video precedenti, ricorderai che percepivamo molto rumore sui microfoni durante l'utilizzo del WiFi.

Per risolvere questo problema di rumore stiamo creando un alimentatore pulito da 3,3 V per i microfoni prendendo un'alimentazione diretta dalla batteria, filtriamo questo con un filtro LC e poi lo passiamo a un regolatore Low Drop Out. Questo ci dà un alimentatore davvero bello e pulito per i microfoni che rimuove molti problemi di rumore.

Tutto il codice è su GitHub: dovrebbe essere per lo più autoesplicativo, ma qui fornirò una panoramica di alto livello.

La sfida principale con questo progetto è come trasmettere l'audio da un walkie-talkie a tutti gli altri walkie-talkie.

L'ho implementato in due modi diversi. Puoi passare facilmente da uno all'altro nel codice con una semplice definizione di hash.

Il primo modo è utilizzare la trasmissione UDP. La trasmissione UDP è un meccanismo molto semplice. Si invia un pacchetto UDP a un indirizzo IP speciale e il router trasmette questo pacchetto a tutti gli altri dispositivi sulla rete.

Possiamo inviare in sicurezza fino a 1436 byte in un pacchetto UDP, quindi se campioniamo a 16 KHz e utilizziamo campioni a 8 bit, si tratta di circa 90 ms di dati audio. Quindi dobbiamo inviare circa 11 pacchetti al secondo. Ciò rientra nelle capacità dell'ESP32.

Il grande vantaggio dell'utilizzo di UDP broadcast è che non abbiamo bisogno di sapere dei nostri colleghi, possiamo semplicemente trasmettere un messaggio e chiunque lo stia ascoltando lo riceverà. Inoltre, non abbiamo bisogno di un server centralizzato a cui tutto si connette. Tutto il sollevamento di carichi pesanti viene eseguito dal router.

Tuttavia, ci sono alcuni svantaggi di UDP di cui dovremmo essere consapevoli:

  • La consegna di pacchetti UDP è solo il massimo sforzo: non vi è alcuna garanzia che qualcuno riceverà il pacchetto inviato.
  • Inoltre, non vi è alcuna garanzia per l'ordinazione dei pacchetti: qualcuno potrebbe ricevere i pacchetti che hai inviato in ordine completamente casuale.

Per questo progetto, ho scelto di ignorare questi due problemi. Con i pacchetti broadcast, generalmente rimaniamo nella stessa rete, quindi probabilmente non perderemo troppi pacchetti e probabilmente anche i nostri pacchetti arriveranno nell'ordine corretto. Se non lo fanno, avremo solo un po 'di rumore e distorsione sull'audio.

L'altro grande vantaggio della trasmissione UDP è che puoi ricevere i pacchetti sul tuo computer desktop o sul tuo telefono, quindi sarebbe abbastanza facile creare client aggiuntivi non basati su ESP32.

Il secondo modo in cui ho implementato il trasporto è utilizzare ESP-NOW.

ESP-NOW è un protocollo sviluppato da Esppresif che consente a più dispositivi ESP di comunicare tra loro senza bisogno del WiFi.

Questo ci offre un grande vantaggio rispetto all'opzione UDP in quanto non abbiamo bisogno di una rete WiFi per far funzionare il nostro Walkie-Talkie.

Lo svantaggio di ESP-NOW è che ha una dimensione del pacchetto molto più piccola di 250 byte. Ciò significa che dobbiamo inviare pacchetti 64 volte al secondo.

Abbiamo anche gli stessi svantaggi dell'UDP: la consegna dei pacchetti è il massimo sforzo e non vi è alcuna garanzia in quale ordine arriveranno i pacchetti.

Tuttavia, nei miei test, ha funzionato abbastanza bene.

Una volta risolto il problema del trasporto, dobbiamo solo collegare tutto.

Abbiamo l'ingresso I2S: questo legge i campioni dal microfono e li passa al nostro trasporto.

Una volta che il trasporto ha accumulato dati sufficienti per riempire un pacchetto, invia i dati tramite UDP o ESP-NOW.

Dall'altro lato, abbiamo lo stesso trasporto che ascolta i pacchetti. Ogni volta che viene ricevuto un pacchetto, mette in coda i dati per la riproduzione tramite la nostra uscita I2S. L'uscita I2S ha appena inviato i campioni all'amplificatore I2S.

Per consentire ai pacchetti che impiegano un po 'più di tempo per arrivare, abbiamo un buffer tra il trasporto e l'uscita I2S. Lasciamo trascorrere un po 'di tempo prima di iniziare a riprodurre i campioni - questo ci dà un po' di tempo libero per consentire il jitter dei pacchetti. Viene a costo di una certa latenza nell'audio: tenendo conto di tutto, l'audio viene riprodotto circa mezzo secondo dopo che è stato realizzato.

Tutto sommato, anche se il progetto funziona. La qualità non è sorprendente, ma è sicuramente sufficiente per un progetto hobby.

Come sempre, il codice è tutto su GitHub. Fammi sapere cosa ne pensi nei commenti. E se hai miglioramenti, apri una richiesta pull.

Alcune idee che sarebbe utile esaminare:

  • Compressione dell'audio per ridurre la larghezza di banda.
  • Controllo automatico del guadagno
  • Cancellazione dell'eco in modo da poter avere il full-duplex

Probabilmente ci sono un sacco di altri miglioramenti, quindi sentiti libero di hackerare!

SCHEMATICO

CODICE SORGENTE

Scaricalo da GitHub

______________

Sorgente articolo

Your Reaction to this Post?

Currently there are no comments, so be the first!