岩の製作記

作ったものを適当に記録します

DCモータドライバの作り方

はじめに

この記事は、学ロボAdvent Calendar 2023の19日目の記事です。

adventar.org

またこの記事は京大機械研究会の部内wikiと同じものです。

モータドライバはなぜ必要?

マイコンからモータを回したいとき、誰もが最初はGPIOにモータを繋げようとするでしょう。ですが残念ながらこれはうまくいきません。GPIOの電流出力能力がせいぜい数mA~数十mAに対してモータは数A単位で電流を食うので、下手すればマイコンが燃えてしまいます。そこでモータドライバ (モタドラ、MD) が必要になるわけです。

DCモータってどんなやつ

どんなやつといっても、電圧を加えると電流が流れて回る。逆向きに電圧を加えると逆向きに回る。電圧を加えるのをやめると回転が止まる。簡単ですね。また電圧を上げるとトルクが増加し回転数が上がり、負荷を増やすと回転数が下がって電流が増加します。これも直感的にわかりますね。真面目に説明するならば逆起電力+巻線抵抗の両端電圧と入力電圧のつり合いを考える必要がありますが、なんとなくで理解できていたら大丈夫でしょう。DCモータはとりあえず電圧加えたら回るってことだけ分かっていれば良いです。モータと回路は燃やして強くなるものです (諸説)。

一番簡単なモータドライバ

さて本題に入りましょう。いきなり多機能なモータドライバを組むのは難しいので簡単なものから始めましょう。というわけでこれです。

motordriver1.png (5.8 kB)

馬鹿にしてはいけません。これはモータの回転と停止を制御できるモータドライバです。逆転はできませんが。 ちなみに分からない人に説明しておくとVDDとGNDは電源を表しています。VDDに電源の+極が、GNDに電源の-極が繋がっていると考えれば良いでしょう。 これのスイッチをNch-MOSFETに置き換えたものがこれです。

motordriver2.png (10.0 kB)

今度はINPUTに加えた電圧でモータを制御できるようになりました。Nch-MOSFETはG(ゲート)-S(ソース)間にVth(スレッショルド電圧)以上の電圧を加えるとD(ドレイン)-S(ソース)間が導通(ターンオン)し、電圧をVth以下にすると非導通になる(ターンオフする)素子です。要はGS間の電圧の有無でスイッチをコントロールできるわけです。 電圧で制御すると言いましたが、実際はGS間はコンデンサのような特性を示すため、MOSFETの駆動はこの仮想的なコンデンサを充放電することで行います。INPUTに電圧を与えるとR1(ゲート抵抗)を介してコンデンサが充電/放電され、MOSFETがON/OFFします。R2はINPUTの電圧が不定となったときにコンデンサを放電してMOSFETをOFFするためにつけています。この回路がMOSFET駆動の基本となるので形を覚えておきましょう。難しく感じるかもしれませんがここは大事なので気合で理解してください。

正転/逆転できるモータドライバ

motordriver3.png (8.3 kB)

これはHブリッジと呼ばれる回路です。スイッチが4つに増えましたね。落ち着いて動作を確認しましょう。まずは全てのスイッチがOFFの時、モータは停止します。次にSW1とSW4がONの時、1番端子から2番端子に電流が流れてモータは回転します。次にSW2とSW3がONの時、2番端子から1番端子に電流が流れてモータは逆回転します。次にSW2とSW4、またはSW1とSW3がONの時、両端子が繋がれてモータは停止します。ここで、モータの軸を回転させようとすると電流が流れますが、この状態では両端子がショートしているためモータの回転を止めようとする力が働きます。要はブレーキがかかるわけですね。最後にSW1とSW2、またはSW3とSW4がONの時、この回路はショートします。危険ですね。でもこうするしかないのでみんなこの回路を使うんです。仕方ないのでこのような状態に陥らないようにスイッチを制御しましょう。

Pch/Nch-MOSFET混合モータドライバ

motordriver4.png (30.3 kB)

スイッチをNch-MOSFETとPch-MOSFETで置き換えました。Q2、Q4については先程と同じですね。そして新たにQ1とQ3にPch-MOSFETが導入されました。これも同じくGS間の電圧で動く素子ですが、先程と違うのはGS間に負の電圧を加えるとターンオンする点です。Nch-MOSFETの逆みたいな素子ですね。なんでPchなのかというと後述するめんどくさいゲート駆動の問題を避けるためです。この回路をマイコンから動かせるようにしたのがこちらです。

motordriver5.png (35.6 kB)

ややこしくなってきましたね。先程の回路にレベル変換用のトランジスタを追加し、マイコンの3.3VのGPIOでMOSFETが駆動できるようになりました。しかしこの回路は致命的な欠点をいくつか抱えています。 まず1つ目、VDDの入力電圧が10V~15V程度に限定されることです。MOSFETのゲート耐圧は20V程度のものが多く、またターンオンには最低でも10V程度の電圧が必要とされるからです。24Vを多用するロボコン等には向きませんね。 次に2つ目、MOSFETの駆動が遅いという点です。各MOSFETに対しトランジスタ1石で駆動するとプルアップ抵抗 (R3とかR4とか) のせいでどうしてもゲート駆動電流が低くなってしまいます。すなわちGS間のコンデンサの充放電に時間がかかり、信号を入力してからMOSFETが完全にON/OFFするまでにタイムラグが生じます。後述するPWM制御などを行った際、このタイムラグが問題になります。 次に3つ目、入力次第で短絡が可能という事です。これは入力にロジックICを挟むなどして解決できますが。 最後に4つ目、Pch-MOSFETはON抵抗が高いという事です。MOSFETはターンオンした時にDS間が抵抗のようにふるまい、この抵抗値をON抵抗といいます。これがPch-MOSFETはNch-MOSFETに比べて数倍以上高いため、大電流を流した時に発熱が問題になります。なのでこの回路はRS-385とかそれ以下の小さいモータ専用になってしまいます。だったら全部Nch-MOSFETで作ればいいじゃん、ということで次の回路です。

フルNch-MOSFETモータドライバ

motordriver6.png (22.0 kB)

先程の回路のPch-MOSFETをNch-MOSFETで置き換えたものです。なんだ、これでいいじゃないか、Pch-MOSFETとか出してくんなやとか言ってはいけません。これ、ゲートの駆動がチョット大変なんです。Q2とQ4は今までと同じくGNDに対してINPUT2、INPUT4に10V程度を与えれば駆動できますね。しかしQ1とQ3はどうでしょう。Q1に注目すると、例えばQ1とQ4をONの状態で維持しようと思ったら、Q1がONのときQ1のソースの電圧はQ1のドレインの電圧にほぼ等しいことを考えると、VDD(電源電圧) 以上の電圧をゲートに加えないといけないことが分かります。つまり昇圧回路か別電源が必要ということです。困りましたね。というわけでこうしてみましょう。

ハイサイドMOSFET駆動とゲートドライバの導入

motordriver7.png (40.9 kB)

ここで新たなデバイス、ゲートドライバを導入します。これは名前の通りMOSFETのゲートを駆動するためのデバイスで、電源を与えると入力に応じてMOSFETのゲートをON/OFFしてくれます。今回はフォトカプラ(LEDと受光素子を用いた絶縁デバイス) とゲートドライバが一緒になったデバイスTLP250を使ってみました。INPUT1に電圧を加えるとフォトカプラU1のLEDが光り、ゲートドライバがONになって電池BT1から電荷が与えられてQ1がターンオンします。INPUT1を0VにするとLEDが消灯してゲートドライバがOFFになり、Q1はターンオフします。ここで電池を使ってハイサイド(Q1、Q3)ゲート駆動用の電源をVDDと別で用意したことがポイントです。とは言いつつも電池は電池、時間が経つと使えなくなってしまいます。さらに10V程度ある電池を用意するのも大変です。というわけで電池を絶縁DCDCコンバータに置き換えてみましょう。

motordriver8.png (50.7 kB)

電池が絶縁DCDCコンバータになった以外は先程と変わっていません。動作も同じです。 これで完璧!と言いたいところですが、絶縁DCDCコンバータはやや高価です。絶縁電源を使わずにハイサイドMOSFETを駆動したい、ということで登場するのがブートストラップ回路です。

ブートストラップ式フルNchモータドライバ

motordriver9.png (47.6 kB)

ダイオードが追加されましたね。ここでポイントとなるのがPWM制御です。PWM制御は、高速でONとOFFを繰り返してONとOFFの時間の比でモータの出力を制御するというものです。つまり、HブリッジでPWM制御を行うときはQ1とQ4がON、Q2とQ4がONを繰り返してON/OFFを切り替えるわけです。このときの回路の動作を考えてみましょう。 Q2がONのとき、点SAは0Vに近い電圧になり、D1を通してC1が充電されます。Q2がOFFになりQ1をONにしようとすると、コンデンサから電荷が供給されてQ1がONになります。このときダイオードの整流作用でコンデンサから電源に電流が流れることはありません。これを繰り返せばハイサイドMOSFETの駆動が達成できるわけです(下図)。

motordriver11.png (40.8 kB) motordriver12.png (40.1 kB)

Q2がOFFの時間が続くとコンデンサの電圧は少しずつ下がってしまうのでQ1をずっとONにはできず、PWM制御が前提となってしまいますが、正しく設計すればDuty0.99くらいは達成可能なので十分実用的な回路だと言えます。

ロジックの整理

先程までは入力が4つあり、入力次第ではショートしてしまうのでロジックICを使って入力を制御しましょう。今回はPWM、PHASE(回転方向)、ENABLE(Loで全MOSFETがOFF)の3入力で制御できるようにしてみましょう。ショートが起きないのに加え、マイコンのPWM出力も1本で済みます。真理値表は以下の通りです。

ENABLE PHASE PWM INPUT1 INPUT2 INPUT3 INPUT4
1 0 0 0 1 0 1
1 0 1 1 0 0 1
1 1 0 0 1 0 1
1 1 1 0 1 1 0
0 x x 0 0 0 0

カルノー図を描いても良いですが、これくらいなら脳内でサクッと組んじゃいましょう。こんな感じです。

motordriver13.png (21.7 kB)

デッドタイム

実は先程の回路ではまだ実用できません。というのは、Q1とQ2のON/OFFを切り替える際に、一瞬だけショートしてしまうからです。なぜなら始めに述べた通りMOSFETのゲートはコンデンサのような特性を示し、このコンデンサを充電/放電する時間が必要でその間MOSFETは中途半端にONになった状態になるからです。すると以下のようにQ1とQ2が同時にONになった時間が生まれてしまいます。

motordriver14.png (13.0 kB)

そこでQ1、Q2のターンオフはそのままで、ターンオンのみをちょっとだけ遅らせて両方OFFの時間を作ります。この時間をデッドタイムと言います。

motordriver15.png (10.2 kB)

こうすることで、ON/OFFの切り替え時もMOSFETがショートするのを防ぐことができます。デッドタイムマイコンで作っても良いですが、より確実な回路で作るのをおすすめします。例えば以下のようにすれば回路でデッドタイムを自動挿入できます。

motordriver16.png (40.4 kB)

遅延といえば定番のRC回路ですね。ロジック出力をいったん反転し、RC回路で遅延を発生させて、ダイオードで充電方向のみバイパスします。こうすると、C_Deadtimeの充電は一瞬、放電はゆっくり行われます。これをさらに反転したものをゲートドライバに入れています。つまり、ゲートドライバがONからOFFになるとき(=C_Deadtimeが充電されるとき) は遅延なく、ゲートドライバがOFFからONになるとき(=C_Deadtimeが放電されるとき) は一定の遅延が挟まれます。これでデッドタイムが作れたことになります。ここまでくるともう十分実用的なモータドライバができますね。

実際の設計

というわけでお待たせいたしました。それでは実際の回路を設計していきましょう。...とその前に、フォトカプラはスイッチング速度が遅い(~20kHz程度)のでそれ以上のPWM周波数が必要なら磁気式絶縁ICを使いましょう。絶縁ICとゲートドライバが一緒になったIC(ADuM3224など)を使えば楽ですね。今回はこれを用いた絶縁型モータドライバを組んでみます。ちなみに絶縁するのはモータ等から来るコモンモードノイズをロジック側に極力入れないようにするためです。まあちゃんと対策していればロボコン程度なら絶縁しなくても問題は無かったりしますが、考えるのが面倒くさいので今回は絶縁仕様とします。

仕様の決定

駆動対象: DCモータ 電源電圧: 24V 最大電流: 連続30A 入力: PWM、PHASE、DISABLE ロジック電圧: 3.3V 絶縁: あり FET: フルNch-MOSFET

Hブリッジ

motordriver17.png (20.0 kB)

まずはモータドライバの心臓部、Hブリッジを設計します。Hブリッジの設計というかMOSFET(とヒートシンク) の選定ですね。まずはVds定格(ドレイン-ソース間電圧定格)です。今回は電源電圧が24Vですが、サージ電圧などが発生する可能性も考えて定格には余裕を持ちましょう。40V、できれば60V以上の耐圧を持つMOSFETを選びましょう。Id(ドレイン電流) についても同様に最大電流から少し余裕を持って選定を行いましょう。次に注目するのはON抵抗です。ON抵抗をRds(on)、流す電流をIdsとするとMOSFETには

 \displaystyle
P=R_{ds(on)} \times Ids^{2}

の熱が発生します。ヒートシンクの熱抵抗をRth(heatsink)、MOSFETのチャネル-ケース間熱抵抗をRth(ch-c)とすると、ヒートシンクの温度上昇は

 \displaystyle
T=P \times (R_{th(heatsink)}+R_{th(ch-c)})

となります。外気温を50℃まで想定し、最大温度を80℃とすると、Tを30以下に抑える必要があります。MOSFETヒートシンクのデータシートを見ながら、Tが30以下になるようなRds(on)を持つMOSFETヒートシンクを選びましょう。 また他にも注目しておきたいのがゲート入力電荷量Qgです。これが大きいほど後のゲートドライバ周辺の設計で苦労するので、なるべく小さいものを選びましょう。 ここで注意すべきなのが、耐圧が高くなるほどON抵抗は大きくなり、ON抵抗やゲート入力容量は小さいほどMOSFETが高価になる傾向があるということです。トレードオフの中で用途に合ったMOSFETを選ぶしかないのです。今回は入手性を考えて秋月電子のTK100E06N1を選びました。用途によっては表面実装品やDigikey、Mouser、RSコンポーネンツを利用するのも良いでしょう。

ゲートドライバ

次にMOSFETを駆動するゲートドライバを選定します。ゲートドライバの選定で注目するのは、機能と、入力電圧と、出力電流です。PWM周波数が高いほど、またMOSFETのQgが大きいほど、より高速で出力電流の取れるゲートドライバが必要になります。今回は絶縁も同時にしてしまいたかったので、秋月電子のADuM3224を選びました。これはロジック電圧3.3Vに対応しており、1個で絶縁とHブリッジのMOSFET2個(ハーフブリッジという) が駆動でき、出力電流も4A取れる優れものです。私が購入したときは確か440円だったのですが、倍近い値段になってしまっていますね...。安いものが良ければそちらでも構いませんし、Digikey等にもっといいのがあるかもしれません。

ゲート抵抗、プルダウン抵抗

ゲートドライバが決まったらゲート抵抗とプルダウン抵抗を決めます。ゲート抵抗は大きすぎるとスイッチングが遅くなって損失(=発熱) が増えますし、小さすぎると寄生成分等でリンギング(電圧の振動) が起きる可能性があります。また駆動時の最大電流がゲートドライバの規定値を超えないようにしなければなりません。今回はゲート抵抗として10Ωを選定しました。最大電流はゲート駆動電圧を12Vとすると1.2Aなので、ゲートドライバの規定値4Aに収まっています。またプルダウン抵抗は、通常数十kΩ~100kΩとする場合が多く、今回は20kΩとしました。プルダウン抵抗は大きすぎるとノイズの影響を受けやすくなり役割を果たせなくなりますし、小さすぎるとブートストラップコンデンサがプルダウン抵抗を介して放電する影響を無視できなくなってしまいます。

ブートストラップ回路

motordriver18.png (36.0 kB)

次にゲートドライバを使ってブートストラップ回路を組みます。ダイオードD1、D2は逆回復時間の短いショットキーバリアダイオードを使用しましょう。ブートストラップコンデンサC1、C3は、基本的にはMOSFETのゲート容量の10倍以上としますが各ゲートドライバのデータシートを参照すべきです。今回はADuM3224のデータシート通り、10uFとしました。またバイパスコンデンサC2、C4についても、同様に10uFとしました。コンデンサ積層セラミックコンデンサを使いましょう。またゲート駆動電圧ですが、基本的に高いほどON抵抗は小さくなるので、定格に余裕を持った範囲で大きくしましょう。今回は12Vにしました。

制御ロジックとデッドタイム生成

motordriver19.png (38.7 kB)

ゲート駆動回りが完成したら制御ロジックとデッドタイム生成回路を組みましょう。今回はゲートドライバにDISABLE入力があるので、これはそのまま利用し、PWMとPHASEの2入力でINPUT1~INPUT4を制御するようにしました。デッドタイムの計算方法はいろいろありますが、今回使った式を紹介しますと以下の通りです。

 \displaystyle
T_{dead}=\lbrace - C_{gate} \times R_{gate} \times \ln \frac{V_{th}}{V_{gate}} +(t_{off}-t{on}) \rbrace \times 1.5

Cgateはゲート入力容量、Rgateはゲート抵抗、VthはMOSFETスレッショルド電圧、Vgateはゲート駆動の電圧、toffはターンオフ時間、tonはターンオン時間、1.5倍しているのは安全率です。MOSFETのデータシートとゲート抵抗値からTdeadを計算すると387nsとなります。時定数が387ns以上になるようにRdeadとCdeadを選び、今回はRdead=1.2kΩ、Cdead=330pFとしました。時定数はR x C = 396 [ns] です。

電源部と入力

motordriver20.png (13.5 kB)

最後に電源と入力です。ゲート電源を三端子レギュレータで生成し、また電源入力にはモータの逆起電力吸収用の大きめのコンデンサを載せます。ロジック入力はコネクタ接続とするならプルダウン抵抗を入れておきましょう。好きなマイコンと直結してもよいです。

全回路図

motordriver21.png (102.9 kB)

これにてモータドライバはとりあえず完成です。お疲れ様でした。

発展編

モータと直列にホール式電流センサを入れたり、Hブリッジの直下にシャント抵抗とアンプを置いたりすると電流制御ができますね。また下のようにハーフブリッジを3つにするとブラシレスモータドライバが作れます。 motordriver22.png (74.2 kB)

あとがき

モータドライバの設計は最初は難しく感じるかもしれませんが慣れれば簡単になってきます。たくさんモータドライバを作って、燃やして、強くなりましょう。 上記の内容は全て筆者が独学した内容を初心者向けに解釈して記述したにすぎないので、誤りがあるかもしれません。その際は是非コメントまたは筆者までお知らせください。 また上記の回路図は未検証です。内容をまねて作った作品が不具合を起こしたりそれによって損害を負っても、筆者は責任を負いかねますのでご了承ください。

74HC181を手に入れたので初めての自作CPUを作った話

この記事は 自作CPU Advent Calendar 2023 12 日目の記事です。

こんにちは。岩です。 今回はタイトルの通り74HC181を手に入れたのでCPUを作ってみた話です。

きっかけ

地元某所のパーツショップでロジックICを物色していたら、74LS181を見つけ、店員さんに聞いたら奥にCMOSもあるよ~ということで74HC181をゲットしたのが始まりです。秋葉原でも日本橋でも大須でもない隠れスポットの方が意外と買う人がいなくて在庫が残っているのかも。

構成(CPU部)

渡波 郁 氏の『CPUの創りかた』で紹介されているTD4を8bit化、入出力を拡張し、ALUを74HC181 (ALU機能を持つロジックIC) に換装、RAMを追加したものです。CPU設計は初めてだったのでできるだけ簡単な構造になるようにしました。

構成(入出力部)

今回はCPUで電卓を作りたかったので、16キーのキーボードとVFDを扱うためのI/Oボードを別途用意しました。手持ちのVFDがダイナミック点灯方式のものだったので、折角なのでロジックICのみでラッチ入力→ダイナミック点灯を実現しました。

全回路図(CPU部)

見にくくて申し訳ありません。使用ICはほぼTD4と同じです。名前は電卓用8bitCPUということでDC8です。ROM、RAMは秋月に売っているものです。

全回路図(入出力部)

構成図と同じです。製作時にはロジックICは全て東芝品で揃えてみました。 こだわりポイントです。4511の6と9のフォントが気に入らなかったので、ロジックICを追加して矯正しています。

74HC181について

74HC181は24pinの4bit ALU機能を持つロジックICです。S0~S3の制御入力とモード入力M、合計5本の入力でコントロールでき、キャリー入力Cn、キャリー出力Cn+4を使ってbit数を増やすことができます。また今回は使用しませんでしたが、2つの入力を比較するA=B出力も備えています。これだけオープンコレクタなので扱いに注意が必要です。さらにルックアヘッド演算用のP、G端子を備えていますが、こちらも今回は使用していません。演算機能はいっぱいありますが、実用的なのは10種類ほどしかありません。181を使ったからと言って高度な演算が一発でできるというわけではないようです。やはりALUは自作すべきなのでしょうか。ただ古のロジックICを現代で動かすという点においては181はロマンの塊ですね。

命令一覧

CPUを作るのは初めてだったのでどのような命令が必要かよくわからず命令を乱立させてしまいました。色々ある割には分岐命令は1つしかなかったり不便な所も多いですが74HC181のおかげで多様な演算が1命令でできるようになっています。

製作

基板サイズは秋月の大サイズユニバーサル基板に合わせて155x210とし、チップLED・抵抗・コンデンサはJLCでPCBAしました。ROMはUV-EPROMを使う予定でしたが製作時学祭が迫っておりライタの製作が間に合わなかったため急遽ラズピコで代用(自作CPUとは...?)。総製作費は部品代と合わせて5万円くらい。

ハマりポイント

ROMエミュレータであるところのラズピコから生やしたレベル変換モジュールの電流吐出力が弱く、LEDをぶら下げただけで派手に電圧降下して異常動作していたため急遽LEDを何個か外す羽目に。良い子の皆さんはちゃんとデータシートを見て必要ならバッファを噛ましましょうね。

動作

フィボナッチ数の計算です。全ての出力にLEDをぶらさげたので賑やかです。やはり大量のLEDは自作CPUの醍醐味ですね。

電卓もできました(画面酔い注意)。今回は固定長命令を採用したためプログラム容量が256Bしかなく、6桁だと加算のみが限界でした。可変長命令にしてプログラムカウンタを増強するか、うまくプログラムすれば減算もできそうですが...。加算のみとは言いつつ、電卓なので入力処理の時に実は乗算もしています。ボタンを押すたびに10倍しますからね。

あとがきと展望

TD4を除けば初めての自作CPUでしたがとりあえず動作まで達成したので良かったです。今度は可変長命令と自作ALUに挑戦してみたいですね。自作CPUの沼は深そうだ...

マイコン無しでPIDライントレーサを作る

こんにちは。趣味で電子工作をしています岩です。マイコン不使用・アナログ縛りでPID制御ライントレーサを作ってみたので、詳細を以下に記します。

きっかけ

学校の講義でオペアンプによる加算・微分積分回路を学び、それが出来るならPID制御も出来るよね?となったのがきっかけ。

構成

センサ値を一つにまとめてPID制御器に入力し、出力を左右のモータの差動に変換して曲がり具合をコントロールします。モータの制御は単純なトランジスタ増幅を用いても良かったのですが、何となく試してみたかったので三角波比較PWMを実装しました。PWMしてるならデジタルじゃね?っていうツッコミは無しでお願いします。Duty比が連続量だからまあアナログと言っていいでしょう。

全回路図

解像度が足りるか分かりませんが、一応全回路図です。以下詳しく見ていきます。

入力部

フォトリフレクタの出力を内側2つずつ、外側2つずつでそれぞれ差動増幅し、外側に2倍の重みをつけて加算することで1本のライン位置出力を得ています。差動増幅部にオフセット調整用のボリューム、加算部に入力感度調整用のボリュームを設けています。

PID制御部

分かりやすさを優先し、P項、I項、D項を別々のオペアンプで制御するようにしました。別々に制御出力を得た後、加算回路でP, I, Dを合計します。

P項

ただの反転増幅回路です。

I項

積分回路のコンデンサに並列に抵抗を挿入し、積分値が減衰するようにしました(ローパスフィルタ)。積分係数とローパスフィルタのかかり具合をボリュームで調整できるようにしました。

D項

増幅率の制限と発振防止の目的でR14とC6を挿入しています。微分係数をボリュームで調節します。

モータパワー計算部

制御器の出力を左右のモータの差動に変換する部分です。制御出力を反転させたもの用意し、非反転・反転出力それぞれにモータパワーを決定する電圧を足します。これを左右のモータ出力を表す電圧とします。

三角波生成部

コンパレータと積分回路で三角波を生成します。発振周波数は約1kHzにしました。各定数は手持ちの抵抗の中から綺麗に発振するものを選びました。

PWM生成、モータードライブ部

コンパレータ(オペアンプで代用)に先程生成したモータパワー出力と三角波を入れ、比較してPWM出力を得ます。これを各モータに与えます。 オペアンプの出力ではFETを直接駆動できないので、プッシュプル回路を挟んでゲートドライバとしています。

中点電位生成部

制御で使用する中点電位(仮想GND)を生成する部分です。抵抗分圧をボルテージフォロワに入れて中点電位としています。LM324(4回路入オペアンプ)を使う関係でオペアンプが2個余っていたので、ボルテージフォロワを抵抗を介して2個並列接続としました。出力コンデンサの値は何も考えず手持ちが多かったものを使いました。

電源

電源は手軽なものを使いたかったので、制御電源は9V電池(006P)1本、動力電源は単4電池2本としました。

ハードウェア

ハードウェアは将来的な頒布等も想定してなるべくプリント基板と既製品を使って作りました。秋月B基板サイズのプリント基板にタミヤのダブルギヤボックスを載せ、タミヤトラックタイヤを取り付け駆動部としました。ここから六角スペーサで高さを調整してセンサ基板を接続し、基板両端にタミヤボールキャスターを取り付けて前輪としました。また六角スペーサで駆動部の上に基板を縦積みして制御回路と単四電池を載せました。制御基板とセンサ基板はピンヘッダで繋ぎ、圧着の手間をなくしました。最後に余ったスペースに006Pをねじ込んでハードウェア完成としました。製造コストを抑えるため全ての基板を100mm角以下とするのにかなり苦労しました(特に電池の置き場)。

動作

PID制御が効いてかなり滑らかな走行ができています。このコースではこの速度が安定して走行できる限界でした。 三角波比較PWMの動作です。綺麗な三角波が出せています。アナログな回路の検証にはやはりアナログなオシロスコープが良いですね。

あとがきと展望

いろいろ急ぎで作ったので、定数とかはかなり適当に決めています。もし何かの参考にしていただくことがあればご注意ください。 オペアンプがあればPIDができる、オペアンプトランジスタで作れる、ということで、次はIC禁止PIDライントレースでしょうか。作るのはいつになるやら...

Nintendo Switchでロボットを操作する

こんにちは。京大機械研の岩です。先日Nintendo Switchを買い、マイコンと通信してロボットを動かせるようにしてみたので記事にしておきます。

きっかけ

キャチロボバトルコンテスト第13回大会に出場するにあたり、Nintendo Switchをロボットのコントローラとして使えないか試してみることにしました。
早速Nintendo Switchのゲーム開発環境について調べてみますが、ネットの情報によるとどうやら経験のある開発者しか申請を通してもらえないなどの情報があり、ソフト屋さんではない私は直接の開発は諦めることにしました。
そこで出会ったのが「プチコン4」というゲームソフトです。

www.petc4.smilebasic.com

これはNintendo Switch内でプログラミングができる製品で、オリジナルのゲームを作ったり遊んだりできます。プログラムはBASIC言語で記述します。
このソフトを活用して”無理やり”外部のマイコンと通信し、ロボットを操作することにしました。

構成

プチコン4でUI制御とジョイコン情報の取得を行い、取得したデータを音声通信でヘッドホン出力からマイコンに流し込みます。これを元にロボットを操作します。

UI制御とジョイコン情報の取得

プチコン4側のプログラムです。

ボタンを長方形で描画し、タッチ座標を比較判定して、押されたボタンのIDを取得します。 ボタンの同時押しを非対応とすることでデータ量を減らしています。 ジョイスティックは中央+8方向のみとし、さらにデータ量を減らしています。

音声通信のプロトコル

0から9までの数値データを周波数変調し、音を鳴らす/止めるを繰り返すことで連続してデータを送信します。データの終了/開始点を明確にするため、データの末尾にストップビットを追加しています。 データを0から9までとしたのは周波数領域上でデータを密にしすぎるとマイコンでデータを受け取る時に隣同士の数値が間違って受け取られるためです。受信側アルゴリズムの工夫次第ではもっと詰められるとは思いますが。

プチコン4で音声通信

一桁ずつ音声信号に変調して出力します。基本的に各音階に1つの数字を0から9まで割り当てていますが、EとFやBとCなど近い周波数の音どうしは避けて変調しています。 プチコン4ではタイマー割り込みが使えず、また遅延命令がWAIT(1/60sec単位)しか使えないため、1/60secを単位として通信を行います。前述のプロトコルだと10進数で1桁のデータを送信するのに2/60secかかるので、通信速度は驚異の100bpsとなります。遅延を抑えるためにはデータ量の削減が必須です。

受信側

トランジスタで音声波形の正の部分だけを増幅し、マイコンで読みやすいパルスに変えます。抵抗値は適当に手元にあった10kにしました。

TP1の波形です。

TP2の波形です。

回路さえできればあとはマイコン側で復調するだけです。割り込みでパルスの幅を測って比較し、ボタンIDとジョイスティック方向IDを得ます。

動作の様子

受信したデータをターミナルに吐いてみます。

音声信号は可聴領域なのでイヤホンプラグを外すと特徴的な通信音が出ます。

課題点

今回実装した方法だと通信が遅く最大遅延が150msも出てしまいます。もっと速くSwitchからデータを送る方法を模索しないといけませんね。
画像による転送やステレオ音声を使った並列化など手段はまだまだありそうです。

追記

通信方式を見直して送信周期を15ms程度にまで改善することができたので、追記しておきます。
プチコン4側のプログラムです。PCMSTREAMという任意波形を生成できる関数を使って通信します。

L出力にクロック信号、R出力にデータ信号を流し、同期通信を行います。
波形は以下の通りです。SPIもどきと言ったところでしょうか。
Switchの音声出力にはDCカット回路が入っているようなので、電圧の時間平均が0になるように波形が少々変則的になっています。

データ信号の生成部です。8bit幅のデータ×5を1bitずつ処理してPCMSTREAMする波形配列を作っています。

実際の通信波形です。上がデータ、下がクロックです。PCMSTREAMの性能上かなり歪んだ方形波になっています。

受信側は前回同様トランジスタで検波、増幅し、マイコンで信号を受け取ります。
クロックの立ち上がりエッジでデータのHIGH/LOWを読み込み、1bitずつ復調します。 プログラムは省略します。
これでなんとか実用できそうな通信が実現できました。

ホテルの玄関スイッチを自宅に設置する

こんにちは。趣味で電子工作をしています岩と申します。今回はホテルの玄関によくあるあのスイッチを自宅に設置してみました。

きっかけ

先日ホテルに宿泊する機会があったのですが、玄関で見かけたスイッチ(下図)に一目惚れしてしまい...

こいつを自宅に設置してやろうと考えたのです。

衝動、そして入手

調べてみると埋込タブレットスイッチという名前で販売されているらしく、モノタロウや千石電商で取り扱いがありました。

早速大阪・日本橋に向かい、購入。6000円弱で買うことができました。千石電商さんありがとう。

自宅設置の構成を考える

物が入手できたので設置に向けて構成を考えます。

今回はESP32で赤外線学習リモコンを作り、それを埋込タブレットスイッチでON/OFFすることにしました。

これにより電気工事を避け、賃貸住宅での設置を可能にしました。(念のため、筆者は第二種電気工事士資格持ちです)

製作

まず基板を作ります。ESP32に赤外線受光モジュールと赤外線LED、ドライブ用のトランジスタ、抵抗、ターミナルブロックを付けました。

Fusion360でさくっとケースをモデリングして3Dプリント。良い時代に生まれたものです。

配線はかなり強引に収めました。一応絶縁等には気をつけましたが汚いですね。はい。

あとはESP32に学習リモコンのプログラムを書き込んで終わりです。今回はIRremoteというライブラリを利用し、大変簡単にコードが書けました。

完成、そして設置

完成したスイッチモジュールを壁に取り付けたところです。タブレットを抜いた時に光る位置表示灯が性癖に刺さります。

タブレットを抜き差しすると連動して部屋の電灯が点灯消灯します。それだけですが、操作感がかなり楽しいです。

皆様もぜひ自宅に埋込タブレットスイッチを設置してみてはいかがでしょうか。

電流センサ付き高出力モタドラの自作

初めまして。京大機械研の岩(@iwamechatronics)です。NHK学生ロボコン向けにそこそこ使えそうなモータドライバを自作したので、その過程を書いておこうと思います。

注意:この記事には素人の独断と偏見による誤った設計が含まれている可能性があります。ご了承ください。

概要

開発の経緯とか

強いモタドラって全人類の夢じゃないですか。というわけで強そうなモタドラを作りました。コンセプトは実用的でラクなやつです。

実は昨年度も下のようなモタドラを作っていたのですが、

爆熱・低出力・非絶縁とあまりよくない感じだったのに加えて、使用していたゲートドライバ(A3921)が入手できなくなったので新規開発に踏み切りました。ついでに電流センサと各種保護機能も載せることにしました。機構班と制御班がいじめてくるので、多少粗野に扱っても壊れない頑丈さを確保しました。

仕様

  • 定格電流: 40A
  • 定格電流 (空冷時): 60A
  • 定格電流 (瞬間): 100A
  • モータ電源電圧: 12-35V
  • 制御電源電圧: 3.3-5V
  • PWM周波数:1-20kHz
  • Duty比: 0-0.99
  • 電流測定範囲: 0-64.5A
  • 過電流検知閾値: 29.2-145.8A (半固定抵抗で設定)
  • 過熱保護: PTCサーミスタ
  • 基板サイズ: 60 x 80mm
  • 製造単価: 約5000円

構成

構成は以下の通りです。都合の良いゲートドライバICと電流センサICを見つけたので、それに合わせて組みました。面倒なことは専用ICにやらせましょう。

構成図

回路

回路図です。入手性を考えてなるべく秋月部品で組みました。

回路図

駆動部

特に捻りはありません。普通のHブリッジとブートストラップ回路です。

駆動部

ブリッジ

秋月のTK100E06N1を4個使ってHブリッジを構成しました。選定理由は、秋月で安く入手できて(130円/個)、100A流せて、耐圧がそこそこ高く(60V)、オン抵抗がそこそこ低い(1.9mΩ) からです。TO-220なのでパッケージの電流制限や放熱に関しても安心感があります。ゲート入力容量が少し大きいのは気になりますが、PWM周波数が高々10kHzでゲトドラもそこそこ強いので問題ありません。

ゲートドライバ

ゲート駆動には秋月のADuM3224を使いました。これ1個でブリッジ半分の絶縁とゲート駆動が一気にできるので楽ですね。

ハイサイドFETの駆動はブートストラップにしました。コンデンサとか抵抗の値はADuM3224のデータシートに従って計算しました。ここのコンデンサの選定で少しハマったので、後ほど記します。

ゲート電源は駆動電源をレギュレータで12Vに降圧して確保しました。ツエナーダイオードを使うのもアリですね。

コンデンサの選定でハマった話

コンデンサにはDCバイアス特性ってのがあります。これを知らずに部品選定をしてハマったので書き留めておきます。

誘電率系の積層セラミックコンデンサは直流電圧をかけると見かけの容量が大きく減小します。これがDCバイアス特性の罠です。

例えば秋月のこの子の場合だと、DCバイアス特性は以下のようになります。

秋月チップコンのDCバイアス特性

定格10uFですが10V時には2uF以下になってしまっています。対して、秋月のこの子の場合だと、同じ10uFですが10V時はだいたい5uFですね。一般にパッケージが小さいほどDCバイアス特性は顕著に現れます。小型大容量なMLCCを使うときはDCバイアス特性に注意しましょう。

保護部

電流センサの過電流検知出力とPTCサーミスタを使って過電流保護と過熱保護を実装しました。

保護部

過電流保護

電流センサCZ3A05は可変抵抗で閾値を設定可能な2系統の過電流検知出力(オープンコレクタ)を有します。過電流検知が作動するとトランジスタQ1がONになり、コンデンサC16の両端電圧が下がり、Q2がONしてゲートドライバに停止信号を送ります。

過電流状態が解除されるとC16がR13, R14を介して充電され、一定時間後にQ2はOFFになり停止状態が解除されます。これにより過電流保護と自動復帰を実現しています。

アナログ回路はなんもわからんなので各定数はLTspiceでゴニョゴニョして決めました(適当)。

過熱保護

秋月のPTCサーミスタヒートシンクに固定し過熱保護としました。高温になると抵抗値が上がり、Q3がONして停止信号を出力します。

制御部

NANDとワンゲートOR, NOTを使ってデコーダを組みました。デッドタイムはCRとダイオードで生成しています。

制御部

デコーダ

先代のMDと互換性を持たせるため、入力はPWM, PHASE (方向入力), BRAKE (OFF時のブレーキ有無) の3入力としました。NANDを4の倍数個使ってなるべくシンプルに組んだつもりです。どんな入力をしてもアーム短絡が起きないので安全です。真理値表は以下の通りです。

BRAKE PHASE PWM AH AL BH BL
0 0 0 0 0 0 0
0 0 1 0 1 1 0
0 1 0 0 0 0 0
0 1 1 1 0 0 1
1 0 0 0 1 0 1
1 0 1 0 1 1 0
1 1 0 0 1 0 1
1 1 1 1 0 0 1
デッドタイム生成

デッドタイムコンデンサを抵抗とダイオードを介して充放電し入力信号の立ち下がりのみを遅らせ、これを論理反転することで生成しました。700nsecくらいです。

電流測定部

電流センサの出力を抵抗分圧しADコンバータ(MCP3421)で読んでいます。分圧抵抗には秋月の精密抵抗を使ってみました。

電源/入出力部

駆動電源はピンヘッダまたは横向きXT60コネクタのどちらからでも取れるようにしました。制御電源を3.3Vまたは5Vの両対応とし、また先代のMDとピン互換にするため制御ピンが少々変則的な配置になりました。

基板

基板表
基板裏

60mmx80mmが幣サークルの標準基板サイズになっているのでそれに合わせて部品を配置しました。スカスカなので配線は余裕ですね。

パターンがあまり綺麗に引けなかったので結局GNDベタは施していません。まあ銅箔厚2倍だしなんとかなるやろ。

2層基板で銅箔厚は70umです。電流容量が明らかに足りてませんが大電流駆動するときはスズメッキ線で補強することとして諦めました。安かったのでJLCPCBに発注して1週間ちょいで着弾。

実装

基板表
基板裏

リフローと手はんだを駆使して3時間ほどで完成。部品点数多すぎて切実にチップマウンタが欲しくなりました。

FETは放熱面を上にして寝かせて実装しました。秋月のヒートシンクにタップを切り、放熱シートを挟んでFET4個とサーミスタを固定しました。

設計時に基板に穴をあけておき裏からドライバーを差し込んで着脱可能にするつもりだったのですが、サーミスタの位置に穴をあけ忘れてしまい着脱がものすごく面倒になってしまいました。

動作

とりあえず適当にコントローラを用意して動確。一発完動。やったぜ。

裏でデスマ中の人間の奇声が聞こえますがご容赦ください。

電流値もちゃんと取れました。温度上昇かなんかでゼロ点がちょっとずつドリフトするようなのでモータを止めるたびにソフト側で補正をかけた方が良さそうです。

775を24V無負荷で3分回してみましたが、有意な温度上昇は見られませんでした。実運用はこれからなので何とも言えませんが、まあ上出来でしょう。

反省とあとがき

今回のモタドラ製作で良かった点

  • 堅実で余裕のある設計
  • 各種保護機能による治安の向上
  • 熱設計をちゃんとやった(大事)
  • PWM入力としたためマイコンを選ばない
  • 部品を設計前に購入しておいた(在庫切れを起こさない)

良くなかった点

  • 部品点数が増えすぎて量産がしんどい
  • 電流容量を確保しようとピンヘッダ固定部のサーマルリリーフを設定しなかったため、半田の乗りが非常に悪くなり苦行と化す
  • ADCのI2Cアドレスが固定でカスケード接続できない
  • 無駄にデカい
  • 高価格(5000円/枚)

良くも悪くもオーバースペックで使いやすいモタドラに仕上がったと思います。次はもっとコンパクトに収めたいですね。