macsbug

Archive for the ‘M5STACK’ Category

Web Radio with a built-in speaker in M5Stack

leave a comment »

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

BUILT-IN SPEAKER TYPE:手の平サイズの WEB RADIO。
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
 
費用: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円
4 Other(Case,Screw,Connector) 328円
Total 1000円

 

MAX98357:Dealers and prices
NO. Dealers Price 円 ($) 輸送期間
1. All ELECTRONICS MALL 264円 ($2.40)
2. All goods are freeshipping Store 313円 ($2.85)
3. SAMIORE Store 391円 ($3.56)
4. YX Electronic Components 421円 ($3.83)
5. Shenzhen icstation Co. Ltd. 450円 ($4.08) 20 day
6. 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 に変更し解凍します。
. 
. 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。


.

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

.
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 を入れました。
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
// 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/
// 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.05
// 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)
//===========================================================
// Web Radio of M5Stack : https://macsbug.wordpress.com/2021/01/08/web-radio-of-m5stack/

#pragma GCC optimize ("Ofast")
#include <M5Stack.h>
#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
#define I2S_DOUT 22
//        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;
int vol = 5;
char URL[100], sname[100];

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

//============================================================
void setup() {
  // M5Stack Initialize --------------------------------------
  M5.begin();
  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
  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()){
    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.pressedFor(50)){              // Cut unknown nois
    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()){
    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 url_=String(url[c]).substring(0,String(url[c]).indexOf("*")+1); 
  url_.toCharArray(URL,url_.length());     // URL
  // Sname -----------------------------------------------------
  String s=String(url[c]).substring(String(url[c]).indexOf("//")+2); 
  String name_ = s.substring(s.indexOf("*")+1)+1;
  name_.toCharArray(sname,name_.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

.
仕様:
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 を DLします。
. 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
// 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/
// 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.05
// 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)
//===========================================================
// Web Radio of M5Stack : https://macsbug.wordpress.com/2021/01/08/web-radio-of-m5stack/

#pragma GCC optimize ("Ofast")
#include <M5Stack.h>
#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
#define I2S_DOUT 22
//        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;
int vol = 5;
char URL[100], sname[100];

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

//============================================================
void setup() {
  // M5Stack Initialize --------------------------------------
  M5.begin();
  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
  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()){
    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.pressedFor(50)){              // Cut unknown nois
    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()){
    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 url_=String(url[c]).substring(0,String(url[c]).indexOf("*")+1); 
  url_.toCharArray(URL,url_.length());     // URL
  // Sname -----------------------------------------------------
  String s=String(url[c]).substring(String(url[c]).indexOf("//")+2); 
  String name_ = s.substring(s.indexOf("*")+1)+1;
  name_.toCharArray(sname,name_.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

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 : 2021.01.08 : macsbug
//                Rev 1 : 2021.03.06 : 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
//=========================================================
// 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[] = "xxx"; // your network SSID (name) 
char pass[] = "xxx"; // 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
  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.pressedFor(50)){       // Cut unknown nois
    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()){
    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

SpaceWars of M5Stack

leave a comment »

SpaceWars of M5Stack               2020.12.06

Volos Projects作成の TTGO Display board用の SpaceWars Game を
M5Stack用に移植しました。

HARD:JoyStick を使用します。

スタート:Aボタン 又は JoyStickボタンで開始します。
操作: JoyStickで上下左右に操作します。

原作:ORG    : 2020.11.18 : Volos Projects
移植:Ported : 2020.12.06 : macsbug
HARD:TTGO Display board 135×240
Play size:game display size: 135×240

原作URL:VolosR/SpaceWars
YouTube:TTGO T Display – Space Shooter game- free code
移植URL:https://macsbug.wordpress.com/2020/12/06/spacewars-of-m5stack/
M5Stack Display Size:320×240
構成:A button : Start, fire, B button :Missile
構成: JoyStick(x,y,switch):start, fire

謝辞:Volos Projects に感謝致します。


.
Start Screen:

Play Screen:


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


.
画像:画像と名前

Play
earthlevel
earth blod blod1 buum
life bulet rocket ebullet ex2
explosion earth2 rover sens
gameover

 


.
移植:
画像:原作は 240×135 サイズ。M5Stack 320×240 に変換しました。
操作:上下左右、ボタンが必要の為、JoyStickを追加しました。


.
感想:
原作は 内容が濃く 移植に難を要しました。
表示は M5Stack用に見やすくしました。
音はうるさくなりますので音の機能は追加しませんでした。


.
.
M5Stack, Game, SpaceWars, Macsbug,

Written by macsbug

12月 6, 2020 at 8:23 am

カテゴリー: M5STACK

BOUNCE BALL of M5Stack

leave a comment »

BOUNCE BALL of M5Stack               2020.12.03

Volos Projects作成の TTGO Display board用の BOUNCE BALL Game を
M5Stack用に移植しました。

スタート:Aボタン 又は Cボタンで開始します。
操作: Aボタンで左に動き、Cボタンで右に動きます。

原作:ORG    : 2020.10.13 : Volos Projects
移植:Ported : 2020.12.03 : macsbug
HARD:TTGO Display board 135×240
Play size:game display size: 135×240
原作URL:https://www.youtube.com/watch?v=N6V7ZJkhSbc
原作URL:https://drive.google.com/file/d/1_lYi8ClOMExkd-qtNqBLwg-l2Y3UiV7F/view
移植URL:https://macsbug.wordpress.com/2020/12/03/bounce-ball-of-m5stack/
M5Stack Display Size:320×240
構成:A button : RIGHT, B button : Auto/Man, C button : LEFT
機能:B button で Manual(手動) 又は Auto(自動) に切り換え。
機能:Screen shot を SD に保存出来ます。#define Screen

謝辞:Volos Projects に感謝致します。


.
Start Screen:

Play Screen:

WIN Screen:


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


.
移植:
背景画像:原作は 135×240 サイズですので背景画像を追加しました。
色:Targetの色は 原作よりも明るくしました。
操作:手動操作以外に自動操作を追加しました。見るだけが出来ます。
報酬:YOU WIN 画面を追加しました。
スクリーンショット:画面をSD に保存出来ます。#define Screen
_ SD の Folder名は「scrennshot」です。


.
感想:
原作の作りが良く、リストも見やすい構造になっています。
表示は M5Stack用に見やすくしました。
Gameには報酬(YOU WIN) が必要かと思い追加しました。
音はうるさくなりますので音の機能は追加しませんでした。
画像の配置は 1 dot 単位で調整を行ないました。


.
.
M5Stack, Game, BOUNCE BALL, Macsbug,

Written by macsbug

12月 3, 2020 at 5:26 pm

カテゴリー: M5STACK

M5Stack WristWatch

leave a comment »

M5Stack WristWatch             2020.07.06

ATmage328PによるMI/O腕時計が気に入り M5Stackに移植。
時刻表示は Nixi Tube を使用しました。

もとネタ:HACKADAY.IO の MI/O Projects
ATmage328Pによる デザインに 魅了させられます。
さらに この背景画像を変更すると他のデザインが楽しめます。

M5Stack PCB Version:


.
使用方法:
.  

1. WiFi ( NTP ) 未接続は Wifi Led は Red。接続は Green に点灯。

2. RTC ( DS3231 SDA=5,SCL=13):接続は RTC ON。無い場合は RTC無しを表示。
. RTC 未接続でも NTPで時刻を表示します。
. RTC があると WiFi NTP が無い場合や 電源ON時に RTCが利用出来ます。
. 参照:2016.10.07:DS3231 RTC in ESP8266

3. A,B,C ボタンで時刻表示を切り変えます。

4. C + A ボタンで 画面の Screen Shot が撮れ SD に保存されます。
. 保存場所は SD内の ScreenShot folder です。事前にfolderを作成しておきます。

5. 一定時間毎に NTP時刻による 補正が行なわれます。


.
準備:

1. Library:ESP32-Chimera-Core v 1.0.3 入手。
.  Arduino IDE/Sketch/ include Library/Manage Libraries..でインストール。
.  M5Stack と LovyanGFX と ScreenShot Library が使用できます。
.  M5Stack Library は 重複する為 Library の外に置いておきます。
.  
2. Library:LovyanGFX 入手。
.  


.
作成:
1. HACKADAY.IO の MI/O Projects から公開画像を入手。

2. LCD Image Convereter で 画像変換 ( xxx.c )。
. 幾つかのバージョンがあり 動作する物を使用する。
. マック10.8.5 + Wine2.0 では 201701319 version を使用。
. 参考:2019.06.15:M5StickC Nixie tube Clock
. これにより 画像で部品を作成します。


.
スケッチ:
. M5Stack MI/O version:
. M5Stack_wristwatch.zip を DLします。
. Fileは PDF形式で DL後に xxx .zip に変更し解凍します。

. M5Stack PCB Version:
. M5_pcb_Wristwatch.zip を DLします。
.  修正:2020.07.12:String str = ,,, + “.jpg”); を “.bmp” に変更。

.  🍎 メモ:2020.07.13, 14:Wifi の ssid , pass について。
_ 1. M5Stackは 一度 WiFi に接続した場合、NVS領域内に ssid , password を
_  記憶する仕組みがあり、最後に接続したAPが接続対象になります。
_  よって、 WiFi.begin(ssid,pass); を WiFi.begin(); に省略しています。2020.07.14 修正。
_ 2. LovyanLauncher にWiFi設定を任せてしまうことで、
_  プログラムコード内に ssid , pass を書かなくて良くなります。


.
ScreenShot:
. 実物の画像とは 色が異なる事に気がつきました。
.  
. M5_PCB の ScreenShot
.  


.
感想:
元ネタの ATmage328Pによるデザインは ジックリ見る程 魅せられました。
購入での費用や 工作は難しく時間もかかります。
そこで 画像で試そうと M5Stackへ移植。
ただし、一番見たい ATMEGA328P の文字は画像が小さく見えません。
M5Stack は 画像のデザインで追加や新機能ができます。
WiFi接続で さらに多くの事ができます。
機能や画像表現は 画像の部品を取り揃える事で かなりの事が出来る様になります。

詰めの甘い所が あるかも知れません。時計は奥が深く 勉強が必要です。

WiFi 接続:ssid, pass の省略方法を熟知していませんでしたが、
. らびやん氏から省略出来る方法のアドバイスを頂きました。感謝致します。


M5Stack , WiFi , RTC , DS3231 , NTP ,

Written by macsbug

7月 6, 2020 at 4:11 pm

カテゴリー: M5STACK

LovyanGFX LCD Graphics driver

leave a comment »

LovyanGFX LCD Graphics driver       2020.07.02
.                     rev 1 : 2020.07.04 : M5.Lcd.startWrite();
LovyanGFX
. らびやん(lovyan03)氏作成による ESP32 ( M5Stack ) や
. SAMD51 ( Wio Terminal ) の LCDグラフィックスドライバーです。
. Hardware SPI LCD Display に対応し高速に動作させる事ができます。
. 解説と使用方法は LovyanGFX に丁寧に書かれていますので お読み下さい。
. 開発された らびやん(lovyan03)氏に感謝致します。

Pacman
M5Stack Library : 9〜18 msec から
LovyanGFX Library : 1〜2 msec を達成!
PACMAN_Joy_GFX.zip

.
Boing Ball:TFT_e SPI / DMA Test にある example です。
. Wio Terminal の Seeed_Arduino_LCD Libraryは DMA機能無し。
. Wio Terminal + LovyanGFX と M5Stack + LovyanGFX を動かす。
. M5Stack は 86 fps 。M5 + LovyanGFX は 175 fps 。2倍の高速化。
. Wio Terminal の設定:SPI_FREQUENCY 50000000 。
. M5Stack の設定:SPI_FREQUENCY 40000000 。

Boing Ball
Wio Terminal + LovyanGFX : 232 fps
M5Stack + LovyanGFX : 175 fps
M5Stack : 86 fps
Wio Terminal : Wio_boing_ball_GFX.zip
M5Stack : boing_ball_GFX.zip

. * DL fileは pdf(WordPressの都合)です。.pdf を削除し .zip を解凍します。
.
Target Display: ILI9341, ILI9342, ILI9486, ILI9488, ILI9163, HX8357,
_ ST7735, ST7789, SSD1351
_ M5Stack は ILI9341, ILI9342。 Wio Terminal は ILI9341 です。

使用方法:3つの方法。
1. LovyanGFX のみで使用。
2. M5Stack と共存:M5Stackの命令を使用可能。例: Switch操作。
3. ESP32-Chimera-Core と共存:M5Stackの命令を使用可能。

使用機種と価格:ESP32 / SAMD51 : 2020.06.26

No. Nomen Purchase Price
1 ESP32-DevKitC 秋月電子通商 1480円
2 ESP-WROOM-32D 秋月電子通商 1480円
3 ESP32 Development
, same as No.1
LANDZO ELECTRONIC
, $5.54+$1.05=$6.59
705円
4 ESP32-WROOM-32D
, same as No.2
Diykitmall Store
, $3.91+$1.02=$4.93
528円
5 D1 mini ESP32 Buy Go Go Store Store
, $3.67+$0.78=$4.45
477円
6 M5Stack Basic ( ESP32 ) M5Stack Official Store
, $27.95+$8.36=$36.31
3890円
7 M5Stack Gray ( ESP32 ) M5Stack Official Store
, $33.95+$8.36=$42.31
4533円
8 M5Stack Fire ( ESP32 ) M5Stack Official Store
, $49.95+$10.25=$60.20
6450円
9 Wio Terminal (SAMD51) 秋月電子通商:3680円税込 3680円
10 Wio Terminal (SAMD51) marutsu :3700円税抜 3996円
11 Wio Terminal (SAMD51) FeedoK Store,:$50.60 5414円


.
使用方法:3つの方法。
1. LovyanGFX , 2. M5Stackと共存 , 3. ESP32-Chimera-Core と共存
.
1. LovyanGFX のみで使用:LovyanGFX : lovyan03 : ver 1.0.14
. 以下 A, B 2つの いずれかで DLします。
. A:github から LovyanGFX をDL。
. B:Arduino IDE/Sketch/include Library/Manage Libraries..でインストール。
.   
. 動作確認: LovyanGFX 内にある examples を試します。
.  サンプルは 驚異的な速度で動きます。
.
. 事例:機種とスケッチ:Wio Terminal ( SAMD51 )
. 詳細:動作状況に記載。
. 結果:Wio Terminal + LovyanGFX で 約4秒 から 2秒 。2倍の高速化を達成!
.    

2. M5Stack と共存:
. LovyanGFX には 「include M5Stack.h より後に include LovyanGFX.hpp
.  を書いてください。M5.Lcdは使わずに、別途LGFXのインスタンスを
.  用意して使用してください。」と書かれています。
. M5.Lcd を tft への変更は 手間がある事と把握不足の為に 今回は省きます。

.
3. ESP32-Chimera-Core と共存:M5Stackの命令を使用可能。
. LovyanGFX には「ESP32-Chimera-Core を利用すると、M5.Lcd が
.   LovyanGFX になります。」と書かれています。
. 開発環境:Arduino IDE 1.8.13
. Library 準備:Versionは最新版を確認。多くのエラーは Ver の不一致です。
.  🍎 の Manage Libraries..でインストールが簡単です。

. 1. ESP32-Chimera-Core の入手:3つの方法。
.    Libraryに M5Stackがあれば Library Folder外に移動しておきます。
.   理由:ESP32-Chimera-Core には M5StackのLibraryが含まれ重複する為。
.   解決:M5stack Library は 使用せず ESP32-Chimera-Core Library で可能です。
. A. ESP32-Chimera-Core v 1.0.3 : tobozo : 左記のURLからDL。
. B. ESP32-Chimera-Core-lgfx : lovyan03 : 左記のURLからDL。
.   A 又は B を DL し Library Folder へ入れます。もしくは 以下の
. C. 🍎 Arduino IDE/Sketch/ include Library/Manage Libraries..でインストール。
.   
.
. 2. LovyanGFX の入手と配置。
.   LovyanGFX : lovyan03 : ver 1.0.14 : 左記のURLからDL。
.   又は 以下の方法で Library内にインストール。
.   🍎 Arduino IDE/Sketch/ include Library/Manage Libraries..でインストール。
.   
.   Library内の構成:追記 ( rev 1 : 2020.07.04 )
.    
. これで ESP32-Chimera-CoreLovyanGFX Libraryが使用できます。

. 3. スケッチの事例:以下は基本的な記述です。
.   Know-how:以下の2つは 速度向上の効果があります。
.   #pragma GCC optimize (“Ofast”)
.   M5.Lcd.startWrite();    // Release SPI bus

#pragma GCC optimize ("Ofast")
#include <ESP32-Chimera-Core.h> // Contains LovyanGFX
#include "M5StackUpdater.h" // SD-Upadate
void setup() {
M5.begin();
Wire.begin();
if(digitalRead(BUTTON_A_PIN)==0){updateFromFS(SD);ESP.restart();}
M5.Lcd.startWrite();  // Release SPI bus
M5.Lcd.setRotation(1);
M5.Lcd.fillScreen(TFT_BLACK); }

動作状況:
. 1. M5Stack Fire ( ESP32 ) と Wio Terminal ( SAMD51 )
.  M5Stack , Wio Terminal と Library の速度
.  Wio Terminal は M5Stack より 速い。
.  メモ:LovyanGFXの効果は 命令にもよります。
.     M5.Lcd.pushImageDMA 命令は高速で動作します。
. 2. スケッチ:Raytrace:drawPixel , fillRect 命令を使用。
. メモ:2020.07.04 :M5.Lcd.startWrite(); 正しい位置は
.    上記記載の基本的な記述と同じく SD操作の後にしてください。

tft.drawPixel(x, y, RGBTO565(r,g,b));
tft.fillRect(x, y, q, q, RGBTO565(r,g,b));
Model / result Library Time
sec
Source
M5Stack Fire M5Stack 6.280 Raytrace_M5Stack.zip
M5Stack Fire ESP32-Chimera-Core 3.875 Raytrace_GFX.zip
M5Stack Fire LovyanGFX 3.862 Raytrace_LovyanGFX.zip
Wio Terminal Seeed_Arduino_LCD 3.362 Wio_Raytrace_sd.zip
Wio Terminal LovyanGFX 1.945 Wio_Raytrace_GFX.zip

.

Wio Terminal
Sketch / Library LovyanGFX memo
Raytrace 動作状況 参照
Tetris Wio_Tetris.zip
Packman Wio_Packman.zip
nixie_tube_clock Wio_nixie_tube_clock.zip
audio_spectrum_display Wio_audio_spectrum_display.zip
uncannyEyes Wio_uncannyEyes_GFX.zip
ThermalCamera ThermalCamera_GFX.zip : 4 fps
Thermal_Camera_AMG8833 Wio_ThermalCam_AMG8833_GFX.zip
, 5 fps が 13 fps にアップ。2.6 倍向上。

.

M5Stack
Sketch / Library LovyanGFX memo
uncannyeyes M5_uncannyEyes_GFX.zip
.
.

.
. ゲームは 高速化と共に 適度な速度が必要です。
. 上記のSketchは 参考程度にしてください。

🍎 高速化のノウハウ:Pacman
. 抽画は DrawIndexedMap.h 内の drawFastHLine 1つで書かれています。
. この様に 抽画は1つでできており優秀な記載方法で勉強になります。
. これを LovyanGFX の pushImageDMA で記載すると高速になります。
.

// Original
#define C16(_rr,_gg,_bb) ((ushort)(((_rr & 0xF8) << 8) | 
                  ((_gg & 0xFC) << 3) | ((_bb & 0xF8) >> 3)))

void drawIndexedmap(uint8_t* indexmap, int16_t x, uint16_t y) {
  byte i = 0;
  uint16_t color = _paletteW[indexmap[0]];
  for (byte tmpY = 0; tmpY < 8; tmpY++) {
    byte width = 1;
    for (byte tmpX = 0; tmpX < 8; tmpX++) { uint16_t next_color = _paletteW[indexmap[++i]]; if ((color != next_color && width >= 1) || tmpX == 7) {
        M5.Lcd.drawFastHLine(x + tmpX - width, y + tmpY, width, color);
        color = next_color;
        width = 0;
      }
      width++;
    }
  }
}

.

// Revision
#define C16(_rr,_gg,_bb) lgfx::swap565(_rr, _gg, _bb)

void drawIndexedmap(uint8_t* indexmap, int16_t x, uint16_t y) {
  static uint16_t dmabuffer[2][64];
  static bool dmaflip;
  int i = 0;
  do {
    dmabuffer[dmaflip][i] = _paletteW[indexmap[i]];
  } while (++i < 64);
  M5.Lcd.pushImageDMA(x, y, 8, 8, dmabuffer[dmaflip]);
  dmaflip = !dmaflip;
}

🍎 高速化のポイント:以下の宣言や変数の設定により速くなります。
.  #pragma GCC optimize (“Ofast”) : 冒頭に記載。速度優先のビルドが行われます。
.  M5.Lcd.startWrite();       : SPI BUSを解放する。場所はSD宣言の後。
.  int_fast8_t  : int8_t を 置き換えると バイナリサイズが小さく動作が速くなる。
.  int_fast16_t  : int16_tを 置き換えると バイナリサイズが小さく動作が速くなる。
.
.  32bitCPU に 8bit や 16bit の変数は 余分な処理が増え バイナリが大きく遅くなる。
.  最終的にコンパイラによってint32_tと同じものとして扱われる。
.  コンパイラはCPUに合わせて最適なサイズを選ぶ。
.  人の目で見ても必要なバイト数が判断できる。
.  for (uint8_t i = 0:節約のつもりが逆に遅くなる。
.  int_fast~ は 記述が長くなり 特に型に頓着しない場合は 素直に int が無難。
.  1つ1つの記述で 効果があり 楽しくなります。
.  DMA 命令:pushPixelsDMA, pushImageDMA, initDMA, waitDMA
.
.
.  スケッチの事例:PACMAN_Joy_GFX.zip:232 FPS
.
.  上記のノウハウは らびやん氏に教えて頂き 大変勉強になりました。
.

参照:
2020.04.12:lovyan03/LovyanGFX:公開。Twitter情報。
2020.04.29:ラズパイスキ ノ ニッキ:LovyanGFXの導入の仕方
2020.05.01:Lang-ship:M5StickCのDisplay周り解析 その4 LovyanGFXで高速描画
2020.05,20:HomeMadeGarbage:MakePython ESP32 Color LCD で LovyanGFXを堪能
2020.05.20:Qiita, @karaage0703:M5 Stack/M5 StickC/Wio Terminalで使える
_      高性能グラフィックライブラリ「LovyanGFX」
2020.05.30:Arduino Library List:LovyanGFX: First Release Date:2020.05.30
2020.06.04:Lang-ship:M5StackでLovyanGFXを試す その1 メモリの確認
2020.06.29:Qiita, @poruruba:LILYGO TTGOのT-Wristbandで
_      グラフィックライブラリLovyanGFXを使ってみた
2020.xx.xx:ArduBadge:What is LovyanGFX?

感想:
画像表示好きで 夢は 高速の Graphics Library。
各種Display や M5Stackの Library は 使用できますが さほど高速で無い。
まして 自分で高速 Libraryを作れるベレルは無し と言う壁に突き当たる。
行き着いたのは Bodmer氏の TFT_eSPI Library。

2017.08.end:M5Stack もどき。
2017.09.12:M5Stack Copy版入手。
2017.10.24:公式 M5Stack Store 販売開始。
2017.11.18:M5Stack:M5Stack Storeから着:2017.10.23-2017.11.18

2020年4月12日に念願の LovyanGFX が公開されました。
早々にサンプルを試し、その高速性に驚きました。
どうして ここまで 速く動くのか? レベルが高すぎるが楽しい!
LovyanGFX Library の中を見ると 莫大な量と高度な内容に圧倒されました。
複数の機種や多種類のSPI LCD Displayにも対応した配慮も同様です。
TFT_eSPI Libraryは 現在のSprite装備まで長年かかって進化した経緯がある。
それに対し 短期間にこれだけの内容が出来た事に驚き そのパワーに驚嘆します。
その事は LovyanGFX Library に書かれている事とCredits に書かれている
方々の謝辞にもあります。
これほどまでの内容を作れる らびやん氏に 敬意と感謝の限りです。

ESP32-Chimera-Core:
Library には M5Stack が含まれています。使用する時は M5Stack を外します。
Library には ScreenShot 機能があり 画面をSDに保存できます。

SD は SPI Busを使用します。 LovyanGFX も SPI Busを使用します。
その為に 最初に M5.Lcd.startWrite();  を記載し 最後に M5.Lcd.endWrite();
を記載します。SPI Bus の開放と閉鎖です。
画面の画像を使用する事により 綺麗で解りやすくできます。

この記事の記載は 2020.07.02。力量不足により内容の不備があるかと思います。
Library の Version 変更や方式の変更で 内容が変わる事も考えられます。
Library Version 変更により 2020.07.04 にて追記、及び 変更を行いました。

 

 


LovyanGFX , TFT_eSPI , らびやん , lovyan03 , Bodmer , tobozo , M5Stack ,
Wio Terminal ,

Written by macsbug

7月 2, 2020 at 8:10 am

カテゴリー: ESP32, M5STACK, Wio Terminal