サマチャレ 2017
データ収集制御
の編集
-- 雛形とするページ --
BracketName
FAQ
FormattingRules
FrontPage
Help
InterWiki
InterWikiName
InterWikiSandBox
MenuBar
PHP
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
SandBox
WikiEngines
WikiName
WikiWikiWeb
YukiWiki
グループ1
グループ2
グループ3
グループ4
グループA
グループB
グループC
グループD
サマーチャレンジ 2017
データ収集制御
データ解析
ラドン検出の原理
写真等
原子核崩壊の基本
実験装置
発表資料まとめ
自己紹介
資料集
[[サマーチャレンジ 2017]] #contents *Arduino [#k800e2c1] CENTER:&ref(./ArduinoNano.jpg,40%);&ref(./arduino_IDE.jpg,50%); 実験データを収集するために、マイクロプロセッサーを使います。電気回路が信号の入力を感知したときに、信号を保持する信号を電気回路に送ったり、次のデータ入力を待つための準備を指示したりします。ATMEGA328というマイクロプロセッサです。通常こういうプロセッサを使うためには入力ピンや出力ピンの複雑な設定が必要で面倒なのですが、Arduinoというオープンソースの開発環境が準備されていて、簡単に使うことが出来ます。 >>マイコンブームが起こったのは僕が学生の頃で、8080とかZ80とかいうワンチップのマイコンが売り出されて夢中になったものでした。 あのころはミニコンと呼ばれたDECのPDP-11がようやく原子核実験でも使われ始めたんだけど、阪大の研究室にはなかった。 RCNPのβ-NMRの実験をするというので制御を8080のマイコンキット(NECから当時10万円くらいで売り出されました)でやりたいって 提案して買ってもらったのがはじめてでしたね。もともとラジオ少年だったので、オペアンプやデジタルIC位は使える状態だったので意外と簡単で RCNPのサイクロのD電圧をON/Offする信号を発生したり、NMRのゲート信号を発生したり、楽しかった。でもコンパイラーなんてなかったので ハンドアセンブルして16進キーボードからタイプしてプログラムを入力しました。最初はプログラムを保存することもできなかったので、 マシンタイムの朝になると毎回ポチポチと手で入力していました。折角入力したところで、コンセントを蹴飛ばされて元の木阿弥になったことも。 そのうち、カセットテープにプログラムを保存出来るようになった時はうれしかった。 **[[Arduino Nano:http://arduino.cc/en/Main/ArduinoBoardNano]]のハードウェアの特徴 [#w5fd36c3] 小さな基板に、 -プログラマブルなデジタル入出力ピンが14本 -10bitのADC入力ピンが6本 -8bitのDACモドキ6本 -USBインターフェース が載っている。とにかく、かわいい。 **Arduino開発ソフトウェアの特徴 [#u7f1f98e] プログラミング環境として、IDE(integrated Development Environment)が、Mac OSX, Linux, Windowsで 提供されている。ボード自体はUSBの給電で動くので、パソコンにusbで接続した途端に使える。うれしいねえ。プログラムは C++ベースなので僕でも書ける。ソフトウェアのダウンロードは[[ここ:http://arduino.cc/en/Main/Software]]から。 **Arduinoを使用する上で注意すること [#r373726c] +ToolsのBordで、今回使用するArduino nanoを選択する~ +Serial Portにも注意する。ProcessingのプログラムのusbPortと合わせておく。~ **資料 [#r42ca0ad] ネットで探すとたくさんの情報を見つけられるけど、重要なところは、 ---[[Arduino本家:http://www.arduino.cc/]] ---[[日本語リファレンス:http://www.musashinodenpa.com/arduino/ref/]] ---[[Arduino project archives(本家の正しい遊び方かな):http://jp.makezine.com/blog/arduino/]] *Arduinoで遊んでみよう! [#s7672ae2] まず、各自のノートパソコンにArduinoの開発ソフトを[[ここ:http://arduino.cc/en/Main/Software]]からダウンロードすること。~ Arduinoの基本的な使い方は&ref(資料集/ar_ex.pdf,,,これ);を見て。下記の例題プログラムはコピペすれば動くよ。 **Arduinoの例題1 [#b5f686cd] ほとんど用意されているExampleと同じなんだけどね。順番にチカチカLEDが点きます。 Digital出力チャンネルは所謂three stateで入力設定時はhigh impedance状態、出力設定時はHIGHでは5Vで20mAくらい ドライブ出来る。すごいね。 /* Blink */ void setup() { pinMode(10, OUTPUT); pinMode(12, OUTPUT); } void loop() { digitalWrite(10, HIGH); delay(10); digitalWrite(10, LOW); delay(1000); digitalWrite(12, HIGH); delay(10); digitalWrite(12, LOW); delay(1000); } **Arduinoの例題2 マックのスリープ時のLEDを真似てみた。 [#u0817d4b] Program /* Ex-03 Sleeping */ int i=0; void setup() { pinMode(9, OUTPUT); } void loop(){ for (i=0;i<255;i++){ analogWrite(9,i); delay(5); } delay(30); for (i=255;i>0;i--){ analogWrite(9,i); delay(5); } delay(300); } **Arduinoの例題3 コンデンサーの放電曲線を測ってみる [#bfb6e7c5] ピン12番に抵抗(10kΩ)を通して、コンデンサー(4.7μF)と抵抗(10kΩ)を並列にグランドへ接続。 アナログ入力1番をコンデンサーの電圧を測る。 ピン12番を5Vにして、0.5秒間コンデンサーを充電。 その後、ピン12番をhigh impedanceにしてコンデンサーの電圧を測定する。 コンデンサーの電荷は10kΩの抵抗で放電して行く様子をみることに相当。 Program /* Ex-04 Discharge of capacitor */ unsigned long time,timezero; int val=0; int i=0; void setup() { Serial.begin(9600); Serial.println("plot ""-"" "); pinMode(12,OUTPUT); digitalWrite(12,LOW); delay(5000); digitalWrite(12,HIGH); delay(500); pinMode(12,INPUT); timezero=millis(); for (i=0;i<100;i++){ time=millis()-timezero; val =analogRead(1); Serial.print(time); Serial.print(" "); Serial.println(val); } Serial.println("end"); } void loop(){ } **ラドン検出器用データ収集プログラムを作ろう! [#m62cef95] シェイパー回路で整形増幅した波高を保持するために、サンプル&ホールド回路にGate信号を送り、保持されたADCの値を読み取ります。 #define ADC 01 int num;//データを入れる箱をつくる //S/Hの出力(ADC)はAnalogの0番ピン //Gate信号はDegitalの7番ピン //Trig信号はDegitalの3番ピン //グランドは共通にする void setup(){ pinMode(7,OUTPUT);//GATEピン digitalWrite(7,LOW);//最初ゼロの値を与える attachInterrupt(1,GATE,RISING);//割込関数。3番ピンがRisingしたらGATE関数を実行 Serial.begin(9600); } void GATE(){ /* 【Gate信号を発生させて下さい】 【アナログピンの値を読み込んで下さい】 【時間をおいてリセット用のGate信号を発生させて下さい】 */ senddata(); } void senddata(){ /* 【ProcessingへADCの値(10bit)を送信する】 例: - 波高データを10bitから8bitに変換する - ビット変換した2つの数値をシリアルポートへ出力する ※このとき安全なデータの送り方についても考えてみて下さい。例えば、10bitのデータを8bitで送ろうとすると数値を2回送信する必要があります。(x1, x2), (x1, x2), …。装置のノイズや何らかの送信ミスによって、データが上手く送れなかった場合、(x1, x2), (x2, x1), (x2, x1), …ということがあり得ます(3番目のx1が消失)。順番を間違えずにデータを送受信するにはどうしたらよいでしょうか? ※余裕がある場合には、パリティビットやスタート/ストップビットをキーワードに、安全かつ効率的なデータの送受信方法を考えてみてください。 */ } void loop(){ } *Processing [#t6ee7872] こちらは、USB経由でArduinoからのデータを受け取るためのソフトウェアだ。ノートパソコン上のソフトなのでいろんな方法はあるが、ここでは[[Processing:http://processing.org/]]というオープンソースのソフトを紹介しよう。ソフトを[[ここ:http://processing.org/download/]]からダウンロードしよう。 **資料 [#fafea966] 以下のページを参考にするとわかりやすい。 ---[[建築発明工作ゼミ2008:http://kousaku-kousaku.blogspot.com/2008/07/processing_10.html]] ---[[Processing reference:http://processing.org/reference/]] ---[[Processing reference(日本語):http://tetraleaf.com/p5_reference_alpha/]] **Processingで遊んでみよう! [#b25a4776] 以下のページにあるexampleを動かしてみると面白いよ。 ---[[Processing example:http://processing.org/examples/]] **Arduinoからのデータを受け取るプログラム例 [#f9ab61ae] データを受信処理するserialEventという関数の中身を考えてみよう!Arduinoのコードと対応させる必要があるよ。その他の部分はデータを画面に表示するプログラムの一例ですので、自由に書き換えてもらって結構です!~ import processing.serial.*;//Serial libraryを読めるおまじない int s_time; int n_time; int y; int entry; int savetime;//いつ始まったか int totaltime = 10000;//(s) int[] data = new int[1024]; //ADC値カウント用 String time_n; String graph_t = "Radon Gas 2012.8.17";//リアルタイムで更新されるグラフの表示タイトル String filename = "Signal_0823.txt";//保存するファイルの名前 //GUI for data monitoring int lens = 5; //拡大縮小倍率 float zoom_max = 125.0; float zoom_min = 0.04; float fZoom = 1.0; float plotX1, plotX2; float plotY1, plotY2; float labelX, labelY; float tmp_y; boolean press=false; Serial usbPort; PrintWriter x;//保存用の変数を用意 //初期設定 void setup(){ size(1124,600); s_time = millis(); savetime = millis(); //シリアル通信のための設定 usbPort = new Serial(this,"/dev/cu.usbmodemfd121",9600); //ファイル生成 x = createWriter( filename );//ファイルを生成 x.print("TIME(s)");//1行ごとの書き込み x.print(TAB); x.println("PulseHeight(ch)"); //canvas area plotX1 = 50; plotX2 = width - plotX1; plotY1 = 90; plotY2 = height - plotY1; entry = 0; } //ループ関数 void draw() { n_time = (millis() - s_time)/1000; if (n_time >= totaltime){ x.flush();//データの保存 x.close();//ファイルを閉じる exit(); // Stops the program } //Online monitoring makeCanvas(); makeButton(); drawTitle(); drawTime(n_time); drawAxis(); drawHistogram(); strokeWeight(1); } void serialEvent(Serial usbPort){ /* Arduinoから送信されたデータを受信するプログラムをここに書いて下さい。 - USBポートに送られたデータを読み込む - ADCの値へ戻す(ビット変換を行っている場合) - ファイルに受け取った時間とADCの値(10bit)を書き込む - データが安全に送られているかをチェックする機能をArduinoと一緒に ぜひ考えて下さい。 */ } //Functions for Online monitoring void makeCanvas(){ background(#87CEFA); fill(255); rectMode(CORNERS); noStroke(); rect(plotX1, plotY1, plotX2, plotY2); //plot area } void drawTitle() { fill(0); textSize(20); textAlign(LEFT); text(graph_t, plotX1, plotY1 - 10); text("Entries", 500, 68); text(entry, 580,68); } void drawTime( int in_time ){ fill(0); textSize(20); textAlign(LEFT); if (in_time < 60) { text(in_time, 50, 50); text(" [s]", 80, 50); } else if (in_time >= 60 && in_time < 3600) { text(in_time/60, 50, 50); text(" [min]", 80, 50); text(in_time%60, 200, 50); text(" [s]", 230, 50); } else if (in_time >= 3600) { text(in_time/3600, 50, 50); text(" [h]", 80, 50); text((in_time%3600)/60, 200, 50); text(" [min]", 230, 50); text((in_time%3600)%60, 350, 50); text(" [s]", 380, 50); } } void drawAxis(){ //Set axis labels and grid lines textAlign(CENTER); for (int k = 1; k <= 10; k++) { stroke(#D3D3D3); line(50+k*100, 510, 50+k*100, 90); //vertical lines if (k < 5) { line(50, 100*k+10, 1074, 100*k+10); //horizontal lines textSize(12); if( fZoom<zoom_max ) text((int)((500-k*100)/fZoom), 30, 100*k+10); // y-label else text((5-k), 30, 100*k+10); // y-label } text(k*100, 50+k*100, 530); // x-label } text(0, 30, 510); // y=0 text("0", 50, 530); // x=0 text("[Ch]", 1060, 550); text("[Count]", 20, 90); text("1024", 1094, 530); } void drawHistogram(){ //Draw bin contents for (int j = 0; j < 1024; j++) { if (data[j]!=0){ if( fZoom<zoom_max ) tmp_y = fZoom * data[j]; else tmp_y = 100 * data[j]; //draw line of content at j-bin if (tmp_y < 420) { stroke(#0000FF); line(j+plotX1, plotY2, j+plotX1, plotY2-tmp_y); //draw maximum line }else { stroke(#0000FF); line(j+50, 510,j+50, 90); } } } } void makeButton(){ fill(0); textSize(20); textAlign(LEFT); 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); } void mousePressed(){//マウスが押されたら発動する if(mouseX>650 && mouseX<750 && mouseY>50 && mouseY<70){//ボタンの矩形範囲にマウスがある 時 fZoom = (int)( fZoom * lens * 100 + 0.5 ) / 100.0 ; } else if(mouseX>800 && mouseX<900 && mouseY>50 && mouseY<70){//ボタンの矩形範囲にマウスが ある時 fZoom = (int)( fZoom / lens * 100 + 0.5 ) / 100.0 ; } if( fZoom < zoom_min ) fZoom = zoom_min; if( fZoom > zoom_max ) fZoom = zoom_max; }
タイムスタンプを変更しない
[[サマーチャレンジ 2017]] #contents *Arduino [#k800e2c1] CENTER:&ref(./ArduinoNano.jpg,40%);&ref(./arduino_IDE.jpg,50%); 実験データを収集するために、マイクロプロセッサーを使います。電気回路が信号の入力を感知したときに、信号を保持する信号を電気回路に送ったり、次のデータ入力を待つための準備を指示したりします。ATMEGA328というマイクロプロセッサです。通常こういうプロセッサを使うためには入力ピンや出力ピンの複雑な設定が必要で面倒なのですが、Arduinoというオープンソースの開発環境が準備されていて、簡単に使うことが出来ます。 >>マイコンブームが起こったのは僕が学生の頃で、8080とかZ80とかいうワンチップのマイコンが売り出されて夢中になったものでした。 あのころはミニコンと呼ばれたDECのPDP-11がようやく原子核実験でも使われ始めたんだけど、阪大の研究室にはなかった。 RCNPのβ-NMRの実験をするというので制御を8080のマイコンキット(NECから当時10万円くらいで売り出されました)でやりたいって 提案して買ってもらったのがはじめてでしたね。もともとラジオ少年だったので、オペアンプやデジタルIC位は使える状態だったので意外と簡単で RCNPのサイクロのD電圧をON/Offする信号を発生したり、NMRのゲート信号を発生したり、楽しかった。でもコンパイラーなんてなかったので ハンドアセンブルして16進キーボードからタイプしてプログラムを入力しました。最初はプログラムを保存することもできなかったので、 マシンタイムの朝になると毎回ポチポチと手で入力していました。折角入力したところで、コンセントを蹴飛ばされて元の木阿弥になったことも。 そのうち、カセットテープにプログラムを保存出来るようになった時はうれしかった。 **[[Arduino Nano:http://arduino.cc/en/Main/ArduinoBoardNano]]のハードウェアの特徴 [#w5fd36c3] 小さな基板に、 -プログラマブルなデジタル入出力ピンが14本 -10bitのADC入力ピンが6本 -8bitのDACモドキ6本 -USBインターフェース が載っている。とにかく、かわいい。 **Arduino開発ソフトウェアの特徴 [#u7f1f98e] プログラミング環境として、IDE(integrated Development Environment)が、Mac OSX, Linux, Windowsで 提供されている。ボード自体はUSBの給電で動くので、パソコンにusbで接続した途端に使える。うれしいねえ。プログラムは C++ベースなので僕でも書ける。ソフトウェアのダウンロードは[[ここ:http://arduino.cc/en/Main/Software]]から。 **Arduinoを使用する上で注意すること [#r373726c] +ToolsのBordで、今回使用するArduino nanoを選択する~ +Serial Portにも注意する。ProcessingのプログラムのusbPortと合わせておく。~ **資料 [#r42ca0ad] ネットで探すとたくさんの情報を見つけられるけど、重要なところは、 ---[[Arduino本家:http://www.arduino.cc/]] ---[[日本語リファレンス:http://www.musashinodenpa.com/arduino/ref/]] ---[[Arduino project archives(本家の正しい遊び方かな):http://jp.makezine.com/blog/arduino/]] *Arduinoで遊んでみよう! [#s7672ae2] まず、各自のノートパソコンにArduinoの開発ソフトを[[ここ:http://arduino.cc/en/Main/Software]]からダウンロードすること。~ Arduinoの基本的な使い方は&ref(資料集/ar_ex.pdf,,,これ);を見て。下記の例題プログラムはコピペすれば動くよ。 **Arduinoの例題1 [#b5f686cd] ほとんど用意されているExampleと同じなんだけどね。順番にチカチカLEDが点きます。 Digital出力チャンネルは所謂three stateで入力設定時はhigh impedance状態、出力設定時はHIGHでは5Vで20mAくらい ドライブ出来る。すごいね。 /* Blink */ void setup() { pinMode(10, OUTPUT); pinMode(12, OUTPUT); } void loop() { digitalWrite(10, HIGH); delay(10); digitalWrite(10, LOW); delay(1000); digitalWrite(12, HIGH); delay(10); digitalWrite(12, LOW); delay(1000); } **Arduinoの例題2 マックのスリープ時のLEDを真似てみた。 [#u0817d4b] Program /* Ex-03 Sleeping */ int i=0; void setup() { pinMode(9, OUTPUT); } void loop(){ for (i=0;i<255;i++){ analogWrite(9,i); delay(5); } delay(30); for (i=255;i>0;i--){ analogWrite(9,i); delay(5); } delay(300); } **Arduinoの例題3 コンデンサーの放電曲線を測ってみる [#bfb6e7c5] ピン12番に抵抗(10kΩ)を通して、コンデンサー(4.7μF)と抵抗(10kΩ)を並列にグランドへ接続。 アナログ入力1番をコンデンサーの電圧を測る。 ピン12番を5Vにして、0.5秒間コンデンサーを充電。 その後、ピン12番をhigh impedanceにしてコンデンサーの電圧を測定する。 コンデンサーの電荷は10kΩの抵抗で放電して行く様子をみることに相当。 Program /* Ex-04 Discharge of capacitor */ unsigned long time,timezero; int val=0; int i=0; void setup() { Serial.begin(9600); Serial.println("plot ""-"" "); pinMode(12,OUTPUT); digitalWrite(12,LOW); delay(5000); digitalWrite(12,HIGH); delay(500); pinMode(12,INPUT); timezero=millis(); for (i=0;i<100;i++){ time=millis()-timezero; val =analogRead(1); Serial.print(time); Serial.print(" "); Serial.println(val); } Serial.println("end"); } void loop(){ } **ラドン検出器用データ収集プログラムを作ろう! [#m62cef95] シェイパー回路で整形増幅した波高を保持するために、サンプル&ホールド回路にGate信号を送り、保持されたADCの値を読み取ります。 #define ADC 01 int num;//データを入れる箱をつくる //S/Hの出力(ADC)はAnalogの0番ピン //Gate信号はDegitalの7番ピン //Trig信号はDegitalの3番ピン //グランドは共通にする void setup(){ pinMode(7,OUTPUT);//GATEピン digitalWrite(7,LOW);//最初ゼロの値を与える attachInterrupt(1,GATE,RISING);//割込関数。3番ピンがRisingしたらGATE関数を実行 Serial.begin(9600); } void GATE(){ /* 【Gate信号を発生させて下さい】 【アナログピンの値を読み込んで下さい】 【時間をおいてリセット用のGate信号を発生させて下さい】 */ senddata(); } void senddata(){ /* 【ProcessingへADCの値(10bit)を送信する】 例: - 波高データを10bitから8bitに変換する - ビット変換した2つの数値をシリアルポートへ出力する ※このとき安全なデータの送り方についても考えてみて下さい。例えば、10bitのデータを8bitで送ろうとすると数値を2回送信する必要があります。(x1, x2), (x1, x2), …。装置のノイズや何らかの送信ミスによって、データが上手く送れなかった場合、(x1, x2), (x2, x1), (x2, x1), …ということがあり得ます(3番目のx1が消失)。順番を間違えずにデータを送受信するにはどうしたらよいでしょうか? ※余裕がある場合には、パリティビットやスタート/ストップビットをキーワードに、安全かつ効率的なデータの送受信方法を考えてみてください。 */ } void loop(){ } *Processing [#t6ee7872] こちらは、USB経由でArduinoからのデータを受け取るためのソフトウェアだ。ノートパソコン上のソフトなのでいろんな方法はあるが、ここでは[[Processing:http://processing.org/]]というオープンソースのソフトを紹介しよう。ソフトを[[ここ:http://processing.org/download/]]からダウンロードしよう。 **資料 [#fafea966] 以下のページを参考にするとわかりやすい。 ---[[建築発明工作ゼミ2008:http://kousaku-kousaku.blogspot.com/2008/07/processing_10.html]] ---[[Processing reference:http://processing.org/reference/]] ---[[Processing reference(日本語):http://tetraleaf.com/p5_reference_alpha/]] **Processingで遊んでみよう! [#b25a4776] 以下のページにあるexampleを動かしてみると面白いよ。 ---[[Processing example:http://processing.org/examples/]] **Arduinoからのデータを受け取るプログラム例 [#f9ab61ae] データを受信処理するserialEventという関数の中身を考えてみよう!Arduinoのコードと対応させる必要があるよ。その他の部分はデータを画面に表示するプログラムの一例ですので、自由に書き換えてもらって結構です!~ import processing.serial.*;//Serial libraryを読めるおまじない int s_time; int n_time; int y; int entry; int savetime;//いつ始まったか int totaltime = 10000;//(s) int[] data = new int[1024]; //ADC値カウント用 String time_n; String graph_t = "Radon Gas 2012.8.17";//リアルタイムで更新されるグラフの表示タイトル String filename = "Signal_0823.txt";//保存するファイルの名前 //GUI for data monitoring int lens = 5; //拡大縮小倍率 float zoom_max = 125.0; float zoom_min = 0.04; float fZoom = 1.0; float plotX1, plotX2; float plotY1, plotY2; float labelX, labelY; float tmp_y; boolean press=false; Serial usbPort; PrintWriter x;//保存用の変数を用意 //初期設定 void setup(){ size(1124,600); s_time = millis(); savetime = millis(); //シリアル通信のための設定 usbPort = new Serial(this,"/dev/cu.usbmodemfd121",9600); //ファイル生成 x = createWriter( filename );//ファイルを生成 x.print("TIME(s)");//1行ごとの書き込み x.print(TAB); x.println("PulseHeight(ch)"); //canvas area plotX1 = 50; plotX2 = width - plotX1; plotY1 = 90; plotY2 = height - plotY1; entry = 0; } //ループ関数 void draw() { n_time = (millis() - s_time)/1000; if (n_time >= totaltime){ x.flush();//データの保存 x.close();//ファイルを閉じる exit(); // Stops the program } //Online monitoring makeCanvas(); makeButton(); drawTitle(); drawTime(n_time); drawAxis(); drawHistogram(); strokeWeight(1); } void serialEvent(Serial usbPort){ /* Arduinoから送信されたデータを受信するプログラムをここに書いて下さい。 - USBポートに送られたデータを読み込む - ADCの値へ戻す(ビット変換を行っている場合) - ファイルに受け取った時間とADCの値(10bit)を書き込む - データが安全に送られているかをチェックする機能をArduinoと一緒に ぜひ考えて下さい。 */ } //Functions for Online monitoring void makeCanvas(){ background(#87CEFA); fill(255); rectMode(CORNERS); noStroke(); rect(plotX1, plotY1, plotX2, plotY2); //plot area } void drawTitle() { fill(0); textSize(20); textAlign(LEFT); text(graph_t, plotX1, plotY1 - 10); text("Entries", 500, 68); text(entry, 580,68); } void drawTime( int in_time ){ fill(0); textSize(20); textAlign(LEFT); if (in_time < 60) { text(in_time, 50, 50); text(" [s]", 80, 50); } else if (in_time >= 60 && in_time < 3600) { text(in_time/60, 50, 50); text(" [min]", 80, 50); text(in_time%60, 200, 50); text(" [s]", 230, 50); } else if (in_time >= 3600) { text(in_time/3600, 50, 50); text(" [h]", 80, 50); text((in_time%3600)/60, 200, 50); text(" [min]", 230, 50); text((in_time%3600)%60, 350, 50); text(" [s]", 380, 50); } } void drawAxis(){ //Set axis labels and grid lines textAlign(CENTER); for (int k = 1; k <= 10; k++) { stroke(#D3D3D3); line(50+k*100, 510, 50+k*100, 90); //vertical lines if (k < 5) { line(50, 100*k+10, 1074, 100*k+10); //horizontal lines textSize(12); if( fZoom<zoom_max ) text((int)((500-k*100)/fZoom), 30, 100*k+10); // y-label else text((5-k), 30, 100*k+10); // y-label } text(k*100, 50+k*100, 530); // x-label } text(0, 30, 510); // y=0 text("0", 50, 530); // x=0 text("[Ch]", 1060, 550); text("[Count]", 20, 90); text("1024", 1094, 530); } void drawHistogram(){ //Draw bin contents for (int j = 0; j < 1024; j++) { if (data[j]!=0){ if( fZoom<zoom_max ) tmp_y = fZoom * data[j]; else tmp_y = 100 * data[j]; //draw line of content at j-bin if (tmp_y < 420) { stroke(#0000FF); line(j+plotX1, plotY2, j+plotX1, plotY2-tmp_y); //draw maximum line }else { stroke(#0000FF); line(j+50, 510,j+50, 90); } } } } void makeButton(){ fill(0); textSize(20); textAlign(LEFT); 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); } void mousePressed(){//マウスが押されたら発動する if(mouseX>650 && mouseX<750 && mouseY>50 && mouseY<70){//ボタンの矩形範囲にマウスがある 時 fZoom = (int)( fZoom * lens * 100 + 0.5 ) / 100.0 ; } else if(mouseX>800 && mouseX<900 && mouseY>50 && mouseY<70){//ボタンの矩形範囲にマウスが ある時 fZoom = (int)( fZoom / lens * 100 + 0.5 ) / 100.0 ; } if( fZoom < zoom_min ) fZoom = zoom_min; if( fZoom > zoom_max ) fZoom = zoom_max; }
テキスト整形のルールを表示する
検索
AND検索
OR検索
編集操作
リロード
新規
編集
添付
差分
一覧
単語検索
最終更新
バックアップ
ヘルプ
最新の20件
2017-08-30
発表資料まとめ
2017-08-27
グループ1
2017-08-26
グループ4
写真等
サマーチャレンジ 2017
2017-08-25
グループ3
資料集
グループ2
データ解析
2017-08-14
自己紹介
グループD
グループC
グループB
グループA
実験装置
ラドン検出の原理
FAQ
データ収集制御
2017-08-10
原子核崩壊の基本
2016-01-27
SandBox