
Arduinoのチュートリアルの多くは、すぐにコードへと進みます。しかしマイクロコントローラの周りにある部品はアナログです。LEDを壊さないようにする抵抗、センサーを電圧に変える分圧回路、モーターを切り替えるトランジスタ、ACアダプタから5Vを作るレギュレータ。これらのどれか一つが間違っていれば、コードをいくら書いても直りません。
Velxioはその半分もシミュレートします。オープンソースのSPICE回路シミュレータであるngspiceをWebAssemblyにコンパイルして実行するため、抵抗、コンデンサ、ダイオード、トランジスタ、オペアンプ、レギュレータが、ブラウザ上で実物と同じように振る舞います。電圧計、電流計、オシロスコープで測定でき、回路を動かしたまま任意の値を変更できます。
この記事では7つのプロジェクトを順に見ていきます。最初の5つはマイクロコントローラを一切使わず、部品だけで構成されています。最後の2つはアナログ回路とArduino、ESP32を組み合わせたものです。どのプロジェクトもサンプルギャラリーに収録されており、以下の数値はすべてシミュレータから読み取り、それを説明する計算式と照らし合わせて確認したものです。
始める前に — 3つの計測器
- ボードのない回路は開いた瞬間に動作します。 部品を右クリックするとインスペクタが開き、そこで値を変更できます。抵抗の抵抗値、コンデンサの静電容量、センサーの明るさや温度などです。回路は新しい値で再度解かれます。
- 電圧計と電流計は他の部品と同じように扱います。電圧計は測定したい対象に並列に、電流計は直列に接続します。DC回路では1つの数値を表示します。AC回路では、回路が落ち着いた後に測定した実効値、ピーク値、DC平均値を表示します。
- オシロスコープは電圧が時間とともにどう変化するかを表示します。配線を右クリックしてAdd to scopeを選ぶと、各チャンネルが信号に合わせて自動的にスケールされます。キャンバス上にボードがある場合は、先にシミュレーションを停止してください。スケッチの実行中は、キャンバスがクリックを部品のために保持してしまいます。
一つ知っておくべきこと。AC電源を含む回路では、Velxioは電源が入った瞬間から短い時間窓(信号の数サイクル分)を解き、その窓のスコープ波形を表示します。値を変更するたびに解き直すので表示は常に最新ですが、連続的な記録ではありません。
1. LEDと抵抗 — オームの法則

初心者が最初に作る回路であり、最もよく間違える回路でもあります。LEDを電池に直結すると、電流を制限するものがないため焼き切れてしまいます。直列に入れた抵抗がその役割を果たします。
計測器がすべてを物語っています。
- 470 Ω抵抗の両端の電圧計は7.136 Vを示しています。
- 電流計は15.18 mAを示しています。オームの法則も同じことを言っています。7.136 V / 470 Ω = 15.2 mA。
- 9 Vの残りはLEDの両端に落ちます。約1.84 Vで、これは赤色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は電圧をほぼ一定に保ち、電流は抵抗が決めるのです。
2. 5V電源 — 整流器、コンデンサ、レギュレータ
古いACアダプタの中に入っている、典型的なリニア電源を4つの段階で見ていきます。
- トランス。 商用ACをより安全で低いAC電圧に変換します。ここではセンタータップ付きの12-0-12 V二次側を、逆相の2つの信号発生器(それぞれピーク12 V、50 Hz)として描いています。
- 整流器。 二次側の各半分に1本ずつ、2本の1N4007ダイオードを使います。それぞれが自分の半サイクルで導通するため、出力には10 msごとに正のパルスが現れます。全波整流です。
- 平滑コンデンサ。 220 µFのコンデンサは各ピークで充電され、その間は負荷に電力を供給します。保持する電圧は平坦ではありません。ピークの間に低下します。この低下がリップルです。
- レギュレータ。 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まで落ち込みます。だからこそ電源には大きなコンデンサが使われるのです。
3. LDRと2つのトランジスタによるナイトライト

マイクロコントローラもコードも使わない自動ナイトライトです。フォトレジスタ(LDR)が明るさを測り、2つのトランジスタが暗くなったときにLEDを点灯させます。
光センサーモジュールは分圧回路です。上にLDR、下に10 kΩの抵抗があります。日中はLDRの抵抗が低く、モジュールの出力(AO)は高くなります。暗くなると数百kΩまで上昇し、AOは0 Vに向かって下がります。
- Q1はセンサーのスイッチです。AOが約0.6 Vを超えるとQ1が導通し、Q2のベースをほぼ0 Vまで引き下げます。
- Q2はLEDを駆動します。Q1がオンの間はQ2はオフで、LEDは消えています。光が弱まるとQ1が導通を止め、10 kΩの抵抗がQ2のベースを引き上げ、Q2がオンになってLEDが点灯します。
なぜトランジスタが2つ必要なのでしょうか。1つだけでは逆の動作になるからです。明るいときにLEDを点灯させてしまいます。最初の段が信号を反転させるのです。
シミュレーションでは、20 lux(薄暗い部屋)でAOは0.50 V、Q1はオフ、LEDには13 mAが流れます。30 luxではAOは0.67 V、Q1がオンになりLEDは消灯します。光センサーを右クリックして**Illumination (lux)**をこの範囲で変化させると、切り替わるのが確認できます。

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 で平らになり、下側は飽和で平らになります。これがクリッピング、つまり過大入力された増幅器の音です。
5. オペアンプコンパレータを使ったサーモスタット

暖かくなるとファンをオンにするサーモスタットを、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)を変えて設定温度を動かしてみてください。
6. Arduino — PWMを本物のアナログ電圧に変える

Arduino UnoにはDACがありません。analogWrite() は電圧を出力するのではなく、デューティ比が平均値を決める490 Hzの矩形波、PWMを出力します。LEDやモータは気にしませんが、多くの回路は本物の安定した電圧を必要とします。アナログフィルタがそれを生成します。
- RCローパスフィルタ。 10 kΩと10 µFがPWMを平均化します。時定数 τ = R·C = 0.1 s はPWM周期の50倍なので、490 Hzのリップルはほぼ完全に除去されます。代償は速度です。変化後、出力が安定するまでに約5τ = 0.5 sかかります。
- 電圧フォロワ。 出力を−入力に接続したLM358が、フィルタの電圧をその出力にコピーします。フィルタからほとんど電流を引き出さないため、次に何を接続しても電圧が低下しません。
- フィードバック。 A0が結果を読み戻し、スケッチが要求値と実際の値を出力します。
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が到達できる範囲だけを使うことです。
7. ESP32 — ファンを切り替える温度計

再びサーモスタットですが、今回はマイクロコントローラが判断するため、コンパレータにはできないことができます。温度を度数で表示し、ヒステリシスを追加できるのです。
温度の読み取り。 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は小さな負荷にのみ適しています)と、オフ時にモータの電圧スパイクを吸収するためのファンに並列のダイオードを使用してください。
これらを作る中で修正したこと
この記事を書くにはすべての回路を測定する必要があり、その測定によってシミュレータの問題が明らかになりました。すべて公開前に修正済みです。
- PWM値の後に
analogWrite(pin, 0)またはanalogWrite(pin, 255)を実行すると、回路が古いPWMレベルを見続けていました。プロジェクト6の表がこれを捉えました。 - 電圧計と電流計が電源投入時の過渡現象をAC測定値に平均化していました。7805の出力が5 Vではなく3.47 Vと表示されていました。
- オシロスコープのアナログチャンネルの範囲が±4 Vに固定されていたため、5 Vや12 Vの信号が画面外に描画されていました。現在は自動でスケーリングされます。
- 電圧レギュレータが入力から電流を引き出していなかったため、電源にリップルがまったく現れませんでした。
Velxioでアナログ回路を組んで数値が計算式と合わない場合は、GitHubでお知らせください。これらの問題はそうやって見つかりました。