Miniaturowe radio internetowe z ESP32

Miniaturowe radio internetowe z ESP32

Klasyczne radia są w dużej mierze wypierane przez inne media, takie jak telewizja czy, przede wszystkim, Internet. Istnieją stacje radiowe w Internecie, jednak, jak można się łatwo domyślić, nie można ich odbierać za pomocą zwykłego radia. Potrzebny jest do tego komputer. Jednak angażowanie komputera PC tylko do tak błahego zadania, jakim jest odtwarzanie muzyki, budzi wiele zastrzeżeń.

Zaprezentowana konstrukcja to kompaktowy odbiornik radia internetowego bazującego na niedrogim mikrokontrolerze ESP32 sprzęgniętym z przetwornikiem cyfrowo-analogowym. System ten, mimo pewnego minimalizmu, ma wszystko, co potrzebne do odtwarzania internetowego radia. MWR (Mini Web Radio) to proste radio internetowe, które zaprogramowane jest do odtwarzania pojedynczej stacji, można ją zmieniać w specjalnym panelu konfiguracyjnym. Konstrukcja jest zasilana bateryjnie, ma regulację głośności i gniazdo słuchawkowe jack 3,5 mm. Moduł zamknięty jest w obudowie wykonanej w technologii druku 3D. Pierwotnie radio zaprojektowane było jako projekt charytatywny.

Potrzebne elementy

Trzy kluczowe elementy omawianego radia to moduł z mikrokontrolerem ESP32, moduł z przetwornikiem DAC MAX98357A oraz bateria litowo-jonowa, która jest źródłem energii do zasilania urządzenia. Autor przygotował listę elementów elektronicznych i innych komponentów potrzebnych do zbudowania urządzenia. Obejmuje ona nie tylko moduły elektroniczne, ale także elementy dyskretne, elementy mechaniczne:

  • moduł WeMos Lolin32 Lite (można zastąpić dowolnym innym modułem z ESP32, jednak wtedy należy odpowiednio skorygować połączenia z wyprowadzeniami modułu),
  • moduł MAX98357A I²S DAC ze wzmacniaczem,
  • liniowy potencjometr 10 kΩ z wbudowanym przełącznikiem SPST,
  • oporniki 2×47 kΩ, 2×330 Ω o standardowej mocy 0,25 W,
  • dwie diody LED 3 mm,
  • uchwyt na ogniwo 18650,
  • dwie śruby M1,7×5 mm z łbem kopułkowym i jedna śruba M2×5 mm z łbem płaskim,
  • elementy z druku 3D (obudowa, panel przedni i pokrętło głośności),
  • przewody do połączenia modułów oraz koszulki termokurczliwe do ich zabezpieczenia.

Oprócz tego potrzebne będą pewne podstawowe narzędzia, które powinny być dostępne w warsztacie każdego elektronika:

  • lutownica,
  • obcinaczki do przewodów i narzędzie do zdejmowania izolacji,
  • pistolet na klej na ciepło.

Zasada działania

MWR dołącza się do zdefiniowanej sieci Wi-Fi i wtedy tworzy połączenie ze zdalnym serwerem radia internetowego. Układ odbiera i dekoduje strumień audio, a następnie wysyła go poprzez interfejs I²S do przetwornika cyfrowo-analogowego, który konwertuje dane cyfrowe na analogowy sygnał i podaje go na wzmacniacz, dzięki czemu do systemu można podłączyć niewielki głośnik, znajdujący się w radiu.

Urządzenie ma wbudowany panel konfiguracyjny dostępny przez przeglądarkę internetową, który umożliwia zdefiniowanie nazwy hosta, poświadczeń sieci bezprzewodowej i adresu URL odtwarzania. Aby włączyć tryb konfiguracji, należy wyłączyć urządzenie, otworzyć panel czołowy i założyć zworkę na wyprowadzenia13 i 15. W takim stanie uruchamiamy radio i łączymy się z siecią o nazwie MWR-WIFI-SETUP. Możemy teraz usunąć zworkę, a pozostając w tej sieci, w oknie przeglądarki wpisujemy adres strony internetowej jako adres IP – 192.168.1.1. Pojawi się panel, w którym można wprowadzić wszystkie szczegóły konfiguracji i finalnie nacisnąć przycisk Zapisz. Po zapisaniu urządzenie automatycznie uruchomi się ponownie, zacznie działać w trybie radia i rozpocznie odtwarzanie.

Oprogramowanie

Kod programu dla urządzenia został napisany w pełni w Arduino IDE i jest do pobrania z repozytorium na GitHubie. Przed przystąpieniem do kompilacji należy pobrać i zainstalować odpowiednie biblioteki oraz pliki konfiguracyjne. Firmware korzysta z następujących bibliotek:

  • ESPAsyncWebServer
  • ESP32-AudioI2S

Oprogramowanie budowane było z użyciem Arduino IDE w wersji 1.8.16 z ESP32 lib w wersji 1.0.6. W przypadku używania Arduino 2.x i ESP32 lib 2.x należy zmodyfikować linię w pliku MWR.ino:

WiFi.onEvent(WiFiStationDisconnected, SYSTEM_EVENT_STA_DISCONNECTED);

Należy zmienić na:

WiFi.onEvent(WiFiStationDisconnected, ARDUINO_EVENT_WIFI_STA_DISCONNECTED);

Finalnie, przed kompilacją, trzeba zainstalować jeszcze pakiet ESPTool_py i dodać adres URL do repozytorium z plikami konfiguracyjnymi dla płytki ESP32 (https://bit.ly/2MA5KTC). Za pomocą Board Managera możemy dodać teraz płytkę esp32 – by Expressif Systems (Narzędzia > Board Manager) i wybrać zastosowany moduł, w tym przypadku Lolin32 Lite.

Listing 1.

#include <Arduino.h>
#include <SPIFFS.h>
#include "mwr_radio.h";
#include "mwr_config.h";

// Definicje pinów
#define I2S_DOUT 27
#define I2S_BCLK 26
#define I2S_LRC  25
#define I2S_GAIN 14
#define I2S_SD 12
#define LED_BATT 5
#define LED_WIFI 18
#define VOL 34
#define MODE_0 13
#define MODE_1 15
int VBATT = 33;

// Inicjalizacja bibliotek
MWConfig mConfig;
MWRadio mRadio;

// Inicjalizacja kontrolera baterii
TaskHandle_t ChckBatTsk;

int mode = 0;   // Status trybu

void setup() {
 Serial.begin(115200);
 pinMode(LED_BATT,OUTPUT);
 pinMode(LED_WIFI,OUTPUT);
 if (!SPIFFS.begin(true)) {
   Serial.println("An error has occurred while mounting SPIFFS");
 }
 Serial.println("SPIFFS mounted successfully");
 // Zadanie kontrolera baterii uruchomione na drugim rdzeniu
 xTaskCreatePinnedToCore(
CheckBattery,"ChckBatTsk",10000,(void*)&VBATT,0,&ChckBatTsk,NULL);
 mode = mConfig.detectMode(MODE_0,MODE_1);  // Sprawdzenie trybu pracy
 if(!mode){   
   mConfig.apMode();
   while (WiFi.status() != WL_CONNECTED){flashLED(LED_WIFI,150);delay(500);}
 }else{      
   mConfig.stMode();
   while (WiFi.status() != WL_CONNECTED){flashLED(LED_WIFI,150);delay(500);}
   WiFi.onEvent(WiFiStationDisconnected, SYSTEM_EVENT_STA_DISCONNECTED);
 // Inicjalizacja audio
   mRadio.init(I2S_DOUT, I2S_BCLK, I2S_LRC, I2S_GAIN, I2S_SD);
   String url = mConfig.readUrlFromFile();
   mRadio.setStation(url);
 }
}

void loop() {
 if(mode){
   if(getVolume() >1){
    mRadio.setVolume(getVolume());
    mRadio.play();
   }
 }
}

int getVolume() {
 return map(analogRead(VOL), 0, 4095, 1, 20);
}

void CheckBattery(void * _VBATT) {
 int timer = 200;
 float voltage = 0.0;
 for(;;) {
   // sprawdzanie co 200 tików
   if(timer >= 200){
     // Odczyt napięcia
     voltage = (
(float)analogRead(*((int*)_VBATT)) / 4095) * 3.3 * 2 * 1.035;
     Serial.print("Battery:");
     Serial.println(voltage);
     Serial.print("RSSI:");
     Serial.println(WiFi.RSSI());
// Typowe napięcie ładowania
     if(voltage > 4) {                   
         flashLED(LED_BATT,500);flashLED(LED_BATT,250);
     }else{
       if(voltage > 3.7){
         digitalWrite(LED_BATT,HIGH);    // Zakres normalny
       }else{
         if(voltage > 3.5){              // Zakres niski
           flashLED(LED_BATT,500);
         }else{                   
           flashLED(LED_BATT,150);       // Zakres bardzo niski
           if(voltage <= 3.0){
// Bateria rozładowania, usypianie ESP32
             flashLED(LED_BATT,50);      
             Serial.println("Battery low, going to sleep");
             delay(1000);
             Serial.flush();
             esp_deep_sleep_start();
           }
         }
       }
     }
   timer++;
  }
 }
}

void flashLED(int LED, int SPEED){
 digitalWrite(LED,HIGH);
 delay(SPEED);
 digitalWrite(LED, LOW);
 delay(SPEED);
}

void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){
 Serial.println("Disconnected from WiFi access point");
 Serial.print("WiFi lost connection. Reason: ");
 Serial.println(info.disconnected.reason);
 Serial.println("Trying to Reconnect");
 WiFi.reconnect();
}

Szkic Arduino pokazany jest na listingu 1. Oprócz wskazanego szkicu potrzebne są jeszcze pliki mwr_radio.h oraz mwr_config.h, które można pobrać z repozytorium na GitHubie. System umożliwia konfigurację z poziomu interfejsu webowego (opisaną powyżej), ale możliwe jest również wstępne skonfigurowanie systemu, wpisując dane dotyczące sieci Wi-Fi (SSID i hasło) oraz pozostałe ustawienia sieciowe (host, url) w odpowiednich plikach tekstowych w folderze /data. W repozytorium przygotowane są odpowiednie pliki, które należy tylko wypełnić.

Montaż

Montaż systemu jest bardzo prosty. Aby urządzenie było możliwie kompaktowe, autor proponuje polutowanie wszystkich modułów za pomocą krótkich przewodów. Całość, dzięki temu, mieści się bez problemu w obudowie, której pliki STL (do druku 3D) zamieszczone są na stronie projektu. W czasie, gdy obudowa radia się drukuje, można przystąpić do montażu elektroniki. Schemat ideowy układu jest pokazany na rysunku 1.

Rysunek 1. Schemat ideowy układu

W pierwszej kolejności należy przygotować moduł z mikrokontrolerem ESP32. W tym celu z modułu Lolin32 należy wylutować złącze baterii i wlutować w nie przewody (fotografia 1).

Fotografia 1. Moduł z ESP32 z przylutowanymi przewodami do podłączenia ogniwa litowo-jonowego

Potrzebne jest około 10 cm przewodów. Następnie drugą stronę przewodów należy przylutować do uchwytu baterii (ogniwa 18650). Do obu biegunów trzeba przylutować także po oporniku 47 kΩ – utworzą one dzielnik, który posłuży do pomiaru napięcia przez przetwornik analogowo-cyfrowy (ADC) w mikrokontrolerze – jak pokazano na fotografii 2a i 2b. Wyprowadzony przewód lutujemy do padu 33 na module z mikrokontrolerem.

Fotografia 2. Uchwyt ogniwa 18650: a) z przylutowanymi przewodami i opornikami; b) oporniki połączone w dzielnik napięcia z przylutowanym przewodem (żółty) i zabezpieczone koszulką termokurczliwą

Podłączenie modułu MAX98357A

Kolejnym krokiem jest podłączenie do systemu przetwornika cyfrowo-analogowego (DAC), który będzie generował dźwięk. Jako DAC zastosowano moduł z układem MAX98357A, który podłączony jest do interfejsu I²S. Ma on zintegrowany wzmacniacz, więc można podłączyć go bezpośrednio do głośnika w systemie. Z drugiej strony moduł musi być podłączony do mikrokontrolera. W tym celu, od listwy goldpinów, jaka jest dostarczana z urządzeniem, odcinamy jeden pin, aby pozostało ich 6 i wlutowujemy w moduł, jak pokazano na fotografii 3.

Fotografia 3. Moduł przetwornika DAC ze wzmacniaczem

Niezapełniony pozostawiamy pin zasilania (VIN), w miejsce którego lutujemy około 15 cm przewodu (najlepiej w kolorze czerwonym), który zostanie podłączony do linii napięcia 3,3 V w systemie. Moduł DAC jest następnie osadzany na module z mikrokontrolerem ESP32, jak pokazano na fotografii 4.

Fotografia 4. Moduł DAC umieszczony na module z mikrokontrolerem ESP32

Umieszczając moduły jeden na drugim, należy zwrócić uwagę na piony masy (GND), jeśli dopasują się, to znaczy, że moduł DAC jest na swoim miejscu (schemat wyprowadzeń płytki Lolin32 na rysunku 2).

Rysunek 2. Schemat wyprowadzeń płytki Lolin32

Przełącznik i diody LED

Finalnym elementem elektronicznym, jaki dołączany jest do systemu, jest potencjometr, zintegrowany z przełącznikiem oraz diody LED sygnalizujące status urządzenia. Na fotografii 5 pokazano zastosowany przełącznik/potencjometr. W pierwszej kolejności należy przylutować mostek, wykonany z odcinka pocynowanego drutu, pomiędzy jedną z nóg przełącznika (tylną) a jedną stroną potencjometru, jak na fotografii 5.

Fotografia 5. Podłączenie przewodów do potencjometru/przełącznika

Do zmostkowanej nogi podłączany jest następnie czerwony przewód z akumulatora. Następnie czerwony przewód (zasilanie) z modułu z ESP32 podłączany jest do przeciwległej nogi przełącznika. Na koniec docinamy odcinek około 5 cm czarnego przewodu, którym łączymy masy w systemie i dołączamy go do przeciwległego wyprowadzenia potencjometru. Całość zabezpieczamy koszulkami termokurczliwymi. Do środkowego wyprowadzenia mocujemy około 10 cm żółtego przewodu. Podłączamy go do drugiego wejścia analogowego w module z mikrokontrolerem. Poziom napięcia z dzielnika posłuży do programowego sterowania poziomem głośności. Podajemy go na pad 34 modułu z mikrokontrolerem.

Fotografia 6. Potencjometr zamontowany w panelu przednim

Po podłączeniu potencjometru-przełącznika do systemu można zamontować go w obudowie, w panelu przednim, jak pokazano na fotografii 6. Na płycie czołowej umieszczone są także dwie diody LED. Anody diod połączone i zlutowane są ze sobą. Do nich dołączony jest czarny przewód masowy, jaki przygotowano wcześniej. Z kolei katody LED przycięte są do około 10 mm, a następnie dolutowano do nich przewody o długości około 10 cm każdy. Do padów 5 oraz 18 modułu z mikrokontrolerem należy przylutować oporniki 330 Ω. Drugie wyprowadzenie opornika powinno być przycięte do około 10 mm, a następnie przylutowane do przewodów biegnących do diod LED (fotografia 7).

Fotografia 7. Wygląd konstrukcji przed zamknięciem obudowy

Podsumowanie

Po połączeniu wszystkich elementów i zaprogramowaniu mikrokontrolera poprzez Arduino IDE możemy zamknąć system w drukowanej obudowie i rozpocząć korzystanie z niego. Jeśli nie wpisaliśmy wcześniej danych do oprogramowania, ustawmy je za pomocą interfejsu webowego i cieszmy się przenośnym radiem internetowym, które będzie się niewiele różnić od klasycznych odbiorników radiowych.

Nikodem Czechowski, EP

Źródło

Artykuł ukazał się w
Elektronika Praktyczna
październik 2022

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik kwiecień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio maj - czerwiec 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje kwiecień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna kwiecień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich maj 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów