南無ちゃんのブログ    https://namva.net

天下御免の夢中人=南無ちゃんは、今日も元気で明るく楽しく逞しく生きてゆく。

続・リニアアンプ操作パネルの画面作成

2024-07-14 20:37:39 | プログラミング

 今日は一日中雨だったので、プログラミングをして遊びました。7月2日以来中断していたリニアアンプ操作パネルの続きです。画面の表示位置などは概ね決着したので、次は画面に動きを与える番です。ラズパイpicoにはアナログ入力として使えるピンが3つあります。このうちの2つに可変抵抗器を接続して、その電圧を進行波電力および反射波電力として表示させるようにしました。

 2つの可変抵抗器をドライバーで回すと、進行波電力(FWD)と反射波(REF)のバーグラフと数値表示が変化するようになりました。

 

 ドレイン電圧やドレイン電流などもAD変換したいのですが、ラズパイpico内蔵のアナログ入力だけでは不足しています。I2Cなどを使ってアナログ入力ポートを増やす必要がありそうなので、Amazonかどこかで調達しようと思います。

 

コメント

リニアアンプ操作パネルの画面作成

2024-07-02 18:18:24 | プログラミング

 一昨日から作成していたLCDパネルの画面設計を元に、実際に液晶パネルに描画してみました。パソコンの画面とは違って、使えるフォントの種類やサイズに制約があるので、表示場所を多少変更するなどのトリミングが必要でした。色に関しては16ビットカラー(6万色)が使えるので問題はありませんが、背景色と表示する文字の色との関係で見にくくなったりするので、色々試してみました。色彩的なセンスは持ち合わせていませんので、いい加減なところで折り合いをつけました。

 何種類かのアイコンも作成してみました。画面左上の横三本線のアイコンは、メニュー表示の意味で、此処をタッチすると保守用の画面が開くようにする予定です。

 Arduino IDEのC++ライクな環境で簡単にアイコンを定義するには、XBMフォーマットを使うと良いようです。16x16ドットの小さなアイコンを作るあたり、表計算ソフト(OpenOfficeのCalc)を使いました。Calcで方眼を作り、16行16列のブロック内を黒か白かに塗り分けてアイコンを作りました。それを目で見て、2進数(16進数)に手作業で変換します。

 プログラムでは次のような表現になりました。

//16x16 XBM, 3 stripes for menu icon
const unsigned char menu_icon[] = {
  0x00, 0x00, 
  0x00, 0x00, 
  0x00, 0x00, 
  0xff, 0xff, 
  0xff, 0xff, 
  0x00, 0x00, 
  0x00, 0x00, 
  0xff, 0xff, 
  0xff, 0xff, 
  0x00, 0x00, 
  0x00, 0x00, 
  0xff, 0xff, 
  0xff, 0xff, 
  0x00, 0x00, 
  0x00, 0x00, 
  0x00, 0x00, 
  };
//16x16 XBM, X mark for exit icon
const unsigned char exit_icon[] = {
  0x02, 0x40,  
  0x07, 0xe0,  
  0x0c, 0x70,  
  0x1c, 0x38,  
  0x38, 0x1c,  
  0x70, 0x0e, 
  0xe0, 0x07, 
  0xc0, 0x03,  
  0xc0, 0x03,  
  0xe0, 0x07, 
  0x70, 0x0e,  
  0x38, 0x1c,  
  0x1c, 0x38,  
  0x0c, 0x70,  
  0x07, 0xe0,  
  0x02, 0x40,  
  };
//16x16 XBM, left-arrow for prev icon
const unsigned char prev_icon[] = {
  0x00, 0x00,  
  0x00, 0x00,  
  0x40, 0x00,  
  0x60, 0x00,  
  0x70, 0x00,  
  0xf8, 0x3f, 
  0xfc, 0x3f, 
  0xfe, 0x3f,  
  0xfc, 0x3f,  
  0xf8, 0x3f, 
  0x70, 0x00,  
  0x60, 0x00,  
  0x40, 0x00,  
  0x00, 0x00,  
  0x00, 0x00,  
  0x00, 0x00,  
  };
//16x16 XBM, right-arrow for next icon
const unsigned char next_icon[] = {
  0x00, 0x00,  
  0x00, 0x00,  
  0x00, 0x02,  
  0x00, 0x03,  
  0x00, 0x0e,
  0xfc, 0x1f, 
  0xfc, 0x3f, 
  0xfc, 0x7f,  
  0xfc, 0x3f,  
  0xfc, 0x1f, 
  0x00, 0x0e,  
  0x00, 0x03,  
  0x00, 0x02,  
  0x00, 0x00,  
  0x00, 0x00,  
  0x00, 0x00,  
  };

 

 アイコンを表示するために、次のような関数を作成しました。

void showIcon(const unsigned char icon[], int16_t x, int16_t y, uint16_t color){
  tft.drawXBitmap(x, y, icon, 16, 16, color);
}

 これを次のように呼び出して、任意のアイコンを指定した座標に指定した色で表示します。

 showIcon(menu_icon, 5, 11, TFT_WHITE);

//  showIcon(exit_icon, 294, 215, TFT_RED);
//  showIcon(prev_icon, 5, 215, TFT_YELLOW);
//  showIcon(next_icon, 30, 215, TFT_YELLOW);

コメント

続VisualStudioでLCD画面レイアウト設計

2024-07-01 09:21:51 | プログラミング

 今日は朝から本降りの雨なので、無線小屋に籠ってプログラミングをして遊んでいます。昨日VisualStudioで作成したLCD画面のレイアウト設計に操作部を追加して、バーグラフや数値などの画面表示をリアルに変更できるようにしました。

 上段の数値は、左からドレイン電流、ドレイン電圧、入力電力、効率を示しています。実機ではドレイン電流とドレイン電圧は計測して取得します。入力電力は、ドレイン電圧とドレイン電流を掛けた値です。効率は、進行波電力(FWD)の入力電力に対する割合(%)を計算で求めます。FWDは進行波電力、REFは反射波電力で、実機では計測して取得します。SWRは、FWDとREFから計算により求めます。実機では計測して求める値4つの値を、4つのNumricUpDownControlを使って入力することができるようにしています。

 LCD画面レイアウトの設計をVisualStudioを使って行いましたが、この画面レイアウトは、WiFi付きのラズパイpicoで実機を構成して、PCからWiFiで遠隔操作するようにした時に、そのまま再利用することができるので一石二鳥です。

コメント

LCDの画面設計ツールとしてVisualStudioを使う

2024-06-30 18:00:27 | プログラミング

 フルグラフィック液晶にラズパイpicoを使って文字やバーグラフを表示しようと思っています。四角形の描画や塗りつぶし、テキストの表示等は、TFT_eSPIライブラリを使う予定ですが、何を何処に描くのかという画面設計が先です。そのためのツールとして、方眼紙と鉛筆を使うなんていうのは時代遅れなので、何か良いツールはないものかとアレコレ検討した結果、PCのアプリを開発する時にいつも使っているVisualStudioのフォーム設計画面が使えるだろうということを思いつきました。

 フォームまたはPictureBoxのサイズをLCDパネルの解像度に合わせて、320x240ドットとしておいて、この上に四角や文字などをレイアウトすれば、ラフスケッチが完成します。文字のフォントやサイズはTFT_eSPIライブラリで使えるモノとは異なるので、ぴったりとは言えませんが、凡その感じを掴むことができます。その上、各オブジェクトのロケーションを読み取れば、それをLCDパネル上での座標として使うことができます。

 現在、くまさんのリニアアンプの操作パネルをLCD化するすることを検討していますが、次のようなレイアウトではどうかなぁ・・・と一つの案を作りました。VisualStudioを使えば、ラピッドプロトライピング(素早く試作すること)ができるので、幾つもの案を簡単に作ることができます。

コメント

TFT_eSPI・タッチパネル付表示器の例

2024-06-28 15:03:07 | プログラミング

 picoとQVGA液晶パネルの組合せで表示器としての動作例を再現して遊んでいましたが、今度は、せっかく表示器にタッチパネルが付いているので、タッチパネルのサンプルプログラムを動作させてみました。example/320x240/Keypad_240x320.inoというプログラムを試しました。その前に、タッチパネルが動作できるように、インターフェス信号の配線を追加して、以下のような接続にしました。

<<<pico側>>>    <<<LCD(ILI9341) 側>>>
信号名  ピン番号     信号名   ピン番号
3.3V       36          3.3V        1
GND        38          GND         2
GP17       22          /CS         3
GP22       29          /RESET      4
GP28       34          DC          5
GP19       25          SDI         6
GP18       24          SCK         7
3.3V       36          LED         8
                       SDO         9
GP18       24          T_CLK      10
GP1         2          T_CS       11
GP19       25      T_DIN      12
GP16       21          T_DO       13

 これに合わせて、User_setup.hを以下のように変更しました。
#define TFT_MISO  16
#define TFT_MOSI  19
#define TFT_SCLK  18
#define TFT_CS    17  
#define TFT_DC    28  
#define TFT_RST   22 
#define TOUCH_CS  1

 それなりに動作しましたが、起動毎にタッチパネルのキャリブレーションをする点が気になりました。プログラムに記述された通りなら、初回のみキャリブレーションを行い、2回目以降はファイルにセーブされたデータを読み出して、キャリブレーションなしで動作する筈です。

 原因は、元のプログラムではSPIFFSが使用されていますが、このファイルシステムが、どうもデフォルト状態のpicoでは上手く動作しないみたいです。ファイルシステムをSPIFFSからLittleFSに変更したら期待通りに初回のみキャリブレーションするようになりました。

 具体的には、次のよう変更しました。

1)Arduino IDEの「ツール」タブのFlash sizeを、取り敢えず 2MB(Sketch:1792KB,FS:256KB)にしました。

2)ソースプログラムを次のように変更しました。

 #include "SPIFFS.h" を#include "LittleFS.h"に置き換えて、"SPIFFS."を全部"LittleFS."に置き換えました。

 

コメント