Processing

Processing は、電子アートとビジュアルデザインのためのプログラミング言語である。視覚的な フィードバックが即座に得られるため、初心者がプログラミングを学習するのに適しており、電子 スケッチブックの基板としても利用出来る。 Arduino のソフトウェア (IDE) は Processing がベースとなっているため、Processing により Arduino の制御が可能である。本研究では、Arduino においてなされる波高分析の結果を PC に送 信し、ファイルに保存する処理を Processing を用いて制御した。下図は、Processing の IDE で ある。

pr.png

ラドン検出器用データ保存プログラムの例1

以下のプログラムを用いてデータの保存を行っています。

import processing.serial.*;//Serial libraryを読めるおまじない

int y;
int firstsign;
int secondsign=0;
int signdata=0;
int num_a = 0;//[] = new int[10];
int num_b = 0;//[] = new int[10];
int num_fivesign = 0;//[] = new int[10];
int num_sixsign = 0;//[] = new int[10];
int savetime;//いつ始まったか
int totaltime = 6999999;//(ms)
String filename = "uchimura_Rnstone_0519.txt";//保存するファイルの名前

Serial usbPort;
PrintWriter x;//保存用の変数を用意

void setup(){

  savetime = millis(); 
 
  usbPort = new Serial(this,"/dev/cu.usbserial-A400FSSD",9600);
 
  x = createWriter( filename );//ファイルを生成
  x.print("TIME(s)");//1行ごとの書き込み
  x.print("   ");  
  x.println("PulseHeight(ch)");  
 
  size(300,300);
 
}

void draw(){
  int passedtime = millis() - savetime;
  background(128);
  text(passedtime,50,50);
 
  if (passedtime >= totaltime){
 
    x.flush();//データの保存
    x.close();//ファイルを閉じる
  
    exit(); // Stops the program
   
  }
 
}

void serialEvent(Serial usbPort){
       
  signdata++;
         
  if(secondsign < 2){

    firstsign = usbPort.read();      
     
      if (firstsign == 1 && secondsign<1){
        secondsign++;

     }

    if (firstsign == 255 && secondsign == 1){
       secondsign++;

    }
 }
 
 if (secondsign >= 2 && usbPort.available() >= 4){//Arduinoから送られてきたデータが4以上なら。。
      
     num_a = usbPort.read();//usbからくるデータを読み込む
     num_b = usbPort.read();
     num_fivesign = usbPort.read();
     num_sixsign = usbPort.read();
     
     if( num_fivesign == 255 && num_sixsign == 1 ){
       
       y = num_a * 256 + num_b;//式
       
       if( y >= 0 && y < 1024 ){

         int passedtime = millis() - savetime;
         int new_passedtime = floor(passedtime/1000);

         x.print(new_passedtime);//1行ごとの書き込み
         x.print("    ");  
         //x.print(num_a);
         //x.print("    ");  
         //x.println(num_b);
         x.println(y);  
         x.flush();//データの保存

       }                     
     }
 }

   if(signdata > 6){
   
       signdata = 0;
       secondsign = 0;
   
   }
}

ラドン検出器用データ保存プログラムの例2

以下のプログラムは、リアルタイムで得られたデータをグラフ化させる機能が追加されています。

プログラム

import processing.serial.*;//Serial libraryを読めるおまじない

int s_time;
int n_time;
int y;
int firstsign;
int secondsign=0;
int signdata=0;
int num_a = 0;//[] = new int[10];
int num_b = 0;//[] = new int[10];
int num_fivesign = 0;//[] = new int[10];
int num_sixsign = 0;//[] = new int[10];
int entry;
int lens = 5; //拡大縮小倍率 
int savetime;//いつ始まったか
int totaltime = 10000;//(ms)
String time_n;
String graph_t = "Radon Gas 2012.8.17";//リアルタイムで更新されるグラフの表示タ イトル
String filename = "Signal_0823.txt";//保存するファイルの名前

int[] data = new int[1024];  
 
float plotX1, plotX2; 
float plotY1, plotY2;
float labelX, labelY;
float a = 1.0;

boolean press=false; 

Serial usbPort;
PrintWriter x;//保存用の変数を用意 

void setup(){
 
 size(1124,600);
 s_time = millis();

 savetime = millis(); 
 
 usbPort = new Serial(this,"/dev/cu.usbserial-11BNP108",9600);
 
 x = createWriter( filename );//ファイルを生成
 x.print("TIME(s)");//1行ごとの書き込み
 x.print("   ");  
 x.println("PulseHeight(ch)");  
 
 //size(300,300);
 
 plotX1 = 50; 
 plotX2 = width - plotX1; 
 plotY1 = 90; 
 plotY2 = height - plotY1;
 entry = 0;
 
}

void draw() {

 background(#87CEFA);
 fill(0);
 textAlign(LEFT);
 textSize(20);

 n_time = (millis() - s_time)/1000;

 if (n_time >= totaltime){
	x.flush();//データの保存
	x.close();//ファイルを閉じる
	exit(); // Stops the program
 }
   
 if (n_time < 60) {
	text(n_time, 50, 50);
	text(" [s]", 80, 50);
 }
 else if (n_time >= 60 && n_time < 3600) {
	text(n_time/60, 50, 50);
	text(" [min]", 80, 50);
	text(n_time%60, 200, 50);
	text(" [s]", 230, 50);
 }
 else if (n_time >= 3600) {
	text(n_time/3600, 50, 50);
	text(" [h]", 80, 50);
	text((n_time%3600)/60, 200, 50); 
	text(" [min]", 230, 50);
	text((n_time%3600)%60, 350, 50); 
	text(" [s]", 380, 50);
 }

 fill(255); 
 rectMode(CORNERS); 
 noStroke(); 
 rect(plotX1, plotY1, plotX2, plotY2);
 if (mouseX>650 && mouseX<750 && mouseY>50 && mouseY<70){//ボタンの矩形範囲にマウスがある 時
	fill(#000000);//ボタン塗り色を#F0F8FFにする
	stroke(#696969);
 }
 else{
	fill(#F0F8FF);//ボタン塗り色を#F0F8FFにする
	stroke(#DCDCDC);
 }
 rect(750, 50, 650, 70);
 if (mouseX>650 && mouseX<750 && mouseY>50 && mouseY<70){//ボタンの矩形範囲にマウスがある 時
	fill(#F8F8FF);//moji色を#F0F8FFにする
 }
 else{
	fill(#000000);//moji色を#F0F8FFにする
 }
 text("ZOOM", 670, 68);
 if (mouseX>800 && mouseX<900 && mouseY>50 && mouseY<70){//ボタンの矩形範囲にマウスがある 時
	fill(#000000);//ボタン塗り色を#F0F8FFにする
	stroke(#696969);
 }
 else{
	fill(#F0F8FF);//ボタン塗り色を#F0F8FFにする
	stroke(#DCDCDC);
 }
 rect(800, 50, 900, 70);
 if (mouseX>800 && mouseX<900 && mouseY>50 && mouseY<70){//ボタンの矩形範囲にマウスがある 時
	fill(#F8F8FF);//moji色を#F0F8FFにする
 }
 else{
	fill(#000000);//moji色を#F0F8FFにする
 }
 text("OUT", 830, 68);
 drawTitle();
 text("Entries", 500, 68);
 text(entry, 580,68);
 textAlign(CENTER);
 for (int k = 1; k <= 10; k++) {
	stroke(#D3D3D3);
	line(50+k*100, 510, 50+k*100, 90);

	if (k < 5) {
		line(50, 100*k+10, 1074, 100*k+10);
		textSize(12);
		text((int)((500-k*100)/a), 30, 100*k+10);
	}
	text(k*100, 50+k*100, 530);
 }
 for (int j = 0; j < 1024; j++) {
	if (data[j]!=0){
		if (a*data[j] < 420) {
			stroke(#0000FF);
			line(j+50, 510, j+50, 510-a*data[j]);
		}
		else {
			stroke(#0000FF);
			line(j+50, 510,j+50, 90);
		}
	}
 }

 text("0", 50, 530);
 text("[Ch]", 1060, 550);  
 text("[Count]", 20, 90);  
 text("1024", 1094, 530);
 strokeWeight(1);

}

void serialEvent(Serial usbPort){
       
 signdata++;
          
 if(secondsign < 2){

  firstsign = usbPort.read();      
     
  if (firstsign == 1 && secondsign<1){
       secondsign++;

  }

  if (firstsign == 255 && secondsign == 1){
       secondsign++;

  }
 }
 
 if (secondsign >= 2 && usbPort.available() >= 4){//Arduinoから送られてきたデータが4以上なら。。

     entry++; 
     num_a = usbPort.read();//usbからくるデータを読み込む
     num_b = usbPort.read();
     num_fivesign = usbPort.read();
     num_sixsign = usbPort.read();
     
     if( num_fivesign == 255 && num_sixsign == 1 ){
       
       y = num_a * 256 + num_b;//式
       
       if( y >= 0 && y < 1024 ){

         int passedtime = millis() - savetime;
         int new_passedtime = floor(passedtime/1000);

	  for (int i = 0; i < 1024; i++) {

 	    if (y == i) {
			data[i]++;
	    }

	  }

         x.print(new_passedtime);//1行ごとの書き込み
         x.print("    ");  
         //x.print(num_a);
         //x.print("    ");  
         //x.println(num_b);
         x.println(y);  
         x.flush();//データの保存

       }
                     
     }
 
 }
       
 if(signdata > 6){
   
       signdata = 0;
       secondsign = 0;
   
 }
 
}

void drawTitle() {
	fill(0);
	textSize(20);
	textAlign(LEFT);
	text(graph_t, plotX1, plotY1 - 10);
} 

void mousePressed(){//マウスが押されたら発動する
	if (mouseX>650 && mouseX<750 && mouseY>50 && mouseY<70){//ボタンの矩形範囲にマウスがある時
		if (a < 125) {
			a = a*lens;  
		}
	}

	else if (mouseX>800 && mouseX<900 && mouseY>50 && mouseY<70){//ボタンの矩形範囲にマウスがある時
		if (a > 0.25){
			a = a/lens;
		}
		else {
			a = a;
		}
	}
}

添付ファイル: fileADCread_timestamp_draw.pde 146件 [詳細] filepr.png 123件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-12-05 (水) 13:45:06 (1634d)