jl7gmnのblog

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

2023年07月

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

カラーグラフィック画像を使ったSメータをLovyanGFXライブラリのスプライト機能を使い作成しましたが、元のSメータ画像の目盛りの赤色が青色で表示されてしまっていました。この青色となってしまう原因を探ってみました。
青色の目盛りカラー写真を撮るのを忘れたので、先の動画で青色の情報確認です。



元の画像ではSで9から上は赤色で塗られています。この画像の変換データが現状のSメータの画像表示では青色で表示されてしまっています。

signal.bmp_Image

Lang-ship

上記リンクのなかのLovyanGFXとは?には、AdafruitGFXやTFT_eSPIと一定の互換性をもちつつカリカリにチューニングされているグラフィックライブラリです。とあります。

この色数に関してのLovyanGFXライブラリの使用上の注意ということで説明しているサイトです。
これに基づいて、実際に確認もしてみたいと思います。

やはり、ライブラリのインクルード状態だけでスプライトを使う上での初期設定がされていないための問題であることが、なんとなく原因であろうことがわかってきました。
基本デフォルトで16ビットの色数らしいのですが、設定したTFT、と各スプライト事に宣言をしていなかったのが色が正常ではなかった原因ではないかと思います。この確認のため、スケッチ上に色数の初期設定を追加してみることにしました。緑色文字が追加した色数の初期設定箇所です。

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

  lcd.init();
  lcd.setColorDepth(16);
  lcd.setSwapBytes(true);
  smeter.setColorDepth(16);
  needle.setColorDepth(16);
(以下省略)

実際にコンパイルして動作させてみると、目盛り上の赤色部が正常な色で表示されました。

color16setting

LovyanGFXライブラリではTFTの色数の初期設定は必ず行う必要があるということです。合わせて、使用したスプライトも色数の初期設定をしておくと違った色で表示されてしまうことがなくなります。
ちなみに、今回使用したLovyanGFXライブラリは、先のJF3HZB uebo氏の新しいバージョンのVFOsys2_00では240x320のサイズにも他の種類のTFTの各ダイアル項目の任意設定用ファイル上でもインクルードして使用しているようです。前のVFOsysよりも、LovyanGFXライブラリやオリジナルのフォントなどを使うことでさらに動作スピードの向上となっていると思われます。

つづく?

続きを読む

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

前のSメータはラインの描画コマンドによる線でのSメータの針でした。太くしようとしても、画面の端ではうまく均一に太さが表示されないため、1本のラインのSメータとしていました。ESPのサンプルのSメータでも同じで、太くする処理がされていましたが、TFT上の位置によって太さが変わるのはいただけません。ということで、針をグラフィック画像で作成し対応してみることにしました。針の太さの事が気にならないSメータの検討を開始しました。今回このSメータで使用するのは、スプライト処理ですが、最初の描画ラインでも一部<TFT_eSPI.h>および、<SPI.h>ライブラリを使ったスプライト処理でした。がネットで調べてゆくと、最近のスプライト処理は<LovyanGFX.h>ライブラリを使うのが主流のようです。処理スピードも改善されている云々とありましたので、このライブラリをSメータのスプライト処理でためしに使ってみることにしました。
最初にやることはArduino IDE 2.1.1(最新にしました。)にライブラリをインストールです。この処理は他のWebページにお任せして、要点は、自分のTFT液晶の型番に合わせたTFT用のライブラリを設定し作成する必要があります。私のTFTは1.8inch(128x160ピクセル)で型はST7735Sです。
このやり方もこの元のライブラリファイル内にファイル名作成についてとかも記載あります。私は設定したファイルのファイル名を "LGFX_ESP32_ST7735.hpp"として用意しました。作成したら動作確認として、サンプルプログラムが動作し、TFTに表示されるかを確認しておきます。問題なければLovyanGFX.hpp と一緒に今後TFTのST7735S専用ライブラリとして利用してゆけます。

おまけ:なお、LovyanGFXサンプルスケッチでは次の定義はコメント化または、削除する必要があリました。
//#define LGFX_AUTODETECT


最初にスケッチ上にライブラリとしてインストールした<LovyanGFX.hpp>ライブラリをインクルードします。

#include <LovyanGFX.hpp>

次に設定してファイル名を付けて保存したTFT設定用のライブラリをインクルードします。

#include "LGFX_ESP32_ST7735S.hpp"

TFT設定用のライブラリをインクルードします。上記を行いスケッチをしてゆきます。ネットには詳しくスプライトの使用方法があるので、練習してみるのもよいかと思います。自分のTFT用のライブラリをインクルードするのを忘れないことです。"LGFX_ESP32_ST7735S.hpp"

作成のスケッチよりも使う画像のサイズをキチンと確認しておく必要があります。また、自分のTFT液晶のサイズもそうです。あとは手順通りにスケッチしてゆくのですが、初めてなので、何度も躓きましたが。何とか2日ぐらいで作成することができました。とにかく実際に試すことも含めいろいろとやってみることです。久々に新しいライブラリのコマンドで悩み、時々、”なんでうごかないの!” そして最後に落ち着くのは、基本に忠実にです。暗中模索はいけません。時間の浪費になるだけです。仕様通りにスケッチすることですべて解決します。特に動作しているサンプルスケッチをみて同じコマンドが使われてないかを含め、確認できる動作サンプルを見つけることも完成への近道かと思います。
【スケッチの概要】
Sメータの画像をLCDに取り込みスプライト処理の針の中心位置を needle.setPivotで決め、画面の回転表示をlcd.setRotation(1)と設定し最初にSメータ画像を(0,0)のポジションに取り込みます。
次にはスプライトのバッファ確保のneedle.setBuffer((void*)hari,2,100,16); とし セットアップ終了し
次のvoid loop()につなげます。

Sメータへの直流電圧をESP32DevKitCのポート32にから取り込みしA/D変換しその値をmap関数で角度へ変換します。ここでSメータの指針のセットを行います。入力には半固定を用いて、電圧値を調整します。4095は最大時なので、入力電圧値で要調整します。最後にmap角度範囲にて微調整します。

long d = 0 ;
  //**************************************************
  for(int i=0;i<avtimes;i++){
    d += analogRead(32);
  }
  signalLevel = d/avtimes;
   // mapping to degree value
  signalLevel = map(signalLevel, 0, 4095, -64 , 80);
  //**************************************************
 
針を表示しますが、針の画像の位置関係よりlcd.setRotation(0);でSメータ画像にうまく位置が合うようにします。あとはスプライト処理での針をTFTへ表示させます。表示の際には元の針の画像データのサイズを拡大して表示しています。signalLevel, 2.0,2.85 で2.0は針の幅を2倍にしています。簡単に針の太さを変えることができます。2.85は針のサイズを中心位置から拡大(長さ)倍率値です。これも調整して設定しています。

表示は2つあげましたが、最初は画像のエッヂ処理なしです。あとはアンチエイリアス処理付きのコマンドでの表示です。アンチエイリアス処理ではエッジをきれいに処理し表示させることができる処理のようです。動作スピードと相談して設定が必要のようです。

■通常処理の場合

needle.pushRotateZoom(&lcd,(imgWidth/1.55),(imgHeight/1),
signalLevel,2,2.85);

アンチエイリアス処理の場合(処理が少し重くなるそうです。)
needle.pushRotateZoomWithAA(&lcd,(imgWidth/1.55),(imgHeight/1),
signalLevel,2.0,2.85);

Sメータの元画像を縮小縮小で作成したため、荒くなってしまいました。あとできれいになるように工夫してSメータ画像データを用意したいと思います。



今回は<LovyanGFX.hpp>ライブラリを使ったスプライト処理での画像データによるSメータ作成でした。

Twitterへも投稿したところ、ニュースで言っていた通りロゴⅩに変わっていました。



つづく?



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氏も古いボードマネージャーでは新しいものが対応していないということでの新しいボードマネージャーでのリニューアルでもあるようです。新しいものへ対応してゆくことへの準備も必要ですね。まずは情報提供まで!

つづく?



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

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