マイコンのデータをPCへ取り込む手段に自由度をもとめるといきなりMicrosoftのやり方に合わせないといけなくなるのですが、VisualStudioは、プログラムを作ることを仕事、テーマにしている専門家の方なら便利でしょうけど、私のように、マイコン電子工作趣味で、プログラムは手段にしかすぎない人には、VSをつかいこなすために費やす時間が無駄としか思えません。いろいろ探した結果、ArduinoIDE的な使われ方をしている言語Processingに行きつきました。
※2020年9月追記
4年間Processingを使ってきましたが、最近、漸くVisualStudio2019を使って、VB.NETでプログラムを作る学習を始めました。食わず嫌いで、とっつきにくかったので、触るだけで3日x5時間くらいかけて何とか短いプログラムを作れるようになりました。シリアル受信プログラムを作って、速度を上げてみる460800bpsどころか921600bpsまで簡単に高速受信できることが確認できました。VB.NETに慣れてしまうとProcessingは不要になります。私のようにVSでVB.NETの敷居が高い方のために5分でシリアル受信プログラムが作れる動画を作りました。こちらのページをご覧ください。
●Processing入門(数時間でOKです)
こちらのMSLABO様が判り易く解説されてます。質問メールすれば丁寧に回答していただけます。
●460800bpsでデータ受信してCSVファイル保存プログラム(コピペで動作します)
今回は、ProcessingでマイコンのUSBシリアルポートから460800bpsという高速通信ができたプログラムを備忘録しておきます。この速度だと、マイコンのAD変換周期500μsecで1行20バイトのデータをPCへ転送してAD変換を5分間回して、60万行分のデータをCSVファイル保存できました。
Processingのシリアル通信コマンドはわずか数行だけです。
これだけで好きな受信ププログラム作れます。
●プログラムのシリアル受信コマンド
①冒頭の宣言として=>import processing.serial.*; ②オブジェクト定義=>Serial myPort; ③データSgtring型配列定義(任意) => String [] mystringArry=new String[600000]; //recived data③COM番号とLIST番号表示=> printArray(Serial.list()); ④COM番号、ボーレート指定=>myPort = new Serial(this, Serial.list()[1], 460800);⑤COMポートをリセット=> myPort.clear(); ⑥受信ループ=>i++でデータ数カウント while (myPort.available() > 0) { myString = myPort.readStringUntil(cr); if (myString != null) { if (i==0){startTime=millis();} i++;//data cout print(i,myString); mystringArry[i]=myString; } ⑦ループの終了=>KEY割り込みを使ってbreakする
|
●Processingソース
コピペしてCOMポート番号をあわせればCSVファイル作ってくれます。RUNでロギング開始して’q’キー入力で、CSVファイルとしてSAVEしてくれます。データ行数は60万行になってますが、もっと大きくしても動作すると思います。
①動作概要
・マイコンからのシリアル通信を割り込み処理で受信してます。
・RUNさせている間、受信データ1行分をデータ配列String[]に記録してPCのメモリーに保持してます。このプログラムでは、60万行分を配列定義してます。高速化のために、
※受信データはString形式のままCSVに保存してますので、CRLFもそのまま保存されれますので、マイコン側の送信文字列でLFを省いておかないとCSVファイル改行が2回はいって空行が1行入ってしまうので注意です。
・text表示のためにcontrolP5ライブラリ使ってますが、テクスト表示しなくてもRUNさせて、下部モニターに受信データが流れますので、きりのいいところで’q’キーインすれば受信停止して、CSVファイルにSAVEしてくれるので、ControlP5関係を消しても動作します。
Processing Source:HIghSpeed_SerialDataSampling_460800bps
// Example by Tom Igoe //Shinshu Makers customiazed // Serial Speed 460800bps Recieving OK // Recieving 600000 sample data //Push ‘q’ key stop program and Save CSV file import controlP5.*;//TEXT DISPLAY library ControlP5 cp5tl; Textlabel tl1,tl2; import processing.serial.*; //serial library PrintWriter output;//file saving declaration int lf = 10; // Linefeed in ASCII int cr=13; // NA String myString = null;//buffer Serial myPort; // The serial port declaration int i,j; int elapsedTime; int startTime; int endTime; int endFlag=0; String [] mystringArry=new String[600000]; //recived data void setup() { //————— TEXT Diplay————————- size(600,100); background(0,0,0); PFont font; font=createFont(“Times New Roman”,30); textFont(font); //Display Comments cp5tl=new ControlP5(this); tl1=cp5tl.addTextlabel(“lable1″); tl1.setText(” Data Sampling ==>Push ‘q ‘ save CSV&Stop”); tl1.setFont(font); //——————————————————— // List all the available serial ports printArray(Serial.list());//Search serial portNo=Serila.list(No) // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 460800);//COM No set and baud rate set myPort.clear(); // Throw out the first reading, in case we started reading // in the middle of a string from the sender. myString = myPort.readStringUntil(lf);//LF delimitor myString = null; // CSV FILE TIME STAMP String filename = nf(year(),4) + nf(month(),2) + nf(day(),2) + nf(hour(),2) + nf(minute(),2) ; output = createWriter( filename + “.csv”); i=0; }void draw() { // LOOP Serial Recieved data are stored to mystringArry[] while (myPort.available() > 0) { myString = myPort.readStringUntil(cr); if (myString != null) { if (i==0){startTime=millis();} i++;//data cout print(i,myString); mystringArry[i]=myString; }} }// Key ‘q’ Interrupt and Save CSV FILE de Program end void keyPressed(){ int k; String[] datastr=new String[100];//1 line 100chara if( key == ‘q’ ){ for(k=0;k<i;k++){ //i data counted output.print(mystringArry[k]); } output.flush(); output.close(); exit(); } } |
●動作と使い方
ProcessingIDEを立ち上げて
ファイルー新規 で新規プログラム開きます。
プログラムを保存すればProcessingがそのプログラム名のフォルダーを作ってくれます、そのフォルダーにCSVファイルが保存されます。
ここに上記HIghSpeed_SerialDataSampling_460800bps
をコピペします。
シリアルCOM番号は、デフォルトで0番になってますが、ケースバイケースでCOM番号が変わりますので、違っていればエラーになりますので、COM番号を合わせて、書き込む必要があります。
便利に出来ていて、35行目のprintArray(Serial.list());で、現在
使われているCOMポート番号とLIST番号の照合を下部のモニター窓にPRINTしてくれます。ここでは、COM15は[0]ということなので、37行目の[0]となっていればCOM15接続してくれます。複数COM番号ある場合は、自分が接続したいCOM番号の指定するLIST番号を[x]指定すればOKです。
myPort = new Serial(this, Serial.list()[0], 460800);
→でRUNさせれば、下記のような窓がでて連続してサンプリングが始まります。止めたければ、
‘q’ボタンをおすとCSVファイルを書き込んで、プログラムは終了します。あとは、このプログラムのあるフォルダーにCSVファイルがタイムスタンプ付きで保存されます。