jl7gmnのblog

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

2020年09月

OLED S-Meter ArduinoUNOその1

今私は、休み期間なので、日中からネットサーフィンしています。
OLEDのSメーターのサンプルが何処かに無いかと情報集めのネットサーフィンしていたら、VUメーターの動画がありました。ソースも公開していましたので、早速ダウンロードしました。


コメント欄に出てくるサンプルはVUメーターのみのサンプルなので、このページのダウンロードが良いです。とても楽しめるスケッチです。! 
接続の下の方にある OLEDMeter.ino をクリックダウンロードします。
範囲を選択_106
楽しめるスケッチとは、後から分かります。
今までは、ESP32 DivKitC でのスケッチでArduino IDEを使っていたので、設定をAruduinoUNOに変えて、早速コンパイルしました。接続はまだしてません。コンパイルが通れば接続してみようというスタンスでやっています。コンパイル結果はNGです。インクルードファイルが無いのエラーをはいていました。これは、Webで確認すると、下記にありましたので、早速IDE上からZIPファイルをインストールです。久々のArduinoUNOです。

https://github.com/kosme/fix_fft

すんなりインクロードファイルが読み込まれました。後から気づきましたが、このインクルードファイルはオーディオ帯域のFFTで必要の様です。特になくても、良いようでしたが、コンパイルを通すだけでも、まっ、いいかです。Hi!
また、スケッチを覗くと、VUメーター以外にも、数種類メーターが記載あるようです。なんかワクワクしました。あとから、何のメーターかは、わかります。
コンパイルが通ったので、実際の表示を確認する為、ArduinoUNOとOLED(128X64)、それとSW類の配線をスケッチに記載してあるポートに合わせて行いました。

CIMG8760

配線
CIMG8759

VUメーターのサンプルのみと思っていましたら、FFT もそうですが、SWが付けられるようにスケッチが書いてあります。Webページにある接続はSW類がありません。少しスケッチの中を見てみると以下のメーターの表示が可能の様です。VU,S,POWER,SWRの4つがSWにより切り替わり表示なるようです。コンパイルを再度行い、書き込み実施しました。4つのメーターが表示されました。残念ですがFFTだけはSW押しても表示されませんでした。

VUメーター
Sメータ
POWERメータ
SWRメータ
FFT (動作せず)

とにかく、一番OLEDで見たかったメーターですし、気になっていたSメーターもありました。
最初の表示がVUメーターになっていたので、少しプログラムを弄り、表示開始はSメーターに変更しました。とにかくメーターを探し始めてこのスケッチに出会えました。スンバラシイです。

少しスケッチをザーッとみていましたら、リバーシブル機能のプログラム箇所がコメント化されていましたので、試しにコメント化を外して、コンパイルしてみた所、白地に黒の目盛りと指針に切り替わりました。これ又いい感じです。好みで選べます。私としては、白地に黒目盛りと黒指針がいいかと!

オリジナルのメーター(黒字に白のメモリと指針)

Sメーター
CIMG8764

VUメーター
CIMG8766

Powerメーター
CIMG8768

SWRメーター
CIMG8770

ここからリバーシブルのメーター表示

リバーシブル Sメーター
CIMG8775

リバーシブル VU メーター
CIMG8776

リバーシブル Powerメーター
CIMG8777

リバーシブル SWRメーター
CIMG8778

このSメーター類は無線機の自作をしている人達は、DDSと合わせてデジタルづくしの無線機を作り上げる事が出来ると思います。少し各メーターの入力のレベル設定の検討、調整は必要かと思います。

動作確認として、Sメーターの針の触れ方を見てみました。イリーガルなやり方ですが、入力端子への手との誘導で敏感にSメーターが触れます。どんな風に指針が動くかの確認には使えます。Hi! 以下各メータの表示とSメータ指針の触れ方確認の動画です。



とてもコンパクトなOLED(128X64)ですが、別の同型のOLEDでは少し広い様(ドットが多い)で、左側が空いて表示されるものがありました。別のOLEDでは範囲の変更が少し必要の様です。

また、このメーターの目盛りを作成するには、画像変換プログラムが必要のようでした。ただし、Windows用のソフトウェアでした。私のPCはLINUX(ubuntu)なので、ダウンロードはしませんでしたが、LINUX用の画像変換プログラムがあれば、目盛りを画像変換して、自分のメーターデータをこしらえてみたいところです。Windows10のPCもありますが、あえて、使いません。なんとか、LINUXで出来るようにという趣旨からです。

最初はVUメーターだけかと思いましたが、無線用の各メーターもおまけにあり、棚ぼたのメーターサンプルスケッチでした。ArduinoUNOも捨てたもんじゃありませんね!探すと色々とスケッチ公開していたりする面白い動画がありますからネットサーフィンも楽しいもんです。新しいデバイス(ESP32等)も、このようなサンプルを例に書き換え応用し楽しめる可能性もありますから!一番いいのは、自分でもWeb動画どおりの体験出来るということです。スケッチ公開してくれてる作者には、感謝です。Hi!

つづく?

続きを読む

ESP32 DivKitCその4

インターネットWeb時計は、たくさん発展させれる要素があると思います。初心者としては、まずはTFT(ST7735S)の描画を学んでみることにしました。このWeb時計は年月日、曜日、時間:分、秒のグラフィック表示だけですので、少し色のラインと四角の描画コマンドをつかってフレームを作成してみました。単に表示位置の周りに色のドット枠つけるだけです。大した内容ではありませんが、重要なのは、128X160ドットのロケーション(位置関係)を把握するという意味では大切な描画練習です。描画コマンドの説明はしなくても、単に位置を決めて色を指定するという単純な作業です。注意しなければならないのが描画しているグラフィックとの重なりがない用に設定するということだけです。重なる部分でドット発光がとぎれたりしました。案外とX,Yの位置関係が慣れないと変なところへ描画してしまいます。繰り返し確認しながらやることで最終的には自分の思ったとおりのライン、四角フレームにする事が出来ます。四角フレームは外側が緑、各表示毎に緑のラインで区切りをつけ、その内側に白の四角フレーム、又その内側に青のフレーム、そして又その内側に白のフレームというようにしてみました。特に他意はありません。1.8インチもフレームをつけると意外と表示エリアは狭くなりどうしても、年月日、曜日、時間:分、秒の位置調整は必要となりました。もう少し大きなインチのTFTを選べば楽に時計情報の表示位置もフレームも余裕で描画出来ると思います。
以下、年月日(2020年9月28日)の周りのフレーム作成です。フレームの中間は青色を使っていましたが、赤に変えました。また、年月日の色を一旦白にしてみましたが、後から緑に変えました。

 tft.setCursor(xp,yp+0);
  tft.drawRect(x0,y0,160,128,TFT_GREEN);      //draw Square green
 
  tft.drawRect(x0+3,y0+3,154,18,TFT_WHITE); //draw Square white
  //tft.drawRect(x0+2,y0+2,156,20,TFT_BLUE);  //draw Square blue
  tft.drawRect(x0+2,y0+2,156,20,TFT_RED);  //draw Square blue
  tft.drawRect(x0+1,y0+1,158,22,TFT_WHITE);  //draw Square white
  tft.drawLine(x0,y0+23,160,y0+23,TFT_GREEN); //draw Line

  String nenn = dayInfo.substring(0,11);
  Serial.println(nenn);
  tft.setCursor(40,4,2);
  //tft.setTextColor(TFT_WHITE,TFT_BLACK);
  tft.setTextColor(TFT_GREEN,TFT_BLACK);
  //tft.setTextSize(1);
  //tft.println(nenn);
  tft.drawString(nenn,40,4,2);

フレーム練習は無事終了しました。

フレームがついたインターネットWeb時計の完成です。
CIMG8753

フレーム作成のついでに描画コマンドの tft.fillRect コマンドを駆使して、秒の0から59までをプログレスバー形式で表示させてみました。秒を描画していた場所は、プログレスバーにする為、秒は曜日のところへ移動しました。プログラム上では、このプログレスバーの秒の変数の扱い(変換)で、少し悩みました。役に立ったのは、Serial.println です。デバッグの仕方として、プログラムは自走Loop しているので、deray(10);をdelay(500);と0.5秒間隔のループに変更し時間を少し伸ばすことで、Serial.printlnで表示させた各変数は容易に確認出来るようになります。一秒ぐらいでも良いかもしれません。シリアルモニターはコンパイル中は停止しています。書き込み完了になると表示開始します。

描画の範囲を60区画に分けて、1秒で何ドットかずつx軸方向に増やして行くやり方をとれば、秒が進むプログレスバーらしくなりそうだという案です。この案で作成することにしました。

秒の変数の値は、Stringで入ります。つまり0秒は”00”のString変数です。ここで先ず、プログレスバーの描画と時間幅の関係を考えないといけません。
入って来る情報はStringで ”00”,”01”,”02”,・・・"58","59","00","01",・・・といった値をとります。これでは位置情報には使うことが出来ませんから、”00”は数値の0、”01”は数値の1、の様に秒の文字列を数値へ変換が必要になります。数値になると、計算値として使用できます。プログレスバーの領域X軸のドット分割の範囲とすると、ドット数を60で割ると分割倍数が出てきます。少し値の調整が必要でしたが!
int pbar;と宣言して、文字として取り込んだ秒のストリング情報のmyou をint型に変換です。以下はその変換部抜粋です。

String myou = dayInfo.substring(23);
pbar = myou.toInt();
plogbar = int((2.58*pbar));
plogbarnasi = plogbar;
  Serial.println(myou);
  Serial.println(pbar);
  Serial.println(plogbar);
tft.fillRect(x0+4, y0+107,(x0+plogbar),y0+17, TFT_GREEN);
この後に、0秒になったら秒描画した箇所を消す処理があります。

ここで、とても厄介な目に合っています。変換する myou.toInt(); のプログラムの位置です。最初はtft.drawStringで秒描画した後にmyou.toInt();を置いていたのですが、変換値は描画を消すピクセル位置計算値として使うのですが常に0となってしまいました。下記がその時の変換が常に0となったときのプログラム位置です。なんで0になるのかがわかりません。対策として上のプログラムにあるとおり、使うための値を他の変数にコピーしておく方法をとりました。憶測ですが、変数値をプログラムで使うと(下のtft.drawString(myou,125,27,2) 消えてしまうというような状況に見えていました。消えても、別にもコピーがあるよー!での対策です。

String myou = dayInfo.substring(23);
tft.setCursor(71,107,2);
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(1);
//tft.println(myou);
tft.drawString(myou,125,27,2);
pbar = myou.toInt();
plogbar = int((2.58*pbar));
tft.fillRect(x0+4, y0+107,(x0+plogbar),y0+17, TFT_GREEN);

上記の様に数値への変換値が0になってしまう現象は、別の変数にコピーを取ることで解決しました。コピーデータの使いみちは、秒で塗りつぶした箇所を0秒時に消す処理で使っています。
2.58倍したのは描画の端までの位置合わせで、丁度端のフレームにかかる前のドットまで描画出来る位置の調整で丁度となる倍数が2.58でした。

途中からですが上記の問題が解決したプログラムです。
void loop(){
省略

 String myou = dayInfo.substring(23);
  pbar = myou.toInt();
  plogbar = int((2.58*pbar));
  plogbarnasi = plogbar;
  Serial.println(myou);
  Serial.println(pbar);
  Serial.println(plogbar);
  tft.fillRect(x0+4, y0+107,(x0+plogbar),y0+17, TFT_GREEN);
 
  Serial.println(plogbarnasi);
  switch(plogbarnasi){
    case 0:
            tft.fillRect(x0+4,y0+107,x0+152,y0+17,TFT_BLACK);
            break;
    default :
            break;
  }
 
  tft.setCursor(71,107,2);
  tft.setTextColor(TFT_WHITE,TFT_BLACK);
  tft.setTextSize(1);
  //tft.println(myou);
  tft.drawString(myou,125,27,2);
 
  delay(10);//10 for debug 500
}

秒のプログレスバーが動作している動画です。


描画もやってみると意外と楽しい面があります。
日中はまだ暑かったりがありますが、少しずつ季節は秋になってきています。新米もスーパーで出始めました。外はすこし冷えてきています。外では、今鈴虫が泣いています。
そろそろ寝ようかと思います。

つづく?

ESP32 DivKitCその3

ESP32 DivKitCと1.8インチTFT(ST7735S)の表示のためのTFT_eSPIのドライバーにて、上手くTFTへ表示出来るようになってきました。ESP32 DivKitCと1.8インチTFTとの接続が分かると、道が開け、どんどんと先へ進める様な感じになり、凄く楽しさが増してきます。TFT_eSPIのサンプルプログラムを動作チェックし、十分動作を楽しんだ後、皆さんが特に面白いし、なんか、すごくネ!と思うようなサンプルを私もやって見る事にしました。それは、ネットサーバーからの時間取得表示です、実はネットにはゴロゴロたくさんのサンプルがありますが、TFTに表示するサンプルは極僅かです。ここは、TFT_eSPIのTFT表示する為に他のサンプルプログラムを参考にし、改良してみることにします。
結果をまずどうぞ!

今日の昼過ぎに動作中の写真を1枚撮りました。
CIMG8742

電源を繋いだ後のネットサーバー時計です。つながるまでのドット表示と接続後にSSID,PASSWORDを表示する様にしました。動画上は本物のSSIDとパスワードは表示出来ないので単なるテキスト文字表示にしてあります。(ブログ用)


サンプルプログラムは”ソースに絡まるエスカルゴ”の表題のWebページです。
これにTFTの表示を付け足します。
通常はシリアルモニター表示の為、データは連続な時間情報で構造体のtmとなっています。この時間情報をそれぞれ好きな長さで取り込みStringに変換できるサンプルと思い元としています。TFT表示用にはとても重宝すると思います。(何処にでも別々に表示可能、勿論任意カラー文字として!)

まず、やる事は、TFTを使うためのライブラリを追加インストールする必要があります。前のブログにも記載していますが、TFTの定義ファイルであるUser_Setup.h でESP32をピンの接続定義ほか、使用するフォント類を必ずセットしておきます。
#define ST7735_DRIVER,#define TFT_WIDTH 128,#define TFT_HEIGHT 160,#define ST7735_BLACKTAB,#define TFT_MISO 19,#define TFT_MISI 23,#define TFT_SCLK 18,#define TFT_CS 15,#define TFT_DC 2,#define TFT_RST 4,(フォントは必要任意設定で省略します。)#define SPI_FREQUENCY 27000000
フォントは使うフォントのみを定義するので良いと思います。わたしは、確認のため、全部使用するようにしてますが! ここいらは最初のTFTを使う為、接続定義の準備です。

以下最初のスケッチへの追加ライブラリです。スケッチー>ライブラリのインストールから追加します。
#include <WiFi.h>はオリジナルで使用してますが、次の2つをTFT用で追加します。

#include <SPI.h>
#include <TFT_eSPI.h>

上記に合わせて、tft で簡略使用するための下記も追加します。
TFT_eSPI tft = TFT_eSPI();  // Invoke library, pins defined in User_Setup.h

自分の家の ssid と接続パスワードを設定します。
const char* ssid = "********”;
const char* password = "********”;

TFTに表示する情報の年、月、日、曜日、時間&分、秒は文字列にて、つながるまでのドット位置の表示用で使う変数も定義します。最初はバラバラで入手していたのですが、年月日はまとめて抜き出しが使いやすいのでnennを急遽年月日にしました。”2020/09/27"です。元は、”2020”でしたが!なので、月、と日も使わないですが、後でなにかで利用出来るようにコメント化です。Hi

String nenn;   // original "2020" change to "2020/09/27"
//String gatu; // "09" Month
//String hi;   // "27" Date
String youbi;  // "Sun" "day of the week
String jifun;  // "11:39" Time(hour:minute)
String myou;   // "39" Seconds
int dotkai=10; //ドットの位置表示用


ネットサンプルから良いと思ったのは利用しています。ネットサーバーが幾つかあるので、これも定義しておきます。通常はnetServer1の”pool.ntp.org"の1つ使いが多いです!

const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.google.com";
const char* ntpServer3 = "ntp.jst.mfeed.ad.jp";

あと標準時はUTCなので、JST用に書き換えました。Web情報より
//const long  gmtOffset_sec = 3600;     
const long  gmtOffset_sec = 3600*9;     //JST
//const int   daylightOffset_sec = 3600;
const int   daylightOffset_sec = 0;   //JST

お決まりのvoid setup() には、TFTの初期化、画面位置の縦横の決め、TFT画面を黒で塗りつぶし、を追加します。setup end!の表示はTFTには表示してません。とくにいらないかと!
----------------------------------------------------------------------------------------------------------------------------
void setup() {
  Serial.begin(115200);
 
  tft.init();
  tft.setRotation(1);
  tft.fillScreen(TFT_BLACK);

 
  setupWifi();    // Wifi接続
  syncTime();     // 時刻を合わせる
  Serial.println("setup end!");
}
----------------------------------------------------------------------------------------------------------------------------
お決まりのvoid loop()には、文字列のsに変換してある日付時間から新たに関数 substring() で必要な情報を抜き出し文字変数に入れてゆきます。ここでの必要な情報抜き出しが一番楽しいところかと思います。VBとかでは、Midなどがありますが、Arduionoではsubstring()で抜き出しが出来ます。
このサンプルでの文字列化は sprintf で時間情報を文字列sとして取得しています。
今回のTFT表示用の年月日を抜き出しの部分だけのスケッチです。ほかの曜日、時間、秒等のTFTへの表示は同じやり方で出来るので省略しました。TFTへのテキスト文字の表示の基本は最初使うために初期化する。それからカーソル位置と使用するフォントを設定、テキストカラーを設定、テキストサイズ設定、テキストをTFTへ表示の順で設定です。ちなみにデバッグ機能としてはSerial.printlnが使えます。Arduino特有の設定値確認用です。Hi 今回のnenn取得文字列の確認様で追加しました。

----------------------------------------------------------------------------------------------------------------------------
void loop() {
  struct tm timeInfo;
  char s[20];

  getLocalTime(&timeInfo); // 時刻を取得

  // 日付と時刻を文字列として取得V
  sprintf(s, "%04d/%02d/%02d %02d:%02d:%02d",
          timeInfo.tm_year + 1900, timeInfo.tm_mon + 1, timeInfo.tm_mday,
          timeInfo.tm_hour, timeInfo.tm_min, timeInfo.tm_sec);

  // 曜日も含めた書式に変更
  String dayInfo = s;
  dayInfo = dayInfo.substring(0, 10) + " (" + getDayOfWeek(timeInfo.tm_wday) + ")\n" + dayInfo.substring(11);
  Serial.println(dayInfo);
 
  String nenn = dayInfo.substring(0,11); 
  Serial.println(nenn);                                  
//シリアルモニターでの確認用で追加しました。
  tft.setCursor(40,10,2);
  tft.setTextColor(TFT_WHITE,TFT_BLACK);
  tft.setTextSize(1);
  tft.println(nenn);
以下省略
 delay(10);
}
----------------------------------------------------------------------------------------------------------------------------

残りのyoubi(曜日), jifun(時間:分), myou(秒)も カーソル位置とフォントを設定、テキストの色設定、テキストサイズ設定、そしてTFTへ表示の順番で同じです。

void setup()でのコールする接続時のサブルーチン、および、時間設定サブルーチンのTFT表示追加分です。下記に載せます。
setupWifi()では、TFTにドットを表示させ、つながるまで、X座標を+10ずつ足して表示位置を動かします。1秒ごとにつながるまで、ドットを表示してゆきます。繋がったら、”Connected to"とその下に文字だけですが、”Your SSID"と、”Your Password"の文字をTFTに表示させ、1秒後TFTを黒塗りつぶしして次のループの syncTime()へ移ります。

----------------------------------------------------------------------------------------------------------------------------
/**
 * Wifiの設定を行う関数
 */
void setupWifi() {
  // WiFiに接続
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)  {
    Serial.print(".");
    dotkai=dotkai+5;
    tft.fillScreen(TFT_BLACK);
    tft.setCursor(dotkai,20,2);
    tft.setTextSize(1);
    tft.setTextColor(TFT_WHITE,TFT_BLACK);
    tft.println(".");
    delay(1000);

  }
  Serial.print("Connected to ");
  Serial.println(ssid);
 
  tft.fillScreen(TFT_BLACK);
  tft.setCursor(23,40,2);
  tft.setTextColor(TFT_WHITE,TFT_BLACK);
  tft.setTextSize(1);
  tft.println("Connected to ");
  tft.setCursor(25,60,2);

  //tft.println(ssid);   //通常はこちらです。下はブログの動画用に表示しない設定
  tft.println("Your SSID");
  tft.setCursor(25,80,2);
  tft.println("Your Password"); //パスワード表示はありませんが、ブログ用動画で文字表示追加
  delay(1000);
  tft.fillScreen(TFT_BLACK);

}
----------------------------------------------------------------------------------------------------------------------------

時刻合わせを行うサブルーチンもJST用の設定値を変数で設定、サーバー1,2,3も追加してあります。
gmtOffset_secもdaylightOffset_secもntpServer1,2,3も最初の定義を使い時刻合わせします。

----------------------------------------------------------------------------------------------------------------------------
/**
 * 時刻合わせを行う関数
 */
void syncTime() {
  //configTime(-9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp");
  //configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp");
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1,ntpServer2,ntpServer3);
}
----------------------------------------------------------------------------------------------------------------------------

なお、サンプルプログラムでは、曜日のオリジナル情報では曜日の文字長が長く、まちまちなので、曜日を省略型(3文字)の曜日に曜日変換しています。TFT表示では長い曜日表示は大変使いづらいので、この曜日変換をそのまま使いました。
----------------------------------------------------------------------------------------------------------------------------
/**
 * 引数の数値を曜日に変換する関数
 */
String getDayOfWeek(int dayNum) {
  String result = "";
  switch (dayNum) {
    case 0:
      result = "Sun";
      break;
    case 1:
      result = "Mon";
      break;
    case 2:
      result = "Tue";
      break;
    case 3:
      result = "Wed";
      break;
    case 4:
      result = "Thu";
      break;
    case 5:
      result = "Fri";
      break;
    case 6:
      result = "Sat";
      break;
  }
  return result;
}
----------------------------------------------------------------------------------------------------------------------------

以上でESP32 DivKitCと1.8インチTFTを使ったネットサーバー時計が出来ます。電源の5VをUSB で供給するだけで、家のWiFiのつながる場所で、ネットサーバー時計として使用出来ます。

今回は、テキスト文字のTFT表示を覚えました。また、文字列の抜き出しや、文字列への変換、デバッグ用として使えるSerial.println();改行付き表示、改行無しはSerial.print(); また、TFT用ライブラリで 通常はtft_setCursor(x,y);がほとんど使われているのに対し今回使用した tft_setCursor(x,y,?)があり、どの様な設定をすればよいのかで最初迷いましたが、昔を思い出し、そこは、ライブラリを直接確認して難なく解決しました。時々ライブラリは覗いてみるもんです。Hi! プログラムの引数設定が明白になります。

TFT_eSPIライブラリのcppのプログラムです。tft.setCursor(x,y),tft.setCursor(x,y,font)の部分だけの抜粋です。
----------------------------------------------------------------------------------------------------------------------------
/***************************************************************************************
** Function name:           setCursor
** Description:             Set the text cursor x,y position
***************************************************************************************/
void TFT_eSPI::setCursor(int16_t x, int16_t y)
{
  cursor_x = x;
  cursor_y = y;
}


/***************************************************************************************
** Function name:           setCursor
** Description:             Set the text cursor x,y position and font
***************************************************************************************/
void TFT_eSPI::setCursor(int16_t x, int16_t y, uint8_t font)
{
  textfont = font;
  cursor_x = x;
  cursor_y = y;
}
----------------------------------------------------------------------------------------------------------------------------

ちなみにヘッダーファイル TFT_eSPI.h では以下のように定義されています。
----------------------------------------------------------------------------------------------------------------------------
 // Text rendering and font handling support funtions
  void     setCursor(int16_t x, int16_t y),                       // Set cursor for tft.print()
              setCursor(int16_t x, int16_t y, uint8_t font);   // Set cursor and font number for tft.print()
----------------------------------------------------------------------------------------------------------------------------
ヘッダーファイルとcppファイルについては下記を参照しました。とてもわかり易いです。おさらいです。NOBUのArduino日記!です。よくページ記載内容を見ると、ライブラリの作成のしかたもありますから、大変参考になります。Hi!
----------------------------------------------------------------------------------------------------------------------------

以下抜粋
 〇ヘッダファイル(拡張子.h)
 ライブラリの定義を記入します。これは内部にあるすべてのもののリストです。
〇ソースファイル(拡張子.cpp)
 実際に仕事をする関数を記入します。
----------------------------------------------------------------------------------------------------------------------------

かなり以前にHamlogデータの取得、や無線機のコントロールでシリアル通信を主体に、VB,C,C++をしてた時期がありましたが、Arduino,ESPを使い始めてから、C,C++をやっていた事が少し、役にたっています。デバッグの仕方が全然他の言語と異なり、Arduinoは少し特殊かと思います。Step by Stepで調べてゆかないとわかりませんね!
今は、兎に角、いろいろなESP32のスケッチで楽しむことが最優先です。コピペ、丸写しでも構いません。ひょんに面白い!と思ったことから、どんどんアイデアが増して、新しい物へと発展してゆくと思います。ハードもソフトも今時用にどんどん進化しているので、本当にハマってしまいました。Hi! 
si5351_oled128x64 ,VFOsys,ESP32ブログでの実験基板作成、等々からのつまみ食いからが、のめり込むきっかけになりました。特にTS−820用のDDS-VFOに関しての内容です。無線家のJA2GQP,JF3HZB,JH7UBC他 各OM 諸氏に感謝致しております。

つづく?
続きを読む

ESP32 DivKitCその2

ESP32 DivKitCと1.8インチTFTディスプレーでのMETERのサンプルは、不足がありました。User_Setup.hファイルでのフォントの設定忘れがありました。スケッチ上に下記記載がありましたので、該当のフォントを定義して再度コンパイル、書き込みしました。

 Needs Font 2 (also Font 4 if using large scale label)

上記の説明どおりにUser_Setup.hのファイルのコメント化を外します。他のフォントはコメント化です。

#define LOAD_FONT2  // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4  // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters

その結果、メーターの測定単位 %RHの大文字と小文字の表示が現れました。また、指針の位置が数値で表示されるようになりました。
最初の時はフォント指定定義がされなかった為、何も表示されなかった事が分かりました。他のサンプルもフォントは何を使うかが、スケッチの最初に記載されていますので、そのとおりにUser_Setup.hを定義設定保存すると、上手く全部サンプルスケッチが動作しています。

TFT_Meter5のスケッチを再コンパイル後、ESP32 DivKitCに書き込み
OK、動作中の写真を1枚取りました。
CIMG8716

動作中の動画も取り直しました。

これがオリジナルです!ひときわメーターらしくなりました。
今回は、User_Setup.hファイルだけですが、修正版になりました。Hi!
最終かと思いましたが、前回あった、目盛りが無いことに気づきました。なので追記します。
フォントの指定が2,4でしたが、下記フォントは初期設定で必要でしたがコメント化しておりました。これを定義するにして、保存です。

#define LOAD_GLCD   // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH

これがMETERの本当のオリジナルです。
CIMG8723

拡大も1枚撮りました。
CIMG8722
サンプルスケッチの説明Webがあると助かるのですが!

つづく?

ESP32 DivKitCその1

ひょんな事でTS820用のDDS-VFOをArduinoNanoでやり始めて、VFOsysなるアナログに見せたデジタルでのダイヤル型DDS−VFOに興味を持ったことから、ESP32 DivKitCを使うことになりました。VFOsysは本当にデジタルでアナログを扱うという素晴らしいDDS−VFOの単なるデジタル表示ではない点が素晴らしいと思いました。特に、ESP32 DivKitCとTFTのLCDを組み合わせたプログラムが、これからの主流になるのだろうということです。液晶LCDでのデジタル表示も勿論目的用途では外せないものではあります。
ということで、今回VFOsysで使用した 1.8 TFT SPI 128*160 V1.1 のディスプレーを使ってESP32のTFT_eSPIの対応するTFT(128*160)サンプルプログラムを動かして見ることにしました。特に興味があったのが、メーターです。JF3HZB UeboさんのブログでもSignal MeterをPIC32MX250F128Bで作った画像処理のシグナルメータがありました。デジタルで作成されていることに感激でした。PICでもやりたいのですが、TFT_eSPIのサンプルにメータがありましたので、ESP32 DivKitC+1.8inch TFT のディスプレーで見てみたいと思いトライしてみました。TFTも中華から購入済みです。最初、サンプルプログラムなので、問題なく動くと思っていましたが、やはり初体験では、右往左往状態になりました。兎に角、手当たりしだい試すのですが、上手くは行きません。あれこれとやっている内に段々と調べて試している内に情報も増え、ある情報でハッと気づくもんなんです。まず、サンプルプログラムはよく考えられて作成されています。というのは、TFTの種類、ESP32などの種類に合わせて定義を設定するヘッダーが用意されているんです。User_Setup.hというヘッダーです。これには悩みました。最初はどれを選んで、どれを使わないかの設定の仕方がわかりませんでした。設定した記録のWeb情報も最初はみつけれませんでした。このため、適当に設定してコンパイルしてもエラーをばかりで、本当に動くサンプルなのかと思うような状況でした。使用するのはESP32です。対応するTFTのドライバーの設定は購入した物はST7735Sなので問題はないだろうと思いました。次のドライバー設定を選択するのですが、これが違ったらおかしいぐらい他にはありません。
#define ST7735_DRIVER
画面のWIDTH,HEIGHTもTFTの仕様(128*160)から全く問題は無いはずです。
#define TFT_WIDTH 128
#define TFT_HEIGHT 160
が、しかしそれ以外の設定では、TFTの初期化の定義がわかりません。何かでは1.8インチのTFTのサンプルプログラムでは見てはいたのですが、たくさんあるうちのどれかを選ぶとなると、わからない状態になります。これは、後からのWeb情報から判明することになります。
他は、ESP32に対するTFTのピンの接続です。これも問題はなかったのですが、2つの接続がわかりませんでした。特に、購入したTFTにはSD用端子も付いていて、迷わせるんです。下記の4つです。
SD_CS, SD_MOSI, SD_MISO, SD_SCK

選ぶ接続は以下で明白なのですが、MISO,MOSI,SCLKが特に迷わせられました。
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS   15  // Chip select control pin
#define TFT_DC    2  // Data Command control pin
#define TFT_RST   4  // Reset pin (could connect to RST pin)

特にTFTのピン接続がわからない状態でした。1.8inchi TFTの端子名は
VCC
GND
CS
RESET
A0
SDA
SCK
LED
です。
TFT_CSはCSと同じで問題ないでしょう。他はTFT_SCLKはSCKかな?というぐらいです。情報がないとこれぐらいの対応しかわかりません。TFTのVCCとGNDは問題なく電源とグランドとわかります。
それ以外は、Web情報を調べてゆく内に少しずつ分ってきます。

VCC  は問題なく電源3.3V
GND  は問題なくGND
CS:(15)は     (TFT_CS)に対応、間違いなかったです。
RESET:(4)は(TFT_RST)に対応、間違いなかったです。
A0:(2)は (TFT_DC)に対応、Web情報より
SDA:(23)は(TFT_MOSI)に対応、Web情報より
SCK:(18)は(TFT_SCLK)に対応、間違いなかったです。
LED:は VCCに接続、Web情報より
左がTFT端子名:()はESP32 DivKitC側の端子番号です。

Web情報の1つは中華のWebページからです。User_Setup.hの選択を載せてくれていました。

http://ep.ckvs.tyc.edu.tw/blog/files/6-5919-9910.php

下記がページの表題です。
ESP32-WROOM-32D + TFT LCD(含環境設定)

TFTのWIDTHは132誤記で選択肢にはありません。128です。HEIGHTも162は誤記で160です。
以下抜粋です。
1.開啟 [ \Arduino\libraries\TFT_eSPI-master\User_Setup.h ] 檔案
2.將以下程式碼取消註解

23    #define ST7735_DRIVER      // Define additional parameters below for this display
55    #define TFT_WIDTH  132
57    #define TFT_HEIGHT 162
76    #define ST7735_BLACKTAB
167   #define TFT_MISO 19
168   #define TFT_MOSI 23
169   #define TFT_SCLK 18
170   #define TFT_CS   15
171   #define TFT_DC    2
172   #define TFT_RST   4
231   #define LOAD_GLCD
242   #define SMOOTH_FONT
261   #define SPI_FREQUENCY  27000000

先に言ったTFTの初期化(リセット)が76の #define ST7735_BLACKTAB  です。
他、231、242、261も同じに設定します。(コメント化を外す)それ以外はコメント化(//)します。
167のTFT_MISOの19は繋がなくても良いとのことです。(SD_MISO)

上記の接続で、下記サンプルプログラムがコンパイルOK,書き込みOKとなりました。

TFT_Meter_5.no
CIMG8711

1.8inch TFT にメータのサンプル表示が出来ました。動画は少しピンぼけ!

バックが白で針が赤で綺麗なメーターです。無線のトランシーバー用のSメーターへ応用できれば最高ですね!スケッチを印刷して、少し見てみましょうか?改良できるかしらん?
他のTFT_eSPIのサンプルも試してみたいと思っています。
本当にESP32 DivKitCに取り憑かれてしまいました。なにせ、接続はESP実験ボードとTFTディスプレーの簡単接続だけで動作するし、しかも面白いのです。VFOsysをきっかけに、購入してよかったです。

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

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