jl7gmnのblog

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

Arduino

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

カラーSメータの動作をファンクションSGを使い疑似シミュレーションしてみました。サイン波と波形整形した信号を2つ用意して、実際の信号の代わりにESP32のA/D入力ポートに入れての動作確認です。

【サイン波】一定のスピードで上がり下がりするSメータの画像動作確認です。


【サイン波整形信号】サイン波でのアタックリリースを調整して、口笛を吹いた時のようなSSB信号の動作のような信号になっていると思います。動画は少しマクロ設定での焦点調整が入り少しピンボケもありますが、指針動作時の画像のチラつきもないことが確認できました。


つづく?

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

これまた、ふと以前のArduinoNANOでのモノクロSメータを思い出し、カラーbmpファイルよりデータ変換PCデータ化した(.hファイル)データでのSメータに挑戦してみたくなりました。ちょうどよく、同じようなESP8266のモノクロSメータ付きのVFOのスケッチを作成していたJA2GQP OMのブログページよりダウンロードして、スケッチ上のSメータ部分のスケッチのカラーSメータ化を試みることにしました。
JA2GQP OMのESP8266のスケッチはTFTが一回り大きなサイズのものを使用しているので、私の手持ちのカラーTFT 128X160でやってみることにします。また、TFT接続は私のいつものお決まりポートにてESP32DevKitCに配線します。これは間違いなくTFTの表示実績のある端子としていつも使用しているものです。OMのブログにある通り、画像データをスケッチ上で使用するデータへの変換用のツールとして紹介されているカラー画像用の lcd-image-conveterを使用します。ただ、このアプリでのカラーでの使用例が最初Web上でみつけれなくて、設定が正しいのかわからず、しばらく一つずつ条件設定をしてはのカットアンドトライがつづくような暗中模索状態でした。そんな中、あきらめずWeb上でカラーイメージの設定例を見つけることができました。

Converting Images to Flash Memory Icons/Images for TFT(without SD Card)

サンプルスケッチコードもリンクが張られているので、Web通りの設定をすることで、まったく同じように再現できました。この設定情報をもとに自分のSメータ画像bmpファイルを先のツールにて変換しました。
私の手持ちのTFT1.8inch(128x160)では変換画像サイズとしては Size ;113 x 160 のサイズがちょうどよく画面いっぱいに表示できました。このページにもありますが、ST7735のTFTでは16 bit colors:R5G6B5のカラーフォーマットで選択設定する必要があると書いてありますので、その通りに設定して変換しました。設置の画像もあるので同じようにimageから画像をツールにインポートして設定しConversion OKとして、元のツール画面に戻り、FileメニューのなかのConvert(Ctrl+P)を押してcファイルとして保存されます。この保存されたファイルの拡張子を".h"に書き換えて使用します。
なお、カラーSメータの画像はJA2GQP OM公開スケッチ上にあったものを利用させていただきました。
サイズをペイントアプリで簡単に変更できます。私の場合はWebと同じような縦長の画像で準備しました。

オリジナルSメータBMP画像
(JA2GQP OMのESP8266VFOダウンロードファイルの画像です。)

signal.bmp_Image

私の113X160のサイズに加工したBMP画像

smeter
画像をlcd-image-Converterに取り込み、Optionで条件を設定しOKボタンで戻り
下記のConvertをクリックしてデータ変換完了です。Convert AllでもOKです。
lcd-image-converter

”.C”拡張子のファイルとして保管されるので、”.h”に拡張子を変えます。

ファイルの中身全体です。かなり大きいので最初のヘッダー部文字が見えないです。Hi!
hファイル全体

【細部説明】
ヘッダー部です。
このヘッダー部の下方に変換されたデータがあります。

hファイルヘッダー部



黒色主のデータの色加工の段階表示ブロック表示部(データではないです。)コメント的表示です。
カラーブロック表示

一番下のグレーの部分がデータになります。上のブロックデータのあとのデータです
変換された画像データ

変換データの最後は ”};” です。 ほかは不要なので ”//” でコメント化してます。
データエンド

このhファイルで、Sメータのスケッチ部でインクルードファイルとして取り込んでゆきます。もちろんデータとしてスケッチ上に記載しても問題ありません。データ領域が広いので、読み込みするほうがスケッチがすっきりします。

Sメータ部の主なスケッチ箇所です。他は使いません。
Sメータ画像変換データを読み込みするのは #include "smeter.h"です。

#include <SPI.h>
#include <TFT_eSPI.h>
#include "smeter.h"
TFT_eSPI tft = TFT_eSPI();


void setup(){
 
 tft.init(INITR_GREENTAB);
 tft.setRotation(0);
  tft.setTextWrap(true);
 tft.fillScreen(TFT_WHITE);


}

メインループスケッチ部です。ここではReceive ルーチン、Transmitルーチンは /*  */で
くくり使用しない設定にします。くくらないとこのルーチン内で止まりTFT表示動作のループ表示ができません。


void loop(){
long d = 0 ;
d=analogRead(32);
signalLevel = d;
//meter_disp(analogRead(32));                 // s-meter,Power meter      
meter_disp(signalLevel);                 // s-meter,Power meter      
.
.
}


要のSメータ部です。mapコマンド はOMのスケッチではレム化されて未使用でしたが、私は使用ししました。

//----------- s-meter --------------------------------------------------
void meter_disp(uint16_t signalLevel){
 static int a1b,a2b = 0;
  const int hMeter = 128;                                   // horizontal center
  const int vMeter = 80;                                   // vertical center
  const int rMeter = 115;                                   // needle length
signalLevel = map(signalLevel, 0, 4095, -90 , -30);
  float smeterValue = (signalLevel);
 // smeterValue = smeterValue - 34;                           // shifts needle to zero position
  int a1 = (hMeter + (sin(smeterValue / 35.0) * rMeter));   // meter needle horizontal coordinate
int a2 = (vMeter - (cos(smeterValue / 35.0) * rMeter));   // meter needle vertical coordinate
  if((a1 != a1b) || (a2 != a2b)){
    tft.drawLine(a1b, a2b, hMeter, vMeter, TFT_WHITE);          // clear needle
    tft.pushImage(5,2,113,160,myBitmap);
    a1b = a1;
    a2b = a2;
    tft.drawLine(a1, a2, hMeter, vMeter, TFT_RED);            // draws needle
    delay(1);
  }
}


このESP32DevKitC用に書き換えたスケッチでSメータのTFT表示ができました。
下の写真は指針が見えていませんが、描画のタイミングとカメラのシャッタータイミングのずれで写っていないのと、A/D変換後のデータが動いているための2つの条件が重なり、映らない状態かと。
ただ、なんとなくうっすらと指針の影が見えてます。


CIMG0193


タイミングよく指針が映った写真です。
CIMG0191

指針の表示がチラつく状態なので、A/D変換でのデータの変換後の出力値のばらつき状態をアベレージングして安定化させることで、指針表示がちらつかなくなると思います。

さっそくスケッチ変更してみました。

アベレージング対応で変更追加する箇所です。アベレージング回数はavtimes の設定値を変えることで調整します。あまり大きくすると、リアルタイム性が欠けるので、実際のSメータ信号で調整するのがよいと思います。現在はちらつかない最低限の値にしています。

■定義部に追加
uint16_t
signalLevel;
uint16_t avtimes = 100 ;   // analoginput avaraging times

■void loop内の変更スケッチ箇所です
void loop(){

long d = 0 ;

for(int i=0;i<avtimes;i++){
  d += analogRead(32);
}
signalLevel = d/avtimes;
meter_disp(signalLevel);                 // s-meter,Power meter      

■上記のように平均化のスケッチを追加修正後、指針表示がとてもきれいなり、まったくチラつかなくなりました。写真撮影でも何ら問題なく指針が写るようになりました。

アベレージング

抵抗分圧でA/D入力ポートに信号をいれます。現在は0から1.5VのDC電圧でメータ範囲をカバーする設定にしました。

結構手間がかかりましたが、モノクロよりはカラーがいいですね。ひとまずちらつかないカラーSメータができました。

もっと別のグラフィカルなスプライト機能を駆使したSメータにも挑戦したいものです。

つづく?


DDS-VFOリニューアル情報その1

ふと、Sメータのデジタル化の情報をESP32のサンプルから試していて、スプライトのサンプルとかをyoutubeで勉強していました。ふとWeb情報からTwitterを覗いたところJF3HZB uebo氏がTFTの多品種対応書き直し版をしていることがわかり、GItHubより、さっそく試しに、ダウンロードしてみました。

tjlab-jf3hzb/Digital_VFO_with_analog_daial_V2

スケッチはVFOsys2_00.inoです。
新たなドライバーのダウンロードが必要でしたので、さっそくzip形式で1つダウンロードして自動組み込みしました。LovyanGFXライブラリです。GitHubからCodeでダウンロードです。ZIPファイルをライブラリマネージャーでインストールです。インストールライブラリをダウンロードしたので選択クリックで下記のインクルードファイルをスケッチに取り込みできます。
#include <LovyanGFX.hpp>

あと、動かすためというか、TFTへの表示を見たくて、取り急ぎ若干のスケッチへの定義追加と数か所の修正をして、TFT表示の確認まではできました。

そのまま何もしないで、ボードをつないでコンパイルすると、エラーがズラズラと出ます。
エラーメッセージを読んで、対応してゆくことになります。

■dial.hppの書き換え少々(各種TFT用のhppファイル)
私の手持ちのTFTはST7735ですのでこの情報に合わせてスケッチを修正です。
オリジナルは 
#include "prm\ST7735S_128x160.hpp"

このhppファイルは階層prmにありますが、VFOSYS2_00.inoと同じ階層に移動しました。
次に書き換えます。階層を別にしないほうが私の場合分かりやすいためです。元のままでも問題はないです。

#include "ST7735S_128x160.hpp"
しかし、このファイルでも下記のエラーを吐きました。
定義がないとのメッセージなので、内容をみて修正してゆきます。

VFOsys2_00\ST7735S_128x160.hpp:111:25: error: 'SPI_DMA_CH_AUTO' was not declared in this scope
cfg.dma_channel = SPI_DMA_CH_AUTO; // 使用するDMAチャンネルを設定 (0=DMA不使用 / 1=1ch / 2=ch / SPI_DMA_CH_AUTO=自動設定)        

このスコープで宣言がされてないとあるので、単に宣言します。内容から0,1,2の内から選ぶ設定のようですが、1と2は推奨しないとあるので必然的に0が設定する値となるので、次のように宣言しました。
#define SPI_DMA_CH_AUTO     0
この宣言を一上の 4行目に入れました。
これでこのエラーは回避できました。

■dial.cppの修正箇所について
ここでのコンパイルエラーは次のメッセージでした。
Compilation error: 'fmax' is not a member of 'std'

このfmax自体はstdのメンバー関数の定義がないとのことなので、ひとまずカーソルをfmaxにおき、右クリックで定義に移動をします。
するとstl_algobase.hのなかにメンバー定義の箇所がありました。
namespace  std  ‗GLIBCXX_VISIBILITY(default) のなかにメンバー関数が定義されているのですが、maxがそれらしきメンバーのようです。。ほかにはminなどもありました。
template<typename _Tp, typename _Compare>
    _GLIBCXX14_CONSTEXPR
    inline const _Tp&
    max(const _Tp& __a, const _Tp& __b, _Compare __comp)
    {
      //return __comp(__a, __b) ? __b : __a;
      if (__comp(__a, __b))
  return __b;
      return __a;
    }
ということでfmaxをmaxに修正します。
 //int yc = voff + top_margin + (std::fmax(radiusMain, radiusSub));
  int yc = voff + top_margin + (std::max(radiusMain, radiusSub));
数か所fmaxがあるので、全部maxに書き換えます。
上記書き換えでこの数か所エラーも全部回避できました。

ESP32DevKitCとTFT液晶の接続のみしてある状態でのコンパイルです。ほかの接続はまだしていませんが、表示がうまく出ました。

VFO (2)

以前のVFOsysです。TS820Sで組み込みで使わさせていただき、大変お世話になっています。
CIMG8627

初回は820VFOでのVFOsysの使用です。本体のTS820Sとは本体に組んだArduinoNanoよりのシリアル通信周波数情報をESP32で受けて周波数表示を変える仕様でした。ハムログでのシリアル通信での周波数読み取りもESP32では別のシリアル通信を使い行っていました。
CIMG8829

2回目はTS820S本体に組み込みで使用しました。ボタンSWでのRITも付けました。ハムログとの連携も行いました。去年の2月の頃には21MHzでのWとのQSOでも大活躍しました。
20220321_213548

と以前のVFOsysは大活躍しています。


VFO (1)


ロータリーエンコーダだけつないで確認しました。プルアップ2.2kでポート16,17接続で、センターアースにつないで、CW,CCW方向とも周波数表示が問題なく変化しました。DDS-ICはまだ接続してないので、今日はロータリーエンコーダでの周波数表示変化確認だけです。

今回のリニューアルでは周波数の表示がデジタルフォントのような感じですね。他にもルーチン的にバージョンアップしていると思われます。

GitHubにあるreadme.txtの内容です。

"VFOsys2" is the original version of a digital VFO with analog dial display by Tj Lab(JF3HZB),
which can be compiled on Arduino IDE with Board manager "esp32 ver. 2.0.9" and Library "LovyanGFX ver. 1.1.7".

Usable display panel:
 ST7735S (128 x 160,  80 x 160),
 ST7789 (135 x 240, 240 x 240, 240 x 320),
 ILI9341 (240 x 320),
 SSD1331 (64 x 96).

JF3HZB  T. Uebo
Tj Lab

https://tj-lab.org


以前のVFOsysではTS820で利用させていただきました。デジタルサブダイヤルに感激したことからの展開で、次々とスケッチも拡張し、全バンド対応化、ハムログでの周波数の読み取りもDualコア機能を駆使し、ダイヤルを回した時だけシリアル通信でできるようにしたりと、最近のトランシーバーのような使い方をアナログトランシーバー(TS820S)でも+アルファ的にバージョンアップさせることができました。オリジナルのuebo氏の公開スケッチのおかげです。今回は、新しいサイズの大きなTFTも対応しているとのことですので、ますます応用範囲がひろがりますね。素晴らしいDDS-VFOスケッチのリニューアル公開にとても感謝しております。
これから少しまたVFOsysにはまりそうです。古い受信機などがあるので、まずはアナログからデジタルへの展開のDDS-VFO化からやれたら楽しいかと思います。最近わたしのパソコンもある程度のスピードの速いものを購入してありましたので、ESPのスケッチを新しいPCでコンパイルするようにしています。スケッチコンパイルが前のVistaインストールのLinuxと比べると雲泥の差です。早すぎるぐらいです。ストレスがありません。最新のプラットフォームIDEにもしています。少し勝手が変わった感じですが、慣れると問題ありません。Uebo氏も古いボードマネージャーでは新しいものが対応していないということでの新しいボードマネージャーでのリニューアルでもあるようです。新しいものへ対応してゆくことへの準備も必要ですね。まずは情報提供まで!

つづく?



Candle for LINUXその48

TS820用のDDS−VFO(VFOsys改)に対しての本体側のバンド情報のシリアルデータ送出のArduinoNANOの回路をブレッドボードに新たに再現出来ました。これで、現状のTS820に組み込みしたArduinoNANOとTS820外部DDS-VFO(VFOsys)のメンテナンスも改良も検討できる状態となりました。新たなフィーチャーなどのスケッチをコーディングまたデバッグも出来る体制ということです。同じ動作をするものということで、実機で使いながら改善、改良、デバッグ等を行えます。

実は既に別の問題を見つけています。まだ、本体の旧VFOを使った時の追加したArduinoNANO回路のタイマーで発生するプチノイズも、対策案は出来ていますが、実機への組み込みも未だですが、新たな問題です。これは、単純に言ってスケッチ(プログラム)上の私のミスです。先ずは、その内容についてですが、これはDDS-VFO(VFOsys改)を使っていての問題です。実機でSSBの電波の状態を確認しようと思い、他の受信機でDDS-VFO(VFOsys改)の周波数をモニターした時の事です。残念ながらSSBの自分の変調(音声)は聞こえて来ませんでした。おかしいと思いロータリーエンコーダーを回して止まった周波数では問題なく変調(音声)は聞こえます。本体のバンドSWを変えるとバンドSWに合わせた周波数帯の設定周波数に自動になってくれるのですが、その周波数はDDS-VFO(VFOsys改)に表示されてはいるのですが、(変調)信号が出ていないのです。つまりDDS−VFO(VFOsys改)が表示してる周波数のキャリアがが出ていません。受信機から変調(音声)が聞こえない状態です。SSBだとわかりにくいので、CWモードでも確認しましたが、電波が出ていませんでした。ただし判ったこととして、ロータリーエンコーダーを動かした途端に周波数が発振し始めるという何とも変な挙動です。一旦発振し始めた後は各周波数で問題なく動作(発振)します。いままでは、バンドSWを回して、すぐにロータリーエンコーダーに触っていました。このため発振していたので、全くロータリーエンコーダーに触らない状態での確認が抜けていました。実際の周波数をモニターしてわかった問題です。ということで、丁度いい具合にシミュレーションボードも揃いました。また、シミュレーションボード以外に使用していないゼネカバ受信できるトランシーバー(TS−140)も受信機として使うことにしました。これで、実機でのキャリア発振周波数の確認も出来ます。やはり実機で確認するのが必要であると痛感しました。実際の対策スケッチも、オリジナルのVFOsysスケッチを参考にしながら、問題の箇所を探してみます。一旦夕食で外します。続きを書くで、対処方法検討について記します。

つづく?
続きを読む

Candle for LINUXその47

TS820の外部DDS−VFO(VFOsys改)と本体からのバンドSWのシリアル情報送出用のArduinoNANOとの実機での確認を継続しています。実際の交信も問題なく出来ています。まずまずかなと思っています。やはり、色々とやってみるとでてくるもんです。まだ問題がありました。実用上の問題では無いかもしれません。が、少し気にし始めるとやはり解決しておくべき問題であるということで対策も考え始めています。問題が何かを言わず、あまり引っ張ると、イライラすると思うので、何が問題かを順次記してゆきます。

今回のTS820の内部のVFOを使わずに外部DDS-VFO(VFOsys改)を使用するということが前提なので、この場合は問題ではありません。(すべて外部VFOのみでRXとTXを行う場合)
問題とするのは、外部DDS-VFO(VFOsys改)を使わず、本体のアナログLC型のVFOを使いたいといった場合です。(まだまだ内部のアナログVFOは十分使用できます。)アナログVFOが動作している時の事です。外部DDS−VFO(VFOsys改)には電源が入っていないので、外部DDS-VFOには問題はありようがないです。ところがTS820本体にはバンド情報送出用のArduinoNANOが電源入っている状態です。そして、シリアルデータ線が電源検出用タイマーの2番端子入力に繋がっており、外部DDS−VFO(VFOsys改)が電源入っている時はこの端子は"H"レベルで、タイマーは動きません。通信データが来た時にタイマーが働くのが通常な動作です。このシリアルデータ線は外部DDS−VFO(VFOsys改)が電源OFFなので、このポートが、"L"レベルになってしまいます。ArduinoNANOの基板には電源が常時入っているので、タイマーICの555が”H”から”l”を検出してしまいタイマー設定時間動作しては、繰り返しタイマーが動作し続けるという状態になります。ただタイマーが相手がいない状態で動いてしまっているという状態です。問題とするのは、送信中にマイクゲインをあげ、無音状態にするとタイマーのオンオフで"プチ"ノイズが聞こえるということです。無音状態でやっと分かるレベルなので、通常の運用では、わからないと思います。これが、タイマーのオンオフで"プチ"ノイズを問題とすることにした内容です。
気にしだすと本当に気になるので、対策を考えます。対策は至極簡単な方法をとります。ArduinoNANOの電源を本体のVFOを使う時、”切る” ということです。タイマーが絶対動きませんからノイズ発生もありません。という具合です。今この回路を考えているところです。リレーを使えば出来ます。入力を内部VFOの電源として、ON時にリレーを切る回路です。(ArduinoNANO電源OFF)、VFO電源OFF時(外部DDS-VFO(VFOsys改)動作時にリレーを繋ぎArduinoNANOがアクティブになるという具合の回路です。(シリアル通信回路が動作する状態です。)簡単な回路でリードリレーでやってみようかと思っています。

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

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