これまでいくつか回路を作ってきました。ほとんどは実験を兼ねているので、デュポンワイヤやブレッドボードを使って構成してきました。回路に使った抵抗は、はんだ付けしたわけではないので、実験が終わったらブレッドボードから取り外して、無造作にBOXの中に収納されることになります。
最初は、抵抗値が記された帯に綺麗に結束されている(左)のですが、一度取り外して使用してしまうと、BOXの中にばらばらに収納されることになります(右)。
すると、大問題が……、「どの抵抗が何Ωかわからない」。
もちろん、カラーコードを読んだら解るんですよ、しかし、読みにくいのですよ、カラーコード。茶色、赤、オレンジ、黄色、金色辺りが見分けつかない時が有ったり、同じ茶色のはずなのに、n本目とm本目の色が微妙に違っていたりすると、「これは、同じ茶色?それとも茶色と黄色とか??」って、なってしまいます。
しかも、左右対称の抵抗なので、そもそも、カラーコードを右から読むのか左から読むのかわからないことがあります。ルール上は「コードの間隔が狭い側から読む」のだそうですが、下の写真、どっちから読むのかわかりますか?
どっちの間隔が狭いか?ってことですけど、筆者には見分けがつきません。左から読むと120Ω、右から読むと10kΩです。ちなみに上の写真は10kΩの抵抗です。言われてみれば、右端の線は他の線と比べて、少し太いですね?太い線を左にして読むルール?(1@_@)?
極めつけが、色と数値の対応が取れない事です。毎回Webで検索して確認してしまいます……。
色 | 数値 | 覚え方 |
黒 | 0 | 黒い礼(0)服 |
茶 | 1 | 茶を一(1)杯 |
赤 | 2 | 赤いニ(2)ンジン |
橙 | 3 | 第(橙)三(3)者 |
黄 | 4 | 四(4)季(黄)の色 |
緑 | 5 | 五(5)月みどり(緑) |
青 | 6 | 青虫(6) |
紫 | 7 | 紫式(7)部 |
灰 | 8 | ハイ(灰)ヤ(8)ー |
白 | 9 | ホワイト(白)ク(9)リスマス |
大学時代に友人から教えてもらった、暗唱の仕方を思い出しながら、記載してみましたが、正直、覚えていません……。黒い礼服〜第三者くらいまでは、覚えていたのですが……。他のサイトとかも見ながら思い出して、確かこんなじゃなかったか?と。
抵抗の許容差表示に使われる金とか銀とかは他のサイトで探していただくとして、以下、抵抗値の読み方です。
カラーコードが4本の物と5本のものがありますが、間隔の狭い方を左側にして、一番右側の1本は許容差を表すので除外します。1〜4の数字を振った線の色から、上の表で数値を引っ張って、以下の様に読みます。
4本の場合 : ((1の数値)×10+(2の数値))×10(3の数値)
5本の場合 : ((1の数値)×100+(2の数値)×10+(3の数値))×10(4の数値)
上図の例に当てはめると、こう(↓)なります。
4本の例 : 20×101=200Ω
5本の例 : 330×102=33kΩ
あと、最後の10のべき乗に関するカラーコードのみ、金(10-1=0.1)と銀(10-2=0.01)のコードが入るケースがあります。例えば、カラーコードが5本の抵抗で、茶/黒/黒/金/許容差の、場合、100×10-1=10.0Ωの様な感じです。
最後はカラーコードを読むしかないとしても、ざっくりとでも抵抗値がわかっていると、記憶に残っている色だけで何Ωか判定できることがあります。そこで、以下の様な回路で抵抗値を測定する装置をブレッドボード上に構築しておくと、ちょっと楽になるのではないか?と考えました。
青点線で囲ったRxが知りたい抵抗(DUT;Device Under Test)です。もう一つついているR0は、抵抗値がわかっている基準抵抗です。R0とRxがVccとGNDの間にシリーズにつながっていて、各抵抗の両端の電圧をArduinoのアナログ端子で測定できるようになっています。「A2とA0はVccとGNDでしょ?」と言わずに、ちゃんと接続してくださいね。ジャンパ線の配線抵抗とか、接触抵抗とかあるので、A2とA0からも、5Vと0V以外の値が読める場合がありますから。
Rxはオームの法則で求めることができます。
最終的にアナログ値A0〜A2は、分母子に存在して、その比率だけが使われるため、AD変換器のフルスケール電圧(Vcc=5V)とは無関係となっています。つまり、多少Vccの電圧(5V)が前後(上下)していたとしても、抵抗値を求めるにあたって、何ら影響がないということです。
対して、基準抵抗R0の値に誤差が入っていると、Rxにもそのまま、誤差が乗ります。ですので、一応気分的な問題で、例えばR0=1kΩを使いたい時には、1kΩの抵抗を1本接続するのではなく、2kΩの抵抗を2本並列につなげて1kΩにしたりしています。計算してみるとわかりますが、2kΩの抵抗に乗った誤差は、2本並列にしたことで気持ち小さくなって、1kΩ抵抗として使用することができます(計算上)。
ただ、2本を並列に使うことで接触抵抗などが増える可能性があり、新たな誤差源を作り出しているだけかもしれません……。
R0>>Rx、R0<<Rxのケースだと、A1−A0やA2−A1の値が小さくなります。Arduinoの10ビットAD変換器では、Vcc=5Vを1,024段階に分割して離散値(デジタル値)に変換するので、あまり小さな電圧差に対しては、解像度が問題になります。よって、R0は、R0≒Rxとなるような値を選ぶのがGoodです。テスタに置き換えてみると、「レンジ切り替え」みたいなものですね。
※ArduinoにUSBから電源を取っている場合、基準抵抗R0をあまり小さくしないでください。例えば、R0=10Ωにして、ほとんど抵抗のない配線などの抵抗値を読もうとすると、オームの法則5V=I×10Ωより、I=500mAの電流が流れ、USBに許容された最大電流値を超えてしまいます。
下図がブレッドボード上に構築した、抵抗測定回路です。
ブレッドボードの左端にあるのが基準抵抗で、2kΩの抵抗を2本並列にしてあるのが見えると思います。黄色いジャンパワイヤをRx(DUT、ブレッドボード右側)の両端に接触させると、その抵抗値を計測するようになっています。
測定プログラム:meas_resistance.ino
Arduinoへコンパイル&書き込みすると、1s毎に測定した抵抗値をシリアルモニタに送ってきます。最初は、R0=1kΩと見なして計算したRxの値が表示されます。途中でダイナミックにR0の抵抗値を変更可能なように、シリアルモニタから抵抗値("r0,"+抵抗値>0、Ω)を送信すると、R0の値を再設定することができるようになっています。
実行サンプル:【 】内はシリアルモニタからの送信データ
【r0,1000】
OK: change R0=1000 -> 1000[ohm]
R0=1000[ohm], 79, 313, 1014, Rx=335[ohm]
R0=1000[ohm], 66, 303, 1014, Rx=334[ohm]
R0=1000[ohm], 31, 276, 1014, Rx=333[ohm]
R0=1000[ohm], 85, 317, 1014, Rx=332[ohm]
R0=1000[ohm], 79, 312, 1015, Rx=332[ohm]
【r0,2000】
OK: change R0=1000 -> 2000[ohm]
R0=2000[ohm], 57, 210, 1016, Rx=379[ohm]
R0=2000[ohm], 53, 207, 1017, Rx=380[ohm]
R0=2000[ohm], 58, 212, 1016, Rx=380[ohm]
R0=2000[ohm], 68, 220, 1017, Rx=381[ohm]
R0=2000[ohm], 70, 222, 1017, Rx=382[ohm]
上の実行サンプルは、330Ω表示の抵抗を、R0=1kΩ(2kΩ×2並列)と、途中からR0=2kΩ(並列の抵抗を1本外しただけ)で、測定した表示です。
"R0="と"Rx="の間にある数値3つは、A0〜A2をanalogRead()した数値そのもの、です。従って、0V(0)〜5V(1,023)までの値を取ります。理論上、0Vと5VになるべきA0とA2から、そうではない値が読めていることにも注目して見てください。
なお、プログラムを見ていただくとわかりますが、アナログ値の読み取り(AD変換器の読み取り)誤差の影響を軽減するため、1測定当たり16回、アナログ値を読み取って平均化しています。
analogRead() 1回で約100μsかかるようですので、3端子×16回×100μs≒4.8ms程かかっています。
可変抵抗器(ポテンシオメータ)の抵抗値を測定してみます。
上図の様に3つの端子があります。両端が抵抗の両端につながっていて、真ん中が可変抵抗の取り出し端子でしょう。測定してみます。
実行サンプル:
−−−−両端の抵抗を測定、つまみを回しても変化なし
R0=1000[ohm], 0, 925, 1023, Rx=9532[ohm]
R0=1000[ohm], 0, 925, 1023, Rx=9526[ohm]
R0=1000[ohm], 0, 925, 1023, Rx=9533[ohm]
R0=1000[ohm], 0, 925, 1023, Rx=9533[ohm]
R0=1000[ohm], 0, 925, 1023, Rx=9492[ohm]
−−−−左端と真ん中端子の抵抗を測定、つまみを回すと抵抗値が変化
R0=1000[ohm], 37, 57, 1000, Rx=21[ohm]
R0=1000[ohm], 8, 701, 1016, Rx=2199[ohm]
R0=1000[ohm], 3, 852, 1020, Rx=5071[ohm]
R0=1000[ohm], 1, 919, 1021, Rx=9010[ohm]
R0=1000[ohm], 1, 924, 1021, Rx=9475[ohm]
両端の抵抗値は約9500Ωですね。本体上部の表示、「B10K」から察するに、定格は10kΩでしょうか?つまみを回すと抵抗値が変化しましたので、やはり真ん中が可変抵抗出力でした。直観的でわかりやすい配置です。
通常は、両端にGNDとVccを繋ぎ、真ん中の端子から観測される電圧値をArduinoのアナログ端子で観測して、利用します。
LCDのバックライトや、LEDの明るさなどを、流す電流値で直接制御する用途では、両端の端子いずれか1本と真ん中の端子に電流を流して制御する場合もありますね。
ジョイステイックモジュールがIduinoスタータキットに入っていました。
ジョイスティックは、前節のポテンシオメータが2つ、x軸方向とy軸方向に配置されている装置なので、同様に抵抗値を測ってみます。
モジュールにはGND、+5V、VRx、VRy、SWの、5本の端子がありますので、それぞれ、GND、+5V端子との間の抵抗を測定してみます。
測定端子 | 抵抗値[Ω] | 備考 | |
GND | +5V | 4,300 | |
GND | VRx | 3,200 | ニュートラル位置、左(80)⇔右(4,200) |
+5V | VRx | 3,300 | ニュートラル位置、左(4,200)⇔右(90) |
GND | VRy | 3,000 | ニュートラル位置、上(70)⇔下(4,200) |
+5V | VRy | 3,000 | ニュートラル位置、上(4,200)⇔下(80) |
GND | SW | inf | 押していない状態、押すと26 |
+5V | SW | inf | 押していない状態、押すと4,000 |
VRxとVRyには、調整用のねじがついていて、おそらく、ニュートラル位置の調整ができるのだと思います。
測定した抵抗値からも、以下の様な回路であると推測できます。うん、「そのまんま」、ですね。
GND⇔+5V間の抵抗測がVRxとVRyの合成抵抗(並列接続)で、測定値が4.3kΩですから、VRx=VRyと考えると、それぞれ8.6kΩ程度だと思われます。定格だと、10kΩ程度のポテンシオメータでしょうか?このモジュールに電源を供給すると、合成抵抗値4.3kΩを通して定常電流I=5V÷4.3kΩ≒1.2mAが流れ続けます。
本来の使い方で試してみましょう。一々プログラムを組むまでもないので、Logiscopeを使います。GNDと+5V端子はArduinoのGNDとVccに接続し、VRx→A0、VRy→A1、SW→A2に接続して、Logiscopeを起動します。
実行サンプル:【 】内はLogiscopeからの送信データ
【ina,0】 …… ニュートラル位置、2.46V
【ina,0】 …… 左いっぱい、0.00V
【ina,0】 …… 右いっぱい、5.00V
【ina,1】 …… ニュートラル位置、2.54V
【ina,1】 …… 上いっぱい、0.00V
【ina,1】 …… 下いっぱい、5.00V
【ina,2】 …… スイッチを押した状態、0.00V
※スイッチを離した状態はHIGH-Zなので、読み出し値は安定しません。
スティックの操作感は、ちょっと傾けるとすぐに0Vか5Vに張り付いてしまって、間の電圧位置で止めるのが難しい感じです。これだと、アナログジョイスティックと言うより、単なる十字キー(0/1)と変わらない使用感なのでは?スタータキットに入っているような代物は、一番安価なタイプなのでしょうから、価格相応、と言うことでしょう。
抵抗測定回路の作成から関連して、ポテンシオメータ、ジョイスティックと、抵抗に関連したモジュールを一通り測定してみました。