戻る

ブラウザで動くアナログ電子回路 — 実行して測定できる7つの回路

Velxioの5V電源 — センタータップ付きトランスとしての2つの信号発生器、2本の1N4007ダイオード、平滑コンデンサ、7805レギュレータ。オシロスコープには12V AC入力と整流後の電圧が表示されている

Arduinoのチュートリアルの多くは、すぐにコードへと進みます。しかしマイクロコントローラの周りにある部品はアナログです。LEDを壊さないようにする抵抗、センサーを電圧に変える分圧回路、モーターを切り替えるトランジスタ、ACアダプタから5Vを作るレギュレータ。これらのどれか一つが間違っていれば、コードをいくら書いても直りません。

Velxioはその半分もシミュレートします。オープンソースのSPICE回路シミュレータであるngspiceをWebAssemblyにコンパイルして実行するため、抵抗、コンデンサ、ダイオード、トランジスタ、オペアンプ、レギュレータが、ブラウザ上で実物と同じように振る舞います。電圧計、電流計、オシロスコープで測定でき、回路を動かしたまま任意の値を変更できます。

この記事では7つのプロジェクトを順に見ていきます。最初の5つはマイクロコントローラを一切使わず、部品だけで構成されています。最後の2つはアナログ回路とArduino、ESP32を組み合わせたものです。どのプロジェクトもサンプルギャラリーに収録されており、以下の数値はすべてシミュレータから読み取り、それを説明する計算式と照らし合わせて確認したものです。

始める前に — 3つの計測器

一つ知っておくべきこと。AC電源を含む回路では、Velxioは電源が入った瞬間から短い時間窓(信号の数サイクル分)を解き、その窓のスコープ波形を表示します。値を変更するたびに解き直すので表示は常に最新ですが、連続的な記録ではありません。

1. LEDと抵抗 — オームの法則

9V電池、15.18mAを示す電流計、両端に7.136Vを示す電圧計が接続された470オーム抵抗、点灯した赤色LED

初心者が最初に作る回路であり、最もよく間違える回路でもあります。LEDを電池に直結すると、電流を制限するものがないため焼き切れてしまいます。直列に入れた抵抗がその役割を果たします。

計測器がすべてを物語っています。

これが抵抗値を選ぶための式です。R = (Vsupply − VLED) / I。9 Vの電池から15 mAを流すには、(9 − 1.8) / 0.015 = 480 Ωなので、470 Ωが最も近い標準値です。

試してみましょう。 抵抗を右クリックして1 kΩに変更します。電流は7.2 mAに下がりLEDは暗くなりますが、LED自身の電圧はほとんど変わりません(1.81 V)。LEDは電圧をほぼ一定に保ち、電流は抵抗が決めるのです。

VelxioでLEDとオームの法則の回路を開く

2. 5V電源 — 整流器、コンデンサ、レギュレータ

古いACアダプタの中に入っている、典型的なリニア電源を4つの段階で見ていきます。

  1. トランス。 商用ACをより安全で低いAC電圧に変換します。ここではセンタータップ付きの12-0-12 V二次側を、逆相の2つの信号発生器(それぞれピーク12 V、50 Hz)として描いています。
  2. 整流器。 二次側の各半分に1本ずつ、2本の1N4007ダイオードを使います。それぞれが自分の半サイクルで導通するため、出力には10 msごとに正のパルスが現れます。全波整流です。
  3. 平滑コンデンサ。 220 µFのコンデンサは各ピークで充電され、その間は負荷に電力を供給します。保持する電圧は平坦ではありません。ピークの間に低下します。この低下がリップルです。
  4. レギュレータ。 7805はその不安定な電圧を受け取り、入力が出力より少なくとも約2 V高く保たれている限り、出力を正確に5 Vに保ちます。

この記事の冒頭のオシロスコープ画像は、トランスからの12 V ACと、コンデンサ両端の整流後電圧を示しています。コンデンサの電圧は10.1 Vから11.8 Vの間で振れ、50 mAの負荷で約1.7 Vのリップルがあり、出力の電圧計は安定した5.000 Vを示しています。

リップルの簡易估算は**ΔV ≈ I / (2·f·C)**です。0.05 A / (2 × 50 Hz × 220 µF) = 2.3 V。この式はコンデンサが半サイクル全体にわたって負荷に電力を供給すると仮定していますが、実際にはダイオードがそれより少し早く再充電するため、測定値の1.7 Vはこれより低くなります。

試してみましょう。 コンデンサを右クリックして47 µFに変更します。リップルは6 Vまで大きくなり、谷は5.9 Vまで下がって7805が必要とする電圧を下回り、その出力は各サイクルで3.9 Vまで落ち込みます。だからこそ電源には大きなコンデンサが使われるのです。

Velxioで5V電源を開く

3. LDRと2つのトランジスタによるナイトライト

暗闇でのナイトライト — 光センサーモジュール、トランジスタQ1とQ2、点灯した黄色LED

マイクロコントローラもコードも使わない自動ナイトライトです。フォトレジスタ(LDR)が明るさを測り、2つのトランジスタが暗くなったときにLEDを点灯させます。

光センサーモジュールは分圧回路です。上にLDR、下に10 kΩの抵抗があります。日中はLDRの抵抗が低く、モジュールの出力(AO)は高くなります。暗くなると数百kΩまで上昇し、AOは0 Vに向かって下がります。

なぜトランジスタが2つ必要なのでしょうか。1つだけでは逆の動作になるからです。明るいときにLEDを点灯させてしまいます。最初の段が信号を反転させるのです。

シミュレーションでは、20 lux(薄暗い部屋)でAOは0.50 V、Q1はオフ、LEDには13 mAが流れます。30 luxではAOは0.67 V、Q1がオンになりLEDは消灯します。光センサーを右クリックして**Illumination (lux)**をこの範囲で変化させると、切り替わるのが確認できます。

同じ回路の日中 — 黄色LEDは消灯している

Velxioでナイトライトを開く

4. トランジスタ増幅器 — コモンエミッタ段

オシロスコープ付きのコモンエミッタ増幅器 — ベース信号(緑)は小さく、コレクタ信号(赤)はより大きく、上下が反転している

小さな信号を大きな信号に変える仕組み、それがコモンエミッタ増幅器であり、あらゆるディスクリート音声増幅器の構成要素です。0.4 V ピークツーピークの 1 kHz 正弦波が結合コンデンサを通って入力され、コレクタからは約4.5倍に増幅され、しかも上下反転して出力されます。(9 V 電源は左上のベンチ電源記号、信号発生器はその下にあります。)

これを成立させているのは2つの要素です。

バイアス。 トランジスタは部分的にオンになっているときだけ増幅します。47 kΩ / 10 kΩ の分圧器がベースを 1.54 V に設定します。エミッタはダイオード1個分低い 0.89 V にあるため、1 kΩ のエミッタ抵抗に 0.89 mA が流れます。同じ電流が 4.7 kΩ のコレクタ抵抗を流れると 4.2 V の電圧降下が生じ、コレクタは 4.83 V になります。これは電源電圧のほぼ中央で、上下両方向に振れる余裕があります。

利得。 ベースの変化はエミッタでもほぼそのまま現れるため、電流は ΔV / Re だけ変化します。この電流変化が Rc を流れ、コレクタを ΔV × Rc / Re だけ逆方向に動かします。したがって利得は −Rc/Re = −4.7 です。シミュレータの測定値は 4.54 です。トランジスタには約 26 mV / Ie ≈ 29 Ω の小さな内部エミッタ抵抗が加わり、4700 / 1029 = 4.57 となります。

オシロスコープ上では、ベース(緑)は 1.5 V を中心に 0.4 V 動き、コレクタ(赤)は 4.8 V を中心に 1.8 V 動きます。コレクタの山はベースの谷の位置にあります。

試してみよう: 信号発生器を右クリックして振幅を 1 V に上げてみてください。コレクタは 9 V 振れる必要がありますが、それは電源が許す範囲を超えています。そのため波形の上側は 9 V で平らになり、下側は飽和で平らになります。これがクリッピング、つまり過大入力された増幅器の音です。

Velxioでコモンエミッタ増幅器を開く

5. オペアンプコンパレータを使ったサーモスタット

設定温度を超えたサーモスタット — LM358の出力はHighで、ファンの代わりとなる赤色LEDが点灯している

暖かくなるとファンをオンにするサーモスタットを、LM358オペアンプ1個とコードなしで作ります。

センサー。 NTCサーミスタの抵抗は温度が上がると下がります(25 °Cで10 kΩ、32 °Cで約7.4 kΩ)。モジュールはこれを固定の10 kΩ抵抗の下に配置しているため、その出力は温度とともに下がります。25 °Cで2.50 V、32 °Cで2.12 Vです。

設定温度。 ポテンショメータは2つ目の分圧器です。そのワイパーは 2.336 V にあり、これはサーミスタが28 °Cで示す電圧です。電圧計がそれを表示しています。

コンパレータ。 帰還のないオペアンプは利得が非常に大きいため、どちらの入力が高いかによって出力がどちらかのレールに張り付きます。設定温度を+入力に、サーミスタを−入力に接続します。28 °C未満ではサーミスタの電圧の方が高く、出力は0 Vです。28 °Cを超えるとサーミスタの電圧の方が低くなり、出力は約 3.7 V に跳ね上がってLEDが点灯します。27 °CではLEDは消灯し、29 °Cでは点灯します。

なぜ5 Vではなく3.7 Vなのでしょうか。LM358は出力を正電源まで振り切ることができず、約1.3 V手前で止まります。プロジェクト6も同じ制限に直面します。

実際のサーモスタットにはヒステリシスがあり、温度がしきい値付近で揺れているときにオン・オフを繰り返しません。プロジェクト7ではこれをコードで実現します。

試してみよう: サーミスタを右クリックして温度を変えるか、ポテンショメータを右クリックして位置(0〜1023)を変えて設定温度を動かしてみてください。

Velxioでオペアンプ式サーモスタットを開く

6. Arduino — PWMを本物のアナログ電圧に変える

ピン9からRCフィルタとLM358電圧フォロワを経てA0に戻るArduino Uno、および期待値と測定値を比較するシリアルモニタ

Arduino UnoにはDACがありません。analogWrite() は電圧を出力するのではなく、デューティ比が平均値を決める490 Hzの矩形波、PWMを出力します。LEDやモータは気にしませんが、多くの回路は本物の安定した電圧を必要とします。アナログフィルタがそれを生成します。

PWM 0    expected 0.00 V  measured 0.02 V
PWM 64   expected 1.25 V  measured 1.26 V
PWM 128  expected 2.51 V  measured 2.51 V
PWM 192  expected 3.76 V  measured 3.77 V
PWM 255  expected 5.00 V  measured 4.03 V

192まではDACは10 mVの精度で正確です。255では4.03 Vで止まります。フィルタは5 Vに達しますが、5 Vで動作するLM358は出力をそこまで高く駆動できません。解決策はMCP6002のようなレールツーレールオペアンプを使うか、LM358が到達できる範囲だけを使うことです。

VelxioでArduino PWM DACを開く

7. ESP32 — ファンを切り替える温度計

GPIO34でNTCサーミスタを読み取り、2N7000 MOSFETを介してファン(緑色LED)を切り替えるESP32、シリアルモニタには35.0 C fan ONと表示されている

再びサーモスタットですが、今回はマイクロコントローラが判断するため、コンパレータにはできないことができます。温度を度数で表示し、ヒステリシスを追加できるのです。

温度の読み取り。 NTCモジュールの出力はGPIO34、ESP32の最初のADCの入力専用ピンに接続されます。スケッチは16回の読み取りを平均し、分圧器からサーミスタの抵抗を計算し(R = 10 kΩ × V / (3.3 V − V))、サーミスタのデータシートにあるベータ方程式で度に変換します。1/T = 1/T₀ + ln(R/R₀)/β、ここでR₀ = 10 kΩ(T₀ = 25 °C)、β = 3950です。サーミスタを25 °Cに設定するとシリアルモニタは25.0 °Cを、35 °Cでは35.0 °Cを表示します。

負荷の切り替え。 GPIOピンが供給できるのは数ミリアンペアで、ファンが必要とする数百ミリアンペアには足りません。代わりにGPIO25が100 Ω抵抗を介して2N7000 MOSFETのゲートを駆動し、MOSFETがファン(ここでは緑色LED)をグランドに接続します。35 °Cではドレインは0.06 Vにあり、MOSFETは完全にオンです。

ヒステリシス。 ファンは30 °Cでオンになり、28 °C未満でのみオフになります。この2 °Cのギャップがなければ、しきい値付近で揺れる温度によってファンが毎秒オン・オフを繰り返すでしょう。

実際のファンには、ファンの電流に適合するロジックレベルMOSFET(2N7000は小さな負荷にのみ適しています)と、オフ時にモータの電圧スパイクを吸収するためのファンに並列のダイオードを使用してください。

VelxioでESP32温度計とファンを開く

これらを作る中で修正したこと

この記事を書くにはすべての回路を測定する必要があり、その測定によってシミュレータの問題が明らかになりました。すべて公開前に修正済みです。

Velxioでアナログ回路を組んで数値が計算式と合わない場合は、GitHubでお知らせください。これらの問題はそうやって見つかりました。


共有:
David Montero

執筆者

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

関連記事


前の記事
ESP32とXIAO ESP32-S3向けの携帯ゲーム6本、ブラウザで遊べる
次の記事
ブラウザで作って動かせるハロウィンプロジェクト7選