Decade Boxの制作

/




序章1 (2019-06-07)


電子工作をやっていてつらいと思うことは、パラメーターをサクッと変えられないことだ。プログラミングならば数字をその場でちょこっとなんてのは、タイピングで数秒もかからない作業だ。(どこにそのパラメーターが設定されているかを探すのが大変だったりもするが)

前回までの流れで基本的なAMラジオは作ることができたが、さらに研究してみたいと思った時に手持ちの札があまりにも足りてないことに気付かされた。一番面倒なコイルのパラメーター以外にも、可変コンデンサや抵抗、ダイオードなどの様々なパラメーターが絡んでくる。ワニクリップ 式デバッグ、ブレッドボード式デバッグも大して効率よくないのではないのかと思い知らされる。つまり電子工作をやっていると、面倒な配線の切り替え作業に翻弄されてしまうのだ。

例えば100kΩを500kΩにしてみたいというケース。

当然1MΩを並列にすれば500kΩになるので楽勝ではあるが、まずは1MΩの抵抗を探さなければならないという手間、管理的な問題がネックになる。さらに1MΩを並列にする作業の手間もかかる。ブレッドーボードでやっていれば比較的簡単だろうか?いやいや、穴の位置を間違えないように相当な神経を使うはずだ。ワニクリップ 式デバッグで大体済ませている私なんかは、抵抗をねじねじして「接触不良しないでね」って祈りをこめながらワニクリップ に挟むことになるだろう。懸命な方は、一度半田付けして確実に500Ω確定抵抗とするかもしれない。しかしこれらも一度や二度のことなら耐えられるが、毎度のこととなるとやってらんない。「面倒くセー」ってなって投げ出してしまうだろう。

料理だと仕込みができていない状態。

こんな問題を解決したくて、たどり着いた案がディケイドボックス(Decade Box)。「Decade box resistor」でググれば楽しい画像がいろいろ出てくる。要は可変抵抗。きっとプロたちはこういうの使ってるんだろうなぁ。しかし、うん万円すのは馬鹿馬鹿しい。ボリューム抵抗連結すれば1000円程度で作れてしまう。ただ、ボリューム抵抗だと正確な数値の読み取りにテスタを使うはめになりこれまた一手間かかってしまう。本末転倒な気がするので、既製品を参考にロータリースイッチ式のDecade Boxを作ってみようかと考案しているところだ。





抵抗は直列に繋げば10単位の桁上げができる。コンデンサなら並列につなげればよい。

ちなみに耳慣れないDecadeという言葉は「10年間」という意味らしい。インタフェースからの命名、なるほど納得。decimalとかdBとかの仲間である。12月のDecemberも元々は10月の意味だったんだよね(ギリシア人から聞いた話)。



序章2 (2019-06-07)




ほとんどの人が醤油を作ることはしないが、醤油を使ったソースくらいは作ったことがあるだろう。例えば「めんつゆ」だ。
この蒸し暑い時期は、そうめんを食べたくなるというもの。そこで鰹節と醤油、みりんでサクッと「めんつゆ」を作る。

電子工作に置いても、誰もが抵抗そのものを作ることはやらないだろう。たとえ紙に鉛筆で塗り塗りして数十kΩの抵抗は作れるとしても、精度の高い抵抗を破格の値段で買えるのだからそちらを選ぶはずだ。つまり抵抗が先ほどの醤油になる。そしたらこのDecade Boxは「めんつゆ」なのだ。目的のための手段の目的化。B to B 製品とも言える。

何かを作るということはその中間の道具が非常に重要だと思う。目立たず地味な役割ではあるが、こういうものがあって主役が引き立つものだ。

シャーシはLEAD社のS-9。抵抗とコンデンサのDecade Boxを作るので二つシャーシを購入。抵抗は1/4Wの金属皮膜抵抗、誤差1%以内。
シャーシを穴あけ後、紙に型取りをしてもう一つのシャーシを穴あけ。しかし気が緩んでいてい一部穴あけに失敗してしまった。
そして10Ωの抵抗の買い忘れに気づく。ロータリースイッチの配信もなかなか頭を悩ます。結局1日では終わらず。しかしこういう作業が一番楽しいかもしれない。



負荷抵抗の耐圧の落とし穴 (2019-06-08)


Decade Boxを作っている時にしまったと思った。抵抗の耐圧(ワット数)を考慮していなかったのだ。使う電圧によっては低すぎる抵抗は使えないよということだ。

電力の計算式は次の通り。

$$P (W) = \frac{V ^ 2}{R}$$
$$P (W) = R I ^ 2$$

これを元に理論値の計算表を作ってみ
た。


https://docs.google.com/spreadsheets/d/1bAGJVNBMF-A0JNzdCM89ZzkF_YMZ0Tkr8WftfpTxigk/edit?usp=sharing


たとえば9Vで見てみよう。1/4W耐圧の抵抗だと400Ωまでしか使えないことがこの表から分かる。

本当に耐圧以上の電圧はかけられないのだろうか?さっそく1/4W耐圧の100Ωを9V電池につないでみた。

※良い子のみんなは真似しないように!(`・ω・)



数分で300度以上の温度になった。これ以上は温度計の性能により測定できない。テーブルが若干焦げた。

その後、電圧をかけ続けたものの抵抗は焼き切れるということはなかった。というか電池の発熱がひどくなったのでやめた。公称では1%誤差内の抵抗の値も3%ほどの狂いが生じた。少しの時間なら耐圧オーバーでもすぐに壊れるということはないことが分かったが、基本スペックは守ったほうがよさそうだ。

ところで電池の発熱は、電池内に抵抗があるということを示している。内部抵抗rってやつだ。そして電池の内部抵抗が安全装置になっているとも言える。つまり一定以上の電流は内部抵抗のおかげで流れることはないのだ。もし電池に内部抵抗がなかったとしたら、オームの法則に従えば、0Ωでショートしたときに電流が無限大に流れることになる。たとえ電池容量が限られたとしていてそれを一瞬で無限大に放出するしたとしたら?微小時間Δtにおいて無限大の電流が持つ影響力というのはどうなってしまうのだろうか。乾電池一個で宇宙が消滅するって話。しかしΔtも無限大に収束するということさ。こうなるとオームの法則で考えるのも限界があるのかな。なんの話だっけ?

電池の話に戻って、ニカドやリチウム電池など内部抵抗が低いものは回路が正しいことが前提で使えるバッテリだろう。万が一ショートしてたらと思うと結構怖い。だから自作回路のデバッグには乾電池が一番なのではないだろうか?もしくはヒューズをつけるなどの対処が欲しいところだ。そう言えばトランスを使った可変電源を作った時には必ずヒューズを付けていたっけ。



nの階乗の計算 (factorial) (2019-06-08)


nの階乗は $$(n - ( n - 1 ) ) \times (n - ( n - 2 ) ) \times (n - ( n - 3 ) ) ... \times (n - ( n - n ) )$$と書けるだろう。

例えばnが4の場合は、

$$ (4 - (4 - 1 ) ) \times (4 - ( 4 - 2 ) ) \times (4 - ( 4 - 3 ) ) \times (4 - ( 4 - 4 ) )$$

となる。
実際に計算してみれば、

$$1 \times 2 \times 3 \times 4 = 24$$ となり正しい値となった。

この計算式をPythonでfactorial (階乗) 関数として定義しておこう。ただし、n = 0の階乗は1とする。



24が出力された。

このようなアルゴリズムはnumpyとかですでに定義されてるかもしれないが、他のプログラミングでも移植できることを考えれば、自分で一度作ってみることに損はないだろう。



組み合わせの計算 (combination) (2019-06-08)



$$ {}_n C_r = \frac{n!} {(n-r)! r!}$$

この計算をプログラミングに置き換えたい時に、一瞬めんどくさい!(´>ω<`)って思うことだろう。しかし前回作ったfactorial関数 (階乗の計算) を利用すると、あっさりと計算できる。単なる割り算、掛け算の計算に置き換えられるからだ。

ビックリマークの階乗を全てfactorialに置き換えれば良いだけ。
例えば、 n = 5 、 r = 3 の場合を考えてみよう。



計算結果は10.0となるはずだ。



手動で計算してみたところ計算間違いはなさそうなので、これを元にcombinationファンクションを定義しておこう。




35個の中から選ぶ組み合わせ (2019-06-09)




これは現在制作中のCapacitance Decade Box だ。スイッチが35個ある。コンデンサを並列に繋げば容量を足し算で合成できるため、様々な容量を作り出すことができる。それでは一体、どれほどのパターンを作り出すことができるのだろうか?前回作った組み合わせの計算関数を使って、この35個のスイッチの組み合わせが何通りあるかを計算してみた。



出力結果はこちら。

35C1 = 35
35C2 = 595
35C3 = 6545
35C4 = 52360
35C5 = 324632
35C6 = 1623160
35C7 = 6724520
35C8 = 23535820
35C9 = 70607460
35C10 = 183579396
35C11 = 417225900
35C12 = 834451800
35C13 = 1476337800
35C14 = 2319959400
35C15 = 3247943160
35C16 = 4059928950
35C17 = 4537567650
35C18 = 4537567650
35C19 = 4059928950
35C20 = 3247943160
35C21 = 2319959400
35C22 = 1476337800
35C23 = 834451800
35C24 = 417225900
35C25 = 183579396
35C26 = 70607460
35C27 = 23535820
35C28 = 6724520
35C29 = 1623160
35C30 = 324632
35C31 = 52360
35C32 = 6545
35C33 = 595
35C34 = 35
35C35 = 1
合計: 34359738367


ななななんと、343億通りあることが分かった。もちろん順列ではない。組み合わせだ。だから並び順が違くても同じものとして見なされるため数には入っていない。計算間違いじゃないのかと疑ったほどだが、どうも本当らしい。


組み合わせを配列で返してくれるファンクションも作ってみたので載せておく。



あとから知ったのだがPythonには itertools.combinations という組み合わせを計算できるファンクションがあらかじめ用意されていたorz。 私が作ったプログラミングは多少スペックは落ちる。しかし本家とアルゴリズム的にそんなに差はなさそうだった。配列処理がボトルネックのようだ。35C17なんて40億を超える配列を処理しなければならない。そして思ったのだが、nCrは再帰処理なのでキャッシュを使ったらかなり速度改善ではかろうか?

さておき、コンデンサー の容量の大きいものと小さいものを組み合わせることは現実的必要ないのではなかろうか。抵抗と違ってコンデンサーの容量誤差は大きい。5%〜20%なんてものが存在する。つまり誤差を考えた上での回路設計にっているのだから1μFに100pFを足すなどのケースは省いて良いといえる。

そういうことで、これ以上の探求は時間もかかるし馬鹿馬鹿しいのでやめておこうか。

と言いつつ、先ほどのプログラムのキャッシュ版もつくってしまった。



キャッシュを利用すると速い。なかなか悪くない結果が得られたのでベンチマークをとってみた。
35C1から35C9までを計算した結果である。キャッシュの差がじわじわ効いている。

itertools.combinations nCr (キャッシュ版)
1回目 71.492s 27.765s
2回目 70.68s 28.093s
3回目 71.928s 28.131s

このプログラムのキャッシュのキーは配列データの値を文字列連結しただけなので、本気で使う場合は改良されたし。



ディケイドボックス完成!(2019-06-12)




時間を忘れて製作に没頭していた。眠い、疲れがどっと出ている。

見た目は、まぁこんなものでしょう。配線やラベリングをもう少し綺麗にしたい気もするが、実験用道具としては必要十分な感じだ。

それにしても抵抗値の数パーセント以内の精度には感心する。50個の抵抗を直列に繋いでも数パーセント以内に収まっている。一方でコンデンサの容量は結構アバウト。前回の計算のような机上の計算通りには行かないことを身をもって学んだ。

さて、これで今後の動作実験や開発が大幅に楽になるはずだ。ふふふ。


関連記事


* Raspberry Pi のセットアップ!モニター、キーボードなしでMacからSSH
* I2C通信でADコンバータの値を読み込む (Raspberry Pi zero)
* Decade Boxの制作
* 10日で作る!倒立振子ロボット
* I made a Self Balancing Robot in 10 days!
* はじめてのステッピングモーター (Raspberry Pi zero)