macsbug

CO2 monitor with M5Stack and LVGL

leave a comment »

M5Stack と LVGL で CO2 , TVOC モニターを製作しました。      2021.07.05

CO2 , TVOC Digital CO2 Gauge
CO2 Chart TVOC Chart
M5Stack へ CCS811 CO2 VOC Sensor を接続:費用は 1000円


.
仕様:
1. 表示:eCO2 , TVOC Digital , eCO2 Gauge , eCO2 Chart , TVOC Chart
2. CCS811 10sec / 1 sec Sample:起動時に B Button を押すと 1sec,。通常は10sec。
3. 表示切り替え:左 = A Button , 右 = C Button
4. Auto / Manual Display:画面切り替えを 手動 又は 自動切り替え:B Buttonを押します。

構成:
1. 開発機種:MacBook Pro (16-inch, 2019) , macOS Catalina Ver 10.15.7
2. 開発環境:Arduino IDE 1.8.15
3. 開発環境:Board Manager:ES32 Arduino 1.0.6
4. Library:m5stack / M5Stack
5. Library:LVGL ( LittleVGL ):lv_arduino
6. Library:LGFX;LovyanGFX:高速化が可能です。
7. HARD:M5Stack
8. HARD:CCS811 CO2 VOC Sensor

DownLoad:lv_CCS811_M5Stack.zip:DL後 pdfを削除しzipを解凍します。
memo.ino に 開発に便利なメモが書かれています。


.
費用:1000円。( Without M5Stack )

No. Nomen Price
1 CCS811 Module 820円
2 CASE、基板、コネクター 180円
Total 1000円

メモ:AliExpress HNV Official Store:リストにある販売店は輸送期間 37日で少し長いです。
メモ:国内では 2000円から3000円等の 高い価格がありますので お調べください。
メモ:CJMCU-8128:二酸化炭素, 温度, 湿度, 気圧。 多数 測定可能なセンサー
_   価格=1723円 ($15.49)。輸送期間=17日。
_   CCS811:二酸化炭素。SI7021(校正付き) :温度, 湿度。BMP280:気圧。
_   CCS811+SI7021+BMP280 Carbon Dioxide Temperature Humidity 3in1 Module
メモ:CJMCU-8128+CCS811+HDC1080+BMP280:$16


.
配線:
CCS811:5本 ( VCC, GND, SCL, SDA, WAK )

CCS811 VCC GND SCL SDA WAK
M-BUS 3V3 GND 22 21 GND


.
M5Stackの A と C button で touchpad controll する方法。
_ tabview上に tabを4つ作ります。例:eCO2 TVOC , eCO2 , eCO2 , TVOC
_ tabの位置に touchpad操作をすると そのtabが選択されます。
_ touchpad 方式は x,y で位置を決めます。
_ M5stack は ボタンが3つの為に x,y 操作はできません。
_ y を固定し x を操作します。事前に x,y を決めて A, C Button で操作する方法もあります。
_ A Buttonで左、C Buttonで右 に touchpad操作で画面が移動します。
_ touchpadの state (LV_INDEV_STATE_PR) と x,y 情報が
_ lv_indev_drv.read_cb = my_touchpad_read; に接続され tab(1,2,3,4) が表示されます。
_ int tb = 4; :tab の数だけ設定しますと x の位置が自動的に計算されます。


my_touchpad_read:

int tb = 4;
//=====================================================================
int mx = screenWidth/(tb*4), my = 10, md = screenWidth/tb;
// Read M5Stack A B,C buttons as touchpad : Tabview select ------------
static bool my_touchpad_read(lv_indev_drv_t * indev_driver,
                             lv_indev_data_t * data){
  // A Button : Leftward ----------------------------------------------
  if (M5.BtnA.wasPressed()){
    mx = mx - md; if (mx < 0){ mx = screenWidth - (md / 4);}
    data->point.x = mx; data->point.y = my;
    data->state =LV_INDEV_STATE_PR; M5.update(); return true;
  }
  // C Button : Rightward ---------------------------------------------
  if (M5.BtnC.wasPressed()){
    mx = mx + md; if (mx > screenWidth){ mx = md / 4;}
    data->point.x = mx; data->point.y = my;
    data->state =LV_INDEV_STATE_PR; M5.update(); return true;
  }
  // B Button : Auto / Manual Display ---------------------------------
  if (M5.BtnB.wasPressed()){
    auto_man = !auto_man;          M5.update(); return false;
  }
  // No button operation ----------------------------------------------
  data->state =LV_INDEV_STATE_REL; M5.update(); return false;
}
//=====================================================================

my_touchpad_read の state と x,y 情報は
indev_drv.read_cb = my_touchpad_read; に接続されます。

// Initialize the Touch pad =========================================
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&amp;indev_drv);     //input device driver
indev_drv.type = LV_INDEV_TYPE_POINTER;//Touch pad is a pointer-like
indev_drv.read_cb = my_touchpad_read;  //Set your driver function
lv_indev_drv_register(&amp;indev_drv); //Finally register the driver
//-------------------------------------------------------------------

.
既製品:屋内多機能空気検出器
測定項目:HCHO,TVOC,TEMP,HUM,CO2,PM2.5,OM1.0,PM10
表示:数値表示とグラフ表示。
価格:11514円 ( $ 110.78 )。
輸送期間:20日。
販売:Aliexpress Gas Analyzer Store;ここの販売店は 他のGas Analyzer製品が多数あります。

同様な商品は IOT初期に 3〜5万円で 高価で購入するまでには至りませんでした。
この商品は 測定項目多く, 表示機能高く, ワーニング機能, 低価格, デザイン良く家庭で使用できます。
これらの機能やケースを全て含んだ電子工作をすると1万円以上になります。
さらに、綺麗なケースは作れません。そして 温度、湿度、気圧、CO2センサー等を作る経験では、
キャリブレーション,エージング、補正等々で難儀します。

結果、作るよりも既製品を購入した方が 合理的です。
よって、私は 電子工作で幾つか製作しましたが、この既製品を使用しています。
購入時の注意は フルスペックを選択します。センサーの少ない同等品は その分 安くなっています。

M5StackのPM2.5 大気質センサキットは 温度,湿度,空気質(PM2.5)のみで6350円もします。
そして サンプルは デイスプレーに数値を出す程度です。


.
LovyanGFXで高速化;
以下の様に記述しますと画面切り替えが速くなります。
M5Stack で使用する場合。

#pragma GCC optimize ("Ofast")
#include <M5Stack.h>
#include <lvgl.h>

LGFX で使用する場合。M5.Lcd を tft に変更し M5StackのSwicth命令は そのまま使用できます。

#pragma GCC optimize ("Ofast")
#include <M5Stack.h>
#define LGFX_AUTODETECT
#define LGFX_USE_V1
#include <lvgl.h>;
#include <LovyanGFX.hpp>;
static LGFX tft;

.
感想:
CO2センサーには 金属ケースに入ったタイプがあり サイズが大きく不便です。
CCS811 は 小型で工作が容易、ケースも小さくて済みます。
CCS811 センサーは 1sec Sample で 40度になると言われており、寿命が低下します。
その為に ファンで冷やすか 10sec 又は 60sec Sample で動作させるかになります。

デザインは、M5Stack の画面サイズに入るように作成しました。
画面ギリギリに作成するとスクロールバーが出てきますので、表示しない様にしています。
LVGLで見易く操作性を追求すると、限りなく既製品のデザインや機能のソフトに近づきます。

A,B,Cボタンしか無い M5Stackでマウス操作は難しいです。
LVGL Forum では ボタン操作のアイデアが投稿されています。
画面のスライドはマウスを「なぞる」事で上下左右 ができます。
このスライド「なぞる」事を検知する方法は まだ出来ておらず課題です。
タッチパットのあるディスプレーは 操作性が良いです。 M5Stackの様な
機械的なボタン操作は「操作している感触が指に伝わり、やり易い」面があります。

 


.
.
M5Stack , LVGL , CCS811 , CO2 , eCO2 , TVOC , LGFX , LovyanGFX

Written by macsbug

7月 5, 2021 at 10:52 am

カテゴリー: ESP32, M5STACK

LVGL with M5Stack Part 2

leave a comment »

M5Stack で LVGL を動かす その2。           2021.07.03

LVGL は多彩な表示が出来るグラフィックス ライブラリーです。
LVGL Library を使用すると、動画の様な表示が容易にできます。
例えば、針の形、目盛りの数値と間隔、色、等を容易に変更できます。
参考:How to run LVGL on M5Stack ( ESP32 )

初めての LVGL 体験で、何も解らず メモを備忘録として記載しています。

 
構成:
1. 開発機種:MacBook Pro (16-inch, 2019) , macOS Catalina Ver 10.15.7
2. 開発環境:Arduino IDE 1.8.15
3. 開発環境:Board Manager:ES32 Arduino 1.0.6
4. Library:m5stack / M5Stack
5. Library:LVGL ( LittleVGL ):lv_arduino
6. Library:LGFX;LovyanGFX:高速化が可能です。
 



.
スケッチの詳細:以下、4点について記載します。
1. 開発メモ と 宣言。
2. loop:タスクと入力処理。
3. disaplyの設定:決まりの部分。
4. setup:objet の 設定。
メモ:ebent処理は、使用していません。
.
GAUGE;
DownLoad:LVGL_Gauge_M5Stack.zip:DL後 pdfを削除しzipを解凍します。

開発メモ と 宣言:
メモ;URLを参考にプログラムできます。
宣言:
_ #pragma GCC optimize (“Ofast”) から
_  static lv_color_t buf[LV_HOR_RES_MAX * 10]; までは、決まりの部分です。
_ 35行目の static lv_obj_t * gauge; は、LVGLで表示するオブジェットです。

//=====================================================================
// GAUGE   : 2021.06.15 : macsbug
//---------------------------------------------------------------------
// Development : Arduino IDE 1.8.15
// LVGL    : v7.11.0-dev : https://docs.lvgl.io/7.11/
// Document: https://docs.lvgl.io/latest/en/html/widgets/
// Tabview : https://docs.lvgl.io/latest/en/html/widgets/tabview.html
// Label   : https://docs.lvgl.io/latest/en/html/widgets/label.html
// Guage   : https://docs.lvgl.io/latest/en/html/widgets/gauge.html
// L_Meter : https://docs.lvgl.io/latest/en/html/widgets/linemeter.html
// Forum   : https://forum.lvgl.io
// ESP32   : LVGL : https://programmersought.com/article/10128234373/
// HARD    : M5Stack.h
//    https://github.com/m5stack/M5Stack/blob/master/src/M5Stack.h#L19   
// BLOG    : How to run LVGL on M5Stack ( ESP32 )
//         : https://macsbug.wordpress.com/2021/06/18/
// BLOG    : ButtonA on M5Stack does not work properly
//         : https://macsbug.wordpress.com/2021/05/02/
// BLOG    : LVGL with M5Stack Part 2
//    https://macsbug.wordpress.com/2021/07/03/lvgl-with-m5stack-part-2/ 
//=====================================================================

#pragma GCC optimize ("Ofast")
#include <M5Stack.h>
#include <lvgl.h>
int screenWidth  = 320;
int screenHeight = 240;
#define LVGL_TICK_PERIOD 30
#include <Ticker.h>
Ticker tick;
#include <driver/adc.h>
static lv_disp_buf_t disp_buf;
static lv_color_t buf[LV_HOR_RES_MAX * 10];

static lv_obj_t * gauge;
uint32_t pointer = 0, inc = 1;
uint32_t lastMillis = 0;
int adc1_ch7 = 35; // GPIO 35 Input

 


.
loop:ループ
_ lv_task_handler(); は LVGLを動作させます。決まり事です。
_ if(millis() – time_ > 20 ){ 以降は GAUGEの針の入力です。
_  lv_gauge_set_value(gauge, 0, pointer);
_  pointer は 入力信号で、gaugeに送り、針を動かします。
_  信号を受け取る場所は、setup中の lv_gauge_set_value(gauge, 0, 0); です。
_  GPIOとの接続部分で重要です。他の表示装置も同様に信号を伝えます。
_  ここでは、loop 内で行なっていますが、割り込みで行う方法もあります。

//=====================================================================
void loop() {
  lv_task_handler(); delay(5);
  
  if(millis() - lastMillis > 20 ){
    lastMillis = millis();
    pointer = pointer + inc;
    if ( pointer > 100 ){ inc = -1;}
    if ( pointer <   1 ){ inc =  1;}
  //pointer = analogRead(adc1_ch7);       // Read GPIO 35 
    lv_gauge_set_value(gauge, 0, pointer);// next gauge pointer
  } 
}
//=====================================================================

 


.
displayの設定:決まりの部分です。これで表示が可能になります。

// Initialize the display =============================================
void Initialize_the_display(){
  lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * 10);
  lv_disp_drv_t disp_drv;
  lv_disp_drv_init(&disp_drv);
  disp_drv.hor_res  = screenWidth;
  disp_drv.ver_res  = screenHeight;
  disp_drv.flush_cb = my_disp_flush;
  disp_drv.buffer   = &disp_buf;
  lv_disp_drv_register(&disp_drv);
}
//=====================================================================

// Display flushing ===================================================
void my_disp_flush(
  lv_disp_drv_t *disp,const lv_area_t *area,lv_color_t *color_p){
  uint32_t w = (area->x2 - area->x1 + 1);
  uint32_t h = (area->y2 - area->y1 + 1);
  M5.Lcd.startWrite();
  M5.Lcd.setAddrWindow(area->x1, area->y1, w, h);
  M5.Lcd.pushColors(&color_p->full, w*h, true);
  M5.Lcd.endWrite();
  lv_disp_flush_ready(disp);
}
//=====================================================================

 


.
setup:セットアップ
_ 最初は M5Stackの設定です。
_ ESP32にBUGがあり GPIO39(A Button) を使用する時の回避策があります。
_ gauge = lv_gauge_create(lv_scr_act(), NULL); で、gauge を用意します。
_ 宣言部の static lv_obj_t * gauge; と繋がっています。
_ gauge のサイズや位置、色を設定します。位置はセンターを中心に行うと良いです。
_  理由は、サイズの異なる Display を使用する時に相対的位置で変換が容易になります。
_ lv_gauge_set_value(gauge, 0, 0); // value は、GPIO等の信号を接続する部分です。
_  guage に信号が繋がり guage が動作します。
_ Create a gauge の部分に対し LVGL は多彩な命令が用意されています。
_  多彩な命令を使用すると、lv_demo_widgetsの様に見事な表示が出来る様になります。

//=====================================================================
void setup() {
  M5.begin(true, true, true, true); // LCD,SD,Serial,I2C
  M5.Lcd.setRotation(1);
  M5.Lcd.fillScreen(TFT_BLUE);
//pinMode(adc1_ch7,INPUT);
  adc_power_acquire();     // ADC Power ON, A Button error prevention
  // WiFi.Begin(); WiFi.setSleep(false); // A Button error prevention
  lv_init();
  Initialize_the_display();
  //-------------------------------------------------------------------

  // Create a gauge ---------------------------------------------------
  static lv_color_t needle_colors[1];
  needle_colors[0] = LV_COLOR_BLUE;
  gauge = lv_gauge_create(lv_scr_act(), NULL);
  lv_gauge_set_needle_count(gauge, 1, needle_colors);
  lv_obj_set_size(gauge, 230, 230);
  lv_obj_align(gauge, NULL, LV_ALIGN_CENTER, 0, 0);
  lv_gauge_set_value(gauge, 0, 0); // value
 //-------------------------------------------------------------------
}
//=====================================================================

 



.
LINEMETER;linemeter 設定部分のリストです。
DownLoad:LVGL_LineMeter_M5Stack.zip:DL後 pdfを削除しzipを解凍します。


2. linemeter と言う objetを 宣言。( static lv_obj_t * linemeter;:全体で使用する時は最初に宣言をする )
3. objet ( linemeter ) の幅を 260 に設定。objet は 白い円です。
4. objet ( linemeter ) の縦を 220 に設定。
5. linemeter の Scaleを 270 から 100 に設定。下側が欠けた円で 画像の向きと角度になります。
6. linemeter の Rangeを 0 から 100 に設定。
7. objet に対し linemeterの 位置X を 50 に設定。
8. objet に対し linemeterの 位置Y を 10 に設定。
9. linemeter の 針(pointer) を 0 に設定。 0 に値を入力すると 針(pointer) が変化します。
10. objet ( linemeter ) に Text文字を表示します。
* objet と linemeterの 設定をする事により 多彩な表示ができます。
* ( ) 内のパラメーターを変える事により 表示が変化します。
* lv_linemeter_set_value の中の 0 で外部とのデーターが接続され、表示ができます。

// Create an linemeter ----------------------------------------------
linemeter = lv_linemeter_create(lv_scr_act(), NULL);
lv_obj_set_width_fit(linemeter, 260);
lv_obj_set_height(linemeter, 220);
lv_linemeter_set_scale(linemeter, 270, 100);
lv_linemeter_set_range(linemeter, 0, 100);
lv_obj_set_x(linemeter, 50);
lv_obj_set_y(linemeter, 10);
lv_linemeter_set_value(linemeter, 0); // value
lv_obj_set_style_local_value_str(linemeter, LV_ARC_PART_BG, 
                                 LV_STATE_DEFAULT, "macsbug");
//-------------------------------------------------------------------

 



.
BAR;bar 設定部分のリストです。
DownLoad:LVGL_bar_M5Stack.zip:DL後 pdfを削除しzipを解凍します。

// Create an bar ---------------------------------------------------
bar = lv_bar_create(lv_scr_act(), NULL);
lv_obj_set_size(bar, 300, 20);
lv_linemeter_set_scale(bar, 0, 100);
lv_linemeter_set_range(bar, 0, 100);
lv_obj_set_x(bar, 10);
lv_obj_set_y(bar, 100);
lv_bar_set_value(bar, 50, LV_ANIM_ON);
//lv_obj_set_style_local_value_str(bar, LV_ARC_PART_BG, 
//                                 LV_STATE_DEFAULT, "macsbug");
//-------------------------------------------------------------------

 



.
CHART;chart 設定部分のリストです。
DownLoad:LVGL_chart_M5Stack.zip:DL後 pdfを削除しzipを解凍します。

// Create a chart ---------------------------------------------------
chart = lv_chart_create(lv_scr_act(), NULL);
lv_obj_set_size(   chart, screenWidth -20, screenHeight -20); // size
lv_obj_align(      chart, NULL, LV_ALIGN_CENTER, 0, 0);
lv_chart_set_type( chart, LV_CHART_TYPE_LINE);//Show lines and points
lv_chart_set_range(chart, 0, 100);  // y axis
ser1 = lv_chart_add_series(chart,LV_COLOR_RED);//Add two data series
lv_chart_set_next( chart, ser1, 0); // val
//-------------------------------------------------------------------

 



.
CHART;LovyanLGFX で高速化

M5Stack M5Stack + LGFX

.
DownLoad:LVGL_chart_LGFX_M5Stack.zip:DL後 pdfを削除しzipを解凍します。
chart 設定部分のリストです。
_ 宣言の 2から6行目までを記載しますと LovyanGFX が可能です。
_ static LGFX tft; を宣言し Display は tft で動作します。

メモ:事前に LovyanGFXの 基本的な使い方 をお読み下さい。
メモ:LGFXは進化し、LGFX_AUTODETECT が必要な場合やそうでない場面があります。
_   ここでは LGFX Developer ver を使用しています。
メモ:M5以外のDisplayを使用する時は、LGFXの基本的な使い方で宣言を行ない動作しています。
_   画素数の多い 3.5″ 320×480 では、LVGXの効果が さらに出てきます。
_   M5やESP2で Arduino用 8bit Paralle Displayを使用すると高速で表示します。
_   LGFXは 8bit Paralleに匹敵する高速を実現しています。

#pragma GCC optimize ("Ofast")
#define LGFX_AUTODETECT
#define LGFX_USE_V1
#include <lvgl.h>
#include <LovyanGFX.hpp>
static LGFX tft;
int screenWidth  = 320;
int screenHeight = 240;
#define LVGL_TICK_PERIOD 30
#include <Ticker.h>
Ticker tick;
static lv_disp_buf_t disp_buf;
static lv_color_t buf[LV_HOR_RES_MAX * 10];

lv_obj_t * chart;
lv_chart_series_t * ser1;
uint32_t period = 200;  // y-axis time
uint32_t lastMillis = 0, pointer = 0, inc = 1;
int adc1_ch7 = 35; // GPIO 35 Input

 
chartの背景を少し黒くして見易くしました。lv_style_set_bg_color

// Create a chart ---------------------------------------------------
chart = lv_chart_create(lv_scr_act(), NULL);
lv_obj_set_size(   chart, screenWidth - 0, screenHeight - 0); // size
lv_obj_align(      chart, NULL, LV_ALIGN_CENTER, 0, 0);
lv_chart_set_type( chart, LV_CHART_TYPE_LINE);//Show lines and points
lv_chart_set_range(chart, 0, 100);  // y axis
ser1 = lv_chart_add_series(chart,LV_COLOR_RED);//Add two data series
lv_chart_set_next( chart, ser1, 0); // val
static lv_style_t st; lv_style_init(&st);
lv_style_set_bg_color(&st,LV_STATE_DEFAULT,lv_color_hex(0xB1B1B1));
lv_obj_add_style(chart, LV_OBJ_PART_MAIN, &st); // Backgroud color
//-------------------------------------------------------------------

 



.
感想;
LVGL は、多くの Display を網羅し、例えばサイズの異なる Display も表示が可能です。

画面スクロール機能があり 画面サイズを超えた表示も可能です。つまり、仮想空間が可能です。
小さな画面の M5Stack , Core2 でも、画面をスクロールし、広く使用する事が可能です。

M5Stackは、画面が小さい為に表示の分かり易さが制限されます。
見やすくする為に、1画面1つの表示にしました。

 


.
.
.

M5Stack , LVGL , LittlVGL , GUAGE , LINERMETER , BAR , CHART ,

Written by macsbug

7月 3, 2021 at 4:53 am

カテゴリー: ESP32, M5STACK

How to run LVGL on M5Stack ( ESP32 )

leave a comment »

LVGL を M5Stack ( ESP32 ) で動かす方法。           2021.06.18

LVGL ( Light and Versatile Graphics Library ) は 綺麗な表示と多彩な機能の
グラフィックライブラリです。


lv_demo_widgets:このデモから 必要な表示を取り出して使用する事ができます。

1. 開発機種:MacBook Pro (16-inch, 2019) , macOS Catalina Ver 10.15.7
2. 開発環境:Arduino IDE 1.8.15
3. 開発環境:Board Manager:ES32 Arduino 1.0.6
4. Library:m5stack / M5Stack
5. Library:LVGL ( LittleVGL ):lv_arduino
6. Library:TFT-eSPI:ESP32で使用します。
7. Library:LGFX;LovyanGFX:高速化が可能です。
8. HARD :M5Stack, ESP32
.


 
準備:
LVGL Libray Install:これで LVGL を使用する事ができます。
_ Arduio IDE の ライブラリマネージャを開き 🔴「lv_arduino」を Install します。
_ 「lv_arduino」には Arduino IDE 開発環境で動作する「lvgl」が含まれています。

_ 注意:lv_exsample , lvgl は、Arduino IDE 開発環境では使用できません。
.


 
_ 資料:
1. Espressif (ESP32) — LVGL documentation v7.11.0-dev
_ 
2. ESP32 Modules Now Support LittlevGL and μGFX Jan 4,2019
_  espressif は LittlevGL and μGFX をサポートするようになりました。( ESP-IDF )
3. ESPRESSIF : LVGL Graphics Library Document があります。
4. 注意:lvgl/lv_port_esp32 : 開発環境は ESP-IDFで Arduino IDEでは使用出来ません。
.


 
デモを動かしてみます。
_ 動かして 表示や操作のイメージを体験し LVGL の機能を把握できます。
1. LVGL_Core2
2. LVGL_ESP32_Test_1
3. LVGL_Core2 M5Stack版
4. lv_demo_widgets
5. lv_demo_benchmark ( + LovyanGFX )
6. LVGL_Sin_Cos_Graph
 


 
✳️ M5Core2 Demo:LVGL ForumのHow-toにあるスケッチはタッチ操作で動作します。
_ 以下の場所で Down Load できます。
_ M5Core2 slow fps. Scrol slider breaks when moving horizontally
_ DownLoad:LVGL_Core2.zip:DL後 pdfを削除しzipを解凍します。

 


 
M5StackのDemo:
✳️ LVGL_ESP32_Test_1:Arduino forumにある Bodmer氏(TFT-eSPIの作成者)作成の
_ 「LVGL_ESP32_Test_1」があります。
_ 構成は ESP32 + TFT Touch Display + TFT-eSPI Library で動作します。
_ Real-world LVGL demo example? で DownLoadできます。
_ その「LVGL_ESP32_Test_1」を M5Stackに移植しました。表示サイズは 240×320 です。
_ DownLoad:LVGL_ESP32_Test_1_M5Stack.zip:DL後 pdfを削除しzipを解凍します。
_ タッチ操作はできませんが Slider , Button, Color_Picker を表示します。
_ ESP32 + TFT Touch Panel Display では タッチ操作で動作しています。
_ スケッチは 解りやすく参考になり Slider や Button の追加が出来る様になります。

_ 3.5″ 320×480 SPI ILI9488 Touch Display と ESP32 で構成した例です。
_ 既にある Slider, Button をコピーして配置。Sliderは 幅を変更すると縦方向を表示します。

 


 
✳️ M5Core2 DemoをM5stackへ移植;M5Stackの A,B,C Button で Tabを操作します。
_ DownLoad:LVGL_M5Stack_ver.zip:DL後 pdfを削除しzipを解凍します。

 
Core2のタッチパッド:
_ my_touchpad_read の M5.Touch.getPressPoint(); で x,y を読んでいます。
_ data point は x,y。dada state は LV_INDEV_STATE_PR を取得します。

bool my_touchpad_read(lv_indev_drv_t * indev_driver,
                      lv_indev_data_t * data){
  TouchPoint_t pos = M5.Touch.getPressPoint();
  bool touched = ( pos.x == -1 ) ? false : true;
  if(!touched) {
    data->state = LV_INDEV_STATE_REL;
  } else {
    data->state = LV_INDEV_STATE_PR; 
    /*Set the coordinates*/
    data->point.x = pos.x;
    data->point.y = pos.y;
  }
  return false; 
}

 
my_touchpad_readの中のタッチパッド(x,y)を M5Stackの A,B,C Button に置き換えます。
A Button は Tab1を選択、B Button は Tab2を選択、C Button は Ta3を選択します。

int xp=10, yp=10;
bool my_touchpad_read(lv_indev_drv_t * indev_driver,
                      lv_indev_data_t * data){
  // A Button ---------------------------------------------------------
  if (M5.BtnA.wasPressed()){  // tab 1 : A Button
      data->point.x = xp; data->point.y = yp; // mouse position x,y
      data->state =LV_INDEV_STATE_PR; M5.update(); return false;}
  // B Button ---------------------------------------------------------
  if (M5.BtnB.wasPressed()){  // tab 2 : B Button
      data->point.x = screenWidth/2; data->point.y = yp;
      data->state =LV_INDEV_STATE_PR; M5.update(); return false;}
  // C Button ---------------------------------------------------------
  if (M5.BtnC.wasPressed()){  // tab 3 : C Button
      data->point.x = screenWidth -10; data->point.y = yp;
      data->state =LV_INDEV_STATE_PR; M5.update(); return false;}
  // No button operation ----------------------------------------------
      data->state =LV_INDEV_STATE_REL;M5.update(); return false;
}

Button入力と処理の流れ:
my_touchpad_readから data(x,y) と LV_INDEV_STATE_PR を setup内の
indev_drv.read_cb = my_touchpad_read; に送られタッチパッドの様に動作します

void setup() {
  // Initialize the (dummy) input device driver
  lv_indev_drv_t indev_drv;
  lv_indev_drv_init(&indev_drv);
  indev_drv.type = LV_INDEV_TYPE_POINTER;
  indev_drv.read_cb = my_touchpad_read;  // ***
  lv_indev_drv_register(&indev_drv);
}

 


 
✳️ lv_demo_widgets
lvgl/lv_demosに「lv_demo_widgets」があり LGVL の多様な機能を見ることができます。

_ 「lv_demo_widgets」をM5Stackへ移植し、デモを見る事ができます。
_ DownLoad:lv_demo_widgets_M5Stack.zip:DL後 pdfを削除しzipを解凍します。
.
_ M5Stack Core2 用の lv_demo_widgets で タッチ操作で動きます。
_ DownLoad:lv_demo_widgets_M5Core2.zip:DL後 pdfを削除しzipを解凍します。
.

 


 
✳️ lv_demo_benchmark:
_ ベンチマークテストを M5Stack と M5Stack + LovyanGFX で実施しました。
_  LovyanGFX ( LGFX ) は 高速化に効果があります。

_ 結果:
_ M5Stack only :FPS = 42 , Opa. speed = 88%
_ M5Stack + LGFX:FPS = 47 , Opa. speed = 87%
_ DownLoad:lv_demo_benchmark_M5Stack.zip:DL後 pdfを削除しzipを解凍します。
_ DownLoad:lv_demo_benchmark_LGFX_M5Stack.zip:DL後 pdfを削除しzipを解凍します。

Library と Display 命令 ( インスタンス ) について。
_ M5Stackで、Display 命令を M5.Lcd や tft で記述します。

_ M5Stack:M5.Lcd

#include <lvgl.h>;
#include <M5Stack>;
#include "lv_demo_benchmark.h"
//
M5.Lcd.setRotation(1);

.
_ TFT-eSPI:tft

#include <lvgl.h>
#include <TFT_eSPI.h>
#include "lv_demo_benchmark.h"
TFT_eSPI tft = TFT_eSPI();

.
_ M5Stack + TFT-eSPI:tft

#include <lvgl.h>;
#include <M5Stack>;
#include "lv_demo_benchmark.h"
TFT_eSPI tft = TFT_eSPI(); 

.
_ LovyanGFX:tft

#define LGFX_USE_V1
#define LGFX_AUTODETECT
#include <lvgl.h>;
#include <LovyanGFX.hpp>;
static LGFX tft;
#include "lv_demo_benchmark.h"
//
tft.setRotation(1);

 


 
✳️ LVGL_Sine_Cos_Graph:
_ akirahitosi氏 作製の LVGLでの随時更新の有るグラフ描画 2021/05/20
_ を M5Stackへ移植しました。akirahitosi氏に感謝致します。
_ DownLoad:LVGL_Sin_Cos_Graph_M5Stack.zip:DL後 pdfを削除しzipを解凍します。
_ 横軸は 200msec とかの時間軸になっています。
_ この様な高速表示が必要なLibraryは LovyanGFX を使用すると滑らかに表示します。
_ 画面サイズの大きい物を使用する場合は 特に効果があります。

_ M5Stack + LovyanGFX + 3.5″ 320×480 SPI ILI9488 Display を使用した例
_ 上は M5Stack。下は M5Stack + LovyanGFX で高速で滑らかに表示します。


 
感想:
LVGLは 2018年から登場しました。LVGL Forumでは レベルの高い人が回答しています。
LVGLに対する Arduino IDE, ESP32, M5Stackに関する情報は 現在少ないです。
中国サイトを検索すると、情報があり若い人への積極的な取り組みがされています。
情報源として日本国内は少なく LVGL Forum中国サイトがあります。

M5Stack社は LVGLを基に UiFlow へ移植(移植中)を進めています。
その為に LVGLの表示や機能は 制限されたり遅れる事になります。
M5Stack Forumにおける LVGLの質問への回答は UiFlowにより積極的ではありません。
一方 TTGO社では TWatchのタッチパネルの為に LGVLを採用し積極的です。
seeed社は Wio Terminal での説明や githubに 移植した LVGLのSampleがあり積極的です。
seeed社でのLVGLの説明は丁寧で技術的にも読み応えのある内容です。

使用する条件は Arduino IDE, ESP32, M5Stack です。
よって LVGLのDocumentが基本ですが 書かれている内容が全て動作するとは限りません。
動かない情報もありますので、切り分けて進めた方が良いかと思います。

何も解らず始めています。初めての LVGLで 説明が不十分な点もあるかと思います。
LVGLは 命令数が非常に多く大変ですが 表現力は多彩で 高機能を期待できます。
LVGLの 一つの表示だけでも、これまでのDraw命令の方法で作ると大変です。
LVGLは 一つの表示だけでも、さらに多彩な表現ができ 驚きます。
備忘録として、デモを体験する事を目指しました。画像から何かが得られたらと思います。
デモの次の課題は メーターとか1つの表示と、その入力は どの様にするかです。
ハードのスイッチやデジタル、アナログ信号を接続できると 反応があり楽しくなるかと思います。

LovyanGFX で動作させる方法は LVGL with M5Stack Part 2 をご覧下さい。


 
.
.
M5Stack , ESP32 , LVGL , LittleVGL , LGFX , LovyanGFX , lv_arduino , lv_demo_widgets ,
lv_demo_benchmark ,

Written by macsbug

6月 18, 2021 at 4:35 pm

カテゴリー: ESP32, M5STACK

ButtonA on M5Stack does not work properly

with 2 comments

M5Stack の ButtonA が 勝手に動作する 原因と対策。2021.05.02。追記:2012.06.13

結論:WiFi.setSleep(false); を追加します。

不具合:
. 1. Web Radio で ButtonA [vol-] が 勝手に動作し Volume が低下します。
. 2. 発生回数は 6時間に 1〜2回程度。
. 3. GPIO39 (ButtonA) に Pulse が発生します。
. 4. 他のスケッチでも WiFi ( WiFi.begin(); ) を使用するとPulseが発生します。

条件:
. 1. WiFi ( WiFi.begin(); ) を使用する時。
. 2. M5.BtnA.wasPressed(); を使用する時。
. 3. Arduino IDE: ESP32 Board Manager:ES32 Arduino 1.0.5 , 1.0.6

原因:
. Arduino IDF(1.06)のBUGと言われています。参照に記載あり。

🔴 対策:( 回避策 )
. Arduino IDE:Setup() , WiFi.Begin(); の直後に
. WiFi.setSleep(false); を記載します。

void setup(){
  WiFi.Begin();
  WiFi.setSleep(false);
}

結果:
. GPIO39のPulse は無くなり ButtonA が 勝手に押される事は無くなります。
 
今後:
. 原因が Arduino IDF(1.06)のBUG であるならば 修正される事を期待します。
. ESP32のBUG であるならば 今回の回避策になります。

追記:2021.06.13
🔴 対策:( 回避策 )

#include <driver/adc.h>
void setup(){
  adc_power_acquire(); // ADC Power ON

_ nao*(なお)氏の調査、解析により、対策が判明 致しました。
_ ADC測定指示→ADC電源がOFFなので、電源ON処理はいる→GPIO39が80ns落ちる→割り込み入る
_ nao*(なお)氏の尽力 と らびやん氏のフォローに感謝いたします。
_ M5Stackでボタン割り込みとanalogReadで、ボタンA押してないのに割り込みが入る。
_ esp_phy_load_cal_and_init(PHY_WIFI_MODULE);でも効果がある。
 


 
🔵 Espressif 情報:
_ 以下の資料にバグ情報があり、GPIO39に約80nsが発生する状況は同じです。
_ ハードのバグで「回避策は 入力を無視してください」と書かれていますが
_ M5Stackでは GPIO39にA Buttonが接続されており 対策が必要です。
_ 尚、M5Stackの ESP-WROOM-32 だけでなく ATOMの ESP32-PICO でも発生している様です。

_ ESP32 ECO and Workarounds for Bugs
_ 資料:eco_and_workarounds_for_bugs_in_esp32_en_V2.3_2020
_ page:9
_ 3.11
_ 特定のRTCペリフェラルの電源がオンになると、GPIO36およびGPIO39の入力が
_ 約80nsの間プルダウンされます。
_ 詳細: 🔴 次のRTCペリフェラルの電源を入れると、この問題が発生します。
_ •SARADC1 •SARADC2 •AMP •HALL
_ 回避策: これらの周辺機器のいずれかで電源を有効にする場合は、
_      GPIO36およびGPIO39からの入力を無視してください。


 
測定:GPIO39 ( ButtonA )( S3 )
. Circuit Diagram:
.  GPIO39(S3)にPulseが発生し GPIO37(S1), GPIO38(S2) には発生しない。
.  memo:
.   GPIO39は 内部PullUpのない入力端子。(SENSOR_VN : Input : ADC1_CH3, RTC_GPIO3)
.   M5Stackの GPIO39は R10 (100kΩ) で PullUp されています。
.   R10 (100kΩ) が無いと Logic “0” で S3 が押された事と同じになります。
.   R10 (100kΩ) 周辺の汚れによる電圧リークは 電圧が高くなる方向で問題は低下する。
.   D27 Diodeは M5Stackのversionにより 接続されているものと無いものがあります。
.   人による Switchが押される時間は 約200〜300msec です。
.   チャタリング防止は M5.BtnA.pressedFor(msec) がありますが 50msec でも
.   今回の不具合は発生します。この命令は速度低下になり使用したくない所です。

 
. TEST POINT ( GPIO39 ):Yellow
.  D27 Diode の上側にOscilloScopeを接続します。
.  R10の場所は R10が破損する恐れがあり接続しない事。
.  注意:基板への部品の接続と基板のpatternは 非常に弱いです。
.  レイアウト参照:Parts arrangement of M5Stack

 
. Waveform:WiFi.begin(); で 以下の画像に示す Pulse が発生します。
.   Period:100msec , Pulse Width:30μsec , Voltage:+1.6Vdc
.   Pulse電圧は +1.6Vdc で ButtonA ON 状態では無いが 何らかの要因が加わり
.   Logic “0” 相当の 0Vdc 近辺になり ButtonA(GPIO39)が動作すると判断しています。
.   WiFi.setSleep(false); を追加すると Pulse は無くなり +3.3Vdc になります。
 

 
memo:WiFi.setSleep(true); を記載すると Pulseが発生します。
 


 
参照:
M5.BtnA.wasPressed() conflicts with WiFi? #52:Apr 17, 2018 – Apr 6, 2021 🔴
_ Apr 17, 2018 : M5StackがWiFi経由で接続されている場合、
_  M5.BtnA.wasPressed() は正しく機能しないようです。
_ valki2氏(Jun 7, 2020) , antimix氏(Mar 27, 2021) , zasnicoff氏(Apr 6, 2021) が
_  WiFi.setSleep(false); の回避策を記載しています。
 
After 1.0.6 update WiFi won’t connect to other network // connection time increased #4980
. Mar 26, 2021 – Apr 29,2021
_ zasnicoff氏(Apr 6, 2021) : WiFiがGPIO39でパルスを引き起こしているように見えます。
 
M5.BtnA.wasPressed() conflicts with WiFi?
_ Apr 17, 2018
_ M5StackがWiFi経由で接続の場合 M5.BtnA.wasPressed() は正しく機能しない。
 
M5Stack: M5.BtnA.wasPressed() conflicts with WiFi #1334
_ Apr 19, 2018:現在のIDFの問題のようです。
 
Calling iot_button_create() causes RTCWDT_RTC_RESET (IDFGH-3167) #1857
_ Apr 14, 2018:ボタンコードは、任意のエッジ割り込みを使用する。これは非常に古い問題。
 
Problems with interface after connecting to network
_ Apr 1, 2020:ButtonA(gpio 39)で1秒に約1回短いパルスをカウントします。
_ M5Stack and its buttonsを参照して下さい。
 
Spurious interrupts on GPIO 36 when using WiFi (IDFGH-2473) #4585
_ Jan 5, 2020:これは既知のハードウェアの問題です。WIFIはADCを使用するためです。
_ igrr commented Jan 7, 2020:
_  Voltage spikes at 5Hz in GPIO36 causing interrupts in release v3.3, v3.2.2 works fine (IDFGH-1917) #4117
_ GPIO 36 and 39 constantly trigger interrupts #7
 
LVGL:M5Stack and its buttons
_ Apr, 2020:period=0.8sec, Pulse width=13us to 170us
 


 
M5StackのボタンAが勝手に反応してしまう件:
_ ESP32 及び M5Stack が販売されてからの不具合です。
_ M5Stack forum では 2018年4月に質問があり、原因と対策が不明のままでした。
_ 2018年4月から2021年4月に Github M5Stack issues #52 で話され
_ valki2氏(Jun 7, 2020) , antimix氏(Mar 27, 2021) , zasnicoff氏(Apr 6, 2021) が
_ WiFi.setSleep(false); の回避策を述べています。
_ 長く不具合をかかえていた件は、3年もかかり 回避策が判明しました。
_ ただし回避策であり 根本的な原因の解明には至っていません。

_ ESP32 , ECO and Workarounds for Bugs マニュアル 9page
_ 3.11. When certain RTC peripherals are powered on, the inputs of
_ GPIO36 and GPIO39 will be pulled down for approximately 80 ns.
_ 特定のRTCペリフェラルの電源がオンになると、GPIO36およびGPIO39の
_ 入力が約80nsの間プルダウンされます。 と書かれています。
_ 回避策は この時 GPIO39を読み込まない事と書かれています。
_ これが原因とすれば 🔴 ESP32 のバグという事になります。
_ 波形の確認:
_  WiFi,Begin(); で GPIO39にPulseが発生しますが GPIO36は発生しません。

M5StickC:
. MDAR氏(Jun 29, 2020)によると「M5StickCでも非常によく似た問題が発生しています」との事。
. M5StickCの ButtonBは GPIO39を使用しています。
. Waveform:WiFi.begin(); で 以下の画像に示す Pulse が発生します。
.   Pulse Width:1.5μsec , Voltage:+1.2Vdc
.   Pulse電圧は +1.2Vdc で ButtonB ON 状態では無いが 何らかの要因が加わり
.   Logic “0” 相当の 0Vdc 近辺になり ButtonB(GPIO39)が動作すると判断しています。
.   WiFi.setSleep(false); を追加すると Pulse は無くなり +3.3Vdc になります。



 


 
感想:
Web Radioで まれ(6時間に 1〜2回程度)にしか起きない為に追求が困難でした。
波形観測により WiFi.Begin(); で GPIO39に Pulse が発生する事が判明しました。
この問題は参照によると2018年4月からあり 2020から2021年にかけて解明されてきました。
不具合は GPIO39に発生する 🔴 Pulse波形により判断する必要があります。
Arduino IDF(1.06)(Arduino IDE Board ManagerのESP32) のバグと言われています。
Ver 1.05 では起きない話がありますが Ver 1.05 でもPulseは発生しています。

Espressif(igrr氏)とM5Stack社は この件を古くから認識していますが解決には至っていません。
この件で BtnA は使用出来ないとか 工夫して使用する人がいるのを知りました。
発売時からの不具合に対し EspressifとM5stackは フォローしていないのが現状です。
M5Stack専用のFaceBookも同様に不具合のフォローがされていません。
FaceBook 及び M5Stack community に この件を公開しました。

回避策が判明し これまでの Web Radio の記事及びスケッチの修正を致しました。
 


 
 
M5Stack , ButtonA , GPIO39 , WiFi , WiFi.begin , WiFi.setSleep(false) , setSleep , 勝手に押される

Written by macsbug

5月 2, 2021 at 11:18 am

カテゴリー: ESP32, M5STACK

Web Radio with a built-in speaker in M5Stack

leave a comment »

M5Stackへスピーカーを内蔵した Web Radio を製作しました。     2021.04.16

BUILT-IN SPEAKER TYPE:手の平サイズの WEB RADIO。
50mm Speaker
SPEAKER EXPANSION TYPE:必要な時に接続し 不要な時は簡単に外せます。

 
BUILT-IN SPEAKER TYPE:MAX98357A I2S DAC Amplifier Module を使用。

MAX98357A I2S DAC Amplifire
LIbrary : ESP32-audioI2S
270円
Web Radio Blog:MP3 Board and I2S DAC Board
VS1053B mp3
Library : ESP8266 Audio
UDA1334A I2S DAC
Library : ESP32-audioI2S
PCM5102A I2S DAC
Library : ESP32-audioI2S
520円 300円 360円

 
仕様:
1. 局 ( Radio Station ) :150局。ボタンで選択。局の追加も可能です。
2. 再生:Mono。
3. 操作:ボタンで操作します。A :Volume – 。B :Channel up 。C :Volume +
4. 文書発声機能:日本語、英語 等の文章が音声で出ます。
5. サイズ:54x54x50mm (M5Stack+Battery+MAX98357A+Speaker)

構成:
1. 開発機種:MacBook Pro (16-inch, 2019) , macOS Catalina Ver 10.15.7
2. 開発環境:Arduino IDE 1.8.13
3. 開発環境:Board Manager:ES32 Arduino 1.0.6
4. Library:m5stack / M5Stack
5. Library:schreibfaul1 / ESP32-audioI2S
6. HARD:M5Stack
7. HARD:2400mA Battery Module
8. HARD:MAX98357A I2S DAC Amplifier Module
9. HARD:40x40mm Speaker, 50x50mm Speaker,

費用:1000円。( Without M5Stack )

No. Nomen Price
1 MAX98357 I2S 3W Dac Amplifire Module 264円
2 M-BUS PCB 100円
3 Speaker 40x40mm 8Ω 2W ( aitendo ) 308円
3 Speaker 42x42mm 8Ω 2W ( aitendo ) 308円
3 Speaker 50x50mm 8Ω 2W ( aitendo ) 330円
3 Speaker 50x50mm 8Ω 5W (DiyTools Store : $3.07:14day ) 333円
4 Other(Case,Screw,Connector) 328円
Total 1000円

. Speaker 50x50mm の音質は DiyTools Store より aitendo の方が良いです。

MAX98357:Dealers and prices
NO. Dealers Price 円 ($) 輸送期間
1. SHENZHEN HUISHUNFA Store 260円 ($2.33) 24 day
2. All ELECTRONICS MALL 264円 ($2.40)
3. All goods are freeshipping Store 313円 ($2.85)
4. SAMIORE Store 391円 ($3.56)
5. YX Electronic Components 421円 ($3.83)
6. Shenzhen icstation Co. Ltd. 450円 ($4.08) 20 day
7. sihugpiao2 519円 (EUR 3.99)

Down Load:I2S DAC と同じスケッチです。
. Web_Radio_of_M5Stack_I2S_DAC.zip を Down Load します。
. Fileは PDF形式で DL後に Web_Radio_of_M5Stack_I2S_DAC.zip に変更し解凍します。
. SD-Uopdate, LovyanLauncher で使用できる bin file も含まれています。

. Library:ESP32-audioI2S


 
MAX98357A I2S DAC Amplifier Module:
_ 電源(VIN)は 2.5 〜 5.5Vdc 。 IC Model No:AKKBD0 。
_ MAX98537A pdf (japan) MAX98537A pdf (en)。
_ Adafruit MAX98357 I2S Class-D Mono Amp。(Schematic)
Specs:
_ Output Power: 3.2W at 4Ω,10% THD,1.8W at 8Ω,10% THD,with 5V supply
_ PSRR: 77 dB typ @ 1KHz
_ I2S sample rates from 8kHz to 96kHz
_ No MCLK required
_ Click + Pop reduction
_ Five pin-selectable gains: 3dB, 6dB, 9dB(open), 12dB, 15dB
_ Excellent click-and-pop suppression
_ Thermal shutdown protection

 


 
配線:
MAX98357A:5本 ( LRC, BCLK, DIN, GND, VIN )

MAX98357A LRC BCLK DIN GAIN SD GND VIN
M-BUS 25 26 22 open open GND 5V

SPEAKER:8Ω 2W 40x40mm。 Case thickness:17mm。

 


 
CASE:
. PROTO_83_UP は MAX98357A を付けます。
. Speakerは PROTO_83_UP 及び Spacer を使用します。
. Speakerの厚みに応じて Spacer を入れます。
. Speakerのサイズに応じて REAR_COVER に丸い穴を空けます。

PROTO_83_UP (8.3mm thickness) Spacer 4mm
REAR_COVER_2Screw_UP REAR_COVER_4Screw_UP

_ CAD Data Down Load:
. Web_Radio_cad_data.zip を Down Load します。
. Fileは PDF形式で DL後に Web_Radio_cad_data.zip に変更し解凍します。
. 


 
以後は、PCM5102A I2S DAC のブログと同じ内容になります。


 
ノイズ対策:M5Stackの改修。
_ 理由:I2S は M5Stack の GPIO-25 を使用します。
_ GPIO-25 には アンプとSpeakerが接続されており I2S信号でノイズがでます。
_ 対策:M5Stack基板上の T1 端子をハンダ付けでShort します。
_ Speaker Amp の電源が遮断され ノイズが無くなります。


 
Arduino IDE 開発条件と方法:
_ 1. Additional Boards Manager URLs:ESP32 Stable version
_ 2. Boards Manager:ESP32 by Espresso Systems version 1.0.6
_ 3. Board Selection : M5Stack-Core-ESP32
_  の設定を行ないます。

条件:
1. Aduino IDE Additional Boards Manager URLs に以下のStable verを追加します。
.
. https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

2. Arduino IDE Boards Manager 設定:
_ Boards Managerを選択し ESP32 で検索。
_ ESP32 by Espresso Systems version 1.06 にします。( Mar 26, 2021)
_ 

3. Arduino IDE 設定:
_ Board Selection : M5Stack-Core-ESP32


 
Library:ESP32-audioI2S:文書発声機能。
_ ESP32-audioI2S の Audio.cpp には 文書発声機能が内蔵されています。
_ https://translate.google.com.vn/translate_tts に WiFi接続し音声合成をする機能。
_ ここ機能により PCM5102A , UDA1334A I2S DAC , MAX98357A I2S DAC Ampから
_ 音声を出す事が出来ます。
_ 日本語、英語 等ができます。
_ 例:audio.connecttospeech(“こんにちは”, “ja”)
_ 例:audio.connecttospeech(“Hello”, “en”)
_ 例:audio.connecttospeech(“Wenn die Hunde schlafen”, “de”);
_ 例:audio.connecttospeech(“Este é um exemplo de síntese de
_        voz usando esp 32”, “pt”);


 
SPEAKER EXPANSION TYPE
_ M-BUSが横に配置され スピーカの取り付け取り外しが簡単に出来ます。
_ M5Stack側は Make an M5Stack case. Part 1 を参照ください。
_ ケース:Thingivers:M5Stack Extension Module by macsbug を参照ください。

費用:1000円。( Without M5Stack )

No. Nomen Price
1 MAX98357 I2S 3W Dac Amplifire Module 264円
2 M-BUS PCB 100円
3 Speaker 42x42mm 8Ω 2W ( aitendo ) 308円
4 Other(Case,Screw,Connector) 328円
Total 1000円

 


 
配線:
MAX98357A:5本 ( VIN, GND, DIN, BCLK, LRC )

MAX98357A VIN GND SD GAIN DIN BCLK LRC
M-BUS 5V GND open open 22 26 25



 
感想:
1. スケッチは UDA1334A I2S DAC , PCM5102A I2S DAC の記事と同じです。
_ 詳しくは 上記を参照下さい。同じ内容の為、スケッチのリストは省略します。
2. M5Stackとスピーカーが1つになり、手の平に乗る姿は 手軽で可愛いです。
3. 他の方法で Stereo にもなりますが シンプルに Mono としました。
4. M5Stack内蔵のスピーカーより 遥かに音質よく聞きやすいです。
5. スピーカーのサイズは 音質に直結します。今回は 40mm と 42mm を使用。
6. MAX98357A GAIN端子は Open(9dB)で Volumeの大きさは I2S DACと同じです。
7. MAX98357A Current:Spec では 8ohm で 220mA。
8. USB Current:USB 5V の 電流は 実測で 約100〜150mA。
9. M5Stackを積み重ねる最大の厚みはネジの長さで決まります。結果、奥行きは50mmまでです。


 
 
.

M5Stack , Web Radio , MAX98357A , I2S DAC Amplifier , Speaker , ESP32-audioI2S ,
BUILT-IN SPEAKER TYPE , SPEAKER EXPANSION TYPE , Expansion ,

Written by macsbug

4月 16, 2021 at 7:44 am

カテゴリー: M5STACK

Web Radio of M5Stack PCM5102A I2S DAC

leave a comment »

M5Stack と PCM5102A I2S DAC Board で Web Radio を製作しました。 2021.02.19
………………………………….. Boards Manager 1.05 による改訂:rev1 : 2021.03.04
………………………………….. Boards Manager 1.06 による改訂:rev2 : 2021.05.01

.
MP3 Board and I2S DAC Board:

VS1053B mp3
Library:
ESP8266 Audio
UDA1334A I2S DAC
Library:
ESP32-audioI2S
PCM5102A I2S DAC
Library:
ESP32-audioI2S
520円 300円 360円

.
仕様:
1. 局 ( Radio Station ) :150局。ボタンで選択。局の追加も可能です。
2. 再生:Stereo。
3. 音質:M5Stack内蔵スピーカーより遥かに良いです。
4. 操作:ボタンで操作します。
_  A button:Volume – 。B button:Channel up 。C button:Volume +
5. 文書発声機能:日本語、英語 等の文章が音声で出ます。

構成:
1. 開発機種:MacBook Pro (16-inch, 2019) , macOS Catalina Ver 10.15.7
2. 開発環境:Arduino IDE 1.8.13
3. 開発環境:Board Manager:ES32 Arduino 1.0.5
4. Library:m5stack / M5Stack
5. Library:schreibfaul1 / ESP32-audioI2S
6. HARD:M5Stack
7. HARD:PCM5102A I2S DAC Module
8. HARD:Speaker Amp or Headphones:ダイソー ミニスピーカー。Volume付き。

費用:1000円。( Without M5Stack )

No. Nomen Price
1 PCM5102A I2S DAC Module 360円
2 M-BUS PCB 100円
3 DAYSO Speaker 300円
4 Other(Case,Screw,Connector) 240円
Total 1000円

1. PCM5102A:Aliexpress $3.4(360円)以下で購入可能。輸送期間=20day.
.
Down Load:
. Web_Radio_of_M5Stack_I2S_DAC.zip を Down Load します。
. Fileは PDF形式で DL後に Web_Radio_of_M5Stack_I2S_DAC.zip に変更し解凍します。

. Library:ESP32-audioI2S


.
PCM5102A I2S DAC Module:
_ 電源(VIN)は 5Vdc。Line Output Load Resistance は MIN 1KΩ, NOR 10KΩ。
_ PCM5102A PDF。 PCM5102 製品詳細, データーシート。 PCM5102A Board Schematic

.


.
回路図:
_ 電源(VIN)は 5Vdc。PCM5102A は 3.3V。基板に LDO 3.3V (S2SL) があります。
_ GND = AGND = DGND

_ Down Load:PCM5102A_circuit_diagram.jpg.zip 1274 × 1178 pixels
.
PIN FUNCTIONS:Select = RED:購入時のセレクト状態。

H Name Description LOW (GND) HIGH (D 3.3V)
H1L FLT Filter select Normal latency Low latency
H2L DEMP De-emphasis control
for 44.1kHz sampling rate
Off On
H3L XMST Soft mute control Soft mute soft un-mute
H4L FMT Audio format selection I2S Left justified


.
LDO (5-terminal Regulator):ME6211C series ME6211C33M5G
_ Marking Code:S2RH , S2SL ( Maker:MicrOne ):ME6211 LDO pdf
_ Operating Voltage Range:2V~6.0V, VOUT=3.3V
_ Maximum Output Current:500mA

.


.
工作:MCP5102A の Jumper端子(SCK と GND) をハンダで接続(Short)します。
_   もしくは 下記 配線の基板上で SCK-GND接続でも良いです。
_   PCM5102Aの内部PLLを使用してシステムクロックを生成します。
_   誘電ノイズを防ぎます。
_   接続しなくても動作はします。


.
配線:5本 ( VIN, GND, LRCK, DIN, BCK )

PCM5102A VIN GND LRCK DIN BCK
M-BUS 5V GND 25 22 26


メモ:CUT(Yellow):基板の左端はGND。VINで使用する為に GNDの部分をCUTします。


.
ノイズ対策:M5Stackの改修。
_ 理由:I2S は M5Stack の GPIO-25 を使用します。
_ GPIO-25 には アンプとSpeakerが接続されており I2S信号でノイズがでます。
_ 対策:M5Stack基板上の T1 端子をハンダ付けでShort させます。
_ Speaker Amp の電源が遮断され ノイズが無くなります。


.
Arduino IDE 開発条件と方法:
_ 1. Additional Boards Manager URLs:ESP32 Stable version
_ 2. Boards Manager:ESP32 by Espresso Systems version 1.0.5
_ 3. Board Selection : M5Stack-Core-ESP32
_ の設定を行ないます。

条件:
1. Aduino IDE Additional Boards Manager URLs に以下のStable verを追加します。
_ 補足:released this Feb 23, 2021:Latest Stable Release and Latest Development Release

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

2. Arduino IDE Boards Manager 設定:
_ Boards Managerを選択し ESP32 で検索。
_ ESP32 by Espresso Systems version 1.05 にします。( released this Feb 23, 2021)
_

3. Arduino IDE 設定:
_ Board Selection : M5Stack-Core-ESP32

方法:スケッチ:宣言
1. include <M5Stack.h>
2. include <Audio.h>

補足:ESP32-audioI2S_Library ( Audio.cpp ) について。
_ Audio.cpp に以下の記述があり、上記設定外でコンパイルエラーが出る時があります。
_ Audio::Audio(const uint8_t BCLK, const uint8_t LRC, const uint8_t DOUT) {
_ clientsecure.setInsecure();
_ // if that can’t be resolved update to ESP32 Arduino version 1.0.5-rc05 or higher
_ //i2s configuration
_
.


.
Library:ESP32-audioI2S:文書発声機能:について。
_ ESP32-audioI2S にある Audio.cpp には 文書発声機能が内蔵されています。
_ https://translate.google.com.vn/translate_tts に WiFi接続し音声合成をする機能です。
_ これにより PCM5102A , UDA1334A I2S DAC から音声を出す事が出来ます。
_ 日本語、英語 等ができます。
_ 例:audio.connecttospeech(“こんにちは”, “ja”)
_ 例:audio.connecttospeech(“Hello”, “en”)
_ 例:audio.connecttospeech(“Wenn die Hunde schlafen”, “de”);
_ 例:audio.connecttospeech(“Este é um exemplo de síntese de voz usando esp 32”, “pt”);
.


.
Option:スケッチに以下を追加すると Serial Monitorで各種情報を見る事ができます。

/--------------------------------------------------------------
// Output infomation to serial output
void audio_info(const char *info){
  Serial.print("info        ");Serial.println(info);}
void audio_id3data(const char *info){  //id3 metadata
  Serial.print("id3data     ");Serial.println(info);}
void audio_eof_mp3(const char *info){  //end of file
  Serial.print("eof_mp3     ");Serial.println(info);}
void audio_showstation(const char *info){
  Serial.print("station     ");Serial.println(info);}
void audio_showstreamtitle(const char *info){
  Serial.print("streamtitle ");Serial.println(info);}
void audio_bitrate(const char *info){
  Serial.print("bitrate     ");Serial.println(info);}
void audio_commercial(const char *info){//duration in sec
  Serial.print("commercial  ");Serial.println(info);}
void audio_icyurl(const char *info){  //homepage
  Serial.print("icyurl      ");Serial.println(info);}
void audio_lasthost(const char *info){//stream URL played
  Serial.print("lasthost    ");Serial.println(info);}
void audio_eof_speech(const char *info){
  Serial.print("eof_speech  ");Serial.println(info);}
//-------------------------------------------------------------

.
Serial Monitorの情報:Station接続時に出力されます。

ESP32-Chimera-Core initializing...OK
info        PSRAM not found, inputBufferSize = 6399 bytes
info        buffers freed, free Heap: 207176 bytes
info        SSL has been established, free Heap: 164112 bytes
info        contentLength=4608 bytes
info        MP3Decoder has been initialized, free Heap: 137472 bytes
info        syncword found at pos 0
info        Channels=1
info        SampleRate=24000
info        BitsPerSample=16
info        BitRate=32000
eof_speech  こんにちは
info        buffers freed, free Heap: 206180 bytes
info        SSL has been established, free Heap: 164056 bytes
info        contentLength=9888 bytes
info        MP3Decoder has been initialized, free Heap: 139084 bytes
info        syncword found at pos 0
info        Channels=1
info        SampleRate=24000
info        BitsPerSample=16
info        BitRate=32000
eof_speech  Web Radio of M5Stack
info        buffers freed, free Heap: 205940 bytes
info        SSL has been established, free Heap: 163848 bytes
info        contentLength=5952 bytes
info        MP3Decoder has been initialized, free Heap: 139068 bytes
info        syncword found at pos 0
info        Channels=1
info        SampleRate=24000
info        BitsPerSample=16
info        BitRate=32000
eof_speech  Smooth Jazz
info        buffers freed, free Heap: 205848 bytes
info        Connect to new host: "http://sj32.hnux.com/stream?type=http&nocache=3104"
info        Connect to "sj32.hnux.com" on port 80, extension "/stream?type=http&nocache=3104"
info        Connected to server
info        HTTP/1.0 200 OK
info        icy-notice1:<BR>This stream requires <a href="http://www.winamp.com">Winamp</a><BR>
info        icy-notice2:SHOUTcast DNAS/posix(linux x64) v2.5.5.733<BR>
info        access-control-allow-origin:*
info        icy-name: SmoothJazz.com Global
station     SmoothJazz.com Global
bitrate     32000
info        icy-sr:22050
info        icyurl
icyurl      http://smoothjazz.com
info        content-type:audio/mpeg, format is mp3
info        MP3Decoder has been initialized, free Heap: 174404 bytes
info        x-clacks-overhead:GNU Terry Pratchett
info        Switch to SWM, bitrate is 32000, metaint is 0
lasthost    sj32.hnux.com/stream
info        inputbuffer is being filled
info        stream ready
info        buffer filled in 290 ms
info        syncword found at pos 0
info        syncword found at pos 0
info        syncword found at pos 0
info        Channels=1
info        SampleRate=22050
info        BitsPerSample=16
info        BitRate=32000

.
課題:時々 ボタンを押さなくとも GPIO 39 に Pulseが発生し Vol – が動作する。
_ 特に Joy Radio Station , http://uk5.internet-radio.com:8174/ で多く発生する。
_ 受信の あるタイミングで GPIO 39 をアクセスします。
_ ソフト検証では、GPIO 39 に 0〜1msec 程度の Pulse が発生します。
_  24msec程度の時も1度経験しました。
対策:M5.BtnA.wasPressed() でなく、M5.BtnA.pressedFor(50) にて
_   50msec以上の場合の時に Vol – を動作する様にしました。
_   メモ:通常、人のボタンをプチッと押す時間は 200〜300msec程度です。
.


.
感想:
1. 注意:ESP32-audioI2S の Audio.cpp の注意書きの対応が必要です。
_ ESP32 by Espresso Systems version 1.05 を使用します。
2. 速度:PCM5102A と Library ESP32-audioI2S は 通信速度が速く,出力が大きく音が明瞭です。
3. 費用:PCM5102A Module は 360円以下で安価にできます。
_    ただし国内やアマゾンでは高価な価格で販売されています。
4. 局数:150局。現存する Web Radio の中で最大の局数です。
5. ESP32 by Espresso System version:
_ 1.05-rc4:コンパイルエラーが発生しました。
_ 1.05-rc5, 1.05-rc6:たまに M5stackの画面が白くなる現象がありました。
_ 1.05-rc7:M5stackの画面が白くなる現象は治りました。
_  ただし、ESP32-audioI2S ( Audio.cpp ) を使用する為に、
_  ESP32 by Espresso Systems version 1.05-rc7 が必要である事、
_  さらに Board Select を ESP32 Dev Module にする事。
_  M5Stack で使用するには ESP32-Chimera-Core が必要になる事。
_  この為に M5.Lcd の ボタン操作命令が使用出来ないとか
_  一部の画像表示命令が使用出来ない制限がありました。
_ 2021.02.23 に ver 1.0.5 が公開されました。
_ ver 1.05:M5Stackの画面が白くなる現象は無くなりました。
_ ver 1.05:M5Stack.h が使用でき M5Stack開発環境で開発出来る様になりました。
7. 課題と対策:たまに VOL- (GPIO39)が動作する課題がありました。原因不明。
_ VS1053 mp3 Board, I2S DAC UDA1334A, PCM5102A Board にて VOL- が発生します。
_ 対策は VOL- に 50msec Filter を入れました。
_ 追記:2021.05.01
_  原因は ESP32 by Espresso Systems version 1.06 によるものらしい。
_  WiFi 使用時に発生します。
_  対策は WiFi.Begin(); の後に WiFi.setSleep(false); 追加し GPIO39の誤動作は無くなりました。
8. 回路図作成:海外でPCM5102A I2S DAC Board の回路図が無いとの論議が多くあります。
_ 回路図は重要ですので Boardからと情報を集め作成しました。


.
スケッチ:Web Radio of M5Stack and I2S DAC : 2021.02.14 : macsbug
_ Enter your ssid and password:Wifi の ssid , pass は ご自身の値を設定してください。

///===========================================================
// Web Radio of M5Stack I2S DAC 
// UDA1334A : ORG   : 2021.02.14 : macsbug
// PCM5102A : rev 1 : 2021.02.20 : macsbug
// PCM5102A : rev 2 : 2021.03.03 : macsbug
// GPIO39   : rev 3 : 2021.05.01 : macsbug
// Github   : https://macsbug.wordpress.com/2021/04/16/web-radio-with-a-built-in-speaker-in-m5stack/
// Github   : https://macsbug.wordpress.com/2021/02/14/web_radio_of_m5stack_i2s_dac/
// Github   : https://macsbug.wordpress.com/2021/02/19/web-radio-of-m5stack-pcm5102a-i2s-dac/
// Github   : https://macsbug.wordpress.com/2021/01/08/web-radio-of-m5stack/
// Development environment : Aduino IDE ver 1.8.13
// Additional Boards Manager URLs : 
//            https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
// Boards Manager  : ESP32 by Espresso System version 1.06
// Board selection : M5Stack-Core_ESP32
// Library  : schreibfaul1/ESP32-audioI2S_Library
//            https://github.com/schreibfaul1/ESP32-audioI2S
// HardWare : M5Stack and UDA1334A I2S DAC Board
// HardWare : M5Stack and PCM5102A I2S DAC Board
// M5Stack  : Short T1 of M5stack Board(M5 Speaker Nois Cut)
// M5.BtnA.wasPressed() conflicts with WiFi? #52
//            https://github.com/m5stack/M5Stack/issues/52 
// After 1.0.6 update WiFi won't connect to other network // connection time increased #4980
//            https://github.com/espressif/arduino-esp32/issues/4980
//===========================================================

#pragma GCC optimize ("Ofast")
#include <M5Stack.h>
#include <M5StackUpdater.h> // SD-Upadate
#include "Free_Fonts.h"
#include <Arduino.h>
#include <WiFi.h>
#include <Audio.h>
Audio audio;
#define I2S_BCK  26 // M5Stack Node I2S pins
#define I2S_WS   25 // M5Stack Node I2S pins
#define I2S_DOUT 22 // M5Stack Node I2S pins
//        Enter your ssid and password. ------------
char ssid[] = "xxx"; // your network SSID (name) 
char pass[] = "xxx"; // your network password
int counter=0, old_counter=0, new_counter=0; 
int playflag=0, led=0, vol=5;
char URL[100], sname[100];

int Number_of_urls = 164 -1; // Change depending on the number of URLs
char *url[164] = {           // url*Station nam 
 "http://sj32.hnux.com/stream?type=http&nocache=3104*Smooth Jazz",
 "http://listen.181fm.com/181-beatles_128k.mp3*181-beatles_128k",
 "http://us2.internet-radio.com:8023/*Love Radio 93.9",
 "http://us5.internet-radio.com:8096/*I Love Smooth Jazz",
 "http://us5.internet-radio.com:8201/*Keith Jarrett - Over The Rainbow",
 "http://us3.internet-radio.com:8639/*Smooth Jazz Planet",
 "http://us5.internet-radio.com:8022/*Smooth Jazz DC",
 "http://us2.internet-radio.com:8046/*Matt Johnson Radio",
 "http://uk2.internet-radio.com:8236/*Funky Jazz/Soul 101 Radio",
 "http://us4.internet-radio.com:8171/*Smooth Jazz - Tampa Bay",
 "http://uk5.internet-radio.com:8174/*Joy Radio",
 "http://us3.internet-radio.com:8485/*Smooth Jazz CD 101.9 New York",
 "http://us1.internet-radio.com:8212/*KHIH-DB Colorado Smooth Jazz",
 "http://us2.internet-radio.com:8443/*MEGATON CAFE RADIO",
 "http://us4.internet-radio.com:8193/*RADIO ESTILO LEBLON",
 "http://us3.internet-radio.com:8297/*The Ranch - Classic Country",
 "http://uk7.internet-radio.com:8000/*MoveDaHouse",
 "http://uk1.internet-radio.com:8004/*Pink Noise Radio",
 "http://us5.internet-radio.com:8267/*CLASSIC ROCK RADIO HD",
 "http://us4.internet-radio.com:8258/*Classic Rock Florida HD",
 "http://us4.internet-radio.com:8266/*Smooth Jazz Florida",
 "http://us3.internet-radio.com:8297/*The Ranch - Classic Country",
 "http://uk6.internet-radio.com:8120/*Radio West Middlesex",
 "http://us3.internet-radio.com:8232/*Bach - C Major Prelude",
 "http://uk6.internet-radio.com:8144/*Radio Cherwell - Hospital Radio in Oxford",
 "http://uk5.internet-radio.com:8237/*Stoke Mandeville Hospital Radio",
 "http://us2.internet-radio.com:8075/*Classic Hits Global HD",
 "http://uk7.internet-radio.com:8226/*Box UK Radio danceradiouk",
 "http://us4.internet-radio.com:8193/*RADIO ESTILO LEBLON",
 "http://us4.internet-radio.com:8258/*Classic Rock Florida HD",
 "http://us4.internet-radio.com:8197/*EZ Hits South Florida",
 "http://uk7.internet-radio.com:8040/*Ava Max - Sweet But Psycho",
 "http://us5.internet-radio.com:8021/*Bill Evans",
 "http://uk2.internet-radio.com:31491/*A Heavenly World of Sound",
 "http://sj32.hnux.com/stream?type=http&nocache=1257*Smooth Lounge",
 "http://relay4.slayradio.org:8200/*SlayRadio", 
 "http://allstream.rainwave.cc:8000/all.mp3*Rainwave All",
 "http://tx.sharp-stream.com/icecast.php?i=planetrock.mp3*Planet Rock",
 "http://s1.viastreaming.net:8000*Smooth Choice",
 "http://sc6.radiocaroline.net:8040/listen.pls*Radio Caroline",
 "http://sc6.radiocaroline.net:10558/listen.pls*Radio Caroline Flashback",
 "http://listen.181fm.com/181-uktop40_128k.mp3*181 F M Top 40",
 "http://listen.181fm.com/181-90scountry_128k.mp3*181 F M Country",
 "http://listen.181fm.com/181-oldschool_128k.mp3*181 F M Old School",
 "http://listen.181fm.com/181-90sdance_128k.mp3*181 F M Nineties Dance",
 "http://listen.181fm.com/181-chilled_128k.mp3*181 F M Chilled",
 "http://listen.181fm.com/181-classical_128k.mp3*181 F M Classical", //
 "http://ice2.somafm.com/christmas-128-mp3*SomaFM Xmas",
 "http://www.internet-radio.com/station/sanfranciscos70shits/*San Franciscos 70s Hits",
 "http://5.152.208.98:8058/*Ancient FM",
 "http://streamer.radio.co/s06b196587/listen*KPop Way Radio",
 "http://jenny.torontocast.com:8134/stream*Mega Shuffle",
 "http://wbgo.streamguys.net/wbgo96*WBGO FM 96",
 "http://wbgo.streamguys.net/thejazzstream*jazzstream",
 "http://stream.srg-ssr.ch/thejazzstream*mp3_128",
 "http://icecast.omroep.nl/3fm-sb-mp3*3fm-sb-mp3",
 "http://media-ice.musicradio.com:80/ClassicFMMP3*Classic FM",
 "http://113fm-edge2.cdnstream.com/5185_48*BigR - 80s Lite",
 "http://streaming307.radionomy.com/WOKEmemories_64.aac*WOKEmemories ",
 "http://streaming316.radionomy.com/W1RS-blues--Rock-s-Radio*W1RSblues&Rock'sRadio",
 "http://streaming307.radionomy.com/bleudream-80_64.aac*bleudream-8",
 "http://streaming211.radionomy.com/ClassicRock-HardRock_64.aac*ClassicRock&HardRock",
 "http://streaming211.radionomy.com/kingdom-rap-radio*KingdomRapRadio",
 "http://streaming211.radionomy.com/radio-delight-kwitonta*Delight Kwitonta FM",
 "http://streaming308.radionomy.com/ViejitasPeroBonitasRadio*Viejitas Pero Bonitas Radio",
 "http://streaming307.radionomy.com/mmabathofm-live*Mmabatho FM LIVE",
 "http://streaming211.radionomy.com/sjl-radio*SjlRadio",
 "http://188.138.9.183/lounge-austria-mobile.mp3*Unspecified name",
 "http://ais-edge24-nyc06.cdnstream.com/2316_128.mp3*Foster Care Warrior Radio",
 "http://play.global.audio/bgradio128*RADIO BGRADIO",
 "http://webradio.antennevorarlberg.at/live*ANTENNE VORARLBERG HD",
 "http://s2.cdnradio.ru/ru-mp3-128*RUSSIAN SONGS",
 "http://live.coolradio.rs/cool128*COOL radio | Serbia",
 "http://streaming315.radionomy.com/foxnews*FOX News Radio",
 "http://ais-edge16-jbmedia-nyc04.cdnstream.com/hot108*HOT 108 JAMZ",
 "http://streams.iloveradio.de/iloveradio1.mp3*I Love Radio",
 "http://live.antenne.at/as*Antenne Steiermark",
 "http://webstream.schlagerparadies.de/schlagerparadies128k.mp3*SCHLAGERPARADIES",
 "http://streaming211.radionomy.com/rtl-1025*RTL 102.5",
 "http://retesport.newradio.it/1*RETE SPORT",
 "http://icy.unitedradio.it/VirginRogerWaters.mp3*PinkFloyd",
 "http://live.m2stream.fr/m280-128.mp3*M2 80's",
 "http://live.m2stream.fr/m2hit-128.mp3*M2 Hit's",
 "http://live.m2stream.fr/m2club-128.mp3*M2 Club",
 "http://live.m2stream.fr/m2love-128.mp3*M2 Love",
 "http://live.m2stream.fr/m2rock-128.mp3*M2 Rock",
 "http://live.m2stream.fr/m2sunshine-128.mp3*M2 Sunshine",
 "http://100radio-90.ice.infomaniak.ch/100radio-90-64.aac*100  0",
 "http://100radio-80.ice.infomaniak.ch/100radio-80-64.aac*1000",
 "http://100radio-hit.ice.infomaniak.ch/100radio-hit-64.aac*100",
 "http://icecast.vgtrk.cdnvideo.ru/vestifm_aac_32kbps*FM News",
 "http://nashe1.hostingradio.ru/nashe20-128.mp3*Our Radio",
 "http://mp3.ffh.de/radioffh/hqlivestream.aac*hqlivestream",
 "http://radiostreaming.ert.gr/ert-kosmos*ert-kosmos",
 "http://ic6.101.ru:8000/a161*Italo Disco",
 "http://cmr-hosting.com/*8050**CLUB MUSIC RADIO - ITALO DISCO",
 "http://den.101.ru:4000/ar_66_03*101.ru - AutoRadio Ekaterinburg",
 "http://ic7.101.ru:8000/a79*101.ru - Cyber Space",
 "http://ic7.101.ru:8000/a161*101.ru - Italo Disco",
 "http://ic7.101.ru:8000/a175*ENIGMA",
 "http://vladfm.com:8000/vfm*Radio Vladivostok FM",
 "http://jfm1.hostingradio.ru:14536/rcstream.mp3*Radio Classic",
 "http://retroserver.streamr.ru:8043/retro128*Radio Retro FM",
 "http://retro70.hostingradio.ru:8025/retro70-128.mp3*Radio Retro FM 70e",
 "http://91.211.56.218:8080/piramida/nazarovo*Radio Piramida FM",
 "http://sea.1tvcrimea.ru:9003/stream_sea.mp3*Radio More",
 "http://kommersant77.hostingradio.ru:8016/kommersant128.mp3*Radio Kommersant FM",
 "http://bfmstream.bfm.ru:8004/fm64*Business FM Moscow 87.5",
 "http://ep128server.streamr.ru:8030/ep128*Europe plus",
 "http://212.26.146.50:8000/rusrock.mp3*Russian rock music",
 "http://listen2.myradio24.com:9000/8144*Radio Magic",
 "http://media2.brg.ua:8000/shanson_l*Radio Chanson",
 "http://online1.gkvr.ru:8000/radiola_eka_128.mp3*Radio Radiola",
 "http://online.radiorecord.ru:8102/sd90_128*Disco 90х",
 "http://online.radiorecord.ru:8102/sd90_128*Superdisco 90х",
 "http://airspectrum.cdnstream1.com:8000/1261_192*Magic Oldies Florida",
 "http://37.187.79.93:8368/stream2*stream2",
 "http://tropicalisima.net:8020/stream/1/*stream",
 "http://192.173.28.222:3690/KRSHFMAAC_SC*The Krush - Wine Country Radio",
 "http://ice.creacast.com/myzen-aac-64*MyZen Radio",
 "http://cms.stream.publicradio.org/cms.aac*Classical 24",
 "http://ais-sa3.cdnstream1.com/2440_128.aac*Oregon Public Broadcasting",
 "http://nis.stream.publicradio.org/nis.aac*MPR News - Minnesota Public Radio",
 "http://current.stream.publicradio.org/current.mp3*The Current",
 "http://stm29.conectastm.com:18860/stream*Nativa FM",
 "http://stream.haarlem105.nl:8000/haarlem105low.mp3*Haarlem 10",
 "http://rockthecradle.stream.publicradio.org/radioheartland.mp3*Radio Heartland - MPR",
 "http://studioone-stream.iowapublicradio.org/StudioOne.mp3*Iowa Public Radio News and Studio One",
 "http://opera-stream.wqxr.org/wnycam-app*WNYC-AM - New York Public Radio",
 "http://bbcmedia.ic.llnwd.net/stream/bbcmedia_radio4fm_mf_p*BBC Radio 4",
 "http://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-einws*BBC World Service",
 "http://sc8.radiocaroline.net/;*Radio Caroline",
 "http://108.61.154.147:6978/*The Nemesis Radio",
 "http://198.50.156.92:8439/*Power 945 ~Your Anime & Gaming Connection~",
 "http://198.50.158.92:8803/*Japannext Radio",
 "http://62.75.215.7:8016/*Blue Heron Radio",
 "http://23.29.71.154:8062/*Friends Forever",
 "http://184.75.223.178:8011/*J-Idols Project Radio - Global Edition",
 "http://radio.kahoku.net:8000/*FMkahoku",
 "http://51.81.46.118:3350/*J-Club Powerplay HipHop",
 "http://51.81.46.118:3340/*J-Rock PowerPlay",
 "http://184.75.223.178:8083/*J-Pop Project Radio - Global Edition",
 "http://uk5.internet-radio.com:8306/*Moon Mission Recordings, Tokyo Deep and Electronic",
 "http://sj32.hnux.com/stream?type=http&nocache=3104*Smooth Jazz",
 "http://uk7.internet-radio.com:8226/*Box UK Radio danceradiouk",
 "http://uk6.internet-radio.com:8230/*Brassbandradio Radio",
 "http://uk1.internet-radio.com:8355/*The Zone - Dublin",
 "http://uk5.internet-radio.com:8011/*Top 80 radio",
 "http://uk7.internet-radio.com:8281/*SWEET ONE RADIO (FRENCH RADIO)",
 "http://uk2.internet-radio.com:8288/*Lymm Community Radio",
 "http://us3.internet-radio.com:8496/*RaveRocksRadio",
 "http://uk3.internet-radio.com:8288/*Relaxing Music",
 "http://us3.internet-radio.com:8157/*Amaghana Radio",
 "http://uk1.internet-radio.com:8465/*Great relaxing music, a nice journey away of the daily problems",
 "http://us3.internet-radio.com:8157/*Amaghana Radio",
 "http://uk1.internet-radio.com:8235/*Hospital Radio",
 "http://us5.internet-radio.com:8026/*Ukiss Radio",
 "http://uk6.internet-radio.com:8224/*Breaking Barriers Bulgaria",
 "http://us2.internet-radio.com:8075/*Classic Hits Global HD",
 "http://uk7.internet-radio.com:8168/*242 RADIO stream",
 "http://uk3.internet-radio.com:8405/*Majestic Jukebox Radio #HIGH QUALITY SOUND",
 "http://us2.internet-radio.com:8443/*MEGATON CAFE RADIO"
};
//  http://icecast.omroep.nl
//  http://github.com/pilnikov/KaRadio32_fork/blob/master/playlist/WebStations.txt
//  http://fmstream.org
//  http://www.internet-radio.com

//============================================================
void setup() {
  // M5Stack Initialize --------------------------------------
  M5.begin();
  Wire.begin();if(digitalRead(BUTTON_A_PIN)==0){updateFromFS(SD);ESP.restart();}
  M5.Lcd.setRotation(1);
  M5.Lcd.fillScreen  (BLUE);               // 0x657F
  M5.Lcd.setFreeFont (FMB12);              // font
  MP(0,1,0xFFFF," Web Radio of M5Stack");  // x,yLine,WHITE
  // WiFi Connection ----------------------------------------
  WiFi.disconnect();
  WiFi.begin(ssid,pass);                   // Set ssid,pass
  WiFi.setSleep(false);                    // Prevent GPIO39 Pulse
  M5.Lcd.setTextColor(WHITE);M5.Lcd.setCursor(0,44);
  while(WiFi.status()!=WL_CONNECTED){delay(50);M5.Lcd.print(".");}
  MP(0,2,0xFFFF,"Connected to Wifi");      // Infomation
  // UDA1334A or PCM5102A I2S DAC Initialize ----------------
  audio.setPinout(I2S_BCK,I2S_WS,I2S_DOUT);// Setup I2S Pin
  audio.setVolume(vol);                    // Set Vol 0...21
  speech("こんにちは","ja");                 // Speech
  speech("Web Radio of M5Stack","en");     // Speech
  // Button Initialize --------------------------------------
  Button_(0xD6DA,0xD6DA,0xD6DA);           // ch Button off
  delay(1000);
}
//============================================================
void loop() {
  M5.update();
  audio.loop();//Executes an internal loop of the audio library
  // playflag 0 ---------------------------------------------
  if (playflag == 0){
    // Station up -------------------------------------------
    Button_(0xD6DA,0x762F,0xD6DA);       // ch Button on
    MP(0,2,0xFFFF,"Wait...");            // Infomation
    url_sname(counter);                  // station,url,sname
    speech(sname,"en");                  // speech
    audio.connecttohost(URL);            // URL connection
    playflag = 1;
    // Display update ---------------------------------------
    MP(0,3,0xFFFF,"Station:"+String(counter));// Staion NO.
    M5.Lcd.fillRect (0,110,320,80,BLUE);      // clear
    MP(0,4,0xFFFF,"Playing:"+String(sname));  // Staion name
    set_vol_btn();                       // Volume and Button
    M5.Lcd.fillRect (0,30,320,20,BLUE);  // Clear info Line
    MP(0,2,0xFFFF,"Playing");            // Infomation
  }
  // playflag 1 ----------------------------------------------
  // Play LED ------------------------------------------------
  led = led + 1;
  if (led>1){led=0;M5.Lcd.fillCircle(310,8,5,GREEN);// led on
    }else{         M5.Lcd.fillCircle(310,8,5,BLUE );// led off
  }
  // ch+ -----------------------------------------------------
  if(M5.BtnB.wasPressed()){                // B Button
    M5.Lcd.fillRect (0,110,320,88,BLUE);   // Clear Sta,sname Line
    Button_(0xD6DA,0x762F,0xD6DA);         // ch Button on
    old_counter=counter;                   // old counter set
    counter=counter+1;                     // Station UP
    if(counter>Number_of_urls){counter=0;} // url count
    new_counter=counter;                   // New Station UP
    playflag = 0;                          // Start Play
  }
  // Vol- -----------------------------------------------------
  if(M5.BtnA.wasPressed()){                // A Button
    Button_(0x762F,0xD6DA,0xD6DA);         // vol Button on
    vol=vol-1; if(vol<0){vol=0;}           // Vol -
    set_vol_btn();                         // Volume and Button
  }
  // Vol+ ------------------------------------------------------
  if(M5.BtnC.wasPressed()){                // C Button
    Button_(0xD6DA,0xD6DA,0x762F);         // vol Button on
    vol=vol+1; if(vol>21){vol=20;}         // Vol +
    set_vol_btn();                         // Volume and Button
  }
} // End of Loop
//==============================================================
void MP(int xpos, int yLine, int16_t color, String str){
  M5.Lcd.fillRect (xpos,30*yLine-30,320,20,BLUE); // clear
  M5.Lcd.setCursor(xpos,30*yLine-16);             // yLine:0-8
  M5.Lcd.setTextColor(color);M5.Lcd.println(str); // Display
// https://github.com/m5stack/m5-docs/blob/master/docs/ja/api/lcd.md
}
//--------------------------------------------------------------
void set_vol_btn(){
  audio.setVolume(vol);                    // Set Volume
  MP(0,7,0xFFFF,"Volume:");MP(100,7,0xFFFF,String(int(vol*5)));
  M5.Lcd.progressBar(150,180,160,16,vol*5);// ProgressBar
  delay(250);Button_(0xD6DA,0xD6DA,0xD6DA);// vol Button off
}
//--------------------------------------------------------------
void Button_(long BA,long BB,long BC){     // Button display
  // https://trolsoft.ru/en/articles/rgb565-color-picker
  M5.Lcd.setTextColor(BLACK);              // BLACK
  M5.Lcd.fillRoundRect( 37,210,60,30,5,BA);
  M5.Lcd.setCursor( 40,230);M5.Lcd.println("vol-");
  M5.Lcd.fillRoundRect(133,210,60,30,5,BB);
  M5.Lcd.setCursor(149,230);M5.Lcd.println("ch");
  M5.Lcd.fillRoundRect(226,210,60,30,5,BC);
  M5.Lcd.setCursor(229,230);M5.Lcd.println("vol+");
}
//--------------------------------------------------------------
void url_sname(int c){ // Separate into URL, sname
  // URL -------------------------------------------------------
  String u=String(url[c]).substring(0,String(url[c]).indexOf("*")+1); 
  u.toCharArray(URL,u.length());           // URL
  // Sname -----------------------------------------------------
  String s=String(url[c]).substring(String(url[c]).indexOf("//")+2); 
  String n=s.substring(s.indexOf("*")+1)+1;
  n.toCharArray(sname,n.length());         // sname
}
//--------------------------------------------------------------
void speech(char* speech, char* Lang){ // Increase volume by +5
  audio.setVolume(vol+5);audio.connecttospeech(speech,Lang);
  audio.setVolume(vol);
}
//--------------------------------------------------------------

.
,
M5Stack , Web Radio , UDA1334A , I2S DAC , 1334A , PCM5102A , Boards Manager .

Written by macsbug

2月 19, 2021 at 3:14 pm

カテゴリー: M5STACK

Web_Radio_of_M5Stack_I2S_DAC

with 4 comments

M5Stack と I2S DAC Board で Web Radio を製作しました。 ORG : 2021.02.14
……………………… Boards Manager 1.05-rc7 による改訂:rev1 : 2021.02.20
……………………………. Boards Manager 1.05 による改訂:rev2 : 2021.03.04
……………………………. Boards Manager 1.06 による改訂:rev3 : 2021.05.01

.
仕様:
1. 局 ( Station ) :150局。ボタンで選択。局の追加も可能です。
2. 再生:Stereo。
3. 音質:M5Stack内蔵スピーカーより遥かに良いです。
4. 操作:ボタンで操作します。
_  A button:Volume – 。B button:Channel up 。C button:Volume +
5. 文書発声機能:日本語、英語 等の文章を音声再生が出来ます。

構成:
1. 開発機種:MacBook Pro (16-inch, 2019) , macOS Catalina Ver 10.15.7
2. 開発環境:Arduino IDE 1.8.13
3. Library:schreibfaul1/ESP32-audioI2S
4. HARD:M5Stack
5. HARD:UDA1334A I2S DAC Module:現品は NXP1334A
_     Aliexpressで $2.8(300円)以下で購入可能。
6. HARD:Speaker Amp or Headphones:ダイソー ミニスピーカー

費用:1000円。( Without M5Stack )

No. Nomen Price
1 UDA1334A I2S DAC Module 300円
2 M-BUS PCB 100円
3 DAYSO Speaker 300円
4 Other 280円
Total 980円

.
Down Load:
. Web_Radio_of_M5Stack_I2S_DAC.zip を Down Load します。
. Fileは PDF形式で DL後に Web_Radio_of_M5Stack_I2S_DAC.zip に変更し解凍します。

. Library:ESP32-audioI2S


.
I2S DAC Board:CJMCU-1334 ( UDA1334A I2S DAC ) ( NXP1334A I2S DAC )
_ 電源:VIN は 5V です。LDO LG33 で 3.3V が作られています。
_ 参考:Adafruit I2S Stereo Decoder – UDA1334A

.


.
配線:5本 ( BCLK, DIN, WSEL, GND, VIN )

UDA1334A BCLK DIN WSEL GND VIN
M-BUS 26 22 25 GND 5V

M5Stackの改造:ノイズ対策。
理由:I2S は M5Stack の GPIO 25 を使用します。
_ GPIO 25 には アンプとSpeaker が接続されており I2Sの信号でノイズがでます。
_ 対策は M5Stack基板上の T1 端子をハンダ等でShort させます。
_ Speaker Amp の電源が遮断され ノイズが無くなります。


.
Arduino IDE 開発条件と方法:
_ 1. Additional Boards Manager URLs:ESP32 Stable version
_ 2. Boards Manager:ESP32 by Espresso Systems version 1.0.5
_ 3. Board Selection : M5Stack-Core-ESP32
_ の設定を行ないます。

条件:
1. Aduino IDE Additional Boards Manager URLs に以下のStable verを追加します。
_ 補足:released this Feb 23, 2021:Latest Stable Release and Latest Development Release

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

2. Arduino IDE Boards Manager 設定:
_ Boards Managerを選択し ESP32 で検索。
_ ESP32 by Espresso Systems version 1.05 にします。( released this Feb 23, 2021)
_

3. Arduino IDE 設定:
_ Board Selection : M5Stack-Core-ESP32

方法:スケッチ:宣言
1. include <M5Stack.h>
2. include <Audio.h>

補足:ESP32-audioI2S_Library ( Audio.cpp ) について。
_ Audio.cpp に以下の記述があり、上記設定外でコンパイルエラーが出る時があります。
_ Audio::Audio(const uint8_t BCLK, const uint8_t LRC, const uint8_t DOUT) {
_ clientsecure.setInsecure();
_ // if that can’t be resolved update to ESP32 Arduino version 1.0.5-rc05 or higher
_ //i2s configuration
_
.


.
Library:ESP32-audioI2S:文書発声機能について。
_ ESP32-audioI2S にある Audio.cppには 文書発声機能が内蔵されています。
_ これにより PCM5102A , UDA1334A I2S DAC から音声を出す事が出来ます。
_ 日本語、英語 等ができます。
_ 例:audio.connecttospeech(“こんにちは”, “ja”)
_ 例:audio.connecttospeech(“Hello”, “en”)
_ 例:audio.connecttospeech(“Wenn die Hunde schlafen, kann der Wolf gut Schafe stehlen.”, “de”);
.


.
課題:時々 ボタンを押さなくとも GPIO 39 に Pulseが発生し Vol – が動作する。
_ 特に Joy Radio Station , http://uk5.internet-radio.com:8174/ で多く発生する。
_ 受信の あるタイミングで GPIO 39 をアクセスする。
_ ソフト検証では、GPIO 39 に 0〜1msec 程度の Pulse が発生します。
_  24msec程度の時も1度経験しました。
対策:M5.BtnA.wasPressed() でなく、M5.BtnA.pressedFor(50) にて
_   50msec以上の場合の時に Vol – を動作する様にしました。
_   メモ:通常、人のボタンをプチッと押す時間は 200〜300msec程度です。
.


.
感想:
1. 注意:ESP32-audioI2S の Audio.cpp の注意書きの対応が必要です。
_ ESP32 by Espresso Systems version 1.05 を使用します。

2. 前回の Web Radio of M5Stack (VS1053)よりも通信速度が速い事と
_ 出力が大きく音が明瞭です。
3. 費用:UDA1334A Module は 300円以下で安価にできます。
_    ただし国内やアマゾンでは高価な価格で販売されています。
4. 局数:150局。現存する Web Radio の中で最大の局数です。
5. ESP32 by Espresso System version:
_ 1.05-rc5, 1.05-rc6 は たまに M5stackの画面が白くなる現象がありました。
_ 2021.02.23 に ver 1.0.5 が公開されました。
_ ver 1.0.5-rc7 又は ver 1.05 により M5Stackの画面が白くなる現象は無くなりました。
_ 上記の開発環境は
_ ESP32-audioI2S ( Audio.cpp ) を使用する為に、
_ Espresso System version 1.05 が必要である事、
_ さらに Board Select を ESP32 Dev Module にする事。
_ M5Stack で使用するには ESP32-Chimera-Core が必要になる。
_ この為に M5.Lcd の ボタン操作命令が使用出来ないとか
_ 一部の画像表示命令が使用出来ない制限があります。
_ ver 1.05 により M5Stack.h が使用できる様になりました。
6 .課題と対策:たまに VOL- (GPIO39)が動作する課題がありました。原因不明。
_ VS1053 mp3 Board, I2S DAC UDA1334A, PCM5102A Board にて同様に VOL- が発生します。
_ 対策は VOL- に 50msec Filter を入れました。


.
スケッチ:Web Radio of M5Stack and I2S DAC : 2021.02.14 : macsbug
_ Enter your ssid and password:Wifi の ssid , pass は ご自身の値を設定してください。

//===========================================================
// Web Radio of M5Stack I2S DAC 
// UDA1334A : ORG   : 2021.02.14 : macsbug
// PCM5102A : rev 1 : 2021.02.20 : macsbug
// PCM5102A : rev 2 : 2021.03.03 : macsbug
// GPIO39   : rev 3 : 2021.05.01 : macsbug
// Github   : https://macsbug.wordpress.com/2021/04/16/web-radio-with-a-built-in-speaker-in-m5stack/
// Github   : https://macsbug.wordpress.com/2021/02/14/web_radio_of_m5stack_i2s_dac/
// Github   : https://macsbug.wordpress.com/2021/02/19/web-radio-of-m5stack-pcm5102a-i2s-dac/
// Github   : https://macsbug.wordpress.com/2021/01/08/web-radio-of-m5stack/
// Development environment : Aduino IDE ver 1.8.13
// Additional Boards Manager URLs : 
//            https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
// Boards Manager  : ESP32 by Espresso System version 1.06
// Board selection : M5Stack-Core_ESP32
// Library  : schreibfaul1/ESP32-audioI2S_Library
//            https://github.com/schreibfaul1/ESP32-audioI2S
// HardWare : M5Stack and UDA1334A I2S DAC Board
// HardWare : M5Stack and PCM5102A I2S DAC Board
// M5Stack  : Short T1 of M5stack Board(M5 Speaker Nois Cut)
// M5.BtnA.wasPressed() conflicts with WiFi? #52
//            https://github.com/m5stack/M5Stack/issues/52 
// After 1.0.6 update WiFi won't connect to other network // connection time increased #4980
//            https://github.com/espressif/arduino-esp32/issues/4980
//===========================================================

#pragma GCC optimize ("Ofast")
#include <M5Stack.h>
#include <M5StackUpdater.h> // SD-Upadate
#include "Free_Fonts.h"
#include <Arduino.h>
#include <WiFi.h>
#include <Audio.h>
Audio audio;
#define I2S_BCK  26 // M5Stack Node I2S pins
#define I2S_WS   25 // M5Stack Node I2S pins
#define I2S_DOUT 22 // M5Stack Node I2S pins
//        Enter your ssid and password. ------------
char ssid[] = "xxx"; // your network SSID (name) 
char pass[] = "xxx"; // your network password
int counter=0, old_counter=0, new_counter=0; 
int playflag=0, led=0, vol=5;
char URL[100], sname[100];

int Number_of_urls = 164 -1; // Change depending on the number of URLs
char *url[164] = {           // url*Station nam 
 "http://sj32.hnux.com/stream?type=http&nocache=3104*Smooth Jazz",
 "http://listen.181fm.com/181-beatles_128k.mp3*181-beatles_128k",
 "http://us2.internet-radio.com:8023/*Love Radio 93.9",
 "http://us5.internet-radio.com:8096/*I Love Smooth Jazz",
 "http://us5.internet-radio.com:8201/*Keith Jarrett - Over The Rainbow",
 "http://us3.internet-radio.com:8639/*Smooth Jazz Planet",
 "http://us5.internet-radio.com:8022/*Smooth Jazz DC",
 "http://us2.internet-radio.com:8046/*Matt Johnson Radio",
 "http://uk2.internet-radio.com:8236/*Funky Jazz/Soul 101 Radio",
 "http://us4.internet-radio.com:8171/*Smooth Jazz - Tampa Bay",
 "http://uk5.internet-radio.com:8174/*Joy Radio",
 "http://us3.internet-radio.com:8485/*Smooth Jazz CD 101.9 New York",
 "http://us1.internet-radio.com:8212/*KHIH-DB Colorado Smooth Jazz",
 "http://us2.internet-radio.com:8443/*MEGATON CAFE RADIO",
 "http://us4.internet-radio.com:8193/*RADIO ESTILO LEBLON",
 "http://us3.internet-radio.com:8297/*The Ranch - Classic Country",
 "http://uk7.internet-radio.com:8000/*MoveDaHouse",
 "http://uk1.internet-radio.com:8004/*Pink Noise Radio",
 "http://us5.internet-radio.com:8267/*CLASSIC ROCK RADIO HD",
 "http://us4.internet-radio.com:8258/*Classic Rock Florida HD",
 "http://us4.internet-radio.com:8266/*Smooth Jazz Florida",
 "http://us3.internet-radio.com:8297/*The Ranch - Classic Country",
 "http://uk6.internet-radio.com:8120/*Radio West Middlesex",
 "http://us3.internet-radio.com:8232/*Bach - C Major Prelude",
 "http://uk6.internet-radio.com:8144/*Radio Cherwell - Hospital Radio in Oxford",
 "http://uk5.internet-radio.com:8237/*Stoke Mandeville Hospital Radio",
 "http://us2.internet-radio.com:8075/*Classic Hits Global HD",
 "http://uk7.internet-radio.com:8226/*Box UK Radio danceradiouk",
 "http://us4.internet-radio.com:8193/*RADIO ESTILO LEBLON",
 "http://us4.internet-radio.com:8258/*Classic Rock Florida HD",
 "http://us4.internet-radio.com:8197/*EZ Hits South Florida",
 "http://uk7.internet-radio.com:8040/*Ava Max - Sweet But Psycho",
 "http://us5.internet-radio.com:8021/*Bill Evans",
 "http://uk2.internet-radio.com:31491/*A Heavenly World of Sound",
 "http://sj32.hnux.com/stream?type=http&nocache=1257*Smooth Lounge",
 "http://relay4.slayradio.org:8200/*SlayRadio", 
 "http://allstream.rainwave.cc:8000/all.mp3*Rainwave All",
 "http://tx.sharp-stream.com/icecast.php?i=planetrock.mp3*Planet Rock",
 "http://s1.viastreaming.net:8000*Smooth Choice",
 "http://sc6.radiocaroline.net:8040/listen.pls*Radio Caroline",
 "http://sc6.radiocaroline.net:10558/listen.pls*Radio Caroline Flashback",
 "http://listen.181fm.com/181-uktop40_128k.mp3*181 F M Top 40",
 "http://listen.181fm.com/181-90scountry_128k.mp3*181 F M Country",
 "http://listen.181fm.com/181-oldschool_128k.mp3*181 F M Old School",
 "http://listen.181fm.com/181-90sdance_128k.mp3*181 F M Nineties Dance",
 "http://listen.181fm.com/181-chilled_128k.mp3*181 F M Chilled",
 "http://listen.181fm.com/181-classical_128k.mp3*181 F M Classical", //
 "http://ice2.somafm.com/christmas-128-mp3*SomaFM Xmas",
 "http://www.internet-radio.com/station/sanfranciscos70shits/*San Franciscos 70s Hits",
 "http://5.152.208.98:8058/*Ancient FM",
 "http://streamer.radio.co/s06b196587/listen*KPop Way Radio",
 "http://jenny.torontocast.com:8134/stream*Mega Shuffle",
 "http://wbgo.streamguys.net/wbgo96*WBGO FM 96",
 "http://wbgo.streamguys.net/thejazzstream*jazzstream",
 "http://stream.srg-ssr.ch/thejazzstream*mp3_128",
 "http://icecast.omroep.nl/3fm-sb-mp3*3fm-sb-mp3",
 "http://media-ice.musicradio.com:80/ClassicFMMP3*Classic FM",
 "http://113fm-edge2.cdnstream.com/5185_48*BigR - 80s Lite",
 "http://streaming307.radionomy.com/WOKEmemories_64.aac*WOKEmemories ",
 "http://streaming316.radionomy.com/W1RS-blues--Rock-s-Radio*W1RSblues&Rock'sRadio",
 "http://streaming307.radionomy.com/bleudream-80_64.aac*bleudream-8",
 "http://streaming211.radionomy.com/ClassicRock-HardRock_64.aac*ClassicRock&HardRock",
 "http://streaming211.radionomy.com/kingdom-rap-radio*KingdomRapRadio",
 "http://streaming211.radionomy.com/radio-delight-kwitonta*Delight Kwitonta FM",
 "http://streaming308.radionomy.com/ViejitasPeroBonitasRadio*Viejitas Pero Bonitas Radio",
 "http://streaming307.radionomy.com/mmabathofm-live*Mmabatho FM LIVE",
 "http://streaming211.radionomy.com/sjl-radio*SjlRadio",
 "http://188.138.9.183/lounge-austria-mobile.mp3*Unspecified name",
 "http://ais-edge24-nyc06.cdnstream.com/2316_128.mp3*Foster Care Warrior Radio",
 "http://play.global.audio/bgradio128*RADIO BGRADIO",
 "http://webradio.antennevorarlberg.at/live*ANTENNE VORARLBERG HD",
 "http://s2.cdnradio.ru/ru-mp3-128*RUSSIAN SONGS",
 "http://live.coolradio.rs/cool128*COOL radio | Serbia",
 "http://streaming315.radionomy.com/foxnews*FOX News Radio",
 "http://ais-edge16-jbmedia-nyc04.cdnstream.com/hot108*HOT 108 JAMZ",
 "http://streams.iloveradio.de/iloveradio1.mp3*I Love Radio",
 "http://live.antenne.at/as*Antenne Steiermark",
 "http://webstream.schlagerparadies.de/schlagerparadies128k.mp3*SCHLAGERPARADIES",
 "http://streaming211.radionomy.com/rtl-1025*RTL 102.5",
 "http://retesport.newradio.it/1*RETE SPORT",
 "http://icy.unitedradio.it/VirginRogerWaters.mp3*PinkFloyd",
 "http://live.m2stream.fr/m280-128.mp3*M2 80's",
 "http://live.m2stream.fr/m2hit-128.mp3*M2 Hit's",
 "http://live.m2stream.fr/m2club-128.mp3*M2 Club",
 "http://live.m2stream.fr/m2love-128.mp3*M2 Love",
 "http://live.m2stream.fr/m2rock-128.mp3*M2 Rock",
 "http://live.m2stream.fr/m2sunshine-128.mp3*M2 Sunshine",
 "http://100radio-90.ice.infomaniak.ch/100radio-90-64.aac*100  0",
 "http://100radio-80.ice.infomaniak.ch/100radio-80-64.aac*1000",
 "http://100radio-hit.ice.infomaniak.ch/100radio-hit-64.aac*100",
 "http://icecast.vgtrk.cdnvideo.ru/vestifm_aac_32kbps*FM News",
 "http://nashe1.hostingradio.ru/nashe20-128.mp3*Our Radio",
 "http://mp3.ffh.de/radioffh/hqlivestream.aac*hqlivestream",
 "http://radiostreaming.ert.gr/ert-kosmos*ert-kosmos",
 "http://ic6.101.ru:8000/a161*Italo Disco",
 "http://cmr-hosting.com/*8050**CLUB MUSIC RADIO - ITALO DISCO",
 "http://den.101.ru:4000/ar_66_03*101.ru - AutoRadio Ekaterinburg",
 "http://ic7.101.ru:8000/a79*101.ru - Cyber Space",
 "http://ic7.101.ru:8000/a161*101.ru - Italo Disco",
 "http://ic7.101.ru:8000/a175*ENIGMA",
 "http://vladfm.com:8000/vfm*Radio Vladivostok FM",
 "http://jfm1.hostingradio.ru:14536/rcstream.mp3*Radio Classic",
 "http://retroserver.streamr.ru:8043/retro128*Radio Retro FM",
 "http://retro70.hostingradio.ru:8025/retro70-128.mp3*Radio Retro FM 70e",
 "http://91.211.56.218:8080/piramida/nazarovo*Radio Piramida FM",
 "http://sea.1tvcrimea.ru:9003/stream_sea.mp3*Radio More",
 "http://kommersant77.hostingradio.ru:8016/kommersant128.mp3*Radio Kommersant FM",
 "http://bfmstream.bfm.ru:8004/fm64*Business FM Moscow 87.5",
 "http://ep128server.streamr.ru:8030/ep128*Europe plus",
 "http://212.26.146.50:8000/rusrock.mp3*Russian rock music",
 "http://listen2.myradio24.com:9000/8144*Radio Magic",
 "http://media2.brg.ua:8000/shanson_l*Radio Chanson",
 "http://online1.gkvr.ru:8000/radiola_eka_128.mp3*Radio Radiola",
 "http://online.radiorecord.ru:8102/sd90_128*Disco 90х",
 "http://online.radiorecord.ru:8102/sd90_128*Superdisco 90х",
 "http://airspectrum.cdnstream1.com:8000/1261_192*Magic Oldies Florida",
 "http://37.187.79.93:8368/stream2*stream2",
 "http://tropicalisima.net:8020/stream/1/*stream",
 "http://192.173.28.222:3690/KRSHFMAAC_SC*The Krush - Wine Country Radio",
 "http://ice.creacast.com/myzen-aac-64*MyZen Radio",
 "http://cms.stream.publicradio.org/cms.aac*Classical 24",
 "http://ais-sa3.cdnstream1.com/2440_128.aac*Oregon Public Broadcasting",
 "http://nis.stream.publicradio.org/nis.aac*MPR News - Minnesota Public Radio",
 "http://current.stream.publicradio.org/current.mp3*The Current",
 "http://stm29.conectastm.com:18860/stream*Nativa FM",
 "http://stream.haarlem105.nl:8000/haarlem105low.mp3*Haarlem 10",
 "http://rockthecradle.stream.publicradio.org/radioheartland.mp3*Radio Heartland - MPR",
 "http://studioone-stream.iowapublicradio.org/StudioOne.mp3*Iowa Public Radio News and Studio One",
 "http://opera-stream.wqxr.org/wnycam-app*WNYC-AM - New York Public Radio",
 "http://bbcmedia.ic.llnwd.net/stream/bbcmedia_radio4fm_mf_p*BBC Radio 4",
 "http://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-einws*BBC World Service",
 "http://sc8.radiocaroline.net/;*Radio Caroline",
 "http://108.61.154.147:6978/*The Nemesis Radio",
 "http://198.50.156.92:8439/*Power 945 ~Your Anime & Gaming Connection~",
 "http://198.50.158.92:8803/*Japannext Radio",
 "http://62.75.215.7:8016/*Blue Heron Radio",
 "http://23.29.71.154:8062/*Friends Forever",
 "http://184.75.223.178:8011/*J-Idols Project Radio - Global Edition",
 "http://radio.kahoku.net:8000/*FMkahoku",
 "http://51.81.46.118:3350/*J-Club Powerplay HipHop",
 "http://51.81.46.118:3340/*J-Rock PowerPlay",
 "http://184.75.223.178:8083/*J-Pop Project Radio - Global Edition",
 "http://uk5.internet-radio.com:8306/*Moon Mission Recordings, Tokyo Deep and Electronic",
 "http://sj32.hnux.com/stream?type=http&nocache=3104*Smooth Jazz",
 "http://uk7.internet-radio.com:8226/*Box UK Radio danceradiouk",
 "http://uk6.internet-radio.com:8230/*Brassbandradio Radio",
 "http://uk1.internet-radio.com:8355/*The Zone - Dublin",
 "http://uk5.internet-radio.com:8011/*Top 80 radio",
 "http://uk7.internet-radio.com:8281/*SWEET ONE RADIO (FRENCH RADIO)",
 "http://uk2.internet-radio.com:8288/*Lymm Community Radio",
 "http://us3.internet-radio.com:8496/*RaveRocksRadio",
 "http://uk3.internet-radio.com:8288/*Relaxing Music",
 "http://us3.internet-radio.com:8157/*Amaghana Radio",
 "http://uk1.internet-radio.com:8465/*Great relaxing music, a nice journey away of the daily problems",
 "http://us3.internet-radio.com:8157/*Amaghana Radio",
 "http://uk1.internet-radio.com:8235/*Hospital Radio",
 "http://us5.internet-radio.com:8026/*Ukiss Radio",
 "http://uk6.internet-radio.com:8224/*Breaking Barriers Bulgaria",
 "http://us2.internet-radio.com:8075/*Classic Hits Global HD",
 "http://uk7.internet-radio.com:8168/*242 RADIO stream",
 "http://uk3.internet-radio.com:8405/*Majestic Jukebox Radio #HIGH QUALITY SOUND",
 "http://us2.internet-radio.com:8443/*MEGATON CAFE RADIO"
};
//  http://icecast.omroep.nl
//  http://github.com/pilnikov/KaRadio32_fork/blob/master/playlist/WebStations.txt
//  http://fmstream.org
//  http://www.internet-radio.com

//============================================================
void setup() {
  // M5Stack Initialize --------------------------------------
  M5.begin();
  Wire.begin();if(digitalRead(BUTTON_A_PIN)==0){updateFromFS(SD);ESP.restart();}
  M5.Lcd.setRotation(1);
  M5.Lcd.fillScreen  (BLUE);               // 0x657F
  M5.Lcd.setFreeFont (FMB12);              // font
  MP(0,1,0xFFFF," Web Radio of M5Stack");  // x,yLine,WHITE
  // WiFi Connection ----------------------------------------
  WiFi.disconnect();
  WiFi.begin(ssid,pass);                   // Set ssid,pass
  WiFi.setSleep(false);                    // Prevent GPIO39 Pulse
  M5.Lcd.setTextColor(WHITE);M5.Lcd.setCursor(0,44);
  while(WiFi.status()!=WL_CONNECTED){delay(50);M5.Lcd.print(".");}
  MP(0,2,0xFFFF,"Connected to Wifi");      // Infomation
  // UDA1334A or PCM5102A I2S DAC Initialize ----------------
  audio.setPinout(I2S_BCK,I2S_WS,I2S_DOUT);// Setup I2S Pin
  audio.setVolume(vol);                    // Set Vol 0...21
  speech("こんにちは","ja");                 // Speech
  speech("Web Radio of M5Stack","en");     // Speech
  // Button Initialize --------------------------------------
  Button_(0xD6DA,0xD6DA,0xD6DA);           // ch Button off
  delay(1000);
}
//============================================================
void loop() {
  M5.update();
  audio.loop();//Executes an internal loop of the audio library
  // playflag 0 ---------------------------------------------
  if (playflag == 0){
    // Station up -------------------------------------------
    Button_(0xD6DA,0x762F,0xD6DA);       // ch Button on
    MP(0,2,0xFFFF,"Wait...");            // Infomation
    url_sname(counter);                  // station,url,sname
    speech(sname,"en");                  // speech
    audio.connecttohost(URL);            // URL connection
    playflag = 1;
    // Display update ---------------------------------------
    MP(0,3,0xFFFF,"Station:"+String(counter));// Staion NO.
    M5.Lcd.fillRect (0,110,320,80,BLUE);      // clear
    MP(0,4,0xFFFF,"Playing:"+String(sname));  // Staion name
    set_vol_btn();                       // Volume and Button
    M5.Lcd.fillRect (0,30,320,20,BLUE);  // Clear info Line
    MP(0,2,0xFFFF,"Playing");            // Infomation
  }
  // playflag 1 ----------------------------------------------
  // Play LED ------------------------------------------------
  led = led + 1;
  if (led>1){led=0;M5.Lcd.fillCircle(310,8,5,GREEN);// led on
    }else{         M5.Lcd.fillCircle(310,8,5,BLUE );// led off
  }
  // ch+ -----------------------------------------------------
  if(M5.BtnB.wasPressed()){                // B Button
    M5.Lcd.fillRect (0,110,320,88,BLUE);   // Clear Sta,sname Line
    Button_(0xD6DA,0x762F,0xD6DA);         // ch Button on
    old_counter=counter;                   // old counter set
    counter=counter+1;                     // Station UP
    if(counter>Number_of_urls){counter=0;} // url count
    new_counter=counter;                   // New Station UP
    playflag = 0;                          // Start Play
  }
  // Vol- -----------------------------------------------------
  if(M5.BtnA.wasPressed()){                // A Button
    Button_(0x762F,0xD6DA,0xD6DA);         // vol Button on
    vol=vol-1; if(vol<0){vol=0;}           // Vol -
    set_vol_btn();                         // Volume and Button
  }
  // Vol+ ------------------------------------------------------
  if(M5.BtnC.wasPressed()){                // C Button
    Button_(0xD6DA,0xD6DA,0x762F);         // vol Button on
    vol=vol+1; if(vol>21){vol=20;}         // Vol +
    set_vol_btn();                         // Volume and Button
  }
} // End of Loop
//==============================================================
void MP(int xpos, int yLine, int16_t color, String str){
  M5.Lcd.fillRect (xpos,30*yLine-30,320,20,BLUE); // clear
  M5.Lcd.setCursor(xpos,30*yLine-16);             // yLine:0-8
  M5.Lcd.setTextColor(color);M5.Lcd.println(str); // Display
// https://github.com/m5stack/m5-docs/blob/master/docs/ja/api/lcd.md
}
//--------------------------------------------------------------
void set_vol_btn(){
  audio.setVolume(vol);                    // Set Volume
  MP(0,7,0xFFFF,"Volume:");MP(100,7,0xFFFF,String(int(vol*5)));
  M5.Lcd.progressBar(150,180,160,16,vol*5);// ProgressBar
  delay(250);Button_(0xD6DA,0xD6DA,0xD6DA);// vol Button off
}
//--------------------------------------------------------------
void Button_(long BA,long BB,long BC){     // Button display
  // https://trolsoft.ru/en/articles/rgb565-color-picker
  M5.Lcd.setTextColor(BLACK);              // BLACK
  M5.Lcd.fillRoundRect( 37,210,60,30,5,BA);
  M5.Lcd.setCursor( 40,230);M5.Lcd.println("vol-");
  M5.Lcd.fillRoundRect(133,210,60,30,5,BB);
  M5.Lcd.setCursor(149,230);M5.Lcd.println("ch");
  M5.Lcd.fillRoundRect(226,210,60,30,5,BC);
  M5.Lcd.setCursor(229,230);M5.Lcd.println("vol+");
}
//--------------------------------------------------------------
void url_sname(int c){ // Separate into URL, sname
  // URL -------------------------------------------------------
  String u=String(url[c]).substring(0,String(url[c]).indexOf("*")+1); 
  u.toCharArray(URL,u.length());           // URL
  // Sname -----------------------------------------------------
  String s=String(url[c]).substring(String(url[c]).indexOf("//")+2); 
  String n=s.substring(s.indexOf("*")+1)+1;
  n.toCharArray(sname,n.length());         // sname
}
//--------------------------------------------------------------
void speech(char* speech, char* Lang){ // Increase volume by +5
  audio.setVolume(vol+5);audio.connecttospeech(speech,Lang);
  audio.setVolume(vol);
}
//--------------------------------------------------------------

.
,
M5Stack , Web Radio , UDA1334A , I2S DAC , 1334A ,

Written by macsbug

2月 14, 2021 at 8:05 am

カテゴリー: M5STACK

Web Radio of M5Stack

with 9 comments

M5Stack と VS1053 Board で Web Radio を製作しました。  2021.01.08
…………………………………………. Station数の追加:rev.1: 2021.03.06
…………………………………………………… GPIO39:rev.2: 2021.05.01

VS1053B Board:Expansion接続。

VS1003 Board:Stack接続。


 
仕様:
1. 局 ( Station ) :150局。ボタンで選択。局の追加も可能です。
2. 再生:Stereo。
3. 音質:M5Stack内蔵スピーカーより遥かに良いです。
4. 操作:ボタンで操作します。
_  A button:Volume – 。B button:Channel up 。C button:Volume +

構成:
1. 開発環境:Arduino IDE
2. Library:baldram/ESP_VS1053_Library
3. HARD:M5Stack
4. HARD:VS1053B Board:Aliexpressで 5$ ( 520円 ) 以下で購入出来ます。
_      Amazonや国内では 一桁上の高価な販売店があります。
_      基板には VS1003/VS1053 と記載。 TIP の 型番は VS1053B。
_      基板は M5Stack に見事にピッタリ入る大きさです。
5. HARD:Speaker Amp or Headphones:ダイソー ミニスピーカー
6. HARD:Expansion board

費用:1200円。( Without M5Stack )

No. Nomen Price
1 VS1053 Board 520円
2 M-BUS PCB 100円
3 DAYSO Speaker 300円
4 280円
Total 1200円

 

謝辞:Somnath Bera氏に感謝。
_ ESP32 Internet Radio
_ Somnath Bera氏の基本は Arduino IDE で作成できる事と 短いスケッチです。
_ スケッチは ESP32 Internet Radio の simple_esp32_radio_mod3 を基本に
_ M5Stackに移植致しました。

参照:Expansion Board:必要な時に接続し、不要な時に簡単に外せます。
1. M5Stack Extension Module
2. MakerBot Thingiverse:M5Stack Extension Module by macsbug
3. MakerBot Thingiverse:M5Stack Joystick by macsbug


 
Down Load:ESP_VS1053_Library を含んだ File です。
. Web_Radio_of_M5Stack.zip を DLします。
. Fileは PDF形式で DL後に Web_Radio_of_M5Stack_.zip に変更し解凍します。


 
VS1053B Board.
Hard Ware:

.
仕様 ( Specifications ):
_ Separate analog, digital, and IO power supply
_ Serial data and control interface (SPI)
_ 1 headphone and audio output interface
_ 1 microphone for recording, support audio encoding format
_ 1 line input interface; supports MP3 and WAV stream
_ On-board 3.3 V and 2.5 V LDO chip AMS-1117, maximum current of 800 mA
_ Single Power Supply: +5 VDC, capacitor filter
_ 12.288 MHz crystal
_ 電源:5Vdc
_ VS1053 5V は U3 AMS1117-2.5(2.5V) から VS1053 CVDD へ供給。
_ VS1053 5V は U2 AMS1117-2.85(2.85V) から VS1053 IOVDD, AVDD へ供給。
_ VS1053 Board:Schematic
.
Soft Ware:
コード:短いコードで出来ています。
受信バッファー:32 Bytes 。player.playChunk で Play しています。
再生:固定ポートでストリーミングサイトに接続し、一度に32バイトの
_ 正確なチャンクでストリーミングデータを受信し、ボードはデータを
_ 処理し続け、ストリームは再生を続けます。

uint8_t mp3buff[32]; // VS1053 likes 32 bytes at a time

// Play -----------------------------------------
  if (client.available() > 0) {
    uint8_t bytesread = client.read(mp3buff, 32);
    player.playChunk(mp3buff, bytesread);
}
  

 
配線:
1. VS1053 Board は MBUS Board のサイズとほぼ同じです。
2. VS1053 Board を MBUS Board の以下の位置にコネクターをハンダ付けします。
3. VS1053 の GND は MBUS BAT と競合する為、BAT LIne(赤X)を Cut します。
4. VS1053 の MISO は MBUS 5V と競合する為、 5V LIne(赤X)を Cut します。
5. VS1053 の MISO,GND が MBUS 5V,BAT と非接続である事をテスターで確認します。
6. VS1053 と MBUS Pin を 以下の様に 9本配線します。

VS1053B 5V MISO SCK XRST XDCS 5V GND MOSI DREQ XCS
M-BUS 5V 19 18 EN 16 5V GND 23 17 5

.
VS1053接続: GPIO 定義

#define VS1053_CS     5 // Wiring of VS1053
#define VS1053_DCS   16 // Wiring of VS1053
#define VS1053_DREQ  17 // Wiring of VS1053
#define SPI_MOSI     23 // Wiring of VS1053
#define SPI_MISO     19 // Wiring of VS1053
#define SPI_SCK      18 // Wiring of VS1053

VS1053 CS,DCS,DREQ 接続

VS1053 player(VS1053_CS, VS1053_DCS, VS1053_DREQ);

VS1053 SPI接続:
VSPI – SCK,MISO,MOSI,SS = 18,19,23

SPI.begin();  // initialize VS1053 SPI

VS1053 SPI接続:他のGPIOを使用する場合。
HSPI – SCK,MISO,MOSI = 14,12,13

SPI.begin(SCK, MISO, MOSI);

.


 
VS1053:mp3 Mode
此のBoardは 起動時にMIDI mode になります。
そこで 音が出ないという記事が多くあります。
音を出すには mp3 mode にする必要があります。
これには 2つの方法があります。
1. HARD:33,34 Pinをshort(Yellow)すると mp3 mode になります。
2. SOFT :player.switchToMp3Mode(); を station_connectの後に記述。

player.softReset();
rx=true;
station_connect(new_counter);
player.switchToMp3Mode();  // mp3 mode
preferences.putUInt("counter",new_counter);


 
局 ( Station ) の保存:NVM Memory
_ 局を選択すると Station no (0,1,2..)を NVM Memory へ保存し 次回から
_ 保存した局 ( Station no ) から動作します。
_ 今回は 保存局を使用せず 毎回 初期の局(Station 0)から始まります。
_ 初期の局(Station 0)は setup(); の中で記述しています。
_ 保存された局を使用する場合:下記の記述をコメントアウトします。

// Comment out the following three when using NVM Memory
preferences.clear(); // namespace : NVM Clear
preferences.remove("counter"); // namespace : NVM counter Erase
preferences.end(); // preference Close

局を保存する:以下、loop(); 内に記述されています。

station_connect(new_counter); // new station connect
preferences.putUInt("counter",new_counter); // NVM Memory

局とURL:
_ 局を追加するには http://www.internet-radio.com に多数あります。
_ を Clickし URLを入手します。
_ PCでは受かるが 今回のスケッチでは 受信しない局があります。
_ 例:http://retroserver.streamr.ru:8043/retro128
_ スケッチのURLは 以下の様に変更します。( port :8043 を削除 )
_ 変更後:http://retroserver.streamr.ru/retro128 ( host + path )
_ 局によって最初の受信に時間がかかる局があります。
_ 時期や条件により 登録した局が全部受信出来るとは限りません。


 
VS1003 Board ( with phone and Line in Connector ) .
AliExpress:Aideepen Direct Store:VS1003 MP3 Board:$4.93 ( 512円)。
_      基板には VS1003/VS1053 と記載。 TIP の 型番は VS1003。
_      左上は Phone OUT。左下は LIne in Connector。
_      基板とPhone Connector は M5Stack に見事にピッタリ入る大きさです。


 
配線:

VS1003 XDCS XCS DREQ SCLK MOSI MISO XRST GND 5V
M-BUS 16 5 17 18 23 19 EN GND 5V



.
他の WEB RADIO:

m5WebRadio:Arduino IDEで直ぐ動作するスケッチ。
_ tommyho氏作成のM5StickC版「m5WebRadio」は Arduino IDEを使用。
_ 解説は丁寧で解りやすく模範となる記述内容です。
_ 出力方法は 3種類(buzzer,SPK-Hat,external speaker)があります。
_ M5Stackに移植し動作しています。

Radio Garden:地球というラジオ局をPCやiPadで聞けます。
_ 地球儀をグリグリ回して世界中のラジオ局をリアルタイムで聴けます。

iOS APP:Radio Garden Live
_ ✈️ Explore:Selected Stationで航空機の RJTT Tokyo Int – Twr/TCA,
_ App/Dep, Controlも聞けます。

Internet Radio :22,420 radio stations を PCやiPadで聞けます。


 
参考:
VLSI:VS1053b DataSheet
VS1053 Board Schematic:VS1053 Board 配線図。
VS1053 U2:AMS1117-2.85:VS1053 2.85 Regulator。
VS1053 U3:AMS1117-2.5
ESP32 Internet Radio:By Somnath Bera May 11,2018
放課後の電子工作:VS1053b 日本語データシート私家版
robo8080:M5Stack + VS1003 mp3 CodeでInternet Radioを作ったりしてみた。
_ :外部コントローラー(PC等)が必要。
Naked Ninja:M5Stack Stereo Web Radio
_ 外部コントローラー(PC等)が必要。4733行の長文。
AliExpress YX Electronic Components Store:VS1053 MP3 Board:$4.98 (518円)


 
感想:
Web Radio を経験したいが 開発環境が Arduino IDEでなかったり
あっても 行数が多く M5Stackへの移植が難しい。
YouTube には 幾つかの Web Radio があるが ソースが公開されていない。
幾つか 移植してみましたが 難解でやめました。
スケッチはシンプルさが重要だと感じました。
画像で綺麗に作ろうかと思いましたがシンプルに文字程度にしました。

ESP8266 Audio Library:この中の Sample「WebRadio」は 440行 で
_ 即 動作しない事や コントロールをPCで行い M5Stack単独ではできません。
_ コントロールをPCで行なう Web Radio は多いです。
_ PCを使用するなら PC単独でWeb Radioが出来るので意味が無いかと思います。

Web Radio は Radio Garden があり 電子工作で作るまでもありません。
電子工作ではソフトで いろいろなアイデアやアレンジが出来る効能があります。


 
スケッチ:Web Radio of M5Stack : 2021.01.08 : macsbug

//=========================================================
// Web Radio of M5Stack
// UDA1334A : ORG   : 2021.01.08 : macsbug
// Station  : Rev 1 : 2021.03.06 : macsbug
// GPIO39   : Rev 2 : 2021.05.01 : macsbug
// Github   : https://macsbug.wordpress.com/2021/01/08/web-radio-of-m5stack/
// Development environment : Aduino IDE
// Library  : baldram/ESP_VS1053_Library
//            https://github.com/baldram/ESP_VS1053_Library
// HardWare : M5Stack and VS1053 Board
// M5.BtnA.wasPressed() conflicts with WiFi? #52
//            https://github.com/m5stack/M5Stack/issues/52 
// After 1.0.6 update WiFi won't connect to other network // connection time increased #4980
//            https://github.com/espressif/arduino-esp32/issues/4980
//===========================================================
// https://www.electronicsforu.com/electronics-projects/prototypes/esp32-internet-radio
// https://forum.arduino.cc/index.php?topic=582644.0
// https://www.hackster.io/mircemk/simple-esp32-internet-radio-with-oled-display-83e49d
// https://www.elektormagazine.com/labs/esp32-internet-radio
//===========================================================

#pragma GCC optimize ("Ofast")
#include <M5Stack.h>
#include "M5StackUpdater.h"
#include "VS1053.h"      // This ESP_VS1053_Library
#include <Preferences.h> // For reading and writing into the NVM memory
Preferences preferences;
#include <WiFi.h>
#include <HTTPClient.h>
#include "ConsoleLogger.h" 
#include "helloMp3.h"
#include "Free_Fonts.h"
//        Enter your ssid and password. ------------
char ssid[] = "your network SSID";
char pass[] = "your network password"; 

int Number_of_urls = 150 -1; // Change depending on the number of URLs
char *url[150] = {           // url*Station nam
 "http://sj32.hnux.com/stream?type=http&nocache=3104*Smooth Jazz",
 "http://sj32.hnux.com/stream?type=http&nocache=1257*Smooth Lounge",
 "http://listen.181fm.com/181-beatles_128k.mp3*181-beatles_128k",
 "http://us2.internet-radio.com:8023/*Love Radio 93.9",
 "http://us5.internet-radio.com:8096/*I Love Smooth Jazz",
 "http://us5.internet-radio.com:8201/*Keith Jarrett - Over The Rainbow",
 "http://us3.internet-radio.com:8639/*Smooth Jazz Planet",
 "http://us5.internet-radio.com:8022/*Smooth Jazz DC",
 "http://us2.internet-radio.com:8046/*Matt Johnson Radio",
 "http://uk2.internet-radio.com:8236/*Funky Jazz/Soul 101 Radio",
 "http://us4.internet-radio.com:8171/*Smooth Jazz - Tampa Bay",
 "http://uk5.internet-radio.com:8174/*Joy Radio",
 "http://us3.internet-radio.com:8485/*Smooth Jazz CD 101.9 New York",
 "http://us1.internet-radio.com:8212/*KHIH-DB Colorado Smooth Jazz",
 "http://us2.internet-radio.com:8443/*MEGATON CAFE RADIO",
 "http://us4.internet-radio.com:8193/*RADIO ESTILO LEBLON",
 "http://us3.internet-radio.com:8297/*The Ranch - Classic Country",
 "http://uk7.internet-radio.com:8000/*MoveDaHouse",
 "http://uk1.internet-radio.com:8004/*Pink Noise Radio",
 "http://us5.internet-radio.com:8267/*CLASSIC ROCK RADIO HD",
 "http://us4.internet-radio.com:8258/*Classic Rock Florida HD",
 "http://us4.internet-radio.com:8266/*Smooth Jazz Florida",
 "http://us3.internet-radio.com:8297/*The Ranch - Classic Country",
 "http://uk6.internet-radio.com:8120/*Radio West Middlesex",
 "http://us3.internet-radio.com:8232/*Bach - C Major Prelude",
 "http://uk6.internet-radio.com:8144/*Radio Cherwell - Hospital Radio in Oxford",
 "http://uk5.internet-radio.com:8237/*Stoke Mandeville Hospital Radio",
 "http://us2.internet-radio.com:8075/*Classic Hits Global HD",
 "http://uk7.internet-radio.com:8226/*Box UK Radio danceradiouk",
 "http://us4.internet-radio.com:8193/*RADIO ESTILO LEBLON",
 "http://us4.internet-radio.com:8258/*Classic Rock Florida HD",
 "http://us4.internet-radio.com:8197/*EZ Hits South Florida",
 "http://uk7.internet-radio.com:8040/*Ava Max - Sweet But Psycho",
 "http://us5.internet-radio.com:8021/*Bill Evans",
 "http://uk2.internet-radio.com:31491/*A Heavenly World of Sound",
 "http://ice2.somafm.com/christmas-128-mp3*SomaFM Xmas",
 "http://www.internet-radio.com/station/sanfranciscos70shits/*San Franciscos 70s Hits",
 "http://5.152.208.98:8058/*Ancient FM",
 "http://streamer.radio.co/s06b196587/listen*KPop Way Radio",
 "http://jenny.torontocast.com:8134/stream*Mega Shuffle",
 "http://wbgo.streamguys.net/wbgo96*WBGO FM 96",
 "http://wbgo.streamguys.net/thejazzstream*jazzstream",
 "http://stream.srg-ssr.ch/thejazzstream*mp3_128",
 "http://icecast.omroep.nl/3fm-sb-mp3*3fm-sb-mp3",
 "http://media-ice.musicradio.com:80/ClassicFMMP3*Classic FM",
 "http://113fm-edge2.cdnstream.com/5185_48*BigR - 80s Lite",
 "http://streaming307.radionomy.com/WOKEmemories_64.aac*WOKEmemories ",
 "http://streaming316.radionomy.com/W1RS-blues--Rock-s-Radio*W1RSblues&Rock'sRadio",
 "http://streaming307.radionomy.com/bleudream-80_64.aac*bleudream-8",
 "http://streaming211.radionomy.com/ClassicRock-HardRock_64.aac*ClassicRock&HardRock",
 "http://streaming211.radionomy.com/kingdom-rap-radio*KingdomRapRadio",
 "http://streaming211.radionomy.com/radio-delight-kwitonta*Delight Kwitonta FM",
 "http://streaming308.radionomy.com/ViejitasPeroBonitasRadio*Viejitas Pero Bonitas Radio",
 "http://streaming307.radionomy.com/mmabathofm-live*Mmabatho FM LIVE",
 "http://streaming211.radionomy.com/sjl-radio*SjlRadio",
 "http://188.138.9.183/lounge-austria-mobile.mp3*Unspecified name",
 "http://ais-edge24-nyc06.cdnstream.com/2316_128.mp3*Foster Care Warrior Radio",
 "http://play.global.audio/bgradio128*RADIO BGRADIO",
 "http://webradio.antennevorarlberg.at/live*ANTENNE VORARLBERG HD",
 "http://s2.cdnradio.ru/ru-mp3-128*RUSSIAN SONGS",
 "http://live.coolradio.rs/cool128*COOL radio | Serbia",
 "http://streaming315.radionomy.com/foxnews*FOX News Radio",
 "http://ais-edge16-jbmedia-nyc04.cdnstream.com/hot108*HOT 108 JAMZ",
 "http://streams.iloveradio.de/iloveradio1.mp3*I Love Radio",
 "http://live.antenne.at/as*Antenne Steiermark",
 "http://webstream.schlagerparadies.de/schlagerparadies128k.mp3*SCHLAGERPARADIES",
 "http://streaming211.radionomy.com/rtl-1025*RTL 102.5",
 "http://retesport.newradio.it/1*RETE SPORT",
 "http://icy.unitedradio.it/VirginRogerWaters.mp3*PinkFloyd",
 "http://live.m2stream.fr/m280-128.mp3*M2 80's",
 "http://live.m2stream.fr/m2hit-128.mp3*M2 Hit's",
 "http://live.m2stream.fr/m2club-128.mp3*M2 Club",
 "http://live.m2stream.fr/m2love-128.mp3*M2 Love",
 "http://live.m2stream.fr/m2rock-128.mp3*M2 Rock",
 "http://live.m2stream.fr/m2sunshine-128.mp3*M2 Sunshine",
 "http://100radio-90.ice.infomaniak.ch/100radio-90-64.aac*100  0",
 "http://100radio-80.ice.infomaniak.ch/100radio-80-64.aac*1000",
 "http://100radio-hit.ice.infomaniak.ch/100radio-hit-64.aac*100",
 "http://icecast.vgtrk.cdnvideo.ru/vestifm_aac_32kbps*FM News",
 "http://nashe1.hostingradio.ru/nashe20-128.mp3*Our Radio",
 "http://mp3.ffh.de/radioffh/hqlivestream.aac*hqlivestream",
 "http://radiostreaming.ert.gr/ert-kosmos*ert-kosmos",
 "http://ic6.101.ru:8000/a161*Italo Disco",
 "http://cmr-hosting.com/*8050**CLUB MUSIC RADIO - ITALO DISCO",
 "http://den.101.ru:4000/ar_66_03*101.ru - AutoRadio Ekaterinburg",
 "http://ic7.101.ru:8000/a79*101.ru - Cyber Space",
 "http://ic7.101.ru:8000/a161*101.ru - Italo Disco",
 "http://ic7.101.ru:8000/a175*ENIGMA",
 "http://vladfm.com:8000/vfm*Radio Vladivostok FM",
 "http://jfm1.hostingradio.ru:14536/rcstream.mp3*Radio Classic",
 "http://retroserver.streamr.ru:8043/retro128*Radio Retro FM",
 "http://retro70.hostingradio.ru:8025/retro70-128.mp3*Radio Retro FM 70e",
 "http://91.211.56.218:8080/piramida/nazarovo*Radio Piramida FM",
 "http://sea.1tvcrimea.ru:9003/stream_sea.mp3*Radio More",
 "http://kommersant77.hostingradio.ru:8016/kommersant128.mp3*Radio Kommersant FM",
 "http://bfmstream.bfm.ru:8004/fm64*Business FM Moscow 87.5",
 "http://ep128server.streamr.ru:8030/ep128*Europe plus",
 "http://212.26.146.50:8000/rusrock.mp3*Russian rock music",
 "http://listen2.myradio24.com:9000/8144*Radio Magic",
 "http://media2.brg.ua:8000/shanson_l*Radio Chanson",
 "http://online1.gkvr.ru:8000/radiola_eka_128.mp3*Radio Radiola",
 "http://online.radiorecord.ru:8102/sd90_128*Disco 90х",
 "http://online.radiorecord.ru:8102/sd90_128*Superdisco 90х",
 "http://airspectrum.cdnstream1.com:8000/1261_192*Magic Oldies Florida",
 "http://37.187.79.93:8368/stream2*stream2",
 "http://tropicalisima.net:8020/stream/1/*stream",
 "http://192.173.28.222:3690/KRSHFMAAC_SC*The Krush - Wine Country Radio",
 "http://ice.creacast.com/myzen-aac-64*MyZen Radio",
 "http://cms.stream.publicradio.org/cms.aac*Classical 24",
 "http://ais-sa3.cdnstream1.com/2440_128.aac*Oregon Public Broadcasting",
 "http://nis.stream.publicradio.org/nis.aac*MPR News - Minnesota Public Radio",
 "http://current.stream.publicradio.org/current.mp3*The Current",
 "http://stm29.conectastm.com:18860/stream*Nativa FM",
 "http://stream.haarlem105.nl:8000/haarlem105low.mp3*Haarlem 10",
 "http://rockthecradle.stream.publicradio.org/radioheartland.mp3*Radio Heartland - MPR",
 "http://studioone-stream.iowapublicradio.org/StudioOne.mp3*Iowa Public Radio News and Studio One",
 "http://opera-stream.wqxr.org/wnycam-app*WNYC-AM - New York Public Radio",
 "http://bbcmedia.ic.llnwd.net/stream/bbcmedia_radio4fm_mf_p*BBC Radio 4",
 "http://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-einws*BBC World Service",
 "http://sc8.radiocaroline.net/;*Radio Caroline",
 "http://108.61.154.147:6978/*The Nemesis Radio",
 "http://198.50.156.92:8439/*Power 945 ~Your Anime & Gaming Connection~",
 "http://198.50.158.92:8803/*Japannext Radio",
 "http://62.75.215.7:8016/*Blue Heron Radio",
 "http://23.29.71.154:8062/*Friends Forever",
 "http://184.75.223.178:8011/*J-Idols Project Radio - Global Edition",
 "http://radio.kahoku.net:8000/*FMkahoku",
 "http://51.81.46.118:3350/*J-Club Powerplay HipHop",
 "http://51.81.46.118:3340/*J-Rock PowerPlay",
 "http://184.75.223.178:8083/*J-Pop Project Radio - Global Edition",
 "http://uk5.internet-radio.com:8306/*Moon Mission Recordings, Tokyo Deep and Electronic",
 "http://sj32.hnux.com/stream?type=http&nocache=3104*Smooth Jazz",
 "http://uk7.internet-radio.com:8226/*Box UK Radio danceradiouk",
 "http://uk6.internet-radio.com:8230/*Brassbandradio Radio",
 "http://uk1.internet-radio.com:8355/*The Zone - Dublin",
 "http://uk5.internet-radio.com:8011/*Top 80 radio",
 "http://uk7.internet-radio.com:8281/*SWEET ONE RADIO (FRENCH RADIO)",
 "http://uk2.internet-radio.com:8288/*Lymm Community Radio",
 "http://us3.internet-radio.com:8496/*RaveRocksRadio",
 "http://uk3.internet-radio.com:8288/*Relaxing Music",
 "http://us3.internet-radio.com:8157/*Amaghana Radio",
 "http://uk1.internet-radio.com:8465/*Great relaxing music, a nice journey away of the daily problems",
 "http://us3.internet-radio.com:8157/*Amaghana Radio",
 "http://uk1.internet-radio.com:8235/*Hospital Radio",
 "http://us5.internet-radio.com:8026/*Ukiss Radio",
 "http://uk6.internet-radio.com:8224/*Breaking Barriers Bulgaria",
 "http://us2.internet-radio.com:8075/*Classic Hits Global HD",
 "http://uk7.internet-radio.com:8168/*242 RADIO stream",
 "http://uk3.internet-radio.com:8405/*Majestic Jukebox Radio #HIGH QUALITY SOUND",
 "http://us2.internet-radio.com:8443/*MEGATON CAFE RADIO"
};
// http://icecast.omroep.nl
// http://github.com/pilnikov/KaRadio32_fork/blob/master/playlist/WebStations.txt
// http://fmstream.org
// http://www.internet-radio.com
// http://icecast.omroep.nl
// http://github.com/pilnikov/KaRadio32_fork/blob/master/playlist/WebStations.txt
// http://fmstream.org
// http://www.internet-radio.com

int  counter = 0, old_counter = 0, new_counter = 0;
char host[100], path[100], sname[100]; 
int  port;
char rx=true;
WiFiClient client;
uint8_t mp3buff[32];    // VS1053 likes 32 bytes at a time
#define VS1053_CS     5 // Wiring of VS1053
#define VS1053_DCS   16 // Wiring of VS1053
#define VS1053_DREQ  17 // Wiring of VS1053
#define SPI_MOSI     23 // Wiring of VS1053
#define SPI_MISO     19 // Wiring of VS1053
#define SPI_SCK      18 // Wiring of VS1053
int led = 0;
int vol = 80;           // volume level 0-100
VS1053 player(VS1053_CS,VS1053_DCS,VS1053_DREQ); // VS1053 init

//============================================================
void setup () {
  M5.begin();
  Wire.begin();if(digitalRead(BUTTON_A_PIN)==0){updateFromFS(SD);ESP.restart();}
  M5.Lcd.setRotation(1);
  M5.Lcd.fillScreen  (BLUE);              // 0x657F
  M5.Lcd.setFreeFont (FMB12);             // font
  MP(0,1,0xFFFF," Web Radio of M5Stack"); // x,yLine,WHITE
  // VS1053 --------------------------------------------------
  SPI.begin();              // initialize VS1053 SPI
  player.begin();           // initialize VS1053 player
  player.switchToMp3Mode(); // VS1053 board : mp3 mode
  player.setVolume(vol);    // VS1053 board : set volume
  // WiFi ----------------------------------------------------
  WiFi.disconnect();
  WiFi.begin(ssid,pass);    // Set ssid,pass
  WiFi.setSleep(false);     // Prevent GPIO39 Pulse
  M5.Lcd.setTextColor(WHITE);M5.Lcd.setCursor(0,44);
  while(WiFi.status()!=WL_CONNECTED){delay(50);M5.Lcd.print(".");}
  MP(0,2,0xFFFF,"Connected to Wifi");
  // VS1053 --------------------------------------------------
  preferences.begin("my-app",false);// Start namespace called my-app
  // https://qiita.com/T-YOSH/items/f388b4d7cbc829829aae
  // Comment out the following three when using NVM Memory
  preferences.clear();          // namespace : NVM Clear
  preferences.remove("counter");// namespace : NVM counter Erase
  preferences.end();            // preference Close
  station_connect(counter);     // station connect,host,path,sname
  counter=preferences.getUInt("counter",counter);// NVM Memory
  // Display -------------------------------------------------
  MP(0,3,0xFFFF,"Station:"+String(counter));// Staion NO.
  MP(0,4,0xFFFF,"Playing:"+String(sname));  // Staion name
  set_vol_btn();                          // Volume and Button 
  player.playChunk(hello2,sizeof(hello2));//VS1053 is wake up & running
  delay(2000);
}
//============================================================
void loop() {
  M5.update();
  // Play ----------------------------------------------------
  if (client.available() > 0) {                    // Rx
    uint8_t bytesread = client.read(mp3buff,32);   // Rx buff
    player.playChunk(mp3buff, bytesread);          // play
  }
  // Play LED ------------------------------------------------
  led = led + 1;
  if(led>1){M5.Lcd.fillCircle(310,8,5,GREEN);led=0;// led on
   }else{   M5.Lcd.fillCircle(310,8,5,BLUE );      // led off
  }
  // ch+ -----------------------------------------------------
  if(M5.BtnB.wasPressed() and rx==true){
    rx=false;
    Button_(0xD6DA,0x762F,0xD6DA);  // ch Button on
    old_counter=counter;            // old counter
    counter=counter+1;              // counter up
    if(counter>Number_of_urls){counter=0;} // url count
    preferences.putUInt("counter",counter-1);delay(500);//NVM Memory
    new_counter=counter;            // new counter
    // Station UP ---------------------------------------------
    if(old_counter != new_counter){ // new counter, new station
      rx=true;
      player.softReset();
      player.switchToMp3Mode();     // VS1053 board : mp3 mode
      station_connect(new_counter); // new station connect,host,path,sname
      preferences.putUInt("counter",new_counter);delay(500);//NVM Memory
      // Display update ---------------------------------------
      MP(0,3,0xFFFF,"Station:"+String(counter));// Station NO.
      M5.Lcd.fillRect (0,110,320,80,BLUE);      // clear
      MP(0,4,0xFFFF,"Playing:"+String(sname));  // Station Name
      set_vol_btn();                // Volume and Button
      MP(0,2,0xFFFF,"Playing");     // Infomation
    }
  }
  // Vol- -----------------------------------------------------
  if(M5.BtnA.wasPressed()){         // ButtonA
    Button_(0x762F,0xD6DA,0xD6DA);  // vol- Button on
    vol=vol-5;if(vol<=0){vol=0;}    // vol-
    set_vol_btn();                  // Volume and Button
  }
  // Vol+ ------------------------------------------------------
  if(M5.BtnC.wasPressed()){         // ButtonC
    Button_(0xD6DA,0xD6DA,0x762F);  // vol+ Button on
    vol=vol+5;if(vol>=100){vol=100;}// vol+
    set_vol_btn();                  // Volume and Button
  }
} // End of loop
//==============================================================
void MP(int xpos, int yLine, int16_t color, String str){
  M5.Lcd.fillRect (xpos,30*yLine-30,320,20,BLUE); // clear
  M5.Lcd.setCursor(xpos,30*yLine-16);             // yLine:0-8
  M5.Lcd.setTextColor(color);M5.Lcd.println(str); // Display
// https://github.com/m5stack/m5-docs/blob/master/docs/ja/api/lcd.md
}
// -------------------------------------------------------------
void station_connect(int cnt){      // Station Connect
  host_path_sname(cnt);             // host,path,port,sname
  if(client.connect(host,port)){MP(0,2,0xFFFF,"Wait...");}
  client.print(String("GET ") + path + " HTTP/1.1\r\n" +
   "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
  delay(1000);
}
//--------------------------------------------------------------
void set_vol_btn(){
  player.setVolume(vol);                   // Set Volume
  MP(0,7,0xFFFF,"Volume:");MP(100,7,0xFFFF,String(vol));
  M5.Lcd.progressBar(150,180,160,16,vol);  // ProgressBar
  delay(250);Button_(0xD6DA,0xD6DA,0xD6DA);// vol Button off
}
//--------------------------------------------------------------
void Button_(long BA,long BB,long BC){     // Button display
  // https://trolsoft.ru/en/articles/rgb565-color-picker
  M5.Lcd.setTextColor(BLACK);              // BLACK
  M5.Lcd.fillRoundRect( 37,210,60,30,5,BA);
  M5.Lcd.setCursor( 40,230);M5.Lcd.println("vol-");
  M5.Lcd.fillRoundRect(133,210,60,30,5,BB);
  M5.Lcd.setCursor(149,230);M5.Lcd.println("ch");
  M5.Lcd.fillRoundRect(226,210,60,30,5,BC);
  M5.Lcd.setCursor(229,230);M5.Lcd.println("vol+");
}
//--------------------------------------------------------------
void host_path_sname(int c){// Separate into host,path,port,sname
  // host ------------------------------------------------------
  String s=String(url[c]).substring(String(url[c]).indexOf("//")+2);
  String h=s.substring(0,s.indexOf("/")+1); // witout port
  h.toCharArray(host,h.length()); 
  if(s.indexOf(":") >= 0 ){                 // with   port
    h=s.substring(0,s.indexOf(":")+1);
    h.toCharArray(host,h.length());         // host
  }
  // path ------------------------------------------------------
  String p=s.substring(s.indexOf("/"),s.indexOf("*")+1);
  p.toCharArray(path,p.length());           // path
  // port ------------------------------------------------------
  String t=String(url[c]).substring(String(url[c]).indexOf("//")+2);
  port = 80;                                // port
  if(t.indexOf(":") > 0){ 
    String pt=t.substring(t.indexOf(':')+1,t.indexOf("*")+1);
    port=pt.toInt();                        // port
  }
  // Sname -----------------------------------------------------
  String n=s.substring(s.indexOf("*")+1)+1;
  n.toCharArray(sname,n.length());          // sname
}
//--------------------------------------------------------------

 
 
 
M5Stack , VS1053 , Web Radio , mp3 , MIDI , Radio Garden , m5WebRadio ,

Written by macsbug

1月 8, 2021 at 3:37 pm

カテゴリー: M5STACK

USB-C and USB Adapter of M5stack

leave a comment »

M5Stack の USB-C と USB Adapter         2020.12.18

M5 Parts Layout
Parts arrangement of M5Stack

結論:USB-C CC1の配線がされていない。
USB-C は 幾つかの種類があります。
今回の分析は充分でありませんが備忘録として公開する事とします。


.
M5Stack USB-C の構成:
機種:M5Stack GRAY ( pcb ver 2017.6 and 2017.11 )

M5Stack USB Circuit Schematic:
1. 配線は R9=R11=22Ω, D1=D2 TVS Diode の記載のみである。
2. USB Micro の詳細:D+, D-, CC1, CC2 の配線が不明確。
3. CC1, CC2 の Resistor :5.10KΩ


.
M5Stack USB Circuit Wiring:実際の配線。
1. D+ , D- は PCB と USB-C Connector の間で共通。
_ D+, D- の信号は USB Connector は 表か裏でも通じる。
2. M5Stack PCB の CC は Resistor で GND されている。
_ 2017.06 ver は 33KΩ。2017.11 ver は 5KΩ である。
_ CC1 の配線は B Side SBU2 へ接続されている。
_ CC2 の配線は B Side CC2 へ接続されている。
_ CC1 の信号は USB Connector は 表か裏で通じない。


.
分析:
1. USB C A Side:D+ , D- , GND , VCC は配線されている。
2. USB C A Side:CC1 は USB-C SBU2へ配線されている。誤配線。
3. USB C A Side:CC1 は USB-C CC1 へ配線されていない。誤配線。
4. USB C B Side:D+ , D- , GND , VCC , CC2 は配線されている。正しい。


.
結論:
設計ミス:M5Stack USB-C CC1の配線がされていない。


.
対策:
1. Adapterを接続する。
2. USBの向きをを反対にして接続する。


.
USB-C Single Side Cable Connector


.
USB-C Double Side Cable Connector


.
Magnet Ring Connector


.
Magnet Flat Connector


.
Adapter接続:


USB Type-C:給電出来ない件。
ラズパイもUSB Cが使用される様になり、M5Stackにあった「給電出来ない」件が起きています。
M5Stackの時に使用者はケーブルやコネクターの説明無く「給電出来ない」「M5の基板の問題」
と言い、勘違いがあります。
電源供給元:CC1・CC2を4.7 kΩ~56 kΩの抵抗(Rp)でプルアップする事。
電源供給先:CC1・CC2を5.1 kΩの抵抗(Rd)でプルダウンする事。
解決方法:⭕抵抗内蔵のUSB-C変換コネクターを使用する。
_ 名称:Micro USB to USB Type-C Data Adapter
_ 価格:1個20円程度 (ebayにあります)。
_ 変換コネクター:以下の記事も画像にある変換コネクターを薦めています。
⭕記事:一部のUSB Type-CケーブルでRaspberry Pi 4に給電できない理由
⭕記事:Pi4 not working with some chargers (or why you need two cc resistors)


.
資料:


Micro USB to USB Type-C Data Adapter

mako’s Electronic hobby 電子工作など
FLIR ONEとZenFone3


.
CORE1 と CORE 2 の配線:
CORE 2 は CC1 に接続されています。右から4本目。

M5Stack:乱暴には 右から3番目(SBU2に接続していても無視)と
_ 4番目をハンダ付けすると正常になるかと思います。


.
感想:
Type-C to Type-Cケーブルだと問題が起き、Type-A to Type-Cだと問題は起きない。
USB-C CC1の配線を本体側でするか Adapter にまかせるか考えさせられます。
2020年3月23日に調査しましたが 一部分析が不充分で遅れました。


.
.
M5Stack , USB-C , Adapter ,

Written by macsbug

12月 18, 2020 at 6:28 am

カテゴリー: M5STACK

3D MAZE of M5stack

leave a comment »

3D MAZE of M5Stack               2020.12.17

Yuji Tanaka氏作成の 3D MAZE Game を M5Stack用に移植しました。

スタート:Bボタンで開始します。
操作: 左:Aボタン、前進:Bボタン,右:Cボタン で操作します。

原作:ORG : 2019.08.15 : Yuji Tanaka
. [電子工作]ESP32 2.8型LCD搭載ゲームプラットフォーム
. http://galaxystar.image.coocan.jp/esp32_lcd28.htm
移植:Ported : 2020.12.17 : macsbug
. 3D MAZE of M5Stack
. https://macsbug.wordpress.com/2020/12/17/3d-maze-of-m5stack/
. Start : B button, LEFT : A button, RIGHT : C Button
. Stage : 0 to 7
. SD : /maze/maze0.dat
. SD : maze0.dat,maze1.dat,maze2.dat,maze3.dat,maze4.dat
. SD : maze5.dat,maze6.dat,maze7.dat,wall.dat

謝辞:Yuji Tanaka氏に感謝致します。


.
練習画面:Stage 0:真っすぐ進むとゴールになります。

GOAL:


.
Down Load:3D_MAZE_Folder.zip
. 3D_MAZE_Folder.zip を DLします。
. Fileは PDF形式で DL後に 3D_MAZE_Folder.zip に変更し解凍します。
. maze Folder は SD に入れます。
. SD から起動出来る LovyanLauncher用の bin file が含まれています。


.
移植:
. 原作は 240×320 で M5Stack用に 320×240 に変換しました。
. 迷路は maze Folder にあります。
.   0:Start 位置です。( 8 8 )
.  05:出口です。( 4 3 )

8 8
4 3
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
10 00 00 00 00 00 10 00 10 00 00 00 00 00 00 10
10 10 00 10 00 10 00 00 00 10 00 00 00 00 00 10
10 00 00 10 05 10 00 10 00 10 10 10 00 00 00 10
10 02 10 10 10 00 00 10 00 00 00 00 10 00 00 10
10 00 10 00 00 10 00 10 00 10 00 10 00 00 00 10
10 00 00 10 00 10 00 00 00 10 00 10 00 00 00 10
10 10 00 00 00 10 00 10 00 00 00 10 00 00 00 10
10 10 00 10 00 00 10 10  0 10 10 00 00 00 00 10
10 00 00 00 10 00 03 00 00 10 00 00 00 00 00 10
10 00 10 10 00 00 10 10 10 10 00 00 00 00 00 10
10 10 00 00 10 10 00 00 00 00 00 00 00 00 00 10
10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10
10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10
10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

. これにより自作の迷路を作成出来ます。


.
感想:
なかなか難しく出口まで時間がかかります。
音はうるさくなりますので音の機能は追加しませんでした。


.
.
M5Stack, Game, 3D MAZE, Macsbug,

Written by macsbug

12月 17, 2020 at 7:42 am

カテゴリー: M5STACK