前回、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桁表示になった。
各バンドを受信してみた結果、思った通り、定期的な「ジッ、ジッ」というノイズが無くなり、ようやく普通のラジオのように受信できることが確認できた。
なかなか良い感じなのである。
しばらく、これを使って遊んでみたい。
気になることが有るので、いろいろ確認してみる。
「にゃにか動いたのかニャ?」