Bunchan747・2026

今年もよろしくお願いします。

今年の目標として・・・断捨離かな
去年の目標は達成できなかったので、今年こそ!って感じで
もっとアクティブに前向きに生きていきます。

体調は良いと思う。
電子工作・ラジオ作成・無線(できるかな)・まずは、片付けないとね(部屋)

前向きにね!

※今年で還暦ですね・・・

MLアンテナ

Aliでループアンテナを少し前に買っていたのを思い出した。

アクティブ磁気ループアンテナ、広帯域短波無線、短波am、fm、vhf、uhf、sdr、50k-500mhz、17db – AliExpress 1420

ループなので、青いケーブルを2本でわっかにする。

そして、RFアンプに電源を供給することで感度が上がる。
2階の部屋で適当の棚にひっかけて聞いてみた。

ATS-miniの出番だ!
おおーーー

聞こえる。
40MでCW、音声交信がガンガン入ってくる。

後は、41Mで海外の短波

VHFでFM放送もバッチリ!

今度、窓際に設置してみよう。

価格はAliで3K~5Kかな

しばらく楽しめそうだ・・・

40M LSB 18:00

73

そうだ、SDRでも試そう・・・

つづく

電子工作する

次のネタを考え中

今まで、作りたい物を妄想しながら、部品集めばかり
していた。

つまり、ぜんぜん、物ができていない。

部品集めで満足してしまっている自分・・・

今年こそ絶対に物・・・形にするぞ!

1.ラジオは、以前、キットを購入して自分なりにUPGRADEした。

2.ヘッドフォンアンプは、これも昔、キット作ってケースに入れた。

3.短波ラジオ・・・作りたい。(真空管・トランジスタ)

4.いろいろ

そう、今用意したのが、2のヘッドフォンアンプのキット
これを、オペアンプをキットのとは違う物にする。
電圧も低めのもの。
ケースに入れる。

キットはまず、aitendoで入手、オペアンプは、AMZONヤフオクで入手中・・・
ケースはタカチのSW-95だ・・・

人が作った物を見て自分も作りたくなった。

部品待ち・・・・

つづく

LILYGO T-Embed SI4732:2

今回は、前回、こいつにSW用のFWが上がっていたので、いれてみたが
まったく受信してくれないので、その前にいれていたFMラジオを再インストール

これは、受信できる。

同じ方のオリジナルソースを、自分ようにカスタマイズした。

1.起動時、音量を40
2.起動時、ボリュームの位置(カーソル)
3.起動後、30秒で画面消灯
4.起動後、1時間でスリープ
5.SW長押しでスリープ

ベッドサイドFMラジオなのだ!

寝るときにつける(リセットで起動)

オリジナルソースの提供者は下記のYoutubeで確認できます。
mini SI4732 ESP32ラジオ用の新しいファームウェア

ただし、ソースなので、自分でコンパイルしてアップロードする必要がある。

FW自体の公開はされていない。

ちなみにBunchan747バージョンは以下になる。
Arduino IDEで必要なライブラリをそろえることでビルドできる。
もちろん、オリジナルを入手して、それをコンパイルできるようになったうえで
このソースを使用しないと、以下だけでは何もできない事をご理解ください。

//ORIGINAL SOURCE
//https://github.com/Xinyuan-LilyGO/T-Embed
//MySource
//Bunchan747:https://bunchan.com/2026/02/11/lilygo-t-embed-si47322/
//起動時:音量40
//起動後:30秒五画面消灯
//起動後:1時間でスリープ
//SW長押しでスリープ
//起動時はボリューム変更位置
#include <lvgl.h> //8.4.0 lv_conf.h #if 1 lv_font 10.12.14.16.30=1
#include "ui.h"
#include <Wire.h>
#include <TFT_eSPI.h>
#include <RotaryEncoder.h>
#include <SI4735.h>
#include <EEPROM.h>
#include <esp_sleep.h>
unsigned long previousMillis = 0;       // Stores the last time the action was performed
const unsigned long interval = 500; 

#define BATTERY_PIN 4         // ADC pin (npr. GPIO34 na ESP32)
#define ADC_MAX 4095.0         // 12-bitni ADC na ESP32
#define VREF 3.3               // Referentni napon (obično 3.3V)
#define R1 100000.0            // Gornji otpornik (npr. 100kΩ)
#define R2 100000.0  

#define FM_BAND_TYPE 0
#define MW_BAND_TYPE 1
#define SW_BAND_TYPE 2
#define LW_BAND_TYPE 3

#define LSB 0
#define USB 1

// ADD Bunchan747
#define START_FREQ 7000   // 70Mhz 
#define END_FREQ 10800    // 108<hz
const int btn = 0;
bool pressed = false;
unsigned long t = 0;
unsigned long bootTime = 0;
unsigned long lastActivityTime;
//

int whole,deci;

int searchDir=10;

int brightness=100;
long n=9660;
int rssi=0;
int snr =0;
 String station;
    String text;
//rotary encoder pins
#define PIN_IN1 2
#define PIN_IN2 1
#define PIN_LCD_BL    15
#define RESET_PIN     16           
#define AUDIO_MUTE    17           

// Enconder PINs
#define ENCODER_PIN_A  2           // GPIO01 
#define ENCODER_PIN_B  1

RotaryEncoder encoder(PIN_IN1, PIN_IN2, RotaryEncoder::LatchMode::TWO03);
String chosenLBL[4]={"VOLUME","TUNE","TUNE","SEARCH"};

int freq[4]={0,9,2,7};
int digMax[7]={3,9,9,9,9,2,63};
int chosen=0;
int volume=40; //0= volume 1 =freq 2=seek
int deb=0;
bool change=1;
bool change2=0;
bool fChange=0;
bool seek=false;
int pos[7]={-125,62,19,113,0,0,0};

// I2C bus pin on Lilygo T-Display
#define ESP32_I2C_SDA 18           // GPIO43 
#define ESP32_I2C_SCL 8     

SemaphoreHandle_t mutex; 

SI4735 rx;

#define LV_BUF_SIZE (320 * 40)  // ili npr. 320 * 40 = 12800
TFT_eSPI tft = TFT_eSPI();


// === LVGL flush funkcija ===
static void lv_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
    uint32_t w = (area->x2 - area->x1 + 1);
    uint32_t h = (area->y2 - area->y1 + 1);

    tft.setAddrWindow(area->x1, area->y1, w, h);
    tft.pushColors((uint16_t *)&color_p->full, w * h, true);
    lv_disp_flush_ready(disp);
}

// === LVGL inicijalizacija ekrana ===
void lvgl_init_display()
{
    lv_init();

    tft.begin();
    tft.setRotation(3);
   
    tft.fillScreen(TFT_BLACK);

    static lv_color_t *buf1 = (lv_color_t *)ps_malloc(sizeof(lv_color_t) * LV_BUF_SIZE);
    static lv_color_t *buf2 = (lv_color_t *)ps_malloc(sizeof(lv_color_t) * LV_BUF_SIZE);
    assert(buf1 && buf2);

    static lv_disp_draw_buf_t draw_buf;
    lv_disp_draw_buf_init(&draw_buf, buf1, buf2, LV_BUF_SIZE);

    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.hor_res = 320;  // tvoja širina
    disp_drv.ver_res = 170;  // tvoja visina
    disp_drv.flush_cb = lv_disp_flush;
    disp_drv.draw_buf = &draw_buf;
    lv_disp_drv_register(&disp_drv);
}

void setup()
{
  mutex = xSemaphoreCreateMutex(); 
  Serial.begin(115200);
  Serial.println("lets go");
  
  // ADD Bunchan747
  bootTime = millis(); // 起動時のタイムスタンプ
  // バックライトPWM
  // ledcSetup(0, 5000, 8);             // チャンネル0, 周波数5kHz, 8bit解像度
  // ledcAttachPin(PIN_LCD_BL, 0);     // GPIO 15 にPWM割り当て


  pinMode(46, OUTPUT);
  digitalWrite(46, HIGH);

  Wire.begin(ESP32_I2C_SDA, ESP32_I2C_SCL);
  lvgl_init_display();
  ui_init();

  rx.setI2CFastModeCustom(100000);
  
  int16_t si4735Addr = rx.getDeviceI2CAddress(RESET_PIN); // Looks for the I2C bus address and set it.  Returns 0 if error

  if ( si4735Addr == 0 ) {
    tft.setTextSize(2);
    tft.setTextColor(TFT_RED, TFT_BLACK);
    tft.println("Si4735 not detected");
    while (1);
  }  
  
  EEPROM.begin(3);
  n=EEPROM.read(0)*100+EEPROM.read(1)*10;

  if(n<START_FREQ || n>END_FREQ)
  n=9100;

  rx.setup(RESET_PIN, FM_BAND_TYPE);
  rx.setAudioMuteMcuPin(AUDIO_MUTE);    
  delay(300);
  rx.setVolume(volume);
  rx.setFM(START_FREQ, END_FREQ, n, 10);
  longToFreqDigitsFM();
   


  xTaskCreatePinnedToCore(core1Task, "Core1Task", 20480, NULL, 2, NULL, 1); // Adjust stack size
  xTaskCreatePinnedToCore(core2Task, "Core2Task", 20480, NULL, 1, NULL, 0);

}

void core2Task(void *pvParameters)
{
  
  while(1)
  {
  static int pos = 0;

  if(seek)
  {
    if (xSemaphoreTake(mutex, portMAX_DELAY)) { 
    n=n+searchDir;
    if(n>END_FREQ) n=START_FREQ;
     if(n<START_FREQ) n=END_FREQ;
  //digits[5]=0;
     rx.setFrequency(n);
  
     delay(62);                                   // Kratko čekanje da se signal stabilizira
     rx.getCurrentReceivedSignalQuality(); 
     rssi = rx.getCurrentRSSI(); 
     snr  = rx.getCurrentSNR();
    if(rssi>25) seek=false; longToFreqDigitsFM();
      change=1;
      xSemaphoreGive(mutex); 
    }
  }

  unsigned long currentMillis = millis(); // Get the current time
  if (currentMillis - previousMillis >= interval && seek==false) {
    previousMillis = currentMillis; // Update the last execution time
   if (xSemaphoreTake(mutex, portMAX_DELAY)) { 
    change2=1;
     rx.getCurrentReceivedSignalQuality(); 
     rssi = rx.getCurrentRSSI(); 
     snr  = rx.getCurrentSNR();
    xSemaphoreGive(mutex); 
   }
  }

  encoder.tick();

  int newPos = encoder.getPosition();
  if (xSemaphoreTake(mutex, portMAX_DELAY)) { 

  if (!digitalRead(btn)) {
    if (!pressed) {
      t = millis(); pressed = true;
    } else if (millis() - t > 500) {
      esp_deep_sleep_start(); // 長押しでSleep
    }
  } else if (pressed) {
    if (millis() - t < 1000) {
      chosen = (chosen + 1) % 4;
      seek = false; change = 1;
    }
    lastActivityTime = millis();            // アクティビティ更新
    digitalWrite(PIN_LCD_BL, HIGH);         // バックライトON
    pressed = false;
  }

//  if(digitalRead(0)==0)
//  {
//    delay(500);
//    if(digitalRead(0)==0)
//    {
//      // Deep Sleep開始
//      esp_deep_sleep_start();
//    }
//
  //  if(deb==0)
//      {
//        deb=1; chosen++; if(chosen>3) chosen=0;
//        seek=false;
//        change=1;
//      }
//  }else deb=0;

  if(!seek){

  

    
  if (pos != newPos) {

        if(chosen==3)
    {
    if(newPos<pos)
    {seek=1; searchDir=10;}

      if(newPos>pos)
    {seek=1; searchDir=-10;}

    
    change=1;
    }
    
    if(chosen==2)
    {
    if(newPos<pos)
    {n=n+100; if(n>END_FREQ) n=START_FREQ; }
    if(newPos>pos)
    {n=n-100; if(n<START_FREQ) n=END_FREQ; }
    fChange=1;
    change=1;
    }
   
    if(chosen==1)
    {
    if(newPos<pos)
    {n=n+10; if(n>END_FREQ) n=START_FREQ; }
    if(newPos>pos)
    {n=n-10; if(n<START_FREQ) n=END_FREQ; }
    fChange=1;
    change=1;
    }

    if(chosen==0)
    {
      if(newPos<pos)
        {volume++; if(volume>63) volume=0; }
        if(newPos>pos)
          {volume--; if(volume<0) volume=63; }
      
        change=1;
      }

      pos = newPos;
      lastActivityTime = millis();            // アクティビティ更新
      digitalWrite(PIN_LCD_BL, HIGH);         // バックライトON

    } 
    if(change){
   

     if(fChange)
     {
      rx.setFrequency(n);
      longToFreqDigitsFM();
      delay(25);                                   // wait for signal stabilize
      rx.getCurrentReceivedSignalQuality(); 
      rssi = rx.getCurrentRSSI(); 
      snr  = rx.getCurrentSNR();
      whole = n / 100;      // 96
      deci = (n % 100) / 10;  // 7
      EEPROM.write(0,whole);
      EEPROM.write(1,deci);
      EEPROM.commit();
      //text = rx.getRdsText();  
      fChange=0;
     }


   if(chosen==0)
   rx.setVolume(volume);
    } }
   xSemaphoreGive(mutex);
   }
   vTaskDelay(pdMS_TO_TICKS(2)); 
  }
}


void core1Task(void *pvParameters)
{
  
  while(1)
  {
    lv_timer_handler();
        if (xSemaphoreTake(mutex, portMAX_DELAY)) { 
        if(change){
        lv_label_set_text(ui_volLBL,String(volume).c_str());
        if(freq[0]!=0)
        lv_label_set_text(ui_dig1,String(freq[0]).c_str());
        else
        lv_label_set_text(ui_dig1,"");

        lv_label_set_text(ui_chosen,chosenLBL[chosen].c_str());
        lv_label_set_text(ui_dig2,String(freq[1]).c_str());
        lv_label_set_text(ui_dig3,String(freq[2]).c_str());
        lv_label_set_text(ui_dig4,String(freq[3]).c_str());
      
       
        lv_label_set_text(ui_rssi,String(rssi).c_str());
        lv_label_set_text(ui_sn,String(snr).c_str());
      
        lv_bar_set_value(ui_Bar1, rssi, LV_ANIM_OFF);  
        lv_bar_set_value(ui_Bar3, snr, LV_ANIM_OFF);  

        if(chosen==5)
        lv_obj_clear_flag(ui_selectedSSB, LV_OBJ_FLAG_HIDDEN); 
        else
        lv_obj_add_flag(ui_selectedSSB, LV_OBJ_FLAG_HIDDEN);  


       
        int per=readBatteryVoltage()*10;
        lv_bar_set_value(ui_Bar2, per, LV_ANIM_OFF);  
        lv_obj_set_pos(ui_selected, pos[chosen], 76);
        change=false;
        }
        if(change2)
        {
          lv_label_set_text(ui_rssi,String(rssi).c_str());
          lv_label_set_text(ui_sn,String(snr).c_str());
          lv_bar_set_value(ui_Bar1, rssi, LV_ANIM_OFF);  
          lv_label_set_text(ui_voltage,String(readBatteryVoltage()).c_str());
          change2=0;
        }
        xSemaphoreGive(mutex); 
        } 
      
      
   
  vTaskDelay(pdMS_TO_TICKS(10)); 
  }
}

void loop()
{
  // バックライト消灯(1分後)
  if (millis() - lastActivityTime > 60000) {
    digitalWrite(PIN_LCD_BL, LOW);  // 🔕 バックライトOFF
    // setBrightness(20); // PWM
  }
  // ⏱ 1時間経過チェック
  if (millis() - bootTime > (3600000 / 2)) {
    esp_deep_sleep_start(); // 自動でスリープ
  }
  delay(1000);  // CPU負荷軽減しつつループ継続
  // vTaskDelete(NULL);
  // Preporučena mala pauza
}

float readBatteryVoltage() {
  int raw = analogRead(BATTERY_PIN);
  float voltageAtPin = (raw / ADC_MAX) * VREF;
  float batteryVoltage = voltageAtPin * 2.1; // koristi isti faktor kao originalni kod
  return batteryVoltage;
}

void longToFreqDigitsFM() {
    int temp = n / 10;
    freq[0] = (temp < 1000) ? 0 : (temp / 1000);          
    freq[1] = (temp / 100) % 10;                      
    freq[2] = (temp / 10) % 10;                       
    freq[3] = temp % 10;             
}

void setBrightness(uint8_t level) {
  ledcWrite(0, level);            // 0〜255で明るさ調整
}

BCL:SW(ats-mini)

今日は、新しいFW(V2.33)にした状態でBCL

まず、朝鮮の声が聴こえた。 9650khz 16:00~

アンテナはヤフオクで入手した2.5mロッドアンテナのエンドフード
3.7~54Mhz対応で聞いてみた。(6998円:個人自作品)

設置はカメラの三脚に固定して室内で聞いている。
※アンテナベースもヤフオク(2700円:個人自作)

綺麗に受信できている。

始めにATS-miniのコントローラをUSBで接続していたが、どうもノイズが
ひどいのでPCとの接続をやめた。

USBアイソレータがいるね・・・

もう少ししたら、KBSも始まる・・・

LILYGO T-Embed SI4732

これもATS-mimiと同じようにESP32でSi4732を制御するRADIOだ

LILYGO T-Embed SI4732 – LILYGO Wiki

有志が開発したファームを入れて楽しめる。

(629) Volos Projects – YouTube
VolosMiniRadio/VolosRadio.zip at main · VolosR/VolosMiniRadio · GitHub
新登場!カスタムESP32 + SI4732 SSB無線ファームウェア!(フルインストール&デモ)

自分でもファームを開発できる。
サンプルソースが公開されていたので、環境さえあれば
コンパイルして更新できる。

今回はVolosさんのFWを入れてSWが聴けるか確認します。

ATS-mini RADIO

これが発売されてるのを見つけてすぐポチッた・・・

2台購入したが、1台は保管したまま・・・どこだ

ATS-miniのバージョンが今はVer4?結構進化している。

自分のは初号機だと思う

今回ファームの最新版があるのを見つけて更新してみた。

ATS Mini documentation

Releases · esp32-si4732/ats-mini

Ver.2.33を入れてみた

※QSPI版

なんか、面白い機能が実装されている。
外部コントロール機能
PCでコントロール、スクリーンショットもできる 楽しいATS MINI
GitHub – mattafaak/miniradio4: ATS-Mini Radio Controller
ATS Mini Controller

ラジオ:SW機・AM機(FM)

手持ちのアナログ系ラジオです。

A1.RAD-S520N(AudioComm:2016年製)(SW/AM/FM)


 ※後継:RAD-H330N(オーム)※かなりコストダウンして評価が下へ
 ※別物:ER-C74TELPA)※こっちのほうが近い・・・がデジタル機?


A2.RF-888(National)クーガ(SW/AM/FM)


A3.RAD-P122N-H(AudioComm)(AM/FM)
 ※防災用に確保


A4.ICF-S73(SONY)(AM/FM)1987


A5.ICR-P10(SONY)(AM)

手持ちのデジタル系ラジオです。

D1.SRW-710S(Kaimeda)(SW/AM/FM)


 ※終売・後継?Retekess・V115(ShigeZone
D2.ER-C68FL(ELPA


 ※デジタル同調(AM/FM/アラーム)
D3.ER-C57WR(ELPA)(SW/AM/FM/AIR/アラーム)
 ※オークションで入手:ポータブルで最強かも

D4.ATS mini Radio

BCL:SW(短波放送)

久しぶりにラジオでも聴くか・・・

夜、テレビばかり見てて(昼間)、いい加減飽きてきた・・・疲れた?

ラジオに目が行き、スイッチを入れた。
いつも聞いている東海ラジオ(FM補完)が流れた・・・

このラジオは以前紹介したShigeZoneで購入したSRW-710Sだ

購入当時は改造キット版で抵抗チップとICのセットだった
ICを交換して抵抗を指定位置に半田づけすることでFMが日本仕様になる
70~108Mhz

で、もちろんSWも聞ける代物!
そうだ短波放送きけるかな~

まずは、ネットで日本語放送のSW放送一覧を探した。
かたっぱしから試しにチューニング!!!

7.325Mhz(北京放送・中国国際放送)が聴けた。

なつかし~って感じで聞き入っていた。
中学時代にBCLやってたな~・・・ベリカードをもらったり・・・

当時は高性能なラジオなんて買えないから、親にねだってラジカセを買ってもらって
いたので、中波で北京放送は聴いていた。(1044Khz)

今もブログを書きながら中国国際放送を聞いている。
こちらは北京放送・中国国際放送です・・・

あ、今現在のラジオは、NATIONAL・PANASONICのRF-888です。

赤いバージョンのRF-888で、おしゃれな四角いラジオで気に入っています。
亡くなった義理の父が愛用していたラジオで、頂いてきました。
まだ動くのリビングに置いたままだったんだが、さっき、自分の亡き父の形見のラジオ
AudioCommRAD-S520NのSWがまともに受信できなくなったので急遽、RF-888
を思い出して使ってみた。

AudioComm RAD-S520NはAM/FM/SWのアナログラジオで
コンパクトでいろいろ聴けるので愛用してたのに・・・
急にSWが発振気味に受信するようになり、分解して内部清掃してみたが
改善せず・・・とほほ・・・
※オーム電機(2016年製)

ラジオ単体の話は別にするね。

今回は久しぶりにBCLしてみたという話

KBS
ラジオNIKKEI
しおかぜ
ベトナムの声
朝鮮の声
が聴けました・・・

モンゴル、台湾がまだだ・・・

つづく