- PVSM.RU - https://www.pvsm.ru -

ESP32 development board с кастомным дизайном

Наконец то у меня добрались руки до сборки минимального аналога Espressif Systems плат на ESP32 микроконтроллере.

На плате расположен микрофон, усилитель для этого микрофона на одном транзисторе. Усилитель для динамика на трех транзисторах с выходным каскадом работающим в режиме AB. OLED дисплей 128x64 SSD1306

ESP32 development board с кастомным дизайном - 1

Espressif Audio Development Framework [1] предоставляет богатую функциональную SDK которая работает все стабильнее с каждым релизом. Не без своих косяков конечно. Есть у нее и минусы. Например некоторые библиотеки предоставляются без исходных кодов. В линейке плат не было версии с использованием внутреннего ЦАП и АЦП для обработки звука. Конечно для чего-то серьезного такой подход не подойдет. И разрядность встроенного АЦП 12 бит и ЦАП 8 бит накладывает некоторые ограничения. Да и шумят эти встроенные модули не слабо. Но хотелось попробовать сделать если уж не VoIP телефон, то пример Google Translator и Text-To-Speech постараться запустить. Как это у меня получилось читайте под катом

Плата проектировалась и разводилась в Eagle Autodesk.

ESP32 development board с кастомным дизайном - 2

ESP32 Module Amplifiers

ESP32 development board с кастомным дизайном - 3

OLED Display

ESP32 development board с кастомным дизайном - 4

«Поднимать» плату будем традиционно с питания. Распаиваем разъем питания, стабилизатор напряжения питания и конденсатор на выходе это стабилизатора. Замеряем напряжение питания. На входе 5V после стабилизатора должно быть 3.3V

Плата задумывалась работать в переносном варианте с питанием от аккумулятора. Для этого предусмотрен чип IC2 отвечающий за заряд батареи TP4056 и схема барьера на полевом транзисторе Q3 и диоде Шоттки D3. Стабилизатор питания сделан на HT7833. Он обеспечивает малое падение напряжения и достаточный для питания схемы ток

Цепь зарядки нас пока не интересует, поэтому кинем перемычку с разъема питания прямо на вход HT7833. Померяем что на выходе и приступим к распайке самого модуля ESP32

Надо распаять цепь Reset и кнопку PROG которую надо удерживать для перевода контроллера в режим программирования. Пины для подключения UART адаптера RX-TX нужны для соединения платы с компьютером

Теперь можно подключать плату к компьютеру через USB-to-UART адаптер и запустить какой нибудь пример esp-idf. Например сканирования сети

ESP32 development board с кастомным дизайном - 5

Далее распаиваем усилитель для динамика и микрофона. Про использование усилителей для микрофона и динамика можно прочитать в статье Микрофонный усилитель и УНЧ для ЦАП и АЦП микроконтроллера [2]

Настраиваем резистором R15 половину напряжения на эмиттерах T3 и T4 в схеме усилителя динамика. У меня подошел резистор 33К. R17 можно поставить поменьше 1K… 4.7K если усиления будет недостаточно. Он ограничивает усиление и выступает в качестве делителя напряжения

Для усилителя микрофона резистором R10 подбираем на коллекторе транзистора T2 напряжение в районе 0.6V...1.2V. Чем больше смещение при слабом сигнале, тем больше потери на разрядности АЦП. Так как у нас один каскад усилителя на одном транзисторе, амплитуда сигнала будет не большая. Я поставил 100К и получил 0.85V. Полная амплитуда сигнала full-scale voltage будет 1.7V что можно компенсировать аттенюатором на входе АЦП взяв например ADC_ATTEN_DB_2_5

Напомню про градации аттенюатора на входе АЦП ESP32

  • 0 dB attenuation (ADC_ATTEN_DB_0) gives full-scale voltage 1.1 V
  • 2.5 dB attenuation (ADC_ATTEN_DB_2_5) gives full-scale voltage 1.5 V
  • 6 dB attenuation (ADC_ATTEN_DB_6) gives full-scale voltage 2.2 V
  • 11 dB attenuation (ADC_ATTEN_DB_11) gives full-scale voltage 3.9 V

Теперь уже можно запустить что-то со звуком. Что касается примеров рассчитанных на внешний ЦАП тут все просто, в настройках конфигурации добавляем I2S_MODE_DAC_BUILT_IN

i2s_config_t i2s_config = {
        .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN,
...

Или при использовании esp-adf audio development framework

struct i2s_stream_cfg_t i2s_cfg = I2S_STREAM_INTERNAL_DAC_CFG_DEFAULT();

В частности это изменение для примера pipeline_bt_sink [3] позволяет получить на этой плате BlueTooth динамик

Есть пример который выдает синусоидальный сигнал dac-cosine [4]

Замена использования внешнего АЦП на внутренний так же возможна, но это будет несколько сложнее. Я это делаю примерно так

#define I2S_STREAM_CFG_1() {                                              
    .type = AUDIO_STREAM_WRITER,                                                
    .task_prio = I2S_STREAM_TASK_PRIO,                                          
    .task_core = I2S_STREAM_TASK_CORE,                                          
    .task_stack = I2S_STREAM_TASK_STACK,                                        
    .out_rb_size = I2S_STREAM_RINGBUFFER_SIZE,                                  
    .i2s_config = {                                                             
        .mode = I2S_MODE_MASTER  | I2S_MODE_RX | I2S_MODE_TX | I2S_MODE_ADC_BUILT_IN | I2S_MODE_DAC_BUILT_IN,                    
        .sample_rate = SAMPLE_RATE,                                                   
        .bits_per_sample = I2S_BITS_PER_SAMPLE,                                                  
        .channel_format = I2S_CHANNEL_FMT,                           
        .communication_format = I2S_COMM_FORMAT_I2S_MSB,                            
        .dma_buf_count = 4,                                                     
        .dma_buf_len = 512,                                                     
        .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,                               
    },                                                                          
    .i2s_port = I2S_NUM_0 
}

И заменяю дефолтный конфиг esp-adf framework на свой

i2s_stream_cfg_t i2s_cfg = I2S_STREAM_CFG_1();
i2s_cfg.type = AUDIO_STREAM_READER;

Продолжение сборки и запуск примеров в видео:

Используя эти подходы по замене внешнего ЦАП и АЦП на встроенный мне удалось запустить такие примеры как:
pipeline_http_mp3 [5]
pipeline_bt_sink [3]
google_translate_device [6]

ESP32 development board с кастомным дизайном - 6

И многие другие

На плате предусмотрена разводка под джойстик 4+1 кнопки, так что можно реализовать мини консоль Arduboy

Запустить VoIP [7] пока не удалось. Но думаю у меня возникли проблема с настройками протокола. Так что пока в процессе. Но опять же, библиотека SIP в примере закрытая. Есть пример на Github sip_call [8] с другой и открытой реализацией SIP библиотеки

В заключении хотел отметить, что я вывел на плате некоторые неиспользованные порты GPIO для подключения периферии. Возможность подключения внешнего ЦАП и АЦП все еще остается, что надо проверить

Автор: Andreev Dmitry

Источник [14]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/gadzhety/354458

Ссылки в тексте:

[1] Espressif Audio Development Framework: https://github.com/espressif/esp-adf

[2] Микрофонный усилитель и УНЧ для ЦАП и АЦП микроконтроллера: https://habr.com/ru/post/485402/

[3] pipeline_bt_sink: https://github.com/espressif/esp-adf/tree/master/examples/player/pipeline_bt_sink

[4] dac-cosine: https://github.com/krzychb/dac-cosine

[5] pipeline_http_mp3: https://github.com/espressif/esp-adf/tree/master/examples/player/pipeline_http_mp3

[6] google_translate_device: https://github.com/espressif/esp-adf/tree/master/examples/cloud_services/google_translate_device

[7] VoIP: https://github.com/espressif/esp-adf/tree/master/examples/advanced_examples/voip

[8] sip_call: https://github.com/chrta/sip_call

[9] esp-idf: https://github.com/espressif/esp-idf

[10] Working with ESP32 Audio Sampling: https://www.toptal.com/embedded/esp32-audio-sampling

[11] Sound Level Meter with Arduino IDE, ESP32 and I2S MEMS microphone: https://hackaday.io/project/166867-esp32-i2s-slm

[12] ESP8266 VoIP/RTP pager: http://tomeko.net/projects/rtp_pager/

[13] ArduinoSIP: https://github.com/dl9sec/ArduinoSIP

[14] Источник: https://habr.com/ru/post/507980/?utm_source=habrahabr&utm_medium=rss&utm_campaign=507980