日々の記録

ほどよく書いてきます。

ダイオードを温度センサーとして使う

2014年08月30日 01時20分34秒 | 電子工作

pn接合の電圧降下は常温で0.65Vから0.7V程度である。温度係数があって-2mV/Kくらい。
広い温度領域でリニアなようなので、これを積極的に使った温度センサーがある。仕事でもそんな温度センサーをつかっていたことがある。センサーは安価じゃないけどね。

汎用のシリコンダイオードを使って温度計測ができないかと思う次第。まあ、温度係数はわかっているのでいいんだが、シミュレータでやってみようと思った次第。シミュレータも部品のデータの温度係数使うだけだから、まあ、傾向を見る程度にしかなりませんので、ご注意を。特に汎用ダイオードはVFが結構ばらつきますので、常温でのVFをあらかじめ測定しておかないと温度のオフセットが結構でるようです。

さて、シミュレーター(LTSpiceIV)で個別の部品の温度を設定する方法だが、部品のラベル(1N4148のところ)をクリックして、temp=50と書けば当該部品が50℃の状態のパラメータにしてくれる。
下のように、パラメータのスイープもできる。

LM358を使おうと思っていたが、トランジスタのVBEも同じ温度係数を持っているので、これを使って別の回路でもうちょっと温度に敏感な電圧変化を得られるものも考えてみた。常温でトランジスタのVBEと同じ程度のバイアスをかけておき、温度が上がるとトランジスタのVBEが下がって、トランジスタがONになっていくというもの。トランジスタのVBEのばらつきでぜんぜん特性が違ってしまう見込みなので、個別にトランジスタの特性を把握しないと、相当な誤差が生じる見込み。

グラフの縦軸は電圧、横軸は温度(℃)

 

3線引っ張るの面倒だなとおもってこんなのも考えてみた。外に引っ張っていくのはD1のダイオード。いや、ダイオードひとつでいけるんじゃないかと。エミッタのダイオードと抵抗にして、ああやって、こうやって・・・
いや、少なくともダイオードがひとつトランジスタと熱結合してないと気温に敏感になってしまいそうだが・・・下の右側の回路だと、D3とQ2が同じ温度で、D1とD2の温度差がミソなのだ。バイアス電流はいじれるようにしておかないと。D1側のVfを電流で微調節しようとしてるからね。

温度の閾値を50℃くらいにしたいので、50℃で電圧の変化率が大きいものがいいかな。

 

また後日検討しよう。

 

コメント (2)
この記事をはてなブックマークに追加

シャープ測距モジュールGP2Y0A21YKの出力電圧と距離の関係

2014年08月17日 01時32分19秒 | 電子工作

シャープの測距モジュールGP2Y0A21YKであるが、

ふざけた仕様で、3つあるケーブルは、
白:出力
黒:+5V
赤:グランド
というとんでもないものである。赤黒逆じゃないのかと。
余裕で逆接続しましたとも。電源装置に接続したのだが、設定していた電流リミットの1.5Aまで流してしまったよ。電流制限ない電源だったら壊れていたかも。ふう。皆さん、電源装置は電圧・電流の設定できるものにしましょうね。


余談でした。

さて、このモジュールですが距離は出力電圧の逆数に比例である。

エレキジャックのページ(2017/8で消滅した)でシャープ測距モジュールGP2Y0A21YKの距離-出力電圧の評価結果が書いてあるが、複雑な関数でフィッティングしている。ちょっとマイコンには負荷高いんじゃ無いのかその計算。
ちなみに、エレキジャックのページではそのままの値を指数関数だか対数関数だかでフィッティングしていました。

ということで、検討。逆数になりそうなのはなんとなくアタリをつけてあったのでもう逆数でいけるだろうの決め打ち。

距離[cm]

出力電圧[V] 1/出力電圧[1/V]
6.6 3.00 0.33
10 2.27 0.44
20 1.31 0.76
30 0.92 1.09
40 0.73 1.37
50 0.60 1.67
60 0.50 2.00
70 0.44 2.27
80 0.39 2.56

うん。出力電圧は距離に反比例ですね。
個体差により上記の計算方法は異なるだろうから、実測で合わせ込むのがよろしいかと。80cmの彼方でもADCで1の変化があれば1cm刻みで値が計算出来る見込み。そんなに精度良く対象物に赤外ビームを照射できるかは不明。

 

原理的にも反比例なのを確認してみた。

装置の原理としては、三角測量であり、人間の目が奥行きを感じる視差を使ったものである。じゃあ、幾何学的に計算できそうですので、ちょっと計算してみましょうか。
スクリーン(オブジェクト表面)までの距離をx、投光器の軸と受光器の軸のオフセットをp(ピッチ?)、ディテクタのレンズの焦点距離をf、一次元イメージセンサー上の軸からのずれをdとすると、d=fp/xとなり、dは1/xに比例することが分かる。
装置としてもおそらく受光したピーク位置を出力するだけの単純な機構だろうから、きっと、距離はセンサー出力値の逆数をいじってあげればいいんじゃないかと思う次第。

 

別に三角関数使わなくとも、x:p=f:d だから、pf=xdでd=fp/xであることは計算できますな。

 

さて、当該機種、外からの光の影響を除去するために、赤外線リモコンのように点滅させて運転させているだろうと思う。しらべたら、http://cyberworks.cocolog-nifty.com/blog/2010/04/psd-gp2y0a21y-1.htmlで調査しているひとがいた。繰り返し周期1024usのうち、発光時間128usとのことで、点滅周期は約1kHzのようだ。

 

 実際にモジュールを買ってみたので、測定してみた。60cmくらいから値がちょっとずれるが、電源装置のツマミをひねってしまったようで、電源5Vで開始したけど測定終わったら電源装置が4.7Vになっていた。まあ、いいか。

距離[cm] 出力電圧[V] 電圧逆数[1/V]
4 3.01 0.33
5 3.12 0.32
6 3.13 0.32
7 3.01 0.33
8 2.76 0.36
9 2.52 0.40
10 2.31 0.43
11 2.15 0.47
12 1.98 0.51
13 1.85 0.54
14 1.74 0.58
15 1.62 0.62
16 1.55 0.65
17 1.48 0.68
18 1.40 0.71
19 1.34 0.75
20 1.28 0.78
22 1.18 0.84
24 1.11 0.90
26 1.03 0.97
28 0.97 1.03
30 0.91 1.09
35 0.81 1.23
40 0.72 1.39
45 0.66 1.52
50 0.60 1.66
55 0.57 1.77
60 0.53 1.90
65 0.51 1.97
70 0.49 2.05
75 0.47 2.14
80 0.45 2.25
85 0.43 2.35

そして、80cm以上も測定できるんじゃないかと思う人はいないだろうか?できそうな見込み。もう一度測定したけど、やっぱり手で装置を移動していくと値がふらふらする。

コメント (5)
この記事をはてなブックマークに追加

prossessingで時計をつくる

2014年08月15日 23時40分05秒 | AVR

お盆休みが暇だったので、prosessingというお絵かきが出来るというプログラミング言語で時計を造ってみた。デザインはスイス鉄道時計。

ちなみに、processingはグラフィックにこだわったものが作れそう。

float R_dot=220;
float R_hour=150;
float R_minute=240;
float R_second=180;

void setup(){
  size(500,500);
  background(255);
  smooth();
  frameRate(1);
}
void draw(){
  translate(250,250);
  colorMode(RGB,256);
  draw_back();
  dots_around_clock();
  hourhand();
  minutehand();
  secondhand();
}
void draw_back(){
  noStroke();
  background(0); //fill black

  fill(255);    //while circle
  ellipse(0,0,480,480);  //white circle
   
}
void dots_around_clock(){
  pushMatrix();
  stroke(0,255);
  strokeWeight(2);
  rectMode(CENTER);
  fill(0);
  for(int i=0;i<60;i++){
    rotate(radians(6));
    line(R_dot-5,0,R_dot+14,0);
  }
  strokeWeight(0);
  for(int i = 0;i<360;i+=30){
    rotate(radians(30));
    rect(R_dot,0,35,15);
  }
  popMatrix();
}
void hourhand(){
  pushMatrix();
  float hand_angle;
  hand_angle = radians(30*hour()+minute()/2-90) ;
  stroke(0,255);
  strokeWeight(0);
  fill(0);
  rectMode(CENTER);
  rotate(hand_angle);
  rect(R_hour/2-40,0,R_hour+40,20);  
  popMatrix();
}
void minutehand(){
  pushMatrix();
  float hand_angle;
  hand_angle = radians(6*minute()+0.1*second()-90);
  stroke(0,255);
  strokeWeight(0);
  fill(0);
  rectMode(CENTER);
  rotate(hand_angle);
  rect(R_minute/2-40,0,R_minute+40,15);  
  popMatrix();  
}
void secondhand(){
  float hand_angle;
  stroke(255,0,0,255);
  strokeWeight(5);
  hand_angle = radians(6*second()-90);
  line(-40*cos(hand_angle),-40*sin(hand_angle),R_second*cos(hand_angle),R_second*sin(hand_angle));
  fill(255,0,0,255);
  ellipse(R_second*cos(hand_angle),R_second*sin(hand_angle),20,20);
  ellipse(0,0,10,10);
}
コメント
この記事をはてなブックマークに追加