nobcha23の日記

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

小さなグラフィック液晶をキャラクタ液晶代わりに使ってみる

中国製エアバンドレシーバーキット改造で、デジタル局発にし、中国オリジナルのケースに局発・表示まで入れようと思ったら、1602液晶では大きくて入りきりません。

I have been trying to remodel the Chinese airband receiver kit to combine the digital loacal oscillator. To install those into the original alumnum case we shall stop to use 1602LCD.


替りに秋月電商が扱うi2c液晶はどうかと思ったが、i2c接続でAdafruits互換の128x32ドットのグラフィック液晶がかなりコンパクトです。Arduinoの世界ではU8g2ライブラリーがあり、メモリーは食うが簡単に使えそうです。これを使うアイデアが浮かびましたので、さっそく実験にかかりました。

8ドットフォントを使うと16字x3行表示できます。実験はPro MINIで行いました。

I found the tiny OLCD LCD of  Adafruits graphic i2c one. When I adopt the 8 by 8 font, it can display 16 columns and 3 lines.

f:id:nobcha23:20210517175924j:plain

Pro mini でSSD1306 128x32グラフィック液晶にテキスト表示


試してみた3行表示スケッチです。 I wrote the tentative sketch to display 8 bits font.

ーーーーーーーーーーーーーーーーーーーーーーーーー
// "Freq. 118.100MHz"‥‥を試しにSSD1306へ表示するスケッチ
//
//

#include <U8g2lib.h>


U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup(void) {
u8g2.begin();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_8x13_tf);
u8g2.drawStr(0, 9, "Freq. 118.100MHz");
u8g2.drawStr(0, 20, "Auto00 STP100kHz");
u8g2.drawStr(0, 32, "S########### ");
u8g2.sendBuffer();
}

void loop(void) {
}

ーーーーーーーーーーーーーーーーーーーーーーーーー

ところが、このスケッチを局発に適用してみると、LCDバッファへの書き込みが追加上書き(グラフィックなどの上にフォントを重ね書きする)なので、重ね書きになり書き換えがうまくいきません。

However this controle was bit overwriting and I should change for the other font controle as below.


そこで次のブログを参考にさせてもらい、問題点解決しました。

ラジオペンチさん「u8g2 のフォントの使い方を理解する」
       

すなわち、透過型フォントではなく、不透過型フォントセットを選べばよいとのこと。ところが、不透過型フォントセットでは文字がそろっているものがあまりなく、ちょっと小さめのフォントを選ぶことになりました。色々試行錯誤しましたが、次のフォントを使います。

u8g2.setFont(u8g2_font_t0_11_mf);

f:id:nobcha23:20210517180144j:plain

局発表示を入れ替え



次はケースにどう入れるかですね。

To step next is to plan to install it into the case.

f:id:nobcha23:20210517180349j:plain

中国製専用ケースに入りそうな寸法です

 


また、中国オリジナルのケースに局発を入れるにはもう一つ課題があります。操作スイッチ集約です。こちらについてはプッシュスイッチ付きのロータリーエンコーダーを使う新操作をこれから検討します。

If I install those into the original case, I should decrease the number of switches. To use the rotary encoder with push switch is one thing.

nobcha23.hatenadiary.com

 

Arduino+LCDでAD8307電力測定表示


AD8307を使った電力測定LOGアンプ中国製基板を以前買いました。

nobcha23.hatenablog.com

 

テスターで電圧を計り、グラフ参照し換算する代わりアルディーノで計算やらせることにします。

まずはWEBで情報集めると、電圧dB換算係数とスライス値をスケッチにされているページがありましたので、ありがたく引用させてもらいます。
(TNX! 氾濫原)

 

今までArduinoはUNOを使ってましたが、今回Pro Miniにしました。表示はPCF8574基板利用の2c LCDです。デバッグ接続USB UARTはFTDIにしました。

ここに並べた基板をケーブルでつなぎます。

f:id:nobcha23:20210424160452j:plain

 

 

次に測定に入ります。AD8307の無入力オフセット電圧が150mVぐらいあります。

ADC値30以下は注意喚起することにしました。

次にRF特性をnano VNAで見てみます。

f:id:nobcha23:20210424160553j:plain

Nano VNAでAd9307入力端をみてみる

 

S11が円弧描いてます。そこで中華製基板の終端抵抗を良く見てみると101となってます。
ECページの写真でも101でした。メーカー推奨回路図では52.3Ωだったはず。


パラに110Ω付けないといけませんね。とりあえず使うのにATTを入れてこの問題を避けることにしました。

 

10dBのPAD入れると全く問題なくなりますが、低いレベル測定したいので、6dBPADを入れて使うことにしました。

f:id:nobcha23:20210424160709j:plain

 

 

ケースに入れて、ちょっと使ってみて改良を考えます。

ーーーーーーーーーーーーーースケッチ 参考に ーーーーーーーーーーーーーー
// AD8307 RF Power Meter V1.0 by nobcha © 04/23/2021
// i2c LCD Pro mini @ nano (old boot)
// Thanks JH1UMV of Hanrangen
// https://lowreal.net/2016/03/14/1
//
#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

static const float SLOPE = 26.367;
static const float INTERCEPT = -63.51879243;

LiquidCrystal_I2C lcd(0x27, 16, 2);

String formatWatts(const float watts) {
if (watts < 1e-3) {
return String(watts * 1e6) + "uW";
} else
if (watts < 1e-1) {
return String(watts * 1e3) + "mW";
} else {
return String(watts) + "W ";
}
}

void setup() {
Serial.begin(9600);
Serial.print("AD8307 RF Power Meter V1.0 ");
Wire.begin();

pinMode(13, OUTPUT); // LED pointing

lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("AD8307 RF Power");
lcd.setCursor(0, 1);
lcd.print("Meter V1.0");
delay(1000);
}

boolean k = 0;

void loop() {
k = !k;
digitalWrite(13, k); // LED on/off

uint16_t adc_raw = analogRead(0); // Get AD8307 output voltage via ADC
Serial.print("ADC value = "); Serial.println(adc_raw);
float adc = static_cast<float>(adc_raw) / 1024 * 5; // Operating on 5V

Serial.print("ADC Voltage = "); Serial.println(adc * 1000);

float dBm = (adc * 1000 / SLOPE) + INTERCEPT; // from voltage to dBm
Serial.print("dBm = "); Serial.println(round(dBm));

float watts = pow(10, dBm / 10) / 1000; // from dBm to wattage
Serial.print("mW = "); Serial.println(watts * 1000);

lcd.setCursor(0, 1);
if (adc_raw <30 ) lcd.print("Under "); //
lcd.print(round(dBm));
lcd.print("dBm");


lcd.print(" ");

lcd.setCursor(0, 0);
lcd.print(formatWatts(watts));
lcd.print(" @10MHz ");

delay(1000);
}

 

 

航空無線受信機キット エアバンドラジオ受信機キット DIYキット 高感度 118-136MHz AM PCB 快適性

 

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

 

 

A HAPPY NEW YEAR

あけましておめでとうございます。

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

 

f:id:nobcha23:20210102163212j:plain

A HAPPY NEW YEAR

 

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受信機基板セットを買って、クリスタルコンバーターを作り、エアバンド受信セットをまとめています。

 

------------------------更に追記@2024.0616---------------

Si4732をArduinoで制御するエアバンド受信機を設計、試作できました。

ここまで来るのに3年以上かかりました。

www.youtube.com

www.youtube.com

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で観測しながらチップ抵抗を使い、プロ製品に負けない反射特性のダミーを試作してみたいと思っています。