部品 · 読了まで18分

555タイマーIC:ピン配置、非安定・単安定回路をわかりやすく解説

555タイマーICの仕組みは?ピン配置、非安定と単安定の配線、f = 1.44/((R1+2R2)C)とt = 1.1RCの公式、LEDの点滅回路、Arduinoのコードを解説します。

555タイマーICは、抵抗とコンデンサだけでマイクロ秒から何時間までの時間を設定できる、安価な8ピンのタイマーチップです。LEDを決まった速さで点滅させる、ボタンを押したあとランプを1分間点けておく、ブザーで音を鳴らす、PWMでモーターを動かす。こうしたことを、マイコンもコードも1行も使わずにこなします。1971年にHans Camenzind氏がSignetics社のために設計し、1972年に発売されたこのチップは、世界で最も多く生産されたチップの1つになりました。2003年には年間10億個が作られていたと推定されています。

このガイドでは、555のピン配置、内部のコンパレーターとフリップフロップの働き、2つの基本回路(非安定の点滅回路と単安定のワンショット回路)、周波数と時間の公式の由来、デューティ比を50%未満にする方法、そして555をArduino、ESP32、Raspberry Pi Picoと一緒に使う方法を学びます。手で計算したくない場合は、555タイマー計算ツールで周波数、デューティ比、波形がすぐにわかります。

555タイマーとは?どう動くのか

555の内部には4つの主要な部分があります。1つ目は、VCCとGNDの間に直列につないだ3つの等しい抵抗(古典的なNE555ではそれぞれ5 kΩ)でできた分圧回路で、VCCの2/3と1/3という2つの基準電圧を作ります。2つ目は、その基準電圧につながった1組のコンパレーターです。スレッショルドのコンパレーターはTHRESピンを2/3 VCCと比べ、トリガーのコンパレーターはTRIGピンを1/3 VCCと比べます。3つ目は2つのコンパレーターがセット・リセットするSRフリップフロップ、4つ目はフリップフロップが駆動する出力段と、コンデンサを空にする放電用トランジスタです。

ルールは実はとても簡単です。TRIGの電圧が1/3 VCCを下回ると出力はHIGHになり、放電用トランジスタはオフになります。THRESの電圧が2/3 VCCを上回ると出力はLOWになり、放電用トランジスタがオンになって7番ピンをGNDに引き込みます。どちらも起きなければ、出力は前の状態を保ちます。時間を決めるのは、外付けのコンデンサが抵抗を通してこの2つのしきい値の間を充放電するのにかかる時間です。5 Vの電源ならしきい値は3.33 Vと1.67 V、9 Vなら6 Vと3 Vです。チップの名前は内部の3つの5 kΩの抵抗に由来するとよくいわれますが、Camenzind氏はSignetics社が番号を適当に選んだと説明しています。

項目NE555(バイポーラ)TLC555(CMOS)
電源電圧4.5〜16 V(SE555は18 Vまで)2〜15 V(LMC555は1.5 Vから)
静止時電流(5 V)2〜6 mA約0.2 mA
出力電流吐き出し・吸い込みとも最大200 mA吐き出し約10 mA、吸い込み100 mA
出力のHIGHレベルVCCより約1.5〜1.7 V低いVCCまで(レールtoレール)
推奨最大周波数100 kHz約2 MHz
3.3 Vで動作いいえはい
2回路入りの版NE556(14ピン)TLC556(14ピン)

555タイマーのピン配置

チップの上面にある半月形の切り欠きか小さな点が1番ピンの目印です。切り欠きを左にして上から見ると、1〜4番ピンが下の列に左から右へ、5〜8番ピンが上の列に右から左へ並びます。つまり番号は反時計回りに増え、8番ピン(VCC)は1番ピンの真向かいにあります。DIP-8のパッケージは、ブレッドボード中央の溝をまたぐようにぴったり収まります。足の列は溝の両側に1列ずつ来なければなりません。

ピン名前機能一般的な接続
1GNDグランド(0 V)電源のマイナス
2TRIG(トリガー)1/3 VCCを下回ると出力をHIGHにし、計時を始める非安定:6番ピンへ。単安定:プルアップ + ボタン
3OUT(出力)出力。NE555では最大200 mAを吐き出し・吸い込みできる抵抗を通したLED、ブザー、トランジスタ
4RESET約0.7 V未満にすると出力を強制的にLOWにする使わないならVCCに直結
5CONT(コントロール)2/3 VCCの基準電圧に直接アクセスできる。しきい値をずらす10 nFのコンデンサでGNDへ
6THRES(スレッショルド)2/3 VCCを超えると出力をLOWにし、計時を終える時間を決めるコンデンサへ
7DISCH(ディスチャージ)出力がLOWの間GNDにショートされるオープンコレクタのピン非安定:R1とR2の間。単安定:6番ピンへ
8VCC電源のプラス(NE555:4.5〜16 V)電源のプラス + 100 nFのパスコン
初心者が最もよくする間違いは、RESETピン(4番)を浮かせたままにすることです。浮いたピンはノイズを拾い、チップがランダムにリセットされます。LEDが点滅したり、まったく反応しなかったりします。使わない場合は、4番ピンをVCCに直結してください。また、バイポーラの555は出力が切り替わるたびに電源から短く大きな電流のスパイクを引きます。8番ピンと1番ピンのすぐ近くに100 nFのセラミックコンデンサと10 µFの電解コンデンサがないと、回路が勝手にトリガーされることがあります。

3つの動作モード:非安定、単安定、双安定

モード別名動作主な用途
非安定(アステーブル)自走マルチバイブレーター自分で連続した矩形波を作るLEDの点滅、ブザーの音、クロック信号、PWM
単安定(モノステーブル)ワンショットトリガーされると決まった時間HIGHになり、そのあとLOWに戻る遅延ランプ、階段のタイマー、パルスの引き延ばし
双安定(バイステーブル)フリップフロップTRIGでHIGH、RESETでLOWになり状態を保つ。計時はしない2つのボタンのオン・オフスイッチ

非安定回路:555でLEDを点滅させる

非安定回路では、TRIG(2番)とTHRES(6番)のピンをつないで、時間を決めるコンデンサに接続します。コンデンサはVCCからR1とR2を通して充電され、電圧が2/3 VCCに達すると出力がLOWになり、放電用トランジスタがオンになって、今度はR2だけを通して7番ピンへ放電します。電圧が1/3 VCCまで下がると出力は再びHIGHになり、このサイクルが自動で繰り返されます。コンデンサは完全には空にならず、1/3と2/3 VCCの間を行き来します。空の状態から始まるのは電源投入時だけなので、最初のHIGHの時間は少し長くなります。下の回路は9 V電池で動き、2つのLEDを1秒に1回交互に点滅させます。いちばん簡単なパトランプです。

  1. 切り欠きを左にして、555をブレッドボード中央の溝をまたぐように挿します。ブレッドボードの内部のつながりがわからなければ、先にブレッドボードとは?を読んでください。
  2. 8番(VCC)と4番(RESET)のピンを+9 Vのレールに、1番(GND)のピンをマイナスのレールにつなぎます。8番と1番の間に、できるだけチップの近くに100 nFのセラミックコンデンサを付けます。
  3. 8番と7番の間にR1 = 10 kΩを、7番と6番の間にR2 = 68 kΩをつなぎます。
  4. 6番と2番のピンを線でつなぎます。この接続点からC = 10 µFの電解コンデンサをGNDへつなぎます。短い(マイナスの)足はGND側に来なければなりません。
  5. 5番ピン(CONT)からGNDへ、10 nFのコンデンサ(103と表示)を付けます。
  6. 出力の3番ピンから470 Ωの抵抗を通して1つ目のLEDのアノードへつなぎ、カソードをGNDにつなぎます。このLEDは出力がHIGHの間点きます。2つ目のLEDのアノードを470 Ωを通して+9 Vに、カソードを出力につなぎます。このLEDは出力がLOWの間点きます。
  7. 電池をつなぎます。2つのLEDが約0.54秒と0.47秒ずつ交互に点くはずです。どちらのLEDも点かない場合は、まず4番ピンがVCCにつながっているか確認してください。

9 VのときNE555のHIGH出力は約7.5 Vなので、1つ目のLEDには約12 mA、2つ目には約15 mAが流れます。5 Vで動かす場合は、抵抗を220〜330 Ωに下げてください。値はLED抵抗計算ツールで求められ、LED自体についてはLEDとは?で読めます。周波数は電源電圧によらないので、5 Vでも同じR1、R2、Cで1秒に1回の点滅になります。

555タイマーの周波数と時間の公式

コンデンサが抵抗Rを通して充電されると、電圧は指数関数の曲線に沿って上がります。τ = R·Cが時定数で、コンデンサとは?で詳しく説明しています。1/3 VCCから2/3 VCCまで上がるにはちょうどln 2 · R · C ≈ 0.693 · R · Cかかります。その時間で目標までの残りの差が半分になるからです。充電はR1 + R2を通して、放電はR2だけを通して行われるので、HIGHとLOWの時間は違います。2つの時間を足して逆数を取ると、1 / 0.693 ≈ 1.44という係数と、有名な公式f = 1.44 / ((R1 + 2·R2) · C)が得られます。

量公式例:R1 = 10 kΩ、R2 = 68 kΩ、C = 10 µF
HIGHの時間(tH)0.693 · (R1 + R2) · C0.54 s
LOWの時間(tL)0.693 · R2 · C0.47 s
周期(T)0.693 · (R1 + 2·R2) · C1.01 s
周波数(f)1.44 / ((R1 + 2·R2) · C)0.99 Hz
デューティ比(R1 + R2) / (R1 + 2·R2)53.4%
単安定のパルス幅(t)1.1 · R · CR = 100 kΩ、C = 10 µFで1.1 s
555の計時回路に使うコンデンサ
555では、コンデンサが抵抗と一緒に時間を決めます。秒単位には電解コンデンサ(µF)を、kHzの周波数にはセラミックかフィルムのコンデンサ(nF)を使います。

値を選ぶときは、いくつかの制限を覚えておいてください。R1は1 kΩ以上にする必要があります。そうしないと、放電用トランジスタがオンになったときにVCCがほぼ直接GNDにつながってしまいます。Texas Instrumentsのデータシートによると、スレッショルド入力が引くわずかな電流のため、R1 + R2は5 Vで約3.4 MΩ、15 Vで10 MΩを超えないようにします。実際には1 kΩ〜1 MΩの範囲にとどめるのが最も安全です。コンデンサは1 nFを下回らないようにしてください。ブレッドボードや配線自体の容量で計算が狂うからです。NE555は100 kHz未満で使い、それより速い信号にはCMOS版を選びます。コンデンサに印刷された数字の読み解きにはコンデンサのコードツールを、充電の曲線を見るにはRC時定数ツールを使ってください。

R1R2C周波数デューティ比用途
10 kΩ100 kΩ10 µF0.69 Hz52%ゆっくりした警告灯
10 kΩ68 kΩ10 µF0.99 Hz53%1秒に1回のLED点滅
4.7 kΩ47 kΩ1 µF14.6 Hz52%速いストロボ効果
1 kΩ10 kΩ100 nF686 Hz52%ブザーの音
1 kΩ6.8 kΩ100 nF986 Hz53%約1 kHzのテスト信号
1 kΩ10 kΩ10 nF6.86 kHz52%高い音、PWM
1 kΩ18 kΩ1 nF38.9 kHz51%赤外線リモコンの搬送波(トリマーで38 kHzに合わせる)

デューティ比の調整:50%未満にする

基本の非安定回路では、コンデンサはR1 + R2を通して充電されますが、放電はR2だけを通るので、HIGHの時間は常にLOWの時間より長く、デューティ比は50%未満になりません。R2をR1よりずっと大きくすれば50%に近づきますが、下回ることはありません。解決法は、R2と並列に1N4148ダイオードを、アノードを7番ピン側、カソードを6番ピン側にして入れることです。充電中は電流がダイオードを通ってR2を迂回し、放電中はダイオードが逆方向バイアスになって電流はR2を流れます。これでtH ≈ 0.693 · R1 · C、tL ≈ 0.693 · R2 · Cとなり、デューティ比はR1 / (R1 + R2)まで下がります。たとえばR1 = 10 kΩ、R2 = 47 kΩ、C = 10 µFなら、LEDは69 ms点いて326 ms消えます。デューティ比17.5%の、短く目を引く点滅です。ダイオードの約0.6 Vの順方向電圧のため、特に5 VではHIGHの時間が計算より少し長くなります。ダイオード全般の振る舞いはダイオードとは?を参照してください。

周波数を一定に保ったままデューティ比だけを変えたい場合は、ポテンショメーターと2個のダイオードを使います。ポテンショメーターのワイパーを7番ピンにつなぎ、一方の端をダイオード(アノードをポテンショメーター側)を通してコンデンサへ、もう一方の端を逆向きの2つ目のダイオード(カソードをポテンショメーター側)を通してコンデンサへつなぎます。R1 = 1 kΩ、100 kΩのポテンショメーター、C = 10 nFなら、周波数は約1.4 kHzのまま、デューティ比はおよそ1%から99%まで変わります。ポテンショメーターを回しても、充電と放電の抵抗の合計が変わらないからです。出力にMOSFETを付ければ、DCモーターの速度や12 VのLEDテープの明るさを制御する定番の方法になります。詳しくはPWMとは?とArduinoでMOSFETを使うを参照してください。

単安定回路:ワンショットのパルスと遅延ランプ

単安定回路では、6番(THRES)と7番(DISCH)のピンをつなぎ、この接続点から抵抗RをVCCへ、コンデンサCをGNDへつなぎます。TRIGピン(2番)はプルアップ抵抗でHIGHに保ちます。待機中、出力はLOWで、放電用トランジスタがコンデンサを空に保っています。TRIGに短いLOWのパルスが来ると、出力がHIGHになり、放電用トランジスタがオフになって、コンデンサがRを通して充電を始めます。電圧が2/3 VCCに達すると、出力はLOWに戻り、コンデンサは一瞬で放電されます。今回はコンデンサがゼロから2/3 VCCまで充電されるので、パルスはln 3 · R · C ≈ 1.1 · R · C続きます。これもやはり電源電圧によりません。

  1. 8番と4番のピンを+5 Vに、1番ピンをGNDにつなぎます。8番と1番の間に100 nFのコンデンサを、5番とGNDの間に10 nFのコンデンサを付けます。
  2. 6番と7番のピンをつなぎます。この接続点からR = 470 kΩを+5 Vへ、C = 100 µFの電解コンデンサをGNDへつなぎます(マイナスの足をGNDへ)。
  3. TRIG(2番ピン)を10 kΩで+5 Vにプルアップし、2番ピンとGNDの間に押しボタンをつなぎます。ボタンの配線について詳しくはArduinoに押しボタンをつなぐ方法を参照してください。
  4. 最初のテストでは、出力の3番ピンに330 Ωの抵抗を通してLEDをつなぎます。
  5. ボタンを短く押します。LEDは約1.1 × 470 kΩ × 100 µF ≈ 52秒点いたあと消えます。電解コンデンサの±20%の許容差のため、42〜62秒の範囲なら正常です。
  6. 本物のランプには、LEDの代わりにリレーを駆動します。出力から1 kΩを通してBC547トランジスタのベースへつなぎ、エミッタをGNDに、コレクタをリレーのコイルの片端につなぎます。コイルのもう片端は+5 Vへつなぎます。コイルに並列に1N4007ダイオード(カソードを+5 V側)を付けるのを忘れないでください。トランジスタの役割はトランジスタとは?を参照してください。
ボタンを遅延時間より長く押し続けると、時間が過ぎても出力はHIGHのままです。データシートによると、計時を終わらせるには、時間が終わる少なくとも10 µs前にTRIGがHIGHに戻っている必要があります。長い遅延にはRではなくCを大きくしてください。電解コンデンサの漏れ電流がRを流れるわずかな充電電流に近づくと、コンデンサが2/3 VCCに達せず、ランプが消えなくなります。そのためRは1 MΩ未満にとどめます。リレーで商用電源のランプを切り替える場合は、商用電源側を絶縁する前に回路に電源を入れないでください。安全のルールはリレーモジュールとは?に従ってください。
RC時間(1.1 · R · C)用途
10 kΩ1 µF11 msボタンのチャタリング対策、短いパルスの引き延ばし
100 kΩ10 µF1.1 s短いビープ音、玄関チャイム
220 kΩ47 µF11.4 s短時間の照明
470 kΩ100 µF52 s階段のタイマー、遅延ランプ
10 kΩ + 1 MΩのポテンショメーター100 µF1.1〜111 s調整可能なタイマー

遅延を途中で打ち切るには、RESETピン(4番)に2つ目のボタンを追加できます。ピンを10 kΩでVCCにプルアップし、RESETとGNDの間にボタンをつなぎます。押した瞬間に出力がLOWになり、コンデンサが放電されます。単安定回路は、最初に電源を入れたときに一度勝手にトリガーされることがあります。これを防ぐには、RESETピンを10 kΩでVCCに、10 µFでGNDにつなぎます。電源投入時、そのコンデンサが充電されるまでの短い間チップはリセット状態に保たれ、電源が落ち着いてから普通に動き始めます。

555タイマーをArduinoと一緒に使うには?

555とArduinoはライバルではなく、よいチームになります。簡単な点滅回路ならmillis()を使ってArduinoでも作れますが、555はコードが要らず、16 Vまでの電源で動き、出力から200 mAを出せ、Arduinoが固まっても動き続けます。そのため555は、たいてい次の3つの役割のどれかでArduinoと組みます。Arduinoが測る信号源、Arduinoがトリガーするハードウェアタイマー(容量計、パルスの引き延ばし)、そしてArduinoがRESETピンでオン・オフする発振器(サイレンやブザーの音)です。最後の場合は、555の4番ピンをArduinoの出力につなぐだけです。ピンがHIGHの間は発振器が動き、LOWの間は静かです。

555のピンArduino UnoESP32Raspberry Pi Pico
8 VCC5V3V3(CMOSの555のみ)3V3(OUT)(CMOSの555)またはVBUS(NE555)
1 GNDGNDGNDGND
3 OUTD2GPIO 27GP15(NE555では10 kΩ + 20 kΩの分圧回路を通す)
2 TRIG(トリガーの例)D7GPIO 26GP14(3V3で給電したCMOSの555のみ)
4 RESET5Vまたはデジタルピン3V33V3(OUT)
555をArduinoにつなぐときは、両方を同じ5 Vから給電し、グランドを共通にしてください。9 Vや12 Vで動く555の出力は7〜10 Vまで振れ、Arduinoの入力を壊します。その場合は分圧回路で出力を下げる必要があります。5 VでのNE555のHIGHレベルは約3.5 Vで、Unoの3 Vのしきい値をわずかに上回るだけです。より確実なHIGHにするには、出力から5 Vへ10 kΩのプルアップ抵抗を追加できます。

最初の例では、Arduinoが点滅回路の周波数とデューティ比を測り、公式で求めた値と比べます。回路は上と同じ非安定回路(R1 = 10 kΩ、R2 = 68 kΩ、C = 10 µF)ですが、9 VではなくArduinoの5Vピンから給電し、出力の3番ピンをD2につなぎます。pulseIn()関数は、ピンがHIGHまたはLOWにとどまる時間をマイクロ秒で返します。

C++ (Arduino IDE)
1// 555 flaşörünün frekansını ve duty cycle'ını ölçer / Measures the frequency and duty cycle of a 555 flasher
2const int SIGNAL_PIN = 2;                    // 555 çıkışı (pin 3) / 555 output (pin 3)
3const float R1_OHM = 10000.0;                // R1 = 10 kΩ
4const float R2_OHM = 68000.0;                // R2 = 68 kΩ
5const float C_FARAD = 10e-6;                 // C = 10 µF
6const unsigned long TIMEOUT_US = 3000000UL;  // 3 s: ~1 Hz sinyal için / for a ~1 Hz signal
7
8void setup() {
9  Serial.begin(9600);
10  pinMode(SIGNAL_PIN, INPUT);
11
12  // Formüllerle hesaplanan değerler / Values from the formulas
13  float fCalc = 1.44 / ((R1_OHM + 2 * R2_OHM) * C_FARAD);
14  float dutyCalc = 100.0 * (R1_OHM + R2_OHM) / (R1_OHM + 2 * R2_OHM);
15  Serial.print(F("Hesaplanan / Calculated: f = "));
16  Serial.print(fCalc, 3);
17  Serial.print(F(" Hz, duty = "));
18  Serial.print(dutyCalc, 1);
19  Serial.println(F(" %"));
20}
21
22void loop() {
23  unsigned long highUs = pulseIn(SIGNAL_PIN, HIGH, TIMEOUT_US);  // HIGH süresi / HIGH time
24  unsigned long lowUs = pulseIn(SIGNAL_PIN, LOW, TIMEOUT_US);    // LOW süresi / LOW time
25
26  if (highUs == 0 || lowUs == 0) {           // zaman aşımı / timeout
27    Serial.println(F("Sinyal yok / No signal"));
28    return;
29  }
30
31  unsigned long periodUs = highUs + lowUs;
32  float f = 1000000.0 / periodUs;            // f = 1 / T
33  float duty = 100.0 * highUs / periodUs;    // duty = tH / T
34
35  Serial.print(F("Olculen / Measured: f = "));
36  Serial.print(f, 3);
37  Serial.print(F(" Hz, duty = "));
38  Serial.print(duty, 1);
39  Serial.print(F(" %, tH = "));
40  Serial.print(highUs / 1000);
41  Serial.print(F(" ms, tL = "));
42  Serial.print(lowUs / 1000);
43  Serial.println(F(" ms"));
44}

pulseIn()は初期設定では最大1秒しか待ちません。1 Hz前後の信号では、まず現在のパルスが終わるのを待ち、次に新しいパルスが始まるのを待つので、タイムアウトを3秒に延ばしました。シリアルモニタで測った周波数が計算値と5〜20%違うのは正常です。差の大部分は電解コンデンサの許容差によるものです。この差を利用して、コンデンサの実際の値を求めることもできます。測った周波数をf = 1.44 / ((R1 + 2·R2) · C)に入れてCについて解きます。より速い信号には、pulseIn()ではなく割り込みでエッジを数えるほうが正確です。

Arduinoから555をトリガーする:容量計

単安定のパルス幅はt = 1.1 · R · Cなので、Rがわかっていてtを測れば、C = t / (1.1 · R)でコンデンサの値を求められます。回路は次のとおりです。6番と7番のピンをつなぎ、この接続点から100 kΩを5 Vへ、測るコンデンサをGNDへつなぎます。4番と8番のピンは5 Vに、5番ピンは10 nFを通してGNDへつなぎます。TRIG(2番ピン)は10 kΩで5 Vにプルアップし、D7につなぎます。出力の3番ピンはD2へつなぎます。ArduinoはD7から10 µsのLOWパルスを送り、出力がHIGHにとどまる時間をmicros()で測ります。

C++ (Arduino IDE)
1// 555 monostable ile kondansatör ölçer / Capacitance meter with a 555 monostable
2const int TRIG_PIN = 7;                      // 555 pin 2 (TRIG)
3const int OUT_PIN = 2;                       // 555 pin 3 (OUT)
4const float R_OHM = 100000.0;                // 6-7 ile 5V arasındaki direnç / resistor between pins 6-7 and 5V
5const float CAL = 1.0;                       // kalibrasyon: gerçek / ölçülen / calibration: real / measured
6const unsigned long TIMEOUT_US = 6000000UL;  // 6 s: ~47 µF'a kadar / up to ~47 µF
7
8void setup() {
9  Serial.begin(9600);
10  pinMode(OUT_PIN, INPUT);
11  pinMode(TRIG_PIN, OUTPUT);
12  digitalWrite(TRIG_PIN, HIGH);              // TRIG beklemede HIGH / TRIG idles HIGH
13}
14
15void loop() {
16  while (digitalRead(OUT_PIN) == HIGH) {}    // önceki darbenin bitmesini bekle / wait for any previous pulse to end
17
18  digitalWrite(TRIG_PIN, LOW);               // 10 µs'lik LOW darbesiyle tetikle / trigger with a 10 µs LOW pulse
19  delayMicroseconds(10);
20  digitalWrite(TRIG_PIN, HIGH);
21
22  unsigned long t0 = micros();
23  while (digitalRead(OUT_PIN) == LOW) {      // çıkışın HIGH olmasını bekle / wait for OUT to go HIGH
24    if (micros() - t0 > 1000) {
25      Serial.println(F("555 yanit vermiyor / 555 not responding"));
26      delay(1000);
27      return;
28    }
29  }
30
31  t0 = micros();
32  while (digitalRead(OUT_PIN) == HIGH) {     // darbe süresini ölç / time the pulse
33    if (micros() - t0 > TIMEOUT_US) {
34      Serial.println(F("Kondansator cok buyuk / Capacitor too large"));
35      delay(1000);
36      return;
37    }
38  }
39  unsigned long widthUs = micros() - t0;
40
41  // t = 1,1 · R · C  ->  C = t / (1,1 · R)
42  float capNf = CAL * (widthUs * 1e-6) / (1.1 * R_OHM) * 1e9;
43
44  Serial.print(F("t = "));
45  Serial.print(widthUs);
46  Serial.print(F(" us, C = "));
47  if (capNf >= 1000.0) {
48    Serial.print(capNf / 1000.0, 2);
49    Serial.println(F(" uF"));
50  } else {
51    Serial.print(capNf, 1);
52    Serial.println(F(" nF"));
53  }
54  delay(1000);
55}

ここではpulseIn()ではなくmicros()で手動で測っています。トリガーの直後には出力がすでにHIGHになっているので、pulseIn()はそのパルスを「前のパルス」とみなして飛ばしてしまうからです。Unoのmicros()の分解能は4 µsです。100 kΩなら1 nFのコンデンサで110 µsのパルスになるので、測定範囲はおよそ1 nF〜47 µFです。値のわかっているコンデンサを測り、実際の値と測定値の比をCAL係数に書き込めば、自分の容量計を校正できます。電解コンデンサをつなぐ前には、足をショートさせて放電し、プラスの足を6〜7番ピン側につないでください。

ESP32とRaspberry Pi Picoで555タイマーを使う

ESP32とRaspberry Pi Picoは3.3 Vで動き、ピンは5 Vに耐えられません。一方、古典的なNE555は最低4.5 Vが必要なので、3.3 Vでは動きません。最もすっきりした解決法は、TLC555、LMC555、ICM7555のようなCMOSの555です。ピン配置は同じで、3V3ピンで動き、出力は0〜3.3 Vの間で振れるので、そのままGPIOにつなげます。NE555しかない場合は5 Vで給電し、出力を10 kΩ(直列)と20 kΩ(GNDへ)で分圧します。NE555のHIGHレベルは約3.5 Vなので、分圧回路の出力は約2.3 Vまで下がります。Picoの2 Vのしきい値には十分ですが、ESP32の約2.5 Vのしきい値にはぎりぎりです。そのため、ESP32にはCMOSの555を選ぶべきです。

ESP32の例では、R1 = 1 kΩ、R2 = 6.8 kΩ、C = 100 nFのCMOSの555が約986 Hzの信号を作ります。点滅回路と同じ比率で、1000倍速いだけです。ESP32は立ち上がりエッジのたびに割り込みルーチンを実行し、1秒間に数えたエッジの数を表示します。その数がそのままHzでの周波数です。デューティ比は、pulseIn()で測った1回のHIGHの時間から計算します。

C++ (Arduino IDE)
1// ESP32 + CMOS 555 (TLC555) frekans ve duty ölçer / ESP32 + CMOS 555 (TLC555) frequency and duty meter
2const int SIGNAL_PIN = 27;                   // 555 çıkışı (pin 3) / 555 output (pin 3)
3
4volatile uint32_t edgeCount = 0;
5portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
6
7void IRAM_ATTR onRise() {
8  portENTER_CRITICAL_ISR(&mux);
9  edgeCount++;                               // her yükselen kenarı say / count every rising edge
10  portEXIT_CRITICAL_ISR(&mux);
11}
12
13void setup() {
14  Serial.begin(115200);
15  pinMode(SIGNAL_PIN, INPUT);
16  attachInterrupt(digitalPinToInterrupt(SIGNAL_PIN), onRise, RISING);
17}
18
19void loop() {
20  static uint32_t lastMs = millis();
21  if (millis() - lastMs < 1000) return;      // 1 saniyelik ölçüm penceresi / 1-second gate
22  lastMs += 1000;
23
24  portENTER_CRITICAL(&mux);
25  uint32_t edges = edgeCount;                // sayacı oku ve sıfırla / read and reset the counter
26  edgeCount = 0;
27  portEXIT_CRITICAL(&mux);
28
29  unsigned long highUs = pulseIn(SIGNAL_PIN, HIGH, 100000UL);  // tek bir HIGH süresi / one HIGH time
30  float duty = highUs * (float)edges / 10000.0;                // duty % = tH(µs) · f(Hz) / 10000
31
32  Serial.printf("f = %u Hz, tH = %lu us, duty = %.1f %%\n", (unsigned)edges, highUs, duty);
33}

PicoではMicroPythonのmachine.time_pulse_us()関数がArduinoのpulseIn()に相当しますが、重要な違いが1つあります。ピンがすでに求めるレベルにあると、すぐに計時を始めてしまうのです。そのため最初の呼び出しは途中のパルスを飛ばして信号のエッジに同期するために使い、その後のLOWとHIGHの測定で完全なパルスを測ります。例では1秒に1回の点滅回路を測り、測定のたびにオンボードLEDを切り替えます。

MicroPython
1# Pico ile 555 flaşörünü ölçmek / Measuring a 555 flasher with the Pico
2from machine import Pin, time_pulse_us
3import time
4
5sig = Pin(15, Pin.IN)       # 555 çıkışı: CMOS 555 doğrudan, NE555 bölücüyle / 555 output: CMOS 555 direct, NE555 via a divider
6led = Pin(25, Pin.OUT)      # dahili LED (Pico W'de Pin("LED")) / onboard LED (Pin("LED") on a Pico W)
7TIMEOUT = 2_000_000         # 2 s zaman aşımı / 2 s timeout
8
9while True:
10    # İlk ölçüm yarım darbeyi atlar ve kenara senkronlar / The first call skips a partial pulse and syncs to an edge
11    if time_pulse_us(sig, 1, TIMEOUT) < 0:
12        print("Sinyal yok / No signal")
13        continue
14    low_us = time_pulse_us(sig, 0, TIMEOUT)    # tam LOW süresi / full LOW time
15    high_us = time_pulse_us(sig, 1, TIMEOUT)   # tam HIGH süresi / full HIGH time
16    if low_us < 0 or high_us < 0:
17        continue
18    period = low_us + high_us
19    print("f = {:.3f} Hz, duty = {:.1f} %, tH = {} ms, tL = {} ms".format(
20        1_000_000 / period, 100 * high_us / period, high_us // 1000, low_us // 1000))
21    led.toggle()            # her ölçümde LED'i değiştir / toggle the LED on every reading
22    time.sleep_ms(200)

555タイマーのプロジェクトアイデア

  • パトランプ:赤と青のLEDを交互に点滅させます。一方を出力からGNDへ、もう一方をVCCから出力へつなぎます。4.7 kΩ、47 kΩ、1 µFで速いストロボ効果になります。
  • 2音のサイレン:ゆっくり動く1つ目の555の出力を、抵抗を通して2つ目の555の5番ピン(CONT)に入れます。しきい値がずれるにつれ、2つ目のチップの音が上下します。音にはパッシブ型のブザーか小型スピーカーを使います。
  • 階段のタイマー:単安定の555、リレー、ボタンで、ランプを1分間点けておくタイマーを作ります。各階のボタンは並列につなぎます。
  • 容量計:この記事のArduinoのコードを使って、表示が消えたコンデンサを測り、結果をI2C LCDディスプレイに表示します。
  • 赤外線送信機:38 kHzに合わせた非安定の555で赤外線LEDを駆動し、赤外線受信モジュールで信号を検知すれば、簡単な光線遮断式の警報になります。TSOPやVS1838Bのようなリモコン用の受信モジュールは、連続した搬送波をノイズとみなしてしばらくすると抑えてしまうことがあるので、2つ目のゆっくりした555でこの555のRESETピンをオン・オフし、断続的に送ってください。
  • モーターの速度制御:ポテンショメーター付きの固定周波数のPWM回路をMOSFETにつなぎ、12 VのDCモーターやLEDテープの出力を調整します。
  • パルス欠落の検出器:時間を決めるコンデンサに並列にPNPトランジスタ(例:BC557)を、ベースをTRIGにつないで追加します。Arduinoが一定間隔で送るLOWパルスのたびに、555がトリガーされると同時にコンデンサが空になり、計時がやり直しになります。Arduinoが固まってパルスが止まると時間切れになり、555が警報を出すかシステムを再起動します。

よくある間違いと解決法

症状考えられる原因解決法
LEDが点滅しない、点きっぱなしか消えっぱなしRESET(4番)が浮いているかGND。非安定モードで2番と6番がつながっていないRESETをVCCにつなぎ、2番と6番を線でつなぐ
周波数が計算値と大きく違う電解コンデンサの±20%の許容差、値の読み違い(µFではなくnF)、Cが小さすぎるコンデンサを測り、コードを確認し、精密な用途にはフィルムコンデンサを使う
回路が不安定、または勝手にトリガーされる電源のパスコンがない、CONTかTRIGのピンが浮いている8番と1番の間に100 nF + 10 µF、5番に10 nF、TRIGに10 kΩのプルアップ
チップが熱くなる出力が抵抗なしのLEDかGNDにショートしている。R1が小さすぎるLEDに直列抵抗を追加し、R1を1 kΩ以上にする
単安定の遅延が終わらないボタンを押し続けている、またはTRIGがLOWのままボタンを短く押すか、Arduinoから短いLOWパルスを送る
リレーがオフになるとチップがリセットされるか壊れるコイルの逆電圧を吸収するダイオードがないリレーのコイルに並列に1N4007をつなぐ
Arduinoが間違った値を読む、またはピンが壊れる555を9〜12 Vで給電している555を5 Vで給電するか、分圧回路で出力を下げる
デューティ比が50%未満にならない基本の非安定回路の本来の限界R2と並列に1N4148ダイオードを追加する
回路が動かないときは、まずテスターで測ってください。8番と4番のピンには電源電圧が、5番ピンには約2/3 VCC(9 Vなら6 V)が出ているはずです。非安定回路でコンデンサの電圧が1/3と2/3 VCCの間をゆっくり行き来していれば、チップは動いていて、問題は出力側にあります。測り方はテスターの使い方を参照してください。

555タイマーは学ぶのに最適な部品の1つです。電子回路での計時の基本的な考え方(RCの充電、しきい値、コンパレーター、フリップフロップ)を、安価な1個のチップで見せてくれるからです。1秒に1回の点滅回路から始め、値を変えてブザーの音を出し、次に単安定の遅延ランプとArduinoの容量計を試してみましょう。BlueGraysアプリには、パトランプ、階段の照明、ブザーのプロジェクトが回路図とコード付きでステップごとに揃っているので、555の回路のArduino版とPico版を並べて試せます。

よくある質問

555タイマーは何に使う?

555は、抵抗とコンデンサで時間を設定する汎用のタイマーチップです。非安定モードでは連続した矩形波を作り、LEDの点滅、ブザーの音、クロック信号に使います。単安定モードではトリガーのあと決まった時間オンになる出力を作り、遅延ランプやタイマーに使います。マイコンもコードも要りません。

555タイマーに必要な電圧は?

古典的なNE555は4.5〜16 V(SE555は18 Vまで)で動き、5 V、9 V、12 Vが最もよく使われる電源です。3.3 Vのような低い電圧には、TLC555(2〜15 V)、ICM7555、1.5 Vから動くLMC555のようなCMOS版を使ってください。電源が一定に保たれている限り、周波数と時間は電圧によりません。

1 Hzで点滅する555の回路にはどの値を使う?

R1 = 10 kΩ、R2 = 68 kΩ、C = 10 µFなら、f = 1.44 / ((10 kΩ + 2 · 68 kΩ) · 10 µF) ≈ 0.99 Hzになります。LEDは約0.54秒点き、0.47秒消えます。電解コンデンサの±20%の許容差のため、実際の値は少し違います。細かく調整するには、R2をトリマーに替えてください。

555のデューティ比を50%未満にするには?

基本の非安定回路では、コンデンサはR1 + R2を通して充電され、放電はR2だけを通るので、HIGHの時間は常にLOWの時間より長くなります。R2と並列に1N4148ダイオードをアノードを7番ピン側にして追加すると、コンデンサはR1だけを通して充電されます。するとtH ≈ 0.693 · R1 · C、tL ≈ 0.693 · R2 · Cとなり、R1をR2より小さく選べば50%を下回ります。

NE555とTLC555の違いは?

NE555はバイポーラトランジスタでできていて、最低4.5 Vが必要で、出力から最大200 mAを出せますが、待機時に2〜6 mAを消費し、100 kHzを超えると苦しくなります。TLC555はCMOS版で、2 Vから動き、約0.2 mAしか消費せず、約2 MHzまで届き、出力は電源電圧まで上がります。その代わり、吐き出せる電流は約10 mAだけです。どちらもピン配置は同じです。

555の4番ピンと5番ピンは未接続のままでいい?

RESETピン(4番)は決して浮かせたままにしてはいけません。使わない場合はVCCに直結してください。そうしないとノイズでチップがランダムにリセットされることがあります。CONTピン(5番)は技術的には開放のままでも構いませんが、ノイズでしきい値がずれないよう、10 nFのコンデンサでGNDにつなぐのがよい習慣です。このピンに外部から電圧をかけると、しきい値、つまり周波数が変わります。

全プロジェクトを見る
LEDの警察車両風点滅
#4初級

LEDの警察車両風点滅

警察車両の警光灯のように、赤いLEDが素早く3回点滅し、続いて青いLEDが3回点滅します。このパターンを途切れることなく繰り返します。Arduinoに2個のLEDと2個の抵抗をつなぐだけで、数分で組み立てられる、目を引く入門プロジェクトです。

4.7(103)
258
ブザーの使い方
#13初級

ブザーの使い方

呼び鈴やアラームがどうやって音を出すのか、気になったことはありませんか?Arduinoが小さなブザーを短い間隔で鳴らし、音を出す、止める、を繰り返します。電気で音が生まれる仕組みを学び、メロディーを演奏するプロジェクトへの第一歩を踏み出せます。

4.7(89)
161
ブザーの周波数を調整
#14中級

ブザーの周波数を調整

4つのボタンでブザーの音を操作します。1つは音を鳴らし、1つは音を止め、残りの2つは音を高くしたり低くしたりします。音を高くするボタンや低くするボタンを押し続けると、音程が段階的に変化し、サイレンのように聞こえます。音の高低が生まれる理由を、自分の耳で確かめられます。

4.6(69)
118
Raspberry Pi Picoでパトカーの点滅灯(赤+青)
#151初級

Raspberry Pi Picoでパトカーの点滅灯(赤+青)

Raspberry Pi Picoで、パトカーの屋根にある点滅灯を最も簡単な形で再現します!赤と青のLEDが交互に点灯するフリップフロップ方式です。赤が点灯している間は青が消灯し、0.3秒ごとに状態を入れ替え、繰り返します。コードは1つのwhile Trueループに2つの動作を直接記述し、速度はWAIT_MS定数で設定します。

4.7(3)
10
階段・廊下のスマート照明
#82中級
プレミアム

階段・廊下のスマート照明

階段や廊下に足を踏み入れると、進む方向に沿って照明が1段ずつ点灯します。両端に距離センサーがあり、どちらの前を通っても、その端から8個のLEDが0.5秒間隔で順番に点灯し、その後、同じ方向に順番に消灯します。夜の暗がりで足元を照らす、おしゃれなホームオートメーションのアイデアです。

5.0(35)
51
ボタンを押している間だけ220V電球を点灯
#19上級
プレミアム

ボタンを押している間だけ220V電球を点灯

ボタンを押している間は実際の220ボルトの電球が点灯し、離すとすぐに消灯します。Arduinoの小さな信号では電球を直接点灯できないため、電気で動くスイッチであるリレーを間に入れ、電球の回路を開閉します。ボードで家庭の照明を操作するための第一歩です。家庭用電源を扱う際は十分に注意し、不安がある場合は詳しい人に手伝ってもらってください。

4.4(30)
38
ESP32でパトカーの点滅ライトを再現
#109初級
プレミアム

ESP32でパトカーの点滅ライトを再現

赤と青のLEDグループを高速で点滅させ、パトカーのライトを再現します。各グループを2個のLEDにすると、より迫力のある演出になります。高速な点灯・消灯パターンとグループ制御の例です。

4.6(21)
36