nobcha23の日記

PICマイコンやArduinoを使う電子回路遊びを紹介します

SDカード&RTCを試してみます

ArduinoでSi5351aを制御するデジタル局発を作りました。中華製エアバンドレシーバーキットを改造し、デジタル化エアバンド受信機を試作しています。

 

次に取り掛かろうとしているのは受信モニターログ記録をしてみようかと言うアイデアです。受信信号をモニターし、信号あったら、周波数や時間を記録してみようかとの取り組みです。そのためにArduino環境でSDカード&RTCをどうするか探したら中華製パーツでSDロガーシールドというのがありました。早速Aliexpressで買うと、キリギスタンから航空便でやってきました。当然資料はついてません。

 

ぐぐってみると、Adafruitsのロガーシールドと言うのが本家のようです。ただし、本家製品は廃版なようで、中華製コピー品が改良されていくつかでています。ARDUINO UNOへピギーバックする基板(シールド)にSDカードスロット、3.3V電圧変換、DS1307クロックとバッテリーが付いています。実験表示環境としてLCD&KEYPADをさらに上載せすることにしました。

 

f:id:nobcha23:20210312230523j:plain

回路構成

f:id:nobcha23:20210312230606j:plain

3種基板

f:id:nobcha23:20210312230712j:plain

3段重ねで動かす

本家がAdafruitsなのでライブラリーは豊富。また、SDカード、RTCに関してブログで発表されている事例はたくさんありました。地盤工学的電子工作講座 Season 1「第5回 SDカードに記録する:SDカードシールド」を参考にさせていただきました。

f:id:nobcha23:20210312230755j:plain

KEYPAD押したらA0に抵抗分圧電圧

LCD&KEYPADシールドではプッシュボタンは抵抗分圧されてA0に入ります。このとき、DOWNキーを押しています。

 

SDカードへはdatalog.csvファイルに書き込まれます。PCにSDカードリーダーを繋いで内容を読んでみました。

f:id:nobcha23:20210312231322j:plain

EXCELで書き込みデータを確認したら



 

 

 

‐―――――――――――――――スケッチは次―――――――――――――――
// SD RTCで時間設定、A0ポートの電圧値をADC値,電圧値として7秒ごとにSDカードにCSV形式で
// 記録するテストプログラム。SDカードのdatalog.csvに記録される。
// SDカードはSPI接続、RTCはi2cで0x68:DS1307Zを使用。表示はLCD KEYPAD基板の16字x2行
// LCDと9600bpsのシリアルポートに出力する。
// 電源ON時にRTCがアクティブでないとコンパイル時のPCの時間をRTCに設定する。
// LCD KEYPAD基板のA0にはボタンキーがつながっていて、各キー押すと電圧分圧される。
// 2021 02 15

#include <SPI.h>
#include <SD.h>

#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 RTC;

const int chipSelect = 10; // Arduino UNOでは10、Arduino MEGAでは53

#include <LiquidCrystal.h> // ―→16x2

//lcd instance for parallel IO LCD. If change to i2c, you shall replace i2c_lcd.
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7); // for LCD&key pin assign

// the digital pins that connect to the LEDs
#define redLEDpin 3
#define greenLEDpin 4


void setup(void)
{
Wire.begin();
lcd.begin(16,2); // initialize the lcd
lcd.clear();

pinMode(redLEDpin, OUTPUT);
pinMode(greenLEDpin, OUTPUT);

RTC.begin();
if(!RTC.isrunning()){
Serial.println( "RTCがRESETされています!");
lcd.setCursor(0, 0);
lcd.print("RTC had been RESET");
//次の行は、RTCをこのスケッチがコンパイルされた日時に設定します
RTC.adjust(DateTime(__DATE__,__TIME__));
}

/* ----- Setting up serial communication with PC ------ */
/* ここでUSBを介してPCとシリアル通信を始める。9600はシリアル通信のボーレート */
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
//何らかの問題があってシリアルポートに接続できないときは、このループにトラップされる
}

/* ----- Initialisation of SD card ------ */
Serial.print("Initializing SD card..");
lcd.setCursor(0, 0);
delay(200);
lcd.print("Initializing SD card");
//see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
lcd.setCursor(0, 1);
lcd.print("Card failed, or no ");
// don't do anything more:
digitalWrite(redLEDpin, HIGH);
return;
}
Serial.println("card initialized. ");
lcd.setCursor(0, 2);
lcd.print("card initialized.");
digitalWrite(greenLEDpin, HIGH);
}

char current_t[20] = "";

void loop(void)
{
int ainput; //読み取ったbit数:intは整数
float vinput; //bit数を電圧に変換したもの:floatは浮動小数点数

// RTCから現在時の取得と文字列変換、シリアルポートとLCDへ出力

DateTime now = RTC.now();
sprintf(current_t,"%04d/%02d/%02d,%02d:%02d:%02d,", now.year(),now.month(), now.day(), now.hour(), now.minute(), now.second());

lcd.setCursor(0, 2);
lcd.print(current_t);

Serial.println(current_t);

/* データの読み取り */
ainput=analogRead(A0); //A0から電圧をADCデータとして読む
vinput=5000.0*ainput/1023; //上記電圧mVに変換

/* PCのシリアルモニタに表示 */
Serial.print(ainput);
Serial.print(" bit "); // bit単位
Serial.print(vinput);
Serial.println(" mV"); // mVと表示、改行する

lcd.setCursor(0,0);
lcd.print(current_t);

lcd.setCursor(0, 3);
lcd.print(ainput);
lcd.print("bit"); // bitと表示、
lcd.setCursor(7, 3);
lcd.print(vinput);
lcd.print("mV"); // mVと表示、

/* SDカードに書き込み */
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile)
{
dataFile.print(current_t);
dataFile.print(ainput);
dataFile.print(" bit,"); // bit単位
dataFile.print(vinput);
dataFile.println(" mV"); // mV単位
}
dataFile.close();

delay(5000); // 5秒待ち

lcd.setCursor(0, 3);
lcd.clear(); // 表示消す
delay(2000); // 2秒待ち
}

 

www.youtube.com

テンキーボードをARDUINOで使ってみる実験 How to combine the ten keyboard with the receiver.

中華製エアバンドレシーバーキットの改造はARDUINO制御のデジタル局発まで進み、安定したチャネルスキャンができるところまでやってきました。

I had made up the stable receiver with a Si5351a PLL chip. To utilize the Si5351a I tried to combine the ten keyboards because of more functional operation can be brought.

中華製エアバンドレシーバーキットにSi5351aを使った局発を組み合わせてコンバーター動作させると色々な受信ができそうです。

デジタル局発ではロータリーエンコーダーの組み合わせよりもテンキースイッチの方が色々な機能が搭載できそうではないかと思い、テンキースイッチを検討してみることにしました。

昔々共立電子でテンキージャンクを買い、PICマイコンでi2cキーパッドモジュールを作ったんですが、今回は趣向を変えてi2cポート拡張チップを使ってi2cキーパッドを試作します。

I found that PCF8574 of i2c extender chip is good for the key control.

--ここまで年寄りの長い前置きでしたーーー

 

共立電子で買ったテンキーパッドです。  I bought this at Kyoritsu parts shop in Nipponbashi radio street.

f:id:nobcha23:20210219214938j:plain

KEY PAD


なんでi2cかと言うと、中華製i2cLCDをこの間買ったんですが、SL2液晶の裏にi2cインターフェイスがソケットでつながっています。制御は思い込みでPICマイコン制御ぐらいに思ってました。

ところが、チップ刻印調べるとPCF8754というNXP開発の8ビットポートのi2c接続IO拡張回路ということを知りました。

ARDUINO FORUMやGITHUBなどを探してみると#include <Keypad_I2C.h>、#include <Keypad.h>を使えば、i2cでIO拡張してテンキーパッド接続ができるようです。

There are several libraries for PCF8754 in Arduino forum and GITHUB.

 

早速ライブラリーをD/Lし、キーパッドを接続、スケッチ書いてみました。
https://www.arduinolibraries.info/libraries/keypad
https://github.com/joeyoung/arduino_keypads

スケッチは次。

f:id:nobcha23:20210219215655j:plain

スケッチ

LCD用i2cなので、ポートは7ビット(残る1ビットはバックライトのON/OFF駆動に使用されている)しか使えません。キーパッドは丁度3x4で足りました。

配線図は次。

f:id:nobcha23:20210219215050j:plain

i2c基板とKeyPad接続

 

デバッグ風景は次です。

f:id:nobcha23:20210219215157j:plain

UNOでi2c接続KeyPadデバッグ

 

ARDUINOの世界では本当に色々なライブラリーがあり、簡単に実験が進められるのは楽しいですね。

 

-------その後

その後、このキーパッド制御をエアバンド用局発で使ってみました。

nobcha23.hatenadiary.com

 

 

SDR(Si4735ブレイクアウト基板)を試してみる To try to use Si4735 chip

There is  Si4735 module in my parts box. I tried to use it easily by using a few commands via i2c interface of Arduino. The sketch is below.

Simply receiving some determined FM station

The necessary commands are "POWER UP" and "TUNE FREQUENCY".

1. Power Up: The command is 0x01.

 ARG1 is "0b00010000" as we are using the crystal.

 ARG2 is "0b00000101" as we shall select the analogue sound output.


2. Set FM Tune Frequency: The command is 0x20.

   ARG1 is "0b00000000" as AN332 direction.

  ARG2,ARG3 are the frequency value as 10kHz base. For example it is 1F40:8000:80MHz to tune the 80MHz FM station. ARG2 = 1F, ARG3 = 40.

 ARG4 is "0b00000000" as AN332 direction.

 

The connection is below.

f:id:nobcha23:20201217211007j:plain

 

AM/FMレシーバー用のSDRチップ、例えばシリコンラボのSi473xシリーズだとFMモードで110MHzぐらいまで受信できます。またAMモードでもSWで30MHzぐらいまで受信できます。だったらエアバンドの118-139MHzなら組み合わせで受信できそうな気がして、以前カンハムで頒布していたFULL DIP SDRキットを買って試してみようとしました。

しかしながら、使われているSi4735はSWで30MHzまでで、AMモードでエアバンド帯域まで受信周波数を拡張はできません。(製品仕様を見れば当たり前の話ですが…。)

 

SWバンドの周波数範囲を拡大、エアバンド帯域まで受信できるようにしたSDRチップは、HDR-737に使用されている事がわかりました。買ってみてケースを開けてICのマーキングを確認したら消されています。ハッカー情報ではM6955のカスタム拡張品らしいです。確かにM6955の製品仕様書にはカスタム帯域も可能とあります。これは上記したように周波数、変調方式をAM/SW/FM用チップで組み合わせCBやエアバンドがオプション追加されたものらしいですね。


ワタシの想像したFM帯域高周波とAMモードの組み合わせはカスタムオプションなら実現できるようです。

(追記:今年1月末に発売されたRL社の受信バイブル2021記事によれば、150MHzの水晶発振器が内蔵され、SW帯に変換されているとのこと。HRD-737を開けてみて、基板を見たらその通り150MHzのユニットがありました。また、このユニットから150MHzがアンテナを通じて輻射されていると記事にありました。心配なので、GigaStで観測してみましたが、アンテナからは輻射されてませんでした。ケースは金属シールドではないので、筐体そばにスペアナに付けたアンテナを近づけると150MHzだけでなく、450MHzも見えました。普通の受信機の局発漏れと同じだと思われます。)

 

今回はとちりと思い込みで買ったSDRラジオキット部品がジャンク箱に眠っていたので、このSi4735ブレイクアウト基板を拾い上げ使い方を試してみることにしました。

 

WEBを探すとARDUINOで簡単に動かしている例がありました。
Si4730をArduinoで制御 DSP ラジオモジュール

電源オンコマンドと周波数設定コマンドだけで動くとのこと。

Power Up:
  コマンドは 0x01
  引数1 (ARG1)は、水晶を使うので "0b00010000"
  引数2 (ARG2)は、音声はアナログ出力なので "0b00000101"
  本来はこの後、Responceを取って、ICの状態を確認すべきですが、割愛。
Set FM Tune Frequency:
  コマンドは 0x20
  引数1 (ARG1)は、AN332の指定で "0b00000000"
  引数2、引数3 (ARG2,ARG3)は、設定する周波数を10kHz単位で設定。80MHzなら
  8000(=1F40)を2バイトに分けて書き込む。ARG2 = 1F, ARG3 = 40
  引数4はAN332を参照して"0b00000000"

 

モジュールの接続は次になります。

f:id:nobcha23:20201217211007j:plain

 

f:id:nobcha23:20201217211039j:plain



つないでスケッチ書いて動かそうとするが、うまくいきませんでした。
まずは基本に立ち返ってi2cアドレススキャンでi2cアドレス確認します。

f:id:nobcha23:20201217212903j:plain

i2cアドレススキャンしてみる

スケッチです。

 

ブレイクアウトボードのアドレスは0x63と0x11の二種があり、手元の基板は0x11でした。

これでうまくつながりました。在阪主要FM局3局の周波数設定するスケッチを書きました。


FM受信設定スケッチ

 

つないだクリスタルイアホンからクリアな受信音声が聴取できました。次はSW設定にチャレンジですね。

 

-------------------------追記@2021.08.03---------------

その後ATS-20用基板(Si4732受信機)を購入し、中国製エアバンド受信機の10.7MHzIF出力を取り出し、受信してみました。

nobcha23.hatenadiary.com

------------------------更に追記@2021.08.12---------------

続いてSi4732受信機基板セットを買って、クリスタルコンバーターを作り、エアバンド受信セットをまとめています。

 

 

nano VNAで手持ちダミーなどチェック

春先にnano VNAを買い、エアバンド用アンテナをトライアンドエラー試作するのに使いました。

nobcha23.hatenablog.com

hrd-737.hateblo.jp


最近RFワールドNo52を入手、更にRFワールド掲載の記事に引用されていたQEXの記事「VNA VNWA3Eのやさしい使い方」も参照し、久しぶりにnano VNAの使い方について再勉強しました。


ジャンク箱探すと、あきばで買ったダミー類とか、自作チップ抵抗張り付けダミーなどがでてきました。さらにジャンクで買ったアッテネータもあるので、これらのS11特性を測ります。ダミーのコネクタはBNCが多いので、SMA/BNC変換アダプタも多種用意しました。手持ちのダミーロード類とBNC-SMA変換コネクタ類です。

 

f:id:nobcha23:20201129120458j:plain

実験につかったダミー類


ハンドリングしやすいように、測定端はnano VNA付属30cmSMAケーブルとし、キャリブレしました。また、実験結果を保存するため簡単な方のnanoVNAというPCソフト(いつも情報を参考にさせていただいているJH4VAJさんのブログ紹介)を使ううことにしました。

www.jh4vaj.com

 

まずはnano VNA付属ダミーを測りました。

f:id:nobcha23:20201129114459j:plain

nanoVNA付属ダミー


続いて、携帯電話基地局ジャンク部品の方向性結合器に付いていたアルミブロック封止のダミー。

f:id:nobcha23:20201129114548j:plain

携帯電話局ジャンクのついていた方向結合器付属のダミー

BNCメスコネクタに510Ωチップ抵抗を張り付け直流抵抗50オームに補正した自作ダミー。抵抗値補正のためにチップ抵抗を追加しましたが、ブリッジになっており、これがS11特性を悪くしている原因なのかもしれません。

f:id:nobcha23:20201129114734j:plain

チップ抵抗をBNCメスに張り付けダミー

BNCオスコネクタに510Ωチップ抵抗を張り付け直流抵抗50オームに補正した自作ダミー。チップ抵抗を同軸心線とアース側で10個、更に抵抗値補正で510Ω2枚直列を並列にしました。こちらの方が特性まし。

f:id:nobcha23:20201129114823j:plain

BNCオスにチップ抵抗張り付けダミー

 

アキバジャンクショップで買ったヒロセのHF帯域のダミー。中を開けていませんが抵抗は炭素被膜抵抗と思われ、VHF以上には使えませんね。

f:id:nobcha23:20201129114913j:plain

ヒロセのHF用ダミー


更にマイクロ波まで使えるというヒロセのアッテネーターAT-120+nano VNA付属ダミー。

f:id:nobcha23:20201129114949j:plain

マイクロ波用20dBATTにnanoVNA付属ダミー直結


計った中ではnano VNA付属ダミーが一番。またプロ用測定治具のダミーやATTではS11反射は大体ー40dBぐらいです。20年ぐらい前に試作した自作ダミーはSWR計を目安に作っていたので、一桁レベルがだめですね。

 

次はnano VNAで観測しながらチップ抵抗を使い、プロ製品に負けない反射特性のダミーを試作してみたいと思っています。

 

nano VNAの情報(RFWorld No.52)

昔の職場関係のFACEBOOK情報を見ていたら、nano VNAを買ったという書き込みがありました。負けないように使いこなさないといけません。nano VNAと一緒に詳しい説明が掲載された雑誌も買ったということで、それがRF World No.52 11月号でした。この間からnano VNAのアプリマニュアルで使いこなせていなかったので、遅まきながらRF World No.52 11月号を買いにグランフロント紀伊国屋さんまで自転車で行きました。


ところが、残念売り切れ。ググったらLUKUA蔦屋が近いので、行ったら、ありましたね。

 

現在エアバンドレシーバーのプリアンプを作ってるんですが、フロントエンドに入れた極小寸法フィルタの調整作業の参考にしたいと思います。

 

 

f:id:nobcha23:20201113220926j:plain

RF World#52

 

Arduino+Si5351aで実験用周波数源を作ります I assembles local oscilator source by using Arduino and Si5351a break out PCb.

中華製エアバンドレシーバーキットの製作と改造を進めています。安定化のためデジタル局発を追加、更に中間周波数フィルタを狭帯域Xtalフィルタに替え、飛行機と管制官の無線通信が安定して、待ち受けモニターできるようになりました。期待通りの出来上がりです。このキットの製作やデジタル化局発は色々な方のブログなどを参考に作りました。みなさんから情報をいただいたことに感謝いたします。

 I had completed digital local oscillator made by Si5351a with Arduino control. This one brings very stable operation on airband receiver to monitor nearest airport.

 

さて、この発振器を実験用周波数源として利用、いろいろな実験をしてみたいと思います。ところが、一号機はArduino UNO互換基板(LCD IF付き)を使い、更に受信機セットに組み込んでしまいました。狭いところでPCとつながないといけないので、ソフト改造デバッグ実験をやるのが大変です。また一号機で使ったArduino UNO互換基板はProfillic贋物USBシリアルを使っているようなので、WIN10最新ドライバ自動ダウンロードに引っ掛かると古いドライバへ入れ替えが必要となり、動かすまでが大変です。

 I would like to divert this LO to the other purpose by remodeling so I assembled again same one by using popular Arduino parts.

 

そこで、この際別に実験用のセットをまとめることにしました。実験用セット構成ですが、Arduino UNOを使います。そしてUNOの上にROBOTのLCD&KEYシールドをかぶせ、キーとLCDを準備します。キー種類判定はA0電圧判定。A1(D15)、A2(D16)はロータリーエンコーダーに接続、A3は受信機からのAGC電圧接続、A4,A5ポートはi2cのSDA,SCLとして使い、AdafruitsのSi5351aブレイクアウトボードにつなぎます。

 If you trace my trial, you shall prepare Arduino UNO, Adafruits Si5351a break out PCB, D1 Robot LCD&KEY shield Rotary encoder, and AC adapter. Please refer the block diagam below in details.

 

f:id:nobcha23:20201027205911j:plain

UNO+Si5351a+RE+

先に紹介した組み込み受信機局発のスケッチをLCDポート変更し動きました。局発信号出力を取り出し、周波数カウンタでモニターしている実験しているところです。配線が空中なので、ケースに入れることを考えてみます。

また、A3(AGC)端子がオープンなので、ノイズ拾ってSいっぱい振っています。 As A3 terminal is open, it is effected by noize from outside and S-meter is full.

f:id:nobcha23:20201027210038j:plain

IF設定なので、10.7MHzシフトしているのを周波数カウンタで確認

回路構成は次になります。 The block diagram of circuit is below.

f:id:nobcha23:20201028165148j:plain

Block diagram


 

また、スケッチは次です。
And please refer Arduino sketch.

 

 

---------------------------追記 2023.08.23―---------

Arduino制御でSi5351aモジュールを使い、OLED表示の高周波信号発生器が派生的にできました。ロータリーエンコーダーとスイッチが付いて、表示は1602でも可能になってます。スケッチはCesarSoundさんのものを流用改造しました。

nobcha23.hatenablog.com

nobcha23.hatenablog.com

OLED表示コンパクト基板