SeeeduinoでDSPラジオ(2) | お父にゃんの電子工作

お父にゃんの電子工作

暇なおじさんが、電子工作(主にラジオ製作)をして勝手な感想を書く

前回、SeeeduinoとSi4732と小型OLEDでラジオを作った↓

 

残念なことに、OLEDの画面の書き換えのノイズなのか、約1秒ごとに、ジッ、ジッとノイズが入るのである。このノイズが無ければ実用的なラジオが出来るのに・・・

 

なので、表示の書き換えデータの少ない16×2くらいのLCDでSi4732を用いたラジオを作って本当に表示データ書き換えのデジタルノイズなのか確かめてみたい。

 

前回はSeeeduinoを使ったサンプルプログラムが有ったのだが、今回は無い。

PU2CLR_SI4735のライブラリのexsamplesの中を調べてみると、ESP32用のサンプルプログラムが、exsamplesの下のSI47XX_06_ESP32の中にLCD16x2_ALL_IN_ONEというサンプルプログラムが有った。

こいつをSeeeduino用に移植してみる。

 

はたしておじさんに出来るのか?

 

で、暫定回路図はこちら

前回作ったのから、OLEDをI2Cの16X2の液晶↓に変更しただけ

 

 

まず、ベースとなる”SI47XX_06_ESP32”の中にあった"LCD16x2_ALL_IN_ONE.ino"を別の場所にコピーしてから、スケッチを書き換えていく。

 

・ピンアサインを回路に合わせて変更
//#define RESET_PIN 12
#define RESET_PIN 3 // D3
// Enconder PINs
//#define ENCODER_PIN_A 13
//define ENCODER_PIN_B 14
#define ENCODER_PIN_A 1 // D1
#define ENCODER_PIN_B 2 //  D2
// LCD 16x02 or LCD20x4 PINs
//#define LCD_D7 15
//#define LCD_D6 16
//#define LCD_D5 17
//#define LCD_D4 18
//#define LCD_RS 19
//#define LCD_E  23
 
// Buttons controllers
//#define ENCODER_PUSH_BUTTON 27 //
#define ENCODER_PUSH_BUTTON 0 // D0
 
・16X2のLCDがSPI接続の物だったので、I2C接続のAQM1602で使うライブラリに変更
//#include <LiquidCrystal.h>
#include <I2CLiquidCrystal.h>
・LCDライブラリ関連を修正
//LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
I2CLiquidCrystal lcd(40, false); //3.3V
 

・フラッシュメモリをEEPROMのように書き換えるライブラリをSeeeduinoのものに変更

//#include <EEPROM.h>
#include <FlashAsEEPROM_SAMD.h>
前回作ったSeeeduinoのOLED_ALL_IN_ONE.inoに合わせてEEPROMのapp_idを変更
//const uint8_t app_id = 37; // Useful to check the EEPROM content before processing useful data
const uint8_t app_id = 47; // Useful to check the EEPROM content before processing useful data
同時に書き込みの最後にEEPROM.commit();を追加 (2か所)
これを追加しないと書き換えが出来なかった。
//  EEPROM.end();
  EEPROM.commit();
 
・バンドデータを書き換え、VHF表示をFMに、その他周波数を日本仕様に微調整
Band band[] = {
//    {"VHF", FM_BAND_TYPE, 6400, 10800, 10390, 1, 0, 1, 0, 0, 0},
//    {"MW1", MW_BAND_TYPE, 150, 1720, 810, 3, 4, 0, 0, 0, 32},
//    {"MW2", MW_BAND_TYPE, 531, 1701, 783, 2, 4, 0, 0, 0, 32},
    {"FM ", FM_BAND_TYPE, 7610, 9490, 8770, 1, 0, 1, 0, 0, 0},
    {"MW2", MW_BAND_TYPE, 522, 1620, 1116, 2, 4, 0, 0, 0, 32},
    {"MW3", MW_BAND_TYPE, 1700, 3500, 2500, 1, 4, 1, 0, 0, 32},
    {"80M", MW_BAND_TYPE, 3500, 4000, 3700, 0, 4, 1, 0, 0, 32},
    {"SW1", SW_BAND_TYPE, 4000, 5500, 4885, 1, 4, 1, 0, 0, 32},
 
前回と同じように”USB”という定数が2重に定義されているとワーニングが出るので、スケッチ内のUSBという定数を全て”USB_”に書き換え
//#define USB 2
#define USB_ 2
とりあえず、これでエラー、ワーニングが出なくなったので書き込んで動作させてみる。
 
ブレッドボードでこんな感じ
 
起動画面
”こ、こいつ動くぞ”  と、脳内で誰かさんがつぶやく
 
FM受信時
 
中波
 
短波
 
さらに受信強度Sの表示が何か変な感じなので、RSSI値をそのまま2桁で表示するように変更
//  if (rssi < 2)
//    rssiAux = 4;
//  else if (rssi < 4)
//    rssiAux = 5;
//  else if (rssi < 12)
//    rssiAux = 6;
//  else if (rssi < 25)
//    rssiAux = 7;
//  else if (rssi < 50)
//    rssiAux = 8;
//  else
//    rssiAux = 9;
 
//  sprintf(sMeter, "S%1.1u%c", rssiAux, (rssi >= 60) ? '+' : '.');
  sprintf(sMeter, "S%2u%c", rssi, (rssi >= 60) ? '+' : '.');
  lcd.setCursor(13, 1);
  lcd.print(sMeter);
 
このようにRSSI読み値そのままの2桁表示になった。
 
各バンドを受信してみた結果、思った通り、定期的な「ジッ、ジッ」というノイズが無くなり、ようやく普通のラジオのように受信できることが確認できた。
なかなか良い感じなのである。
しばらく、これを使って遊んでみたい。
気になることが有るので、いろいろ確認してみる。
 
 
「にゃにか動いたのかニャ?」