jl7gmnのblog

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

ESP32 DevKitC

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

つづく?



愛知タワー風速値表示追加その6

ArduinoNano での1.8inch TFT液晶表示も問題ないことより、ESP32DevKitCの使用と並行してデコード部の機能だけをArduinoNANOでデコード部回路をブレッドボードで作製しました。そして仮の風速パルス源として実験装置のOSC信号を使ってた風速カウント値を1.8inch TFT液晶に表示出来ました。色々とOSCの周波数を変えカウントのデコード表示を確認していると気になる事がありました。前回も書きましたが、現状の入力値に対しての表示部との時間関係で周波数が上がった時(風速が早くなった時)に0から順番に表示されず、数値が飛んでしまう現象があります。
対策は原因に合わせて対策を取る必要があります。原因としては風速の値の大小にて表示のゲートタイミングがいつも同じことによるものです。さすれば、風速の値の大小にてゲートタイミング(ディレータイム)を変えればよいということです。具体的には、色々と方法が考えられますが、方法の1つとしてはデコード値の値のある区間毎にて適切なディレータイムを設定する事です。ただし0から127の区間の分け方とディレータイムをどれぐらいに設定するかの各区間での確認が必要です。しかもスケッチは区間設定した分の追加となります。区間を2,3適当に設定し実験してみましたが、少しカット&トライがひつような感じで時間がかかりそうでしたので、もう少し別の方法を考えることにしました。
その方法とは、風速で変わるバイナリーのB0ポートを使い低い周波数の周波数を読み取りして、周波数の範囲を適当に設定しディレータイムを設定する方法です。これをやるには周波数カウンターをArduinoNanoに新たに組み込む必要があります。タイミング的に周波数カウンターをいろいろと実験していましたので、その情報の中の低周波用カウンターをArduino系で実現していた情報にて試してみました。バイナリーのデコード処理だけで現状動作していますので残りの空きポートが使用出来るかの確認です。やはりポートのバッティングがありデコード入力の入れ替えが必要でした。入れ替えを行ない動作確認を行ないました。(低周波カウンターは割り込みを使う方式で、ArduinoNano で使用できる割り込みPORTはD2かD3の2つのどちらかです。バイナリーの入力のD2がバッティングしていましたので、B0バイナリー入力を(A1)D15 に変更し、D2をカウンターの割り込みで使っています。D2(カウンター入力)とD15(B0バイナリー入力)はつなぐことになります。)
カウンターを使うので周波数区間を分ける必要がありましたが区間3つで表示も問題なく十分な抜けのないカウント動作をさせる事が出来ています。ディレータイムも1箇所の設定で出来るので簡単です。
デコード処理もカウンターも上手く動作し組み入れることが出来ました。低周波数カウンター組込で参照したGitHub情報は下記になります。


ArduinoNano でデコード部に低周波カウンターを組み込んだ回路図を纏めました。
回路図上でのカウンターの追加は、D2ポートの追加とD2ポートバッティングによるB0バイナリー入力ポートをD15ポートへ変更のみです。
ArduinoNANO−anemoMeter

仮のパルス源のOSC周波数を色々と変え、ゆらぎの風に見立ててカウント値を確認しましたが、カウントが抜ける様な表示はありませんでした。低周波数カウンターは変化のある風速値を十分検出しカウント表示をしてくれています。
カウンター組込スケッチ追加部とバッティングによる変更スケッチ部です。

【定義部】
//------------------------------------------
#include "HzMeter_asukiaaa.hpp"
//------------------------------------------


#define WIND0 15 //D2 binary 1   (0,1)change D15

//---------------------------------------------------------------
#define PIN_INTERRUPT_HZ_METER 2
#if digitalPinToInterrupt(PIN_INTERRUPT_HZ_METER) < 0
#error needed to assign interrupt pin for PIN_INTERRUPT_HZ_METER
#endif

#define HISTORY_LENGTH 15
HzMeter_asukiaaa::Core hzMeter(HISTORY_LENGTH);

//---------------------------------------------------------------

int16_t dljikan;

//for frequency counter
int pinLed = 15;//3
int LED_Stat = 1;
unsigned long frq;

【setup部】
void setup(void) {
    Serial.begin(115200);
    //-----------------------------------------------------
    hzMeter.begin();
    pinMode(PIN_INTERRUPT_HZ_METER, INPUT_PULLUP);
    attachInterrupt(
      digitalPinToInterrupt(PIN_INTERRUPT_HZ_METER),
      []() { hzMeter.countUp(); }, RISING);
    //-----------------------------------------------------

    
    pinMode(pinLed,OUTPUT);

【void loop()部】
void loop() {
//-----------------------------------------------------
    hzMeter.onInterval();
    auto countInfo = hzMeter.getInfoBundled();
    Serial.print(countInfo.calcHzByFirstAndLast());
    Serial.print("Hz from ");
    Serial.print(countInfo.measuredFrom);
    Serial.print(" to ");
    Serial.println(countInfo.measuredTill);
    if(countInfo.calcHzByFirstAndLast()<= 0.80)
    {
      dljikan = 1000;
    }
    else
    {
      if(countInfo.calcHzByFirstAndLast()<= 1.50)
      {
        dljikan = 500;
      }
    }
    if(countInfo.calcHzByFirstAndLast()<= 1.80)
    {
      dljikan = 200;
    }
    else
    {
      dljikan = 100;
    }
//-----------------------------------------------------

省略
 sprintf(ce,"%3d",windvalue);
  
    tft.fillScreen(ST77XX_BLACK);
    tft.setCursor(50, 50);
    tft.setTextColor(ST77XX_WHITE);
    tft.setTextSize(5);//10
    tft.println(ce);
    delay(dljikan);
}

液晶の表示も縦置きから横置きにし風速値のみ表示する様に余分な表示は消しました。

TFT-display


ひとまず表示だけでのArduinoNANOの試作は完成ということにします。後は実際のカウンターにつないでの最終確認がありますが後にします。
次は、元の軌道に戻り、ESP32DevKitCでのデコード表示にとりかかります。

つづく?


愛知タワー風速値表示追加その5

ArduinoNanoでTFT液晶表示のスケルトンまでできたので、実際に7ビットのポート入力のデコード部をスケッチしました。スケッチはオリジナルのwebスケッチに下記のデコードの部分を付け足しています。
オリジナルからの変更追加箇所です。

・TFT液晶display の表記とRSTポートの変更D8→D15(D2〜D8)を連続で並べる為の変更)
#define TFT_SCLK  13
#define TFT_MLSI  11
#define TFT_CS  10
#define TFT_DC  9
 //#define TFT_RST 8
#define TFT_RST 14

int16_t windvalue;

char ce[6];

・シリアルボーレートの変更(9600 →115200)
ポート定義部追加
#define WIND0 2 //D2 binary 1   (0,1)
#define WIND1 3 //D3 binary 2   (0,1)
#define WIND2 4 //D4 binary 4   (0,1)
#define WIND3 5 //D5 binary 8   (0,1)
#define WIND4 6 //D6 binary 16  (0,1)
#define WIND5 7 //D7 binary 32  (0,1)
#define WIND6 8 //D8 binary 64  (0,1)


void setup(void) {
   Serial.begin(115200);
   pinMode(pinLed,OUTPUT);

   //Port D2-D8 input setting (0-127)
   pinMode(WIND0, INPUT);  //D2 Port normally LOW
   pinMode(WIND1, INPUT);  //D3 Port normally LOW
   pinMode(WIND2, INPUT);  //D4 Port normally LOW
   pinMode(WIND3, INPUT);  //D5 Port normally LOW
   pinMode(WIND4, INPUT);  //D6 Port normally LOW
   pinMode(WIND5, INPUT);  //D7 Port normally LOW
   pinMode(WIND6, INPUT);  //D8 Port normally LOW

省略

void loop() {
    // put your main code here, to run repeatedly:
   if(((((((digitalRead(WIND0)==LOW)
        and(digitalRead(WIND1)==LOW)
        and(digitalRead(WIND2)==LOW)
        and(digitalRead(WIND3)==LOW)
        and(digitalRead(WIND4)==LOW)
        and(digitalRead(WIND5)==LOW)
        and(digitalRead(WIND6)==LOW)))))))
    {
      windvalue = 0;   
    }
    else
    {
    if(((((((digitalRead(WIND0)==HIGH)
          and(digitalRead(WIND1)==LOW)
          and(digitalRead(WIND2)==LOW)
          and(digitalRead(WIND3)==LOW)
          and(digitalRead(WIND4)==LOW)
          and(digitalRead(WIND5)==LOW)
          and(digitalRead(WIND6)==LOW)))))))
      {
        windvalue = 1; 
      }
    }
    if(((((((digitalRead(WIND0)==LOW)
         and(digitalRead(WIND1)==HIGH)
         and(digitalRead(WIND2)==LOW)
         and(digitalRead(WIND3)==LOW)
         and(digitalRead(WIND4)==LOW)
         and(digitalRead(WIND5)==LOW)
         and(digitalRead(WIND6)==LOW)))))))
    {
      windvalue = 2;      
    }
省略(延々とwindvalue=127まで同じスケッチでLOW,HIGH設定)

 
  tft.setTextColor(ST7735_YELLOW);
  tft.setCursor (30, 95);

   //tft.print(windvalue);
   //tft.print ("038");
  sprintf(ce,"%3d",windvalue);
  tft.print(ce);
  delay(150);


  tft.setTextSize(4);
  tft.setCursor(30,95);
  tft.setTextColor(ST7735_BLACK);
  tft.print(ce);

   //tft.print("   ");
  delay(10);
}

■デコード部詳細
バイナリー出力を受ける入力ポート(D0〜D8)のデコード部は0〜127までのカウンタ出力の瞬間値7ビット入力値を判断し表示用カウント変数のwindvalueにカウンタ値のデコード値を入れるスケッチです。

■TFT液晶Display表示部詳細
フォント色を黄色、サイズ4に設定しchar変数ce をsprintf書式で3桁の数値の右詰めでtft.setCursorでの設定位置にデコードカウント値を表示します。表示後は時間をおいて、フォント色、黒色、サイズ4で同じ位置に再度ceを上書きして表示を消しています。これをしないと文字が残りどんどん重なり黄色の■になります。

実際のカウントデコード値表示動画
カウント値が上がっていくLED発光ダイオードとTFT液晶Displayのカウント表示です。


入力信号D2ポート波形
単に入力ポートに信号が来てるかの確認の為、撮ったものです。


カウンタでの信号パルス(OSCからの信号)でスケルトンで作製しTFT液晶に仮表示してた”038"固定数値をバイナリーデコード値に変えて表示することができました。

表示までは上手くこぎつけましたが、若干気になっている事があります。
現状の入力値に対しての表示部との時間関係で周波数が上がった時(風速が早くなった時)に0から順番に表示されず、数値が飛んでしまう現象があります。時間のデレー設定が固定なので、全部の風速スピードで表示出来るタイミングでない事によるものです。

次の画像の表示に変更して対策を行なっています。どのように対応を検討してるかは次回に!
表示変更スケッチ

つづく?

愛知タワー風速値表示追加その4

風速値表示ユニットからの信号線をCMOS IC 4024 バイナリーリップルカウンタでカウント値をバイナリーに変換した出力7ビットをデコードし表示する1.8inch TFT液晶を使いたかった為、CPUとしてESP32DevKitCを予定して回路図を作製しました。ただ表示だけなら小型のArduinoNANOでもいいのではと思い、並行して1.8inch TFT液晶ディスプレーを繫いでの表示が上手く出来るか確認してみることにしました。ネット情報を探ると結構Arduino系でのTFT液晶ディスプレーの表示は可能の様です。ArduinoNANOを使った1.8inch TFT液晶ディスプレーのサンプルがありました。

動作確認した所、色の設定が上手くありません。スケッチを最初コピペした所、液晶表時上の文字化けがありましたが、スケッチを一端消キーボードから打ち直しでOKとなりました。また、位置ずれもあり、直接ライブラリの書き換えで対応出来る情報より変更対応して位置ずれも治りました。

■位置ずれ修正
ライブラリはAdafruit_ST7735_and_ST7789_Library で、その中のAdafruit_ST7735.cpp ファイルの下記2箇所です。

void Adafruit_ST7735::initR(uint8_t options) {
  commonInit(Rcmd1);
  if (options == INITR_GREENTAB) {
    displayInit(Rcmd2green);
    _colstart = 0;//2->0
    _rowstart = 0;//1->0

  } else if ((options == INITR_144GREENTAB) || (options == INITR_HALLOWING)) {

■色修正
他、RGBカラーでなくBGRカラーの為、数カ所色の入れ替わりとオレンジ色が出ない事象もありました。入れ替わりは単に適当なカラー設定値で何回か直接色を設定し目的の色になった事を確認した上で、直接Adafruit_ST77xx.h ファイルを書き換え手直しし、設定カラー通りに色表示できるようにしました。

// Some ready-made 16-bit ('565') color settings:
#define ST77XX_BLACK 0x0000 //OK
#define ST77XX_WHITE 0xFFFF //OK
#define ST77XX_RED 0x001F //ORIGIN BLUE:0xF800
#define ST77XX_GREEN 0x07E0 //LIME
#define ST77XX_BLUE 0xF800 //ORIGIN RED:0x001F
#define ST77XX_CYAN 0xFFE0 //ORIGIN YELLOW:0x07FF

#define ST77XX_MAGENTA 0xF81F //OK
#define ST77XX_YELLOW 0x07FF //ORIGIN CYAN:0xFFE0
#define ST77XX_ORANGE 0x0BFF //SET MAKE 0x0BFF ORANGE ORIGIN 0xFC00

オレンジ色は手探りで色確認です。他の順当な方法もあるようでしたが、設定通りに色が出ればそれでOKとしました。力ずくです。このスケッチだけで、他では通用しません。Hi!
書き換えたライブラリファイルは元の状態に後で戻す必要もあります。他のスケッチで使う場合不具合となります。

設定通りの色がちゃんと表示出来る様になったので、早速、設定した数値に風速がなった状態を想定して数値38を表示させてみました。

ArduinoNANO-TFT-1

ArduinoNANO-TFT-2

ArduinoNANO-TFT-3

風速バイナリーデータ7ビット分のポートを割り当てて、デコードスケッチをコーディングですが、まずはArduinoNanoの端子情報を準備しました。1.8inch TFT液晶Displayで使ったポート以外から使用できる7ポート分を選びます。

ArduinoNano−PORT


つづく?


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

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