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:
Należy zmienić na:
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.
#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.
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).
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.
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.
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.
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).
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.
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.
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).
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