jl7gmnのblog

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

測定器

愛知タワー風速値表示追加その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


つづく?


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

愛知タワー付属の風速計へつながっているインプット情報のカウント入力、リセット入力、電源、COMMONの各端子からCMOS IC 4024の7Stage Binary Ripple Counterへのカウント入力と4024の論理にあわせる為、リセット信号は1石のスィッチングトランジスタの反転回路を通して繋ぎます。回路図とパターン作製ができたので、このバイナリー出力の7ビットをESP32DevKitCに繫ぐインターフェース部を別基板で作製するための回路図を作製しました。スケッチは回路図での端子を決めてから検討してゆく事になります。単に入力の7ビットバイナリーデータのデコードです。単純に必要なものは入力の7ビットを繋ぐポート、電源、1.8inch TFT液晶ディスプレーを繋ぐポートがあれば事足ります。今は使いませんが、余分なシリアルポート端子も回路には入れてあります。

1.8 inch TFT液晶ディスプレーは、今まで使った実績がある物なので、過去の他の実績のある回路と同じ端子接続で使うことができます。スケッチ上のTFT設定は過去使ったものがそのまま使える利点があります。(検討が不要)実は回路図のTFT液晶部分や電源、シリアル端子部は前の他の回路をそのままそっくり流用です。使わないところを消して、必要な箇所を部品を置いて繫いでゆくやり方です。
AnemometerValueDisplay

カウンターからの7ビットの出力を受ける入力ポートも、過去同じ様な用途で使った実績がありますから、安心してスケッチできます。Hi!
回路図も作製できたので、ついでにパターンも作製してしまいました。回路が単純な引き回しなので、100X80mm基板は、スカスカです。

AnemometerValueDisplayPCB

今回は2枚基板の接続の合理的な端子の接続は全く考慮していません。基板を2階建てにした設計も必要かもしれません。今は検討段階での試作です。

さてスケッチを開始しましょうか?

つづく?

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

風速値表示回路のパターン作製でのジャンパー処理が必要でしたので、回路図を修正し若干のパターン修正を行ないました。当初LEDはピンヘッドジャックに差す予定でパターンを作製していましたが、ジャックを省き、確認時使うパターンということで入れてあります。確認時のみ使うだけで良く、風速値表示はESP32DevKitCに繋ぐTFTカラー液晶で数値として表示されるため特に問題がなければ部品としては取り付けしない予定です。

修正回路図:どうしても繋がらない箇所をジャンパーワイヤーを使いパターン
を修正しました。
修正パターン

※ちょっとしたeagle操作!
当初CMOSの電源とグランドの接続パターンがピン配線できなかったのですが、ちゃんと機能がありました。今までは、専用のICは使わないでソケットで配線していました。ないわけがないのはわかっていましたが、探すのが面倒でソケットで足りていました。Hi!知ってしまえば、やはり専用のICを使うと便利です。(ピンを調べなくても、回路図に出てきます。)
invoke
invokeでICをクリックして電源を選択すると回路図に表示されランドとしてパターン配線出来る様になりました。

実際に修正した最終ボトムパターンです。100X80mmの基板サイズに十分入ります。
修正パターンボトム

切削待ち基板が既に1枚あるので、コレを合わせて2枚になりました。
EAGLE CADは最初のparts選びが一番最初に悩むところかと思います。習うより慣れろという言葉が本当に当てはまると思います。部品のパーツも秋月の部品もありますからとても助かります。ESP32もあります。回路図でよく使うGND ,+12Vとかレギュレータ、コンデンサ、抵抗、インダクタンス、ピンヘッド、(ピンジャック代用)取り付け穴、LED、各ICソケット、ジャンパー、トランジスタ、ダイオード、基本的なパーツを押さえて於けば、一通り回路図がかけると思います。片面基板が対象ですので、EAGLE CAD では回路図ができてしまえば、後は部品を選んで基板上に置いて、ボトムパターンにてランド間を繫いでゆく手順です。特に最初によく使うパターン太さとドリル穴を選んで、一覧にパターン幅がなければ、手入力で数値を入れます。私はよく2mm幅を使いますが、この2mmは手入力になります。パターンをICの中を通したりする時はパターン幅を1.5mm幅とか、1mm幅とかに変えてます。ドリル穴径はディスクリートパーツリードが入る0.9Φにしています。ICソケットも0.9Φでokです。これらを設定してからパタ−ン化してゆきます。片面基板は、なれるとサッサと回路図を横にして、繫いでゆき、行き詰まったところで、ジャンパーを使います。全配線分が終了したら、微調整を行なう段取りです。(パターンの太さや、ランド補強、基板取り付け穴追加等)調整が終わったら、ベターアース化でパターン設計は終了です。後は切削マシーン用にガーバーデータ(パターン用とドリル用、切り抜き用)を作製です。コレぐらいの回路だと1日かからないで簡単に出来る様になります。当面はDIPタイプのICとディスクリートL,C,Rでいいのではないかと思っています。すすんでいる人はICもSOPとかチップL,C,Rで、基板業者にたのんでいますね。綺麗に出来上がるようですね。作ることが好きでやっていますので、簡単なのが私には向いていると思っています。今の所はブレッドボードでの実験で使った部品をまるまるそのまま使うやり方で行なっています。超アナログですが、一番楽しい所、醍醐味は回路を考えボードで確認している時です。Hi!

つづく?

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

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