jl7gmnのblog

yahooブログから移行してきました。アマチュア無線を中心としたブログです。

ESP32 DevKitC

FT-2000DをICOMチューナーに繋ぐ自動制御-続き-その9

先延ばしにした、ESP32DevKitCとOP Ampを使ったD/A出力のICOM BAND 設定電圧理論値との差分を測定したので、一覧表を表示します。

ICOM-BAND-VOLTAGE-DAOUT

使用したデジタルマルチメータは横河の7555で電圧ヌル調整後測定してます。

7555
14MHzのD/A出力LPF後の出力電圧です。時間経過で少数第4位の百μVの桁は少しパラつき表示してます。

結果から、BANDの中心理論電圧に対して±0.02V(±20mV)以内の出力となっています。最初に試した2022年11月23日の測定の誤差とほぼ同じ結果です。全周波数でのBAND電圧範囲区間に対して最大で±0.02Vです。誤差のないところもありますから十分実用的なD/Aでの発生電圧値です。誤差は気にしなくてもよいレベルかと思います。Hi!

他、ICOM IC-AT100のバンド比較の基準電圧は、8Vですが、今回の回路ではFT-2000DのBAND DATA端子の13Vから8Vの3端子電圧レギュレータで得ています。電圧値は7.8134V発生しています。前にも書きましたが、8Vの3端子レギュレータは規格範囲内(7.8V~8.3V)にある出力電圧値なので、物が悪いのでありません。きっかり8Vである必要はなく、8Vに近い安定した電圧であれば問題ないようです。

つづく?

FT-2000DをICOMチューナーに繋ぐ自動制御-続き-その8

制御回路のバンド毎のICOM器での設定電圧に対するD/A変換での設定電圧との差分をまとめる予定でしたが、昨日8Pのプラグが届いたので、FT-2000DとESP32DevKITCとの接続ケーブルをまず完成させることにしました。実際にFT-2000DのBAND-DATAメスコネクタに挿してみたところ、入りません。調べてみたところ、どうもコネクタ自体がDINプラグではありますが、よく似ていますが、バランスよいDINプラグと異なる馬蹄形の並びの端子で、COMMODORE 64 VIDEO CABLE 8-POLE 262°DIN CONNECTOR -262°MAS 80S DIN CONNECTORというプラグがBAND-DATAメスコネクタに挿せるということがわかりました。eBAYで、販売されているようです。日本では、リニアアンプ用のCT-58-OBが販売されているようですが、AMAZONは売り切れでしたし、他も売り切れが結構ありました。無線のショップでは在庫はあるようです。作成したケーブルのプラグがさせない為、バンドに対する4ビットの出力対応を確認できない状態です。が、ここは、力ずくで8P-DINプラグ端子を馬蹄形に加工して挿して見ることにしました。ひとまず、FT-1000MPにも同じBAND-DATAの8P-メスコネクタがあるので、こちらで挿入できるか試しました。案外うまく加工できたようで、奥まで、きちっとは差し込みはできませんが、十分端子接続はできてるぐらいは入っています。ひとまずこの状態でBAND-DATA出力を確認してみました。

4ビットの各緑色のLEDは少しピンとがあっていませんが、無線機の周波数ボタンを押したときの4ビットのそれぞれの10進に対してのBCD点灯は確認できました。1.8/1.9MHzが0001,3.5MHzが0010、.....28/29MHzが1001といった具合にうまく表示していました。8P-DINオスコネクタ加工での接続自体はうまくいった様です。
バックで14MHzのDX局の音声が入っています。14MHzの朝方のコンディションは良いようです。


FT-1000MPでのBAND-DATA出力が確認できたので、次のステップとしてESP32DevKITCの回路にケーブルをつないでみました。
FT-2000Dでは50MHzがあるので、50MH時の4ビット出力が確認できました。ただしIC-AT100は対応していません。ほかの50MHzに対応しているアンテナチューナーであれば、50MHz への対応は可能です。


FT-2000DのバンドSWを1.8→3.5→7→10→14→18→21→24→28→50→1.8→3.5→7と押した動画です。
各BANDのボタンを押して、AUTO-TUNEされるまでは、若干時間がかかっています。
50MHzでは制御回路では1.6V(1.6233V)を出力しているので、制御自体はICOM器に対し、問題なく50MHz設定対応可能かと思います。また、前回のMC14028BのゲートICの2個使いにて、50MHzもバンド設定表示は問題なくできています。IC-AT100は残念ながら50MHzバンドは付いていません。(50MHzセット時では、10MHzと24/28MHz のLEDが点灯している状態です。)なので、後でスケッチで出力をオープン設定等にするなど工夫処理したいと思います。
あと、1.8/1.9MHzはチューナーでLEDは点灯し対応するコネクタにバンド出力はつながりますが、AUTO TUNE機能はありません。なので、AUTO-TUNEのLEDは消灯したままです。別に壊れているわけではないです。Hi!

ESP32DevKitCによるICOMチューナーの自動制御はまずまず動作確認でき第一歩、動き始めました。回路的な面でも、スケッチの面でも改良の余地が、まだまだたくさんあります。まずは、実機での基本動作確認ができましたので、ほっとしたところです。今回の8P-DINプラグには少し焦りましたが、何とか強引な加工にて、使用可能になりました。これも少しほっとしています。が、リニア用のCT-58-OBインターフェースケーブルもいずれは購入が必要と思っています。
今回ケーブル作成での動作確認を先に行ったので、次回は、基本ICOMの各BANDの理論電圧に対しての、ESP32DevKitCからD/A変換で出力した設定電圧との比較、また差分等をまとめようと思います。低い分解能の割には、案外理論値に近い電圧値の設定ができている感じです。

つづく?

FT-2000DをICOMチューナーに繋ぐ自動制御-続き-その7


以前ブログで取り上げた、FT-2000Dのバンドデータを使ったICOMアンテナチューナーIC-AT100(500)の自動バンド切り替え回路の表示に関して、ゲートIC MC14028Bでのバンド表示の改良をおこないました。
FT2000DをICOMチューナーに繋ぐ自動制御-その1

回路自体は前のもので、単に4ビットの出力値に合わせて、バンドの表示LEDをそれぞれつけるだけのオプション回路の改良です。前回は同ゲートIC、1個使いで50MHzが対応していませんでした。

データシートの使用する入力と出力の論理値表です。
入力は4ビットのA,B,C,D(16進)です。一応0000から1111がありますが、使うのは10進で1から10までになります。ただし確認用SWでは0から9までしか設定できません。実際のFT-2000Dの10のデータ出力では50MHz のLEDが点灯します。(頭の中では点灯するはずになっています。Hi)実際に確認が必要!
一応0のときもLEDはつきますが、実際のFT-2000Dのバンド出力値は0001からです。

10進:4ビットデータ:IC-AT100バンド表示:対応する周波数 の順の対応です。

0:0000:なし(全4ビットオープン時は10MHzになります。)
1:0001:    1.8:(1.8MHz/1.9MHz)
2:0010:    3.5:(3.5MHz/3.8MHz)
3:0011:       7:(7MHz)
4:0100:     10:(10MHz)
5:0101:     14:(14MHz)
6:0110:18-21:(18MHz)
7:0111:18-21:(21MHz)
8:1000:24-28:(24MHz)
9:1001:24-28:(28MHz)
10:1010:なし:(50MHz)
11:1011:未使用
12:1100:未使用
13:1101:未使用
14:1110:未使用
15:1111:未使用

MC14028B理論値と回路

バンドの1.8/1.9MHz,3.5/3.8MHz,7MHz,10MHz,14MHz,18MHz,21MHz,24MHz,28MHz,50MHzのバンドデータ(4ビット)に合わせてLEDが1対1で対応して光るだけの回路です。すべてゲートICが自動でFT-2000Dのバンドデータで対応するバンドの10進の出力に接続されたLEDを点灯するという回路です。

メイン回路:前と変わりありません。オペアンプの入力にESP32のD/Aのアナログ電圧出力がつながります。
4ビットでの電圧自動発生回路

MC14028Bの2個使いでの10進表示回路(FT-2000DのBANDデータ4ビットがGATE入力端子につながるだけです。)
MC14028B

MC14028Bの10進出力につながるバンド表示用LEDです。赤色が左から10進0,次が1,2,3,4,5,6,7,8,9、黄色が10進の10です。透明のLEDは11,12,13です。14,15はLEDがなくて繋いでません。透明からの10進出力は対応する入力データがないので必要ないのですが、つけてあります。
14028Bの10進出力LED
バンドデータがつながっていないときに一番左の赤LEDが点灯します。
バンドコネクタ接続の確認用LEDとでもいいましょうか?そういった点では役に立つLEDとして利用できます。Hi!
赤色LEDの左から2番目がバンドのはじまり1.8/1.9MHzです。次3.5MHz.......以降省略!

FT-2000DのBAND DATAにつながる端子です。実際はこれに8Pの雄-雄DINケーブルにてFT-2000Dとつないで使用します。回路的には5V-3.3V(ESP32DEVKITCの入力が3.3Vまでのため直接は繋げません。)電圧変換が必要です。専用の電圧変換ICもありますが、一番簡単な抵抗2本での分圧回路を4端子分入れて電圧を3V台まで下げるようにしてあります。
バンドデータFT-2000接続用

このコネクタは中心の位置が異なるDIN8Pメス、雄が余っていたので、使いました。雄の8PDINコネクタは注意しないと無線機のバンドデータメスコネクタにさせませんから購入時には注意が必要です。無線機側では使用できませんが、今回の様にESP32の回路側では使用はできます。コネクタにどちらが無線機側かを表示し間違えないようにする工夫は必要となります。Hi!
接続用コネクターケーブル (2)

FT-2000D側の8P-DIN雄コネクタがこないので接続用ケーブルはまだ完成していません。
接続用コネクターケーブル (1)

注文したFT-2000DのBAND DATAに繋ぐDIN-8P雄コネクタとメスコネクタは貿易入国時のトラブルでまだ届いてません。接続用コネクタに使用した線はロータリーエンコーダーのケーブルが長かったので少し拝借し利用しています。

今までは、IC-AT100のバンドSWを手動でバンド切り替えに合わせて、都度切り替えSW操作をしていましたが、完成時は、AUTOのSW位置にしておくだけでFT-2000Dのバンドを変えるのに合わせて自動でアンテナチューナーが切り替わってくれるようになります。早く楽ちんレベルにて運用したいものです。
なお、このESP32を使った回路はICOMのトランシーバーには十分対応できる出力電圧値を設定できます。ほかにもLED用のICを使った電圧出力設定する回路もあるようです。私はどちらかというと、自由に電圧値をスケッチにて設定できるESP32の方が楽しいし、いろんな工夫やアイデア、またオリジナリティもだせるので、良いと思います。あとで再度、ICOM用のバンド電圧の設定理論値に対するESP32から出力する電圧との差についても、記したいと思います。また、使用する電源に関しても重要なことがありましたので、あわせて記録を残したいと思います。

今日現在、FT-2000でのバンドデータコネクタに挿す、8P-DIN雄コネクタが届くのを首をながくして、待っている状態です。

つづく?

ESP32DevKitCでのカラーグラフィックSメータその6

Sメータの画像表示で使用したLovyanGFXライブラリでの画像データを直接TFT液晶に書き込み表示するやり方とスプライト画面に書き込んでから表示する方法をまとめてみました。

■オフラインスプライトcanvasに書き込む方法

//#define LGFX_AUTODETECT //no need this one
#include <LovyanGFX.hpp>
#include "LGFX_ESP32_ST7735S.hpp" // add needing
#include "smeter.h"
#include "needle.h"

static LGFX lcd;
static LGFX_Sprite canvas(&lcd); // off screen draw buffer
static LGFX_Sprite smeter(&canvas);// myBitmap (128x160)
static LGFX_Sprite needle(&canvas);// hari     (5x100)

const uint16_t imgWidth = 128;
const uint16_t imgHeight = 160;

uint16_t signalLevel;  //角度に変換するのA/D値(0から4095)
uint16_t avtimes = 16 ;   //16 analoginput avaraging times

#define SW_TX  32                // A/D port 32   original sketch D0

void setup() {
  pinMode(SW_TX,INPUT);          

  lcd.init();
  lcd.setColorDepth(16);
  lcd.setSwapBytes(true);

  smeter.setColorDepth(16);
  needle.setColorDepth(16);

  canvas.fillScreen(TFT_WHITE); 
  canvas.setPivot(lcd.width() >>1,lcd.height() >>1);
  canvas.setColorDepth(16);
  canvas.setSwapBytes(true);
  canvas.setRotation(1);
  canvas.setBuffer((void*)myBitmap,128,160,16);
  canvas.createSprite(lcd.width(),lcd.height());
  canvas.pushImage(0,0,128,168,myBitmap);
  canvas.pushSprite(0,0);

  needle.createSprite(5,100);
  needle.setPivot((imgWidth/2),(imgHeight/3));
  needle.setBuffer((void*)hari,5,100,16);
  
}
void loop() {
 
    long d = 0 ;
  //*********************************************************
  // averaging settingtimes avtimes now setting 16
    for(int i=0;i<avtimes;i++){
      d += analogRead(32);
    }
    signalLevel = d/avtimes;

   Serial.println(signalLevel);
   //********************************************************

   //********************************************************
   // mapping to degree value
    signalLevel = map(signalLevel, 0, 4095, -64 , 80);
   //********************************************************
    
   //****************************************************************************************
 //エイリアス処理なし
   //needle.pushRotateZoom(&lcd,(imgWidth/1.55),(imgHeight/1),signalLevel,1.0,2.8);
   //エイリアス処理あり
    needle.pushRotateZoomWithAA(&lcd,(imgWidth/1.55),(imgHeight/1),signalLevel,1.0,2.8);
   // needleスプライト表示 
    needle.pushSprite(imgWidth/1.55,imgHeight/1); 
   //****************************************************************************************
    delay(200); //needle 表示時間調整用
   //スプライト書き込みしたcanvasを表示
   canvas.pushSprite(0,0);
   delay(1);

}

■直接lcdに画像データを書き込む方法
//#define LGFX_AUTODETECT //no need this one
#include <LovyanGFX.hpp>
#include "LGFX_ESP32_ST7735S.hpp" // add needing
#include "smeter.h"
#include "needle.h"

static LGFX lcd;
static LGFX_Sprite smeter(&lcd);// myBitmap (113x160) (128x160)
static LGFX_Sprite needle(&lcd);// hari     (5x100)

const uint16_t imgWidth = 128;
const uint16_t imgHeight = 160;

uint16_t signalLevel;  //角度に変換するのA/D値(0から4095)
uint16_t avtimes = 16 ;   //16 analoginput avaraging times

#define SW_TX  32                // A/D port 32   original sketch D0

void setup() {
  pinMode(SW_TX,INPUT);          

  lcd.init();
  lcd.setColorDepth(16);
  lcd.setSwapBytes(true);

  smeter.setColorDepth(16);
  needle.setColorDepth(16);
   
  lcd.setRotation(1); //角度設定1
  lcd.pushImage(0,0,128,160,myBitmap); //指針表示
  lcd.setRotation(0);   //角度設定0に戻す 指針の位置設定に合わせる
  lcd.pushImage((imgWidth/1.6),(imgHeight/7),5,100,hari);
   
  needle.createSprite(5,100);
  needle.setPivot((imgWidth/2),(imgHeight/3));
  needle.setBuffer((void*)hari,5,100,16);
  
}
void loop() {

    long d = 0 ;
  //**************************************************
  // averaging 100times
    for(int i=0;i<avtimes;i++){
      d += analogRead(32);
    }
    signalLevel = d/avtimes;
  Serial.println(signalLevel);
  
  //*********************************************************
  // mapping to degree value
    signalLevel = map(signalLevel, 0, 4095, -64 , 80);
  //*********************************************************
 
  //******************************************************************************************************
  //エイリアス処理なし
  //needle.pushRotateZoom(&lcd,(imgWidth/1.55),(imgHeight/1),signalLevel,1.0,2.8);
  //エイリアス処理あり
    needle.pushRotateZoomWithAA(&lcd,(imgWidth/1.55),(imgHeight/1),signalLevel,1.0,2.8);
    
    needle.pushSprite(imgWidth/1.55,imgHeight/1); //指針スプライト表示
  //******************************************************************************************************
    delay(200);//needle 表示時間調整用

    lcd.setRotation(1); //角度設定1
    lcd.pushImage(0,0,128,160,myBitmap); // Sメータ画像表示
    lcd.setRotation(0); //角度設定0に戻す。指針の位置表示に合わせる

   delay(1);
}

直接lcdに書き込む方法とオフラインバッファ画面に書き込んでから表示するのと同じ動作ですが、指針表示時間調整のディレータイムの値設定にもよると思いますが、若干ですが、lcd直接書き込みのほうがチラつきが少ないように思えます。これは、実際に動作させてみて、良いほうを使うのが常道のようです。必ずしも、オフラインで画像書き込みしたのを表示するスプライト処理がチラつきがないとは言えないこともあるようです。(書き込みの画像データ量も関係あるかと思います。)

いずれにしても、スプライト処理は画像のみならず、文字でも同様に処理できますので、覚えておいてよい表示方法かと思います。

つづく?

ESP32DevKitCでのカラーグラフィックSメータその5

気が向いたので、Sメータのパネルを最初から作り直してみました。
画像編集用のアプリは例のごとく、Inkscape とWindows10のペイントアプリ、そして、画像変換アプリの LCD-Image-Converterです。

Inkscapeはレイヤー処理で重ねる順番も自由に設定できるので、パネルの赤塗処理はとても簡単にきれいに作成できます。他、文字はコピーで、単に文字を書き換えて作成が簡単です。前のSメータパネルで一番気になっていたのは文字盤の目盛りと針の重なった時の一致していないことでした。今回はほぼ指針と重なるようにできましたので、すっきりしました。

■Inkscapeで作成したSメータパネル
できるだけ大きなページサイズで作成しておきます。サイズ変更はペイントアプリが便利です。
幅:1000px 、 高さ:680px
エクスポートで名前を適当に決めて、jpegで保存します。

inkscape-smeter


■ペイントアプリで編集します。
最初にサイズを目的の128x160pcになるように横の160pcは固定で縦の128pcになるように下側のページ位置を下げたり上げたりして変換値を確認し丁度128x160のサイズになったら変換します。
ESPのスケッチでは画像を左に90度回転しての取り込み仕様なので、ペイントで左回転90度で下記の画像にしてjpegで保管です。


paint-smeter-size-rotate

■ESP32DevKitC用の取り込みデータ用に変換するLCD-Image-Conveterで変換します。

LCD-image-converter-main

OptionでPreviewしデータを確認します。右側のデータをすべてを選択し、コピーしてESP32DevKitCのSメータスケッチのSメータ用データ取り込みファイルにコピー貼り付けします。
LCD-image-converter

■ESP32DevKitCのSメータスケッチをコンパイルしてTFT液晶に表示されることを確認します。出来上がったのが下記の画像です。
Homebrew1

Homebrew2


前のSメータパネルより、インジケータ指針とSメータパネルの目盛りのバランスはよくなったと思います。目盛りとインジケータ指針の重なりもうまく一致してバランスの悪かった違和感がなくなり見やすくなったと思います。粗削りの要素多く、まだいろいろと問題があるかと思いますが、最初から作成したのは今回が初めてなので、次の作成時はもっと、よくできるかと! ただ、デザインやスケッチのセンスが、かなり影響がでるので、私の場合は、もしかしたらこの程度が限界かもしれません。Hi !


ついでに動画も取りました。カメラを手で持ってるので、フォーカスとブレがありますが、まずまず動作は確認できると思います。



既存の画像を利用してうまく加工できればいいのですが、やはり、納得のいくものは、自分で作成するのが一番です。
LovyanGFXライブラリではSPIライブラリ(従来のスプライト処理)を継承し、たくさんのコマンドが用意されています。その中のコマンドでで指針の元画像を拡大、伸長できる調整パラメータがあるので、あとからでも指針のバランス調整が自由にできます。

通常表示
needle.pushRotateZoom(&lcd,(imgWidth/1.55),(imgHeight/1),signalLevel,2.3,2.8);
OR
アンチエイリアス付き回転と拡大縮小
needle.pushRotateZoomWithAA(&lcd,(imgWidth/1.55),(imgHeight/1),signalLevel,2.3,2.8);

目盛り版としての画像データは作り直しでないとできませんが!
LCD-image-Converterは各種のTFT液晶のサイズも対応しているので、もう一回りサイズの大きなTFT液晶を用意すれば、既存の受信機のSメータをデジタル式に入れ替えできますね。指針のカラーや、目盛り装飾などアイデア次第で、自由に目盛り版も作成できるので、楽しく自作できるデジタル式Sメータとしてアマチュア無線家の醍醐味の一つにもなると思います。Hi !

つづく?
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード
アーカイブ
  • ライブドアブログ