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

CENTER:&ref(./pr.png,60%);

**ラドン検出器用データ保存プログラムの例1 [#kff0f75b]
以下のプログラムを用いてデータの保存を行っています。~

 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 [#kff0f75b]
以下のプログラムは、リアルタイムで得られたデータをグラフ化させる機能が追加されています。~

プログラム
#ref(ADCread_timestamp_draw.pde);
 
 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;
		}
	}
 }

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS