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()で実行することができ
冒頭のグラフがでてきます。
その他
・execは絶対パスか相対パスかでファイルの指定が必要です。
相対パスの場合は現在のフォルダを
コンソールの "ファイル→現在のディレトリを変更" で変更できます。
・funcprot(0) :
execを一度実行した後でスクリプトを修正した場合、
もう一度execを実行する必要があるのですが、エラーが起きます。
funcprot(0)を入れるとexecが実行できるようになります。
これで、LPC1343で取得したデータを可視化することが出来ました。
scilab内でシュミレーションすることもできます。
取得したデータからアルゴリズム開発などをMCUコーディングで
カットアンドトライするよりも
シミュレーションの方が効率的な場合も多いはずです。