Scilab を使ってLPC1343とシリアル通信 & データ処理 ADCデータのリアルタイムデモ


1. ScilabでLPC1343のADC データをリアルタイム表示
(データに応じて円のサイズ変更)

開発Listへ戻る

フォトセンサーのデータの出力に応じて
scilabの円グラフの円のサイズをリアルタイムに
変更させるデモのようなものを作りました。

こんな感じです。

円のサイズが変わっています。
フォトセンサーの上に手をかざすと、出力が小さくなるのでそれに連動して
円のサイズが小さくなります。

画面がチラチラしています。
これはscilabのグラフを使っているためです(回避方法わからず・・)
scilabのグラフは通常、重ね書きをするので前のプロットが残ってしまいます。
それじゃあかっこ悪いので、前のプロットを消してから、新しいデータをプロットしています。
前のプロットを消して新しいプロットをするというコマンドがなく
消すというコマンドとプロットをするというコマンドを行っているために
チカチカ点滅してしまいます。

こんなもんなのかなぁ。。

LPC1343回路準備
以前のエントリを参照。
 2)回路&LPC1343準備編(2012.4.27)

Scilab プログラムフロー
今回は無限ループを使い、デモを終了する際には'Ctrl'キー+'C' キーで抜けるようにします。

1)準備: COM portを接続する (scilab コンソールで実施)

2)円グラフデモ関数実行
  2-1 円グラフ準備
  2-2 LPC1343にADCデータ取得指示 & Scilabがデータ取得(関数の中で実施)
  2-3 取得データ正規化 & 円データ変更
  2-4 グラフupdate (クリア+描写)
   2-2〜2-4は無限ループ

3)終了処理
'Ctrl'キー+'C' で終了
abortで標準レベルのプロンプトに戻る
COM portを閉じる


Scilab 関数 コード
プログラムフローの2)の部分のみです。

function ad0circle_r ()

// 1)円グラフ準備
t=0:0.01:2*%pi;
x=sin(t);
y=cos(t);
x2=x;
y2=y;

while 1 // 無限ループ

// 2)LPC1343のフォトトランジスタADCデータ取得
writeserial(h,"ad0"+ascii(13)+ascii(10)); // ad0 CR+LF送信
sleep(30); //30ms wait: LPC1343の動作時間 & 通信時間考慮
d=readserial(h); //シリアル受信データ取得
[d,endstr]=strtod(d); //char->int

//3)データの正規化
d=d/1023
x2=d*x;
y2=d*y;

// 4)グラフに表示する
clf; //clear glaph
plot2d(x2,y2,rect=[-1,-1,1,1],axesflag=0) // グラフ表示

end
endfunction

解説
関数の名前はad0circle_rにしました。

ほぼコメントどおりなのです。
グラフに表示する際に 'clf'で一度グラフを消してplot2dで再度描写するという形なので
デモがチラチラしています。

plot2dではrectでx,y軸のmin_maxを固定しています。
またaxesflag=0で軸の表示を消しています。

clfでグラフを消すと軸まで消えます、軸の部分のチラチラ感をなくそうということで
軸は消しました。


Scilab 関数実行

1)関数ファイルの作成
 Scilab コンソールでアプリケーションSciNoteを開き
 上の関数のコードをコピペします。
 そして、適当な場所に保存
 関数の名前.sciで保存します。先ほどの関数はad0circle_r でしたので
 ad0circle_r .sciで保存します。

2)実行の様子

 2-1)-->exec("macros/ad0circle_r.sci");
   関数を使えるようにする。
   execは絶対パス相対パスかでファイルの指定が必要です。
   相対パスの場合は現在のフォルダを
   コンソールの "ファイル→現在のディレトリを変更" で変更できます。

 2-2)-->h=openserial(1)
   COM portを開く。
   今回、私の場合はCOM1で通信する事だったので ()に'1'を入れてます。
   関数の中に入れていないのは、無限ループ&強制終了を使うデモなので
   COM port開く処理を入れてしまうと、COM portを正しく閉じることが出来ないためです。

 2-3)-->ad0circle_r()
   関数の実行
   別windowが出てきて、冒頭の動画のデモのができるようになります。
   無限ループです。

 2-4)-1->
   'Ctrl'キー+'C' で終了したときです。
   従来は-->で待ち受けているのに、-1->となっています。
   違うモードになっています。

 2-5)-->abort
   標準プロンプトに戻る。
   -1->から従来の-->に戻ります。

 2-6)-->closeserial(h)
   COM portを閉じます。

最近は新しい技術が非常に多くあるので
イチイチ説明を聞いて判断してくれる人が少なくなってきました。
百聞は一見にしかず!デモで理解してもらう必要性が高くなっています。
効果的でかつ簡単なデモの方法をこれからも調べて行きたいとおもいます。