Scilab を使ってLPC1343とシリアル通信 & データ処理 ADCデータのグラフ処理


1. ScilabでLPC1343のADC データ取得 (COMポート経由)
2. データのグラフ化
(リアルタイムではなく100データ保存後グラフ化)

開発Listへ戻る

実際にLPC1343とScilabをつなげて
フォトダイオードの出力をグラフ化します。

こんな感じで出力されます。

Scilab プログラム関数フロー
以下のようにします。リアルタイムでグラフ化するのではありません。

1)COM portを接続する
2)LPC1343のフォトトランジスタADCデータを100回取得し内部に保存する
3)グラフに表示する
4)COM portを閉じる

Scilab 関数 コード

function ad0glaph ()

// 1) COM portを接続する。
h=openserial(2); //COM2と接続 COM10以上はNGのようだ

// 2)LPC1343のフォトトランジスタADCデータを100回取得し内部に保存する
n=ones(100,2); // 100個のデータ格納変数作成
for k=1:100, // 100回データ取得
n(k,1)=k
writeserial(h,"ad0"+ascii(13)+ascii(10)); // ad0 CR+LF送信
sleep(30); //30ms wait: LPC1343の動作時間 & 通信時間考慮
x=readserial(h); //シリアル受信データ取得
[x,endstr]=strtod(x); //char->int
n(k,2)=x;
end;

// 3)グラフに表示する
plot(n(:,1),n(:,2)) // グラフ表示
set(gca(),'data_bounds',[0,0;100,1023]); //グラフ軸範囲
set(gca(),'tight_limits','on'); //グラフ軸固定化

// 4)COM portを閉じる
closeserial(h);

endfunction

コード解説 
ad0glaphという関数名にしました。
コードの中でほとんど説明してますが追加で説明すると

・LPC1343は 回路&LPC1343準備編 で説明したようにad0と受信することでADCを実行して結果を返します。
また改行コードはCR+LFなので以下のように記載しています。

writeserial(h,"ad0"+ascii(13)+ascii(10)); // ad0 CR+LF送信

・また何もしないとScilabのグラフでは軸のMin,Maxを自動調整します。
LPC1343のADCは10bitなのでY軸範囲をを0-1023に固定するようにしました。

set(gca(),'data_bounds',[0,0;100,1023]); //グラフ軸範囲
set(gca(),'tight_limits','on'); //グラフ軸固定化

Scilab 関数 コード実行

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

2)関数を使えるようにする。
 .sciを作っただけでは関数は使えるようになりません。
execで定義してやらねばなりません。

3)execで定義後は ad0glaph()で実行することができ
 冒頭のグラフがでてきます。

実行の様子です。(funcprot(0)は下の説明参照)

その他
・execは絶対パス相対パスかでファイルの指定が必要です。
相対パスの場合は現在のフォルダを
コンソールの "ファイル→現在のディレトリを変更" で変更できます。

・funcprot(0) :
execを一度実行した後でスクリプトを修正した場合、
もう一度execを実行する必要があるのですが、エラーが起きます。
funcprot(0)を入れるとexecが実行できるようになります。


これで、LPC1343で取得したデータを可視化することが出来ました。
scilab内でシュミレーションすることもできます。
取得したデータからアルゴリズム開発などをMCUコーディングで
カットアンドトライするよりも
シミュレーションの方が効率的な場合も多いはずです。