2022.7.13
前へ
次へ
ホームページトップへ戻る


PIC−USBIO using BASIC

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第22回]



●簡易グラフの表示

ずっと昔からのお客様からメールをいただきました。
PIC−USBIO用BASICではグラフの表示はできないのですか?
というお問い合わせです。
データロガーとしての使い道を考えるとリアルタイムで取得するデータを数値で表示するだけだと値の変化などを把握することが難しいのでそれをグラフで表示できると利便性が高まります。
とのご要望です。

正直そこまでは考えていませんでした。
お考えはわかります。
ただ取得データをリアルタイムでグラフ表示するというのはPIC−USBIO用BASICではほぼ不可能に近い難題です。
最初からグラフィカルな画面表示ができるソフトを使ってそれとUSB制御を組み合わせればそういうものも可能かと思います。
しかしそれはもうBASICインタプリタなどカケラもないものになってしまうでしょう。
おそらくグラフィカルな画面にボタンなどを配して半ば全自動で動作するツールといったイメージになると思います。
それでPIC−USBIOを制御する?
いやいやいや。
それはちょっとイメージが違いすぎる、と私は思います。
大体あの狭い黒い画面の中だけで動作するというのが時代遅れなんですよね。
それを百も承知でそこにこだわっているのです。
もともとBASICインタプリタなるものはレガシーなCUI(Character User Interface)なのですからグラフィカルなものの対極にあります。
今時、流行(はやり)ませんよねぇ。
BASICインタプリタなどレガシーの最たるものですけれど、扱い易いプログラムとしては昔も今もずっと現役だと私は思っています。
あくまで用途を限れば、の話でしょうけれど。
私としてはPIC−USBIOの制御こそBASICインタプリタの格好のターゲットだと思っています。

ということでせっかくのご要望なのですけれど、それはちょっと実現は難しいかと思います。
ご希望のレベルにはとても及ばないとは思いますがPRINT文を使った簡易グラフィックならBASICインタプリタでもなんとかできます。
参考までにサンプルプログラムを作ってみました。

たったこれだけの簡単なプログラムです。
行番号10〜90はグラフ表示のためのサンプルデータを作成している部分でグラフの表示に直接関係はしていません。
グラフの表示を行なっているのは行番号100〜160です。
そのうち1個分のデータをグラフ表示しているのは行番号120〜140です。

今は試作版のBASICインタプリタですから/CONVコマンドで中間言語に翻訳します。

そのあとRUNコマンドで実行します。

実際のデータロガーのデータ入力ならばプログラムの設定に応じて決められた時間間隔でデータを取得してそれをグラフ表示することになりますが、今回はあらかじめ作成したサンプルデータなので全データのグラフ表示が間をおかずに表示されてしまいます。

左端に表示されているのがデータです。
表示部分ではプログラムのミスでデータよりも+1多く*が表示されています。
画面の横方向の表示は最大80字ですから最大でも75ぐらいまでの数値しか表示できません。
8ビットのデータの最大値は255ですからその1/4ぐらいしか表示できません。
最大値まで表示したいときは値を4で割ってそれを表示することになります。
ほんの目安程度にしかならない簡易グラフィックですが、プログラムとしては超簡便でありましょう。
そこがBASICインタプリタのウリなのです。

グラフの全体はログで見ることができます。
logfile piciolog\07122202.txt open
*** pic i/o ***
pic i/oが接続されていないか電源が入っていません
>/load test93.txt
loading test93.txt ...16lines read ok
>list
   10 dim a(100)
   20 for n=0 to 50
   30 a(n)=n
   40 next n
   50 b=50
   60 for n=51 to 100
   70 a(n)=b
   80 b=b-1
   90 next n
  100 for n=0 to 100
  110 print a(n),;:if a(n)<10 print " ";
  120 for c=0 to a(n)
  130 print "*";
  140 next c
  150 print
  160 next n >/conv
txtbfend=16
txtbfi=0
txtbfi=1
txtbfi=2
txtbfi=3
txtbfi=4
txtbfi=5
txtbfi=6
txtbfi=7
txtbfi=8
txtbfi=9
txtbfi=10
txtbfi=11
txtbfi=12
txtbfi=13
txtbfi=14
txtbfi=15
gnoiend=0
>run
0  *
1  **
2  ***
3  ****
4  *****
5  ******
6  *******
7  ********
8  *********
9  **********
10 ***********
11 ************
12 *************
13 **************
14 ***************
15 ****************
16 *****************
17 ******************
18 *******************
19 ********************
20 *********************
21 **********************
22 ***********************
23 ************************
24 *************************
25 **************************
26 ***************************
27 ****************************
28 *****************************
29 ******************************
30 *******************************
31 ********************************
32 *********************************
33 **********************************
34 ***********************************
35 ************************************
36 *************************************
37 **************************************
38 ***************************************
39 ****************************************
40 *****************************************
41 ******************************************
42 *******************************************
43 ********************************************
44 *********************************************
45 **********************************************
46 ***********************************************
47 ************************************************
48 *************************************************
49 **************************************************
50 ***************************************************
50 ***************************************************
49 **************************************************
48 *************************************************
47 ************************************************
46 ***********************************************
45 **********************************************
44 *********************************************
43 ********************************************
42 *******************************************
41 ******************************************
40 *****************************************
39 ****************************************
38 ***************************************
37 **************************************
36 *************************************
35 ************************************
34 ***********************************
33 **********************************
32 *********************************
31 ********************************
30 *******************************
29 ******************************
28 *****************************
27 ****************************
26 ***************************
25 **************************
24 *************************
23 ************************
22 ***********************
21 **********************
20 *********************
19 ********************
18 *******************
17 ******************
16 *****************
15 ****************
14 ***************
13 **************
12 *************
11 ************
10 ***********
9  **********
8  *********
7  ********
6  *******
5  ******
4  *****
3  ****
2  ***
1  **
>/exit

リモート接続を終了しました
logfile closed at Tue Jul 12 22:05:10 2022

記事を書いていてふと思いついたのですが。
精細なグラフなどをWindows画面に表示させることは上のほうに書きましたようにCUIであるBASICインタプリタとしてはほぼ不可能です。
しかし外部に(多分USB接続することになると思います)小型の液晶グラフィック表示器を接続してそこにデータを出力表示することなら可能かと思います。
グラフィック型の液晶表示器については以前から興味はもっていましたから(時間の関係ですぐには無理かとは思いますが)いずれ何とか実現したいと思います。

PIC−USBIO using BASIC[第22回]
2022.7.13upload

前へ
次へ
ホームページトップへ戻る