齢寿天任せ

写真付きで日記や趣味を書くならgooブログ

週間スケジュールが可能なRDA5807 FM DSPラジオ

2023-10-26 15:02:00 | 電子工作

色々なDSPラジオを製作してきたが、普段、聴く上で面倒なのはラジオ局の選択である。ボリュームで行うのは論外で、プリセット(ボタン)で行うのは許容範囲内であるが、番組の時刻になった時に、ボタンを押すのを忘れ聞き逃すことがある。常々、時刻になったら自動で番組を選択してくれる機能があればと思っていた。そのようなラジオはないので、自分で作ることにした。

求める機能は以下の通りである。

  • 時刻機能(時刻設定は自動)を持つ。
  • 番組の時刻になったら(電源をONして⇒目覚まし機能)該当のラジオ局を自動で選局する(スケジュール機能)。
  • 指定の音量で再生する。
  • 番組が終了したら、電源をOFFする(Sleep機能)。
  • スケジュールの設定は、PCやスマホからブラウザ経由でできる。
  • 最低限の操作(音量調節、選局、電源ON/OFF)はブラウザ経由でできる。

以上の機能は、RDA5807FP(FM DSPラジオ)とSeeed Studio XIAO ESP32C3(WiFi機能あり)を組み合わせることで可能となる。RDA5807FPは、安価であるが性能的には十分である。ワイドFMに対応し、聴きやすい音質で、ステレオをサポートする。XIAO ESP32C3は、サイズが500円硬貨位で、全体をコンパクトにできる。また、Arduino IDEでのプログラミングがサポートされている。RDA5807FPとXIAO ESP32C3は、I2Cで接続する。RDA5807FPは、小口径のスピーカーなら十分駆動できるので、アンプは不要である。全体の、消費電力は微少(0.3W程度)で、24時間電源ONでも大丈夫である。今回、作成したスケッチ(プログラム)と製作に関する情報はGithubに登録してある。

スケジュールは、曜日ごとに週間で設定する。ラジオの番組は、平日、土、日で異なり、毎週ほぼ同じなので、週間スケジュールで十分である。聴きたい番組について、「開始時刻、ラジオ局、番組の長さ(分)、音量、番組終了後に電源OFF(RDA5807FPのみ)するか否か」を設定する。以下に示すのは、ブラウザに表示された週間スケジュールの設定画面である。中央の表に各曜日ごとのスケジュールが表示されている。各エントリの指定項目は上記の通りである。ラジオ局については、”Station List:”の数字を設定する。

スケジュールを変更する方法は、まず各曜日のラジオボタンをクリックする。選択した曜日の設定が上部の入力領域にコピーされるので、それを編集後、”Submit”ボタンをクリックする、これで変更内容が保存される。

上の設定画面の下部”Control Functions”にあるボタンは、それぞれ、音量調節、選局、電源(RD5807FPのみ)をON/OFFするためのものである。

製作したDSPラジオの外観を以下に示す。

手前がXIAO ESP32C3、奥がRDA5807FP。部品数は少ない。口径10センチのスピーカーをRDA5807FPに直接接続している。アンテナは70センチ程のリード線を接続すれば十分受信できる。

OLEDの表示内容を以下に示す。

日付、曜日、時刻、音量、電源(1:ON,0:OFF)、受信周波数の順。

数か月間利用しているが、朝、電源ONした後はノータッチで自動選局してくれるので、大変便利である。

 


ESP32でWiFiとBluetooth(A2DP)は同時に使えるか

2023-09-17 15:20:22 | 電子工作

以前、ESP32によるインターネットラジオを製作したが、これはDACをI2Sで接続し、スピーカーから音を出す物だった。ESP32はWiFiとBluetoothを搭載しているので、それらを同時に使えば、ESP32でインターネットラジオを受信し、それをA2DPでBluetoothスピーカーに送って音を出すことができるはずである(スマホで普通にやってること)。事例がないかを調べて見た。

GithubにESP32を色々な方式のプレイヤーにするコードの実装例があった。その中に、SDカードモジュールを使い、A2DPで接続したBluetoothスピーカーから音を出すプレイヤーと、インターネットラジオを受信し、I2Sで接続したDACから音を出すプレイヤーの例を見つけた。これらを組み合わせれば、所期の目的を達成できそうだと思った。

しかしながら、結論からいうと、WiFiとA2DPを同時に動作させることはできなかった。A2DPを接続するとWiFiが繋がらない。WiFiを接続するとA2DPの接続でリセットエラーになる等、(このケースでは)同時には動作しなかった。

以下は試行錯誤の報告である。実装コード(ライブラリ)は洗練されていて、各種のプレーヤーが簡単に実装できるようになっており、最初の2例は動作を確認したので参考になると思う。

インターネットラジオを受信し、I2Sで接続したDACから音を出すプレイヤー

以下にスケッチを示す。上記の実装例からは、ボリューム(音量)や接続先のURLを変更するコードは省略している。ライブラリは、pschatzmannさんのライブラリを、ZIP形式でダウンロードし、ArduinoIDEのライブラリ管理からインストールする。「*wifi」と「*password」の部分は、利用しているWiFiのものを指定する。DACはUDA1334かPCM5102のモジュールが使える。ESP32との接続方法は、上記のリンク先に記載されている。

なお、ArduinoIDEは1.8.9。ボードマネージャからインストールするESP32ライブラリはEspressif Systemsの2.0.10である(古いとコンパイルエラーになる)。

下記のスケッチ中の、「AudioPlayer player(source, i2s, decoder)」の組み合わせを変えることで、色々なプレーヤーを実装できる。


#include "AudioTools.h"
#include "AudioCodecs/CodecMP3Helix.h"

const char *urls[] = {
  "http://stream.srg-ssr.ch/m/rsj/mp3_128"
};
const char *wifi = "your_ssid";
const char *password = "your_password";

URLStream urlStream(wifi, password);
AudioSourceURL source(urlStream, urls, "audio/mp3");
I2SStream i2s;
MP3DecoderHelix decoder;
AudioPlayer player(source, i2s, decoder);

void setup() {
  Serial.begin(115200);
  AudioLogger::instance().begin(Serial, AudioLogger::Info);

  // setup output
  auto cfg = i2s.defaultConfig(TX_MODE);
  i2s.begin(cfg);

  // setup player
  player.begin();
}

void loop() {
  player.copy();
}

 

A2DPで接続したBluetoothスピーカーから音を出すプレイヤー

以下にスケッチと実験セットを示す。SDカードモジュール(写真ではタテになっている基板。Amazonから200円程度で入手できる)の接続方法は、上記の実装例に記載されている。mp3の楽曲をSDカードにコピーしてセットしておく。複数の曲をコピーした場合は一通り演奏後に停止する(その後は一旦電源を落とさないと「ファイル無」のエラーになる)。スケッチ中の「cfg.name」に、Bluetoothスピーカーのデバイス名を設定する。

なお、SDカードモジュールが手元に無い場合は、ESP32のSPIFFS領域にMP3のファイルを予めコピーしておく方法(プラグインの設定が必要。なお、このプラグインはArduinoIDEのVer2.x.xでは使用できないので注意)で実験できる(実装例はこちら、コピーするデータあり)。


#include "AudioTools.h"
#include "AudioLibs/AudioA2DP.h"
#include "AudioLibs/AudioSourceSDFAT.h"
#include "AudioCodecs/CodecMP3Helix.h"

const char *startFilePath="/";
const char* ext="mp3";
AudioSourceSDFAT source(startFilePath, ext); // , PIN_AUDIO_KIT_SD_CARD_CS);
A2DPStream out;
MP3DecoderHelix decoder;
AudioPlayer player(source, out, decoder);

void setup() {
  Serial.begin(115200);
  AudioLogger::instance().begin(Serial, AudioLogger::Warning);
  // setup output - We send the test signal via A2DP - so we conect to a Bluetooth Speaker
  auto cfg = out.defaultConfig(TX_MODE);
  cfg.name = "bbbbbbbbbb";  // set the device here. Otherwise the next available device is used for output
  cfg.auto_reconnect = true;  // if this is use we just quickly connect to the last device ignoring cfg.name
  out.begin(cfg);

  // setup player
  player.setVolume(0.7);
  player.begin();

}

void loop() {
  player.copy();
}

 

インターネットラジオを受信し、A2DPで接続したBluetoothスピーカーから音を出すプレイヤー(動作せず)

目的のプレイヤーである。実装例にはないが、上の2つを組み合わせれば(入力:インターネットラジオ、出力:Bluetoothスピーカー)実現できるはずである。実装例からの類推で作成したスケッチは以下の通り。

実行したところ、「E (17464) wifi_init_default: netstack cb reg failed with 257」というようなエラーとrebootを繰り返し、動作はしなかった。なお、以下のスケッチをコンパイルすると、プログラムサイズが1.7MBになるので、ArduinoIDEからPartition Schemeのサイズを「No OTA 2MB APP/ 2MB SPIFFS」に変更した。

 


#include "AudioTools.h"
#include "AudioLibs/AudioA2DP.h"
#include "AudioCodecs/CodecMP3Helix.h"
const char *urls[] = {
  "http://cast1.torontocast.com:2170/stream"
};
const char *wifi = "your_ssid";
const char *password = "your_password";

URLStream urlStream(wifi, password);
AudioSourceURL source(urlStream, urls, "audio/mp3");

A2DPStream out;
MP3DecoderHelix decoder;
AudioPlayer player(source, out, decoder);

void setup() {
  Serial.begin(115200);
  AudioLogger::instance().begin(Serial, AudioLogger::Warning);
  // setup output - We send the test signal via A2DP - so we conect to a Bluetooth Speaker
  auto cfg = out.defaultConfig(TX_MODE);
  cfg.name = "bbbbbbbbbb";  // set the device here. Otherwise the next available device is used for output
  cfg.auto_reconnect = true;  // if this is use we just quickly connect to the last device ignoring cfg.name
  out.begin(cfg);

  // setup player
  player.setVolume(0.9);
  player.begin();
}

void loop() {
  player.copy();
}

 


16KEY PADを使用した RDA5807 FM DSPラジオ

2023-07-06 16:13:26 | 電子工作

4x4 keypad(前掲記事)、RDA5807(前掲記事1前掲記事2)、Seeeduino XIAOを組み合わせたFMラジオを製作し、既に半年程利用しているが、とても安定していて、常用しているので紹介する。RDA5807はFM DSPラジオ用のICであり、SOP16ピンサイズであることや、使用部品が少なく済み(特にXtal発信回路にコンデンサが不要なのが良い)、自作派には使い易い。また、安価なのでお勧めである。さらに、ここで組み合わせたXIAOのI2C制御との相性も良い。

これまで複数のラジオを製作してきたが、使う立場で言うと、(特に選局が)ワンタッチで操作できるのが良い。自作であり、汎用にする必要はないので、4x4 keypadを利用して、地域に合わせて1放送局1ボタンにプログラミングしておくのが使い易い。

4x4 keypadと今回のMCP23107を組み合わせる場合、唯一の難点は両者を、8本のリード線で結ぶ(ハンダ付け)必要があり、細かい作業が必要なことである。以前の製作で利用した別の4x4 keypad(制御ICとKeypadが同じ基板に載っている)を利用してみるのも一案かもしれない(この場合、配線は4本で済む)。

今回のスケッチは、こちら(Github)に置いてある。

写真。100均のアクリルケースに格納している。ブレッドボードから、汎用基板に実装し直した。手前がXIAO、奥がRDA5807、その奥は表示用のOLED。アクリルケースの上面にKeypadを配置した。XIAOは、長さが短いので、全体をコンパクトにできるが良い。


MCP23017を使用した4x4Keypad

2023-04-01 13:41:09 | 電子工作

DSPラジオを製作して実際に使ってみると、放送局をプリセットボタンに定義しておいて選局するのが使い勝手が良い。実際に4x4のKeypadを使用した物を製作したが、I2Cインターフェースの調子が悪く、電源を入れてから時間が立つと応答が無くなる現象に悩まされて、いまいちであった。

今回は、別のパーツを組み合わせて4x4のKeypadを実現した。使用したのは、MCP23017(基板付)4x4のKeypad基板(前回よりコンパクト)である。

MCP23017はMCU(マイクロ・コントローラ)のポートの数が足りない時に、ポート数を拡張するためのICである。Arduinoでは、デフォルトでKeypad.hライブラリが用意されていて、4X4のKeypadが使える。ただし、この場合、接続する線が8本、つまりMCU側のポートが8個必要になる。MCUにはXIAOを使う予定なので、そのままでは、ポートが不足する。このMCP23017は、MCUとI2Cインターフェース経由で接続するため、線は2本(電源、グランド線を含めると4本)で済む。MCP23017をサポートするKeypad_MC17.hライブラリは、Keypad.hライブラリを拡張している。

評価のためのコードを以下に示す。コードの冒頭でincludeしたライブラリは、Keypad_MC17.h、Wire.h、Keypad.hである。Arduino IDEのシリアルモニタに、押したキー(customKey)が表示される。


#include 
#include  
#include 
#define I2CADDR 0x20    // keypad IC
#define MIN_ELAPSED_TIME 100
const byte ROWS = 4;
const byte COLS = 4; 
char hexaKeys[ROWS][COLS] = { {'1', '2', '3', 'A'},  {'4', '5', '6', 'B'},  {'7', '8', '9', 'C'},  {'*', '0', '#', 'D'}};
byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad 
byte colPins[COLS] = {7, 6, 5, 4}; //connect to the column pinouts of the keypad 
//Keypad 
customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 
Keypad_MC17 keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS, I2CADDR );
long elapsedButton = millis();
long elapsedPull = millis();
void setup() {
   Serial.begin(9600);
   Wire.begin(); 
   keypad.begin( );
   delay(500);
}
void loop() {
  char customKey = keypad.getKey();  // Check button commands
  if ((millis() - elapsedButton) > MIN_ELAPSED_TIME)  {
    // check if some button is pressed
    if (customKey){
      Serial.println(customKey); 
     if (customKey == 'D') {
        // todo 
     }  else if (customKey == '#') {
        //todo
     }  else if  (customKey == '0') {
       //todo
    }  else;  // and so on 
       elapsedButton = millis();
    } 
   delay(10);
}

MCP23017(基板)とKeypadの間は、適当なコネクタがなかったのでメスのピンヘッダ(4x2)を挿した上、8本のリード線で接続している。Keypadのピン番号{1,2,3,4}(COL)をMCP23017のポート{A7、A6、A5、A4}に接続、Keypadのピン番号{5,6,7,8}(ROW)をMCP23017のポート{A0、A1、A2、A3}に接続する。

I2Cのアドレスは、MCP23017の半田ジャンパーをすべてGND側に接続して、X”20”とした。MCP23017側のI2Cの接続はSDA,SCLの表示がある。なお、場合によっては数KΩのプルアップ抵抗が必要なケースがあるかもしれない。


Seeed Studio XIAO ESP32C3でWifiによる時刻設定が可能な時計の製作

2023-03-04 16:23:32 | 電子工作

Seeed Studio XIAO ESP32C3はESP32互換でWifiが利用できるMCU(マイクロコントローラ)である。外形はSeeed Studio XIAOと同じ大きさ、超小型である。スイッチサイエンスから購入(送料200円)した。Wifiのアンテナが付属していて、I-PEXコネクタで本体に接続するタイプである。余談だが、I-PEXコネクタが極小で、接続に苦労した。

試しに何かWifiを利用したものを作ってみようと考え、NTP(タイムサーバー)から時刻と日付を参照し、XIAOのRTC(リアルタイムクロック)に設定する時計を製作した。

いままで、RTCを内蔵したMCUをいくつか利用してきたが、時刻設定の機能をHW、SWで実現するのが手間な上に、電源OFFの度に設定が必要になるので、時計として利用しようとは思わなかった。それが、インターネットに接続してNTPから時刻と日付を参照できればことは簡単である。時刻を利用した作り物にも展開できる。

NTPから時刻を設定する方法はこちらのサイトを参考にさせて頂いた(感謝)。時刻関係のライブラリ(Timelib.h)はこちら。表示は定番のSSD1306のOLED、ライブラリはライブラリ管理から検索可能(Adafruit版)。

Wifiは、2つのWifiステーションのうち、電波の強い方を自動で選択できるように、WiFiMulti.hライブリを利用した(一つしかない場合は一方を適当に指定すればよい)。

I2Cの接続はデフォールト(SDA:4、SCK:5)でよい。

XIAO ESP32C3にはSleep機能があるので、時刻の更新時以外はスリープさせると、使用電力(十数mA)を節約できる。ただし、スリープさせるとArudionoIDEからスケッチの書き込みができなくなるので要注意である。スリープを有効にするのは、最後の書き込み時のみにする必要がある。なお、スリープを有効にしてしまった後は以下の手順で復旧できる。これは、スケッチの誤りで、XIAO ESP32C3がリセットを繰り返すような場合にも利用できるので覚えておく価値があると思う。

  1. USBを抜く
  2. BOOTボタンを押したままUSBを挿す、押したまま
  3. IDEからスケッチを書き込む
  4. 書き込みが完了したら、BOOTボタンを離す
  5. RESETボタンを押す

本記事のスケッチはこちらを参照のこと。

帆のように見えるのはWifiのアンテナである。シールになっていて貼付けることができる。右側の基板はアンテナの台として利用、XIAOには未接続である。


RDA5807(FM DSPラジオ)のI2S機能を使ってみた

2022-12-05 14:15:19 | 電子工作

RDA5807FP(FM DSPラジオ IC)が使い易く、地域のFM局の受信も安定しているので色々と試している。

RDA5807FPは、I2S経由でディジタル音声信号(ラジオ音声)を出力する機能を持っているのが面白いと思ったので、動作を確認してみた。ここではDAC(ディジタルーアナログ変換)にUDA1334を使用する(現在、スイッチ・サイエンスでは販売終了とのこと)。

RDA5807とUDA1334の基板側の接続は以下の通り。電源はUSBからの5VをVINに、基板のGND同士を接続する(写真を参照のこと)。

ピン1(GPIO1) ー WSEL 
ピン15(GPIO3)ー BCLK 
ピン16(GPIO2)ー DIN

写真では、マイクロ・コントローラ(MCU)として、RP2040‐ZERO (Raspberry Pi Pico相当)を使用している。

RDA5807のI2Sを有効にするには以下の初期化コードを追加する。

Wire.beginTransmission(0x11);
Wire.write(0x04); // REG4
Wire.write(0b10001000); // RDSIEN, De-emphasis 50μs
Wire.write(0b01000000); // I2S Enabled
Wire.endTransmission(); // stop transmitting
Wire.beginTransmission(0x011);
Wire.write(0x06); // REG6
Wire.write(0b00000010); // DATA_SIGNED
Wire.write(0b10000000); // 48KBPS
Wire.endTransmission(); // stop transmitting

上のコードでは、Wireライブラリを利用して、RDA5807のREG4、REG6を直接設定している。RDA5807側のサンプリングレートは最大の48KBPSに設定している。UDA1334はWSEL入力の周波数に自動で対応するようである。

結果として、UDA1334側からもラジオ音声は出力されたが、RDA5807からの出力と比較してみて、音質の違いは明確には認識できなかった。あと、I2S側は音量が調節できないので、後段にアンプを接続する必要がある。

ということで、I2Sを利用しても仕掛けが大掛かりになる割にはメリットがないので、実験にとどめておくことにする。


RDA5807(FM DSPラジオ)をRDA7088の回路で動作させてみた

2022-11-10 13:55:14 | 電子工作

RDA5807FPは、マイクロコントローラ(MCU)で制御するFM DSPラジオICであるが、接続によって、マイクロコントローラなしで動作(RDA7088相当)させることができることを知ったので確認してみた。

きっかけは、AliExpressなどで売られている(とても安価な)FMラジオのDIYキットにおいて、HEX3653の替わりにRDA5807FPが添付されているのを発見したことにある。HEX3653の互換品はRDA7088(データシート)である(どちらがオリジナルであるかは不明)。RDA5807FPのデータシートには、RDA7088モードで動作するとは書かれていない。しかしながら、RDA5807FPは、ピン6をVCC(つまりHIGH)に接続するとRDA7088として動作するのである。

まず、AliExpressから件のDIYキットを購入してみた。確かにRDA5807FPが添付されていた。ただ、このまま組み立てると壊しそうなので、ブレッドボード上にRDA7088相当の回路を構成し、組み込んでみた。なお、事前にピン6と他のGNDに接続するピン間に十分な抵抗値があることは確認済みである(でないと発火するので)。

ちゃんと動作したというが結果である。放送局のSEEK(探索)、ボリュームの増減がタクトスイッチ操作で可能である。また、RDA5807FPの受信品質は、ワイドFM含めて良好で、小型のスピーカーを十分に鳴らせることが分かった。

次に、このRDA5807FPが、マイクロコントローラ制御で動作するかを確認する必要があるが、これは、この後に組んだ回路(ピン6はGNDに接続)で確認済みである。

このRDA7088モードは、どうも「隠し仕様」であるらしい。なお、RDA7088は、RDA5807FPの検査不良品(例えばレジスタが設定できない等)であるかもしれないので、RDA5807FPとして動作する保証はない(念のため)。

件のDIYキットであるが、後日、RDA5807FPを別途購入(安かった)したので、それを組み込んで完成させた。タクトスイッチはケースに収めるため基板の裏側に付けた。なお、動作に必要な部品のみ実装している。


KT0915(AM/SW/FM DSPラジオ)の試作

2022-09-20 14:43:21 | 電子工作

AM/SW/FMが受信できるマイコン制御のDSPラジオ ICは、これが3つ目(AKC6955、Si4732、KT0915)であり、たぶんこれが最後だと思う。KT0915については、期待を込めて試作したが、結論から言うと、試作で終えることにした(残念)。なお、DSPラジオ ICは、色々と種類があって、電子うさぎさんのサイト(日本語のリンクが貼れないので「電子うさぎ DSPラジオ」で検索)を参考にした。

結果のまとめを少々述べることにする。

SW(短波)の受信感度は、Si4732>AKC6955>KT0915の順であった。FMだけなら、KT0915が良い。AKC6955がそれに次ぐ(が製作上の安定度はいまいちで苦労した)。Si4732は、FMについては、音質が良くないのでお勧めではない。AMについては、感度はSWと同じ順番である、ただ、どれも音質は良くない、利用は電波状況が良い場所に限られると思う(筆者の環境は高雑音)。

マイコン(Arduino)用のライブラリは、いずれも、pu2clrさん作の物が利用できる(Si4732とKT0915で利用した)。特にSi4732(Si4735と同じ)の物は完成度が高い(そのまま利用した受信機が売られている程)。

KT0915は、KTマイクロ製、SSOPの16ピン ICである。ピン数が少ないため、部品点数が少なくて済むので、自作向きである。ただ、変換基板に載せるためのハンダ付けは、ほぼ限界である。AKC6955(SSOP、24ピン)で失敗した経験が役に立って、今回は上手くいった。

Arduinoは、Seeeduino XIAOを利用した。pu2clrさん作のKT0915用ライブラリは、GitHubにあるが、ArduinoのIDEのライブラリ管理の検索から「KT0915」で検索するとインストールできる。

試作ではpu2clrさんのGitHubのexamlpesフォルダにあるKT0915_02_OLEDをベースに、少々改変を加えた。詳細は筆者のGitHubを参照して頂きたい。なお、Arduino Pro Miniベースの回路図が前記のexamlpesフォルダにあるが、受信周波数を変更するロータリーエンコーダ(スケッチには存在)が省略されている。試作したスケッチでは、受信周波数の変更はタクトスイッチで行なっている。

さて、評価であるが、FMはリード線程度のアンテナで問題なく受信できた。音質もまずまずである。音量は小音量でスピーカーを鳴らせる程度、やはりアンプが欲しい。AMは、地元に4局(距離は20から30km)あるが、大電力(100㎾と300㎾)の2局(NHK)のみ受信できた。音質は良くない。SW(短波)は、マグネティックループアンテナを使用したが、7MHz帯の北京放送すらまともに受信できなかった(Si4732では同じアンテナで複数局が受信できたのに)。

 


Si4703搭載FMラジオチューナ評価ボードによるFMラジオ その3

2022-08-26 14:43:08 | 電子工作

SiliconLabのSi4703(FM DSPラジオIC)搭載の評価ボードについての記事は、3つ目(その1その2)である。この評価ボードで製作した2台のFMラジオはもう2年以上実用している。今回の記事は「その1」で行った試作の直ぐ後に作成したFMラジオについて紹介する。その概要とコードはGitHubに載せている。

特徴として、回路を簡単にし、部品を減らして、再現性を高めている。Si4703の制御は、Atmega328pで行ない、電圧を3.3Vに統一している。使用しているタクトスイッチ(ボタン)は3つだけである。表示にはOLED(SSD1306)を利用している。コントローラの基板(Auduino UNOなど)をラジオセットに持ち込まないのでコンパクトに組み立てられると思う。余談であるが、最近、Aruduinoの値段が高くなっていて、Auduino UNOなどを新規に買いたいと思わない。

写真に示したが、操作は、ボリュームの大小とFM局の選択だけである。百均のクリアケースに収めている。FM局の名前と周波数、ボリューム値をOLEDに表示する。FM局の名前と周波数は、予めコーディングしておく必要がある。受信できるFM局が多い場合は、タクトスイッチを追加して、正逆の選択ができるようにした方が良いかもしれない。電源はUSBからとるようにしている。5Vの電圧をAMS1117-3.3を使って3.3Vに変換している。

配線の様子は以下の通り。部品は最少である。なお、基板の下にも電源ラインの配線あり。Xtal発振子の周波数は16MHzである。発光ダイオードはピン19(PB5)に接続している。起動時に点滅する。

Atmega328pを単体で扱う場合は、いくつか考慮が必要である。その辺りの話はこちらのネット記事を参考にすると良い。まず、Atmega328pにはブートローダが書き込まれていなければならない。前記のネット記事にはその方法(Arduino UNOが必要)が紹介されている。難しいと感じる場合は、Atmega328pを購入する時にブートローダが書き込まれた物を購入すると良い。秋月電子から購入可能(それ程値段は高くならない。ピン配列のシールが貼付け済みで便利)である。

Atmega328pにスケッチを書き込む一番簡単な方法は、Arduino UNOの既存のAtmega328pを抜いて、該当のAtmega328pを差し込んでしまうことである。これが無理な(抜き差しには器具とコツがいる)場合は、USBシリアル変換器と若干の回路が必要である。これも前記のネット記事に説明されている。お勧めのUSBシリアル変換器は、ネット記事にも紹介されている秋月の FT232RL USBシリアル変換モジュール (AE-UM232R)であるが、同様なものがAmazonなどでも入手できる。ただし、PC側でのドライバの対応と、Atmega328pをリセットするための信号(DTR)がサポートされていることが必要である。

なお、Atmega328pの書き込みは5Vで行うことになっているので、スケッチの修正時に、既にSi4703やOLEDなどを組み込んだ基板上(3.3V)では書き込みできないので注意が必要である。また、3.3V動作では、16MHzのクロック周波数は保証されていないので、これも注意が必要(動いたらラッキー)である。


M6955(AKC6955)によるオールバンドラジオ受信機の製作

2022-05-13 16:17:58 | 電子工作

M6955(AKC6955)は、FM/TV/MW/SW/LWマルチバンドのDSPデジタルラジオICである。かなり歴史のあるチップで、中華の開発元AKC technology limitedのホームページは既に検索できなくなっている。このチップとの付き合いは、コロナ禍の始まる前からなので、既に3年近い。何とか纏まりが付いたので結果を報告することにした。最終のスケッチはGitHubにアップしている。

事の始まりは、aitendoのDSPラジオモジュールを見つけたことにある。マイコン制御のDSPラジオに興味があったので早速購入(2019年8月)したが、後から考えると少々敷居が高かったようである。Arduinoによる制御が目標であったが、チップもプログラムも実績なしで始めたため、モード(AM/FM)の変更までは確認できたものの、受信周波数の設定(つまり放送局の受信)は、ついに成功しなかった。このチップは色々と配線を替えて試しているうちに、誤ってDC9Vを印加して、燃やしてしまった。5VのArduinoと3.3VのDSPラジオを混在させてはいけない(信号の電圧レベルの変換が必要で配線が複雑化する)という教訓を得た。ただ、このDSPラジオモジュールには(受信周波数設定用レジスタの)不具合があったと、今でも思っている。ちなみに、この時利用していたArduinoのスケッチは、もへある氏作のもので、最終的なスケッチに一部原型が残っている。

前述の反省により、3.3Vで動作するArduino、ProMini(8Mhz動作)と、M6955チップをAliExpressから購入した。M6955チップを変換基板にハンダ付けするのには難儀したが、何とか成功。結果として、所期の目標機能(モード変更、受信周波数の変更など)は、ほぼ確認できたのであるが、ProMiniのI2Cに、M6955と表示用のOLEDをマルチドロップ接続すると、動作しなくなるいう不具合が最後まで解決出来なかった。プルアップ抵抗を追加するなど色々試したが無駄であった。そのまま、暫く放置(2019年12月頃)。

2020年になって、既に入手していたXIAOでは、どうかと思い付き、ProMiniから変更すると、OLEDの表示が可能になった。XIAOのI2CはM6955と相性が良かったということである。気を良くしたので、スケッチを改良して最終化(GitHubに登録した物)した。以下の写真は全体の最終形で、配線をブレッドボードから汎用基板(ブレッドボード互換)に替え、ケースに収めている(2022年の作業)。

感想を別稿のSi4703との比較で述べてみたい。一番大きな違いは、Si4703は無線機指向で、M6955はラジオ指向であるという点である。理由は、前者は受信周波数が1KHzステップ単位で変更が可能であるのに対して、後者は受信周波数の変更ステップ幅がモードごとに決まっていて、結果として1KHzステップ単位での受信周波数が選択できない点。これはラジオとしては問題ないが、無線機として致命的な欠点である。感度は、Si4703の方が良い。ただし明瞭度の点で若干問題がある。FMについては、M6955の方がはるかに音質が良く、Si4703は実用レベルとは言えない。AM(中波)については、XIAOとの電波干渉(AGCが効いて感度が低下?)がありバーアンテナの相性が良くない(実用性は期待できない)。音声出力はSi4703はイヤホンが精々で、M6955は音声出力が0.5Wあるので、小型のスピーカーを直接接続できる。