無線ブログ集
メイン | 簡易ヘッドライン |
愛知タワー風速値表示追加その6 (2023/2/2 3:13:45)
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ポートへ変更のみです。
仮のパルス源のOSC周波数を色々と変え、ゆらぎの風に見立ててカウント値を確認しましたが、カウントが抜ける様な表示はありませんでした。低周波数カウンターは変化のある風速値を十分検出しカウント表示をしてくれています。
カウンター組込スケッチ追加部とバッティングによる変更スケッチ部です。
【定義部】
//------------------------------------------
#include "HzMeter_asukiaaa.hpp"
//------------------------------------------
#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);
//---------------------------------------------------------------
#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;
//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);
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;
}
//-----------------------------------------------------
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.fillScreen(ST77XX_BLACK);
tft.setCursor( 50, 50 );
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize( 5 );//10
tft.println(ce);
delay(dljikan);
}
液晶の表示も縦置きから横置きにし風速値のみ表示する様に余分な表示は消しました。
ひとまず表示だけでのArduinoNANOの試作は完成ということにします。後は実際のカウンターにつないでの最終確認がありますが後にします。
次は、元の軌道に戻り、ESP32DevKitCでのデコード表示にとりかかります。
つづく?
execution time : 0.020 sec