概要
紙があるときだけ、ソレノイドを動かす回路です。ほんとそれだけです。以下にブロック図を示します。
今回の回路のブロック図 |
で、フォトリフレクタは紙すれすれの場所に無いといけないので、場所の制約からメイン基板とは離れてしまいます。なので、センサーだけを載せるミニ基板を作りました。上のブロック図で"sub_sensor_pcb.sch/brd"となっているのがそうで、12mm × 35mm程度の大きさです。
フォトリフレクタとメイン基板までは、1mの3芯銅線(オヤイデの人に選んでもらった極東電線製細物多芯ケーブル VVC 3芯 (7/0.18 × 3芯))で接続しています。ここのノイズ対策のために、メイン基板側で1 Logic ICのバッファーを入れています。また、フォトリフレクタのフォトトランジスタがON時に完全に0Vにはならず、C-E間飽和電圧Vce(sat) = 0.4Vだけ浮いてしまうので(これでもLVCMOS的にはLowですが)、それをLowレベルまで下げる役割も兼ねています。
実際に信号に応じてソレノイドの制御信号を生成するのは、STM32 Nucleoボードで行っています。
最初はLPC810で制御をしていたのですが、「立ち上がり/下がり割り込みから、一定時間遅れてピンを反転させる」というロジックを、自分の力ではどうしてもLPC810で実現できなかったので、書くのが簡単そうなmbed SDKが使え、なおかつ安い(\1,500)Nucleoを選んだ経緯があります。
mbed SDKはInterruptInクラスで立ち上がり/立ち下がり時の割込みハンドラが扱えるので、これを利用してセンサーの出力変化時にFETの出力を変えています。
ソレノイドの駆動にはFETを利用しています。ソレノイドは、0.1A~0.2A(実測)とそこそこの電流が流れるので、ON抵抗が低そうなInternational RectifierのHEXFET、IRLTS6342を利用しました。
回路
センサー基板の回路図 |
メイン基板の回路図 |
センサー基板について
フォトリフレクタの抵抗の値については、以下のように決めました。
赤外線LEDの順方向電圧Vf : 1.2V typ. (データシートのElectrical Specificationsより)
赤外線LEDに流すべき電流If : 20mA?(データシートのElectrical Specificationsの、Conditionsが大体そうだから)
よって、R1 = (Vcc - Vf) / If = (3.3 - 1.2) / 0.02 = 105(Ω)。
まあ、100ΩでもIf = 21mAとなり、絶対定格60mAの1/3なので、安全率3だし壊れはしないでしょう…ということで、100Ω。
フォトトランジスタの抵抗R2は10kΩにしましたが、これは最初プルアップと思い込んで、いつもの様に10kΩにしていたら動いてしまったので、実験で決めた値になります。ちゃんと計算するなら、ON時に流す電流、データシートのグラフにある過渡応答特性などから総合的に判断すべきなんでしょう…。
その場合、R2 = (Vcc - Vce(sat)) / Ic = (3.3 - 0.4) / 0.002 = 1450(Ω)
あれ、結構低いですね、まあいいや…
LED1は、電源がここまでは来ているよという確認の為に設けています。そうしないと、テスターでいちいち測ることになって面倒ですので。
D1は、コネクタの逆挿入防止です。といってもXHコネクタは1方向しか入りませんが。ブレッドボード向けジャンパワイヤなどを利用した時のためと、安心のために一応入れています。ダイオードの選定理由は特に無し。面実装で小型で、Eagleのライブラリにあったから、かな。
FUSE1は、万が一この基板がショートしたりして過大電流が流れた時に、それはどう考えても故障なので、せめて他の基板は動いてくれよと、この基板だけ切り離すためのポリスイッチです。電源電圧も低いですし、消費電流は100mAにも満たないでしょうから(これは計算できるはず)、1608サイズの小さなポリスイッチを利用しています。
メイン基板について
最初はチャタリングが発生するかと思い、センサーからの入力に対してLPF(積分回路)を入れようかと思っていました。が、冷静に考えるとセンサーってスイッチではないですし、実際にオシロスコープで波形を見てみてもチャタリングなんてなかったので、結局R4 = 0Ω、C2 = NI(Not Inserted, 未実装)になっています。
IC1は、波形整形のためのバッファーICです。この基板では、バッファーICはここにしか使用しないので、1ゲートロジックICであるTexas InstrumentsのSN74LVC1G07を使用しています。が、後述の理由から、74LVC1G34(TI, NXP)を利用するか、74LVC1G08(2-input AND)か74LVC1G32(2-input OR)の2つの入力を接続してバッファーとして使うなどした方がいいようです。
余談ですけど、1ゲートロジックは面実装ばかりですが、入力電圧範囲・電源電圧範囲が広いことが多く、基板を作る回路の時には便利ですね。あまり秋葉原とかには売っていませんけど。
D1は、万が一コネクタに過大電圧(静電気とか?)が加えられた場合の保護回路です。本当に動くのかな、まだ試験したことないです。「ヤバい状況下で、保護回路が本当にちゃんと保護してくれるのか?」というのは気になる話ですので、今度試してみたいです。
R3は、コネクタに何も繋がっていない場合、Logic ICの入力が不定にならないようにするための、プルアップ抵抗です。値は特に考えず10kΩ。
メイン基板のJ3は、ここからNucleoに対してメイン電源を供給するために付けたコネクタです。でも、Nucleoを外部電源で動かすためには、Nucleo上のジャンパーの切り替えが必要だったので、まだ浸かってなかったりします。JP1は、この基板上で外部電源を利用するかどうか切り替えるジャンパーです。
続いて、ソレノイド駆動回路に話を移します。
FET(Q1、X1)は、ソレノイドのON/OFFを制御する素子です。モータードライバーなどのスイッチ素子は、わりかし過電流などで破壊されやすいので、交換を容易にするために手半田しやすい2SK4017用パターンも用意することにしました。初期では特性の良いQ1を実装しておき、もし壊れた場合は、以後X1にします。
Q1を選定した理由は、Digikeyでよさそげなのを探していたところ出てきたことと、IRのFETは優秀そうだっていうイメージからです(この会社の主力製品ですよね)。
R15はFET入力に対するダンピング抵抗です。そんな反射で困ったことはないけれど、半ばおまじないのように入れています、R16は、万が一Nucleo基板が挿入されていなかった場合に、FETの入力が不定とならないようにするための、プルダウン抵抗です。FETがそんな状況下でONされては困るので、プルダウンです。
パターン
センサー基板のパターン図 |
メイン基板のパターン図 |
センサー基板は、ネジでちゃんと固定できるように、M3.2の穴を2つ開けてあります(1つだと回転しそう)。実際にはM3のネジを使いますけど、なんか余裕のない穴径は嵌まらなくなりそうで怖いので、+0.2mmして3.2にしています。
で、ぶっちゃけるとこれらが基板の半分以上を占めています。やはり機構部品は大きいですね、電子部品のようにもっと小型化しないかなあとよく思ってしまいます。回路の部品は、なるべくセンサとコネクタの隙間に詰めるようにしました。
もう一つ気をつけることとして、フォトリフレクタとXHコネクタは逆向きに実装することがあります。フォトリフレクタは紙方向に向きますが、その分コネクタから線を取り出すスペースは逆の面にしかありませんので。
メイン基板は、なるべくバッファーICを、信号コネクタの直近に配置するようにしました。そうすれば、基板内はちゃんとした信号になるといいな(願望)。
ソレノイドは、それなりに電流が流れるということで、配線を太くし、裏面のベタアースはしないようにしています(なんでだっけ)。ダイオードは、ソレノイドの直近に配置するようにしました。
FETは、2つのデバイスのS、G、Dが全て共通なので、TO-251AAの2SK2417と、TSOP-6のIRLTS6342PbFをうまい具合に配置しないといけません。で、圧倒的にTO-251AAが大きいので、その間に何とか収まるように配置してみました。IRLTS6342PbFはDが4ピン分ありますので、それを2SK4017のDに繋がるポリゴン上に乗るよう、大まかに位置決めをしています。
また、ソレノイドに流れる電流は、そのまま外部電源のGNDに帰って欲しいので、FETのSと外部電源につながるコネクタJ2のGNDをポリゴンで囲い、外のGNDとは小さく繋げています。
そうそう、ここに書かれているArduinoのピン番号のシルク、基板を作ったら書かれていませんでした。SparkFun-Boards.lbrの なんですけど、番号とかは全てtPlace(21)に書かれてました。あれ、変だ… ガーバーデータを確かめないと、、
実際に制作してみて
この基板も、当然のように最初動きませんでした。
センサー基板からの出力はちゃんと出ているのをテスターで確認できたので、メイン基板の信号の流れを追っていくと、ロジックICの出力で信号が途絶えていました。
このバッファIC、最初はLVCMOS出力かと思ってたのですが、よくよくデータシートを見たらOpen-Drainって書いてありました。そりゃ動きませんね、出力にVccへのプルアップ抵抗を付けてみたのですが、それでもまだ動きませんでした。えーなんでと思いつつデータシートを更に読むと、p.11のLayout Exampleで、NCピンをfloatにしてないのを見つけました。よく説明を読むと、GNDかVccに配線するよう書かれていました。で、その通りにジャンパを飛ばしてみたら案の定動きました。たとえ5ピンのロジックICだとしても、油断せずにデータシートはよく読めということですね…。
それ以外にバグはなく、FETもちゃんと動いてくれました。
今回の教訓
- 例えロジックICでも、5ピンしかなくても、ちゃんとデータシートは読む。
- NCピンの処遇はちゃんと確認する。
- ICのOpen-Drain出力には気をつける。