避難場所

Entries

Arduinoで簡易オシロスコープ ~processing1.5.1、Arduino1.06

 ケアレスミスによるコンパイルエラーならそう悩むこともないですが
コンパイラのバージョンによるものかどうかがわかるまでには
余計な時間を使ってしまうことがあります。
これもそうでした。

「Arduinoなら転がっているよ」ということなら追加の費用もいらず
手軽にオシロとして使うことができます。
もちろん何十万もするようなオシロの機能はありませんが
用途を限定すればこれはこれで十分に使えます。
作者に感謝、優れものです。 
 ◇ Arduinoで簡易オシロスコープ --> こちら

 より実用性を上げるには
  ①ノイズ対策
  ②プリアンプ
が欠かせません。
ノイズについては、内部で発生している取り切れないノイズはどうしようもありませんが
USBケーブルを伝って、コンピュータからやってくるノイズは
ラインを切って電源を供給するのを止めて、
トランス内蔵のACアダプタから電源を供給するとスッキリした波形になります。
さらに、金属ケースに入れてBNCコネクターとプローブを使えば外来ノイズ対策になるだろうと
予定しています。
②のアンプですがこれは相当にノイズ対策しないとイケナイので敷居が高いです。検討中です。

Arduinoで簡易オシロスコープ  クリックで原寸大
ArduinoScope1_0_0_s.gif


※当機で動くように
 ①シリアルポートの番号をArduinoで使っている同じにポートとなるように1に書き換えてあります。
   ポートはゼロから始まる整数です。
 ②フォントですが、このソースをそのまま使うのであれば「Dotum」を選択、フォントのサイズを16に変更して生成します。

【Processing sketches】
// ArduinoScope v1.0.0
//
// Note:
// 1. please confirm serial port setting
// 2. prepare font
// 3. Arduino code is attached at the end of this code

// Copyright (c) 2009-2013 I. Maruta
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Neither the name of the author nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE.



import processing.serial.*;

Serial ArduinoPort; // Create object from Serial class

int NumOfScopes,NumOfInput=2;
int data_span=10000;
Strage dfs = new Strage();
Scope[] sp;

int fontsize=16;
PFont myFont;

void setup()
{
// Serial Port
println(Serial.list());
String portName = Serial.list()[1]; // TODO: automatic detection?
ArduinoPort = new Serial(this, portName, 38400);
ArduinoPort.bufferUntil(10);

// Screen
size(800, 600);
NumOfScopes=2;
sp = new Scope[NumOfScopes];
sp[0]= new Scope(0,50,10,width-100,height/2-35,512,-512,1000);
sp[1]= new Scope(1,50,height/2+15,width-100,height/2-35,1024,0,1000);

myFont = loadFont("Dotum-16.vlw");
textFont(myFont,fontsize);
}

class Scope{
int input_id; // corresponding input
int posx,posy; // screen position of the scope
int sizex,sizey; // pixel size of the scope
float yu,yl; // range of y is [yl,yu]
int tspan; //
int ngx,ngy; // number of grids
float maxposx,maxposy,minposx,minposy,maxx,minx,maxy,miny;

Scope(int did,int px,int py,int sx,int sy,float syu,float syl,int ts){
input_id=did;
posx=px;
posy=py;
sizex=sx;
sizey=sy;
yu=syu;
yl=syl;
tspan=ts;
ngx=10;
ngy=4;
}

void grid(){
pushStyle();
fill(255,196);
stroke(0,0,150);
for(float gx=sizex; gx>=0; gx-= (float)sizex/ngx){
line(posx+gx,posy,posx+gx,posy+sizey);
textAlign(CENTER,TOP);
text((int)map(gx,sizex,0,0,-tspan),posx+gx,posy+sizey+2);
}
for(float gy=sizey; gy>=0; gy-= (float)sizey/ngy){
line(posx,posy+gy,posx+sizex,posy+gy);
textAlign(RIGHT,CENTER);
text((int)map(gy,0,sizey,yu,yl),posx,posy+gy);
}
popStyle();
}

int curx,cury;

// draw cursor
void cur()
{
// return if mouse cursor is not in this scope
if(constrain(mouseX,posx,posx+sizex)!=mouseX
|| constrain(mouseY,posy,posy+sizey)!=mouseY) return;

pushStyle();

// draw cross cursor
stroke(255,0,0,196);
fill(255,0,0,196);
line(mouseX,posy,mouseX,posy+sizey);
line(posx,mouseY,posx+sizex,mouseY);

// draw measure if mouse is dragged
if(mousePressed){
line(curx,posy,curx,posy+sizey);
line(posx,cury,posx+sizex,cury);
textAlign(RIGHT,BOTTOM);
text((int)map(curx,posx,posx+sizex,-tspan,0)+"ms, "+(int)map(cury,posy,posy+sizey,yu,yl),curx,cury);
textAlign(LEFT,TOP);
text("("+nfp((int)map(mouseX-curx,0,sizex,0,tspan),1)+"ms, "+nfp((int)map(mouseY-cury,0,sizey,0,-(yu-yl)),1)+")\n"+nf(1000/map(mouseX-curx,0,sizex,0,tspan),1,2)+"Hz\n"+nf(TWO_PI*1000/map(mouseX-curx,0,sizex,0,tspan),1,2)+"rad/sec",mouseX,mouseY+2);
}
else{
curx=mouseX;
cury=mouseY;
textAlign(RIGHT,BOTTOM);
text((int)map(curx,posx,posx+sizex,-tspan,0)+"ms, "+(int)map(cury,posy,posy+sizey,yu,yl),curx,cury);
}
popStyle();
}

// draw min&max tick
void minmax(){
pushStyle();
fill(255,128);
stroke(0,0,100);
textAlign(RIGHT,CENTER);
line(posx,maxposy,posx+sizex,maxposy);
text((int)maxy,posx,maxposy);
line(posx,minposy,posx+sizex,minposy);
text((int)miny,posx,minposy);
textAlign(LEFT,CENTER);
textAlign(CENTER,TOP);
text("max",maxposx,maxposy);
textAlign(CENTER,BOTTOM);
text("min",minposx,minposy+20);
popStyle();
}

// draw scope
void Plot(){
float sx,sy,ex,ey;
int nof=0;
DataFrame df_last = dfs.get(0);

maxy=-1e10; // -inf
miny=1e10; // +inf

// draw background (for transparency)
pushStyle();
noStroke();
fill(0,0,64,64);
rect(posx,posy,sizex,sizey);
popStyle();

// draw data plot
pushStyle();
stroke(0,255,0);
smooth();
strokeWeight(1);
for(int idx=0;(dfs.get(idx).t>max(df_last.t-tspan,0)) && -idx DataFrame df_new=dfs.get(idx);
DataFrame df_old=dfs.get(idx-1);
sx=(float) map(df_new.t, df_last.t, df_last.t - tspan, posx+sizex,posx);
ex=(float) map(df_old.t, df_last.t, df_last.t - tspan, posx+sizex,posx);
sy=(float) map((float)df_new.v[input_id],(float) yu,(float) yl,(float) posy,(float) posy+sizey );
ey=(float) map((float)df_old.v[input_id],(float) yu,(float) yl,(float) posy,(float) posy+sizey );
if(ex ey+=(sy-ey)*(posx-ex)/(sx-ex);
ex=posx;
}
line(sx,sy,ex,ey);
maxy=max(maxy,df_new.v[input_id]);
if(maxy==df_new.v[input_id]){
maxposx=sx;
maxposy=sy;
}
miny=min(miny,df_new.v[input_id]);
if(miny==df_new.v[input_id]){
minposx=sx;
minposy=sy;
}
nof++;
}
popStyle();

// minmax();

// draw current value of input
pushStyle();
textAlign(LEFT,CENTER);
stroke(0,0,64);
fill(0,255,0,196);
text(df_last.v[input_id],posx+sizex,map(df_last.v[input_id], yu, yl, posy, posy+sizey ));
popStyle();

grid();
cur();
}
}

void draw()
{
background(0);

for(int i=0;i sp[i].Plot();
}
}

// input data buffer class
// (now using ring buffer)
class Strage{
int cur;
DataFrame[] DataFrames;

Strage(){
cur=0;
DataFrames=new DataFrame[data_span];
for(int idx=0;idx int ret_v[] = new int[NumOfInput];
DataFrames[idx] = new DataFrame(0,ret_v);
}
}

void push(DataFrame d){
cur = ((cur+1) %data_span);
DataFrames[cur]=d;
}

DataFrame get(int idx)
{
int num=(cur+idx);
for(; num<0; num+= data_span);
return((DataFrame) DataFrames[num]);
}

void save()
{
String savePath = selectOutput(); // Opens file chooser
if (savePath == null) {
// If a file was not selected
println("No output file was selected...");
}else{
PrintWriter output;
output = createWriter(savePath);
DataFrame df_last = this.get(0);
for(int idx=0;-idx if(this.get(idx).t==0) break;
output.print(this.get(idx).t-df_last.t);
for(int k=0;k output.print(","+this.get(idx).v[k]);
}
output.println("");
}
output.flush();
output.close();
}
}
}

class DataFrame{
int t;
int[] v;
DataFrame(int st, int[] sv){
t=st;
v=sv.clone();
}
}

boolean isactive=true;

// buffering data from serial port
void serialEvent(Serial myPort)
{
int[] vals=new int[NumOfInput];
int timestamp;
int[] splitdata;
if( myPort.available() > 0) {
String datline=myPort.readString();
splitdata=parseInt(datline.split(","));
if((splitdata.length==NumOfInput+2)){
timestamp=splitdata[0];
for(int idx=0;idx vals[idx]=splitdata[idx+1];
}
if(isactive){
if((timestamp-dfs.get(0).t)<0){
dfs.cur--;
}
if((timestamp-dfs.get(0).t) > ((float)sp[0].tspan / sp[0].sizex/2.0) ){
dfs.push( new DataFrame(timestamp,vals));
}
}
}
}
}

/* Arduino code
void setup()
{
Serial.begin(38400);
}

void loop()
{
Serial.print(millis());
Serial.print(",");
Serial.print(analogRead(0));
Serial.print(",");
Serial.print(analogRead(1));
Serial.println(",");
}

【九工大版 kyutech Arduino 簡易オシロスコープ】
もあります。
国立大学法人 九州工業大学 情報工学部|飯塚キャンパス
 ◇ Kyutech Arduino Scope --> こちら
関連記事
この記事にトラックバックする(FC2ブログユーザー)
http://c3plamo.blog.fc2.com/tb.php/2307-c991f1ee

トラックバック

コメント

コメントの投稿

コメントの投稿
:  (任意)タイトルがあるとわかりやすいです。
:  お名前 ニックネームなどなんでもOKです。
: (任意)メールアドレス(表示されませんのでご安心ください。)
: (任意)ホームページやブログをお持ちでしたらURLリンクを張れます。
: 
 
 以下の欄にコメントをお書きください。
パスワード:  <-- (任意)ここで設定しておけばあとでコメントの内容を編集できます。 
秘密のコメント: 管理者にだけ表示を許可する (任意)チェックを入れると内容を表示させず、管理人宛のメールとして使えます。  
コメント送信ボタン ⇒

【ときどきのメッセージ】
国民を指差して、「こんなヤツに負けられるか」と絶叫
クリックで原寸大
abeKonaHitotatini_ss.jpg


そもそも国民に主権があることがおかしい。全文はこちら クリックで原寸大
nisidaShoji_ss.jpg


 安倍さんが最も欲しがっているモノは「国家緊急権」。
その欲しくて堪らなかったモノがもう手に届くところまで来ています。
それを手に入れるには、自民党の憲法草案を通すほかないわけですが、
手段を選ばず、あらゆることを仕掛けて来ることが想定されます。
その国家緊急権は、第九章 緊急事態にやろうと思えば「何でもできる」を織り込んでいます。 --> こちら

つぎの動画ですが、安倍さんのこれまでの言動がヒトラーのそれと見事に符合していることを描いています。
ということだと、これから何が起きるかも想像がつくというものです。
クリック ↓ でYoutubeを開く
hodoStation160318_ss.jpg


 大新聞・テレビが批判をやめた、戦前と同じ。
安倍首相「安保法制は中国が相手、必ずやる!」と戦争を想定--> こちら
たかが個人的な野望なのに、実現するためにはどんなに反対されようが構わず進め、そして国民を戦争へ引き摺り込む・・
 断じて許しません。
戦争法案施行に合わせて日中緊張が仕掛けられ着々と前準備が整えられる。戦争させられるのも時間の問題である。
「ふたたび戦争の歴史になる・・」と2007年安倍一次政権から繰り返し警告してきた。
2005年に決定されたシナリオがいよいよ最終章を迎える、まさに危機的状況となってきた。
殆どの国民が知らないでいるシナリオが、しかも着々と積み上げられてきていることに気付き、そして大声上げて阻止しないと取り返しのつかないことになる。
阿鼻叫喚となる前に・・・

というのは、
アーミテージ・レポート第3弾アーミテージレポート(ブログ) のシナリオ通りに進んでいることでわかるように、アメリカ戦争屋勢力が、ニッポンの外務省と安倍政権(強力な軍事力を持つことで有利になれるという妄想・野望)を利用できるところまで最大限利用しようとしているからだ。
自分から決して先には手をださず、
ニッポンを使って事を起こそうとしている連中の 謀略 はいまだ消えていない。執念深くしかも確実に実行しようとしている。
どんなに時間がかかろうが、システマチックに動いてやり遂げる連中を甘くみたら後悔することになる。
アメリカが仕掛けてきたこれまでの謀略・戦争の数々が教えてくれている。

ふたたび戦争の歴史になる・・
クリックで原寸大
WarHistory3_s.gif


LIBERAL_PARTY_m.gif
自由党(国民の生活が第一)

kokuminSeikatu_s_s.jpgkokuminSeikatu_s.jpg


Appendix

リンク

「お気に入りの音楽」 もくじ

myFavoriteMusic_s.gifmyFavoriteMusic_m.gif

※※ 納得ゆく演奏を取り上げています。高音質なスピーカーや抜けのいい開放型ヘッドフォンでどうぞ ※※

【愛聴盤】ショパン ノックターン 江崎昌子エザキマサコ
MasakoEzakiNocturnes_ss.jpg

録音は最悪で申し訳ありませんが・・・
ショパン ノクターン第20番 嬰ハ短調 「遺作」~ギオルギ・ラッザビゼ
GiorgiLatsabidzeNocturneNo20_ss.jpg

ベートーヴェン・ヴァイオリン協奏曲ニ長調op.61 ~クライディ・サハチ
BeethovenViolinConcerto61_ss.jpg

アルネセン マニフィカト ~Arnesen MAGNIFICAT
ArnesensMAGNIFICAT_ss.jpg

チャイコフスキー第6番"悲愴"チョン・ミョンフン
Tchaikovsky6SeoulPhil_ss.jpg

マリ・サミュエルセン ヴィバルディ四季~夏
MariSiljeSamuelsen_s.jpg

八神純子 DAWN
DAWN_s.jpg

ブラームス交響曲第一番 スタニスラフ・フランクフルト放送交響楽団
Brahms1hr-Sinfonieorchester_ss.jpg

ベートーヴェン「月光」ネルソン・フレイレ
NelsonFreireMoonlightSonata_s.jpg

ポールポッツ Paul Potts・La Prima Volta
PaulPottsLaPrimaVolta_s.jpg

ユジャ・ワン グルック・メロディー(ズガンバーティ編)
MirusiaSolveigSong.jpg

ミルシア La Vergine degli Angeli
LaVergineDegliAngeli_s.jpg

ミルシアMirusia ソルヴェイグの歌
MirusiaSolveigSong.jpg

Ave Maria ミルシアMirusia
AVE_MARIA_MirusiaLouwerse_s.jpg

ラブ・シュープリーム - 八神純子
loveSupreme2_s.jpg

ミルシアMirusia ショパン別れの曲
Mirusia_In_mir_klingt_ein_Lied.jpg

スーザン・エレンズ Don't Cry For Me Argentina
SuzanErensDontCryForMeArgentina_ss.jpg


本家HP

nonologo_s_s.gifnonologo_s.gif


「約束」 ~名張毒ぶどう酒事件 死刑囚の生涯

yakusoku_s.jpgyakusoku_s.jpg


このブログをリンクに追加する

【著作権などについて】
インターネットは世界最大の図書館であるという考え方でページなどを公開しております。著作権までは放棄しておりませんが、当ブログも他のサイトも、ネットで公開している以上「どこのページへのリンク」も自由ですし連絡も要りません。「引用」も「コピー&ペースト」もご自由にどうぞ。もちろん図表なども制限ありません。いずれも、引用元を明記くだされば幸いです。 管理人
【管理人へのメール】
  メールは --> こちら からお願いします。

【お詫び】システム不良で不達。修正しました。

QRコード

QR