レベル変換モジュール:3.3 Vと5 Vの機器を安全に接続
レベル変換モジュールとは?ESP32やPicoのピンに5 Vを加えられない理由、VIH・VILのしきい値、分圧回路、I2C用BSS138、74HCTチップ、モジュールの対応表を解説します。
レベル変換モジュールは、3.3 Vで動くボード(ESP32、Raspberry Pi Pico、ESP8266)と、5 Vで動くボードやモジュール(Arduino Uno、I2C LCD、HC-SR04、WS2812B)が安全に通信するための小さな回路です。5 Vの出力を3.3 Vのピンに直接接続すると、徐々に、または瞬時にピンが壊れるおそれがあります。逆方向では、3.3 Vの信号が5 Vの入力で「1」と認識されない場合もあります。変換が必要な場面と、どの方式で十分かを知れば、異なる電圧を組み合わせるプロジェクトの半数で起こる不可解な不具合を解消できます。
この記事では、まずVIHとVILのしきい値の意味と、ESP32やPicoのピンに5 Vを加えられない理由を説明します。次に、2本の抵抗による分圧回路での一方向変換、I2C向けのBSS138 MOSFETによる双方向変換、WS2812BやSPIなどの高速信号向けの74HCTチップという3つの方法を、例を使って紹介します。最後に、3.3 Vで直接使えるモジュールの一覧表と、よくある間違いをまとめます。

3.3 Vと5 Vのロジックレベルとは?
デジタルピンが扱う値は0と1だけですが、実際の電圧は0から電源電圧までのどの値にもなり得ます。そのため、各チップのデータシートには4つのしきい値が記載されています。VIH(入力HIGH)は、入力が確実に1と読み取られる最低電圧です。VIL(入力LOW)は、確実に0と読み取られる最高電圧です。その間の領域は未定義で、チップは0と1のどちらとして読み取る可能性もあります。出力側では、VOHがHIGH出力時にピンが保証する最低電圧、VOLがLOW出力時に保証する最高電圧です。2つのチップが確実に通信するには、送信側のVOHが受信側のVIHを十分に上回り、送信側のVOLが受信側のVILを十分に下回る必要があります。これらのしきい値を使ってゲートがどう判断するかは、論理ゲートの記事で確認でき、論理ゲートツールで試せます。
| チップ(電源電圧) | VIL(最大) | VIH(最小) | VOL(最大) | VOH(最小) | ピンの絶対最大定格 |
|---|---|---|---|---|---|
| ATmega328P、Arduino Uno(5 V) | 1.5 V(0.3 × VCC) | 3.0 V(0.6 × VCC) | 0.9 V | 4.2 V | 5.5 V |
| ESP32(3.3 V) | 0.83 V(0.25 × VDD) | 2.48 V(0.75 × VDD) | 0.33 V | 2.64 V | 3.6 V |
| RP2040、Raspberry Pi Pico(3.3 V) | 0.8 V | 2.0 V | 0.5 V | 約2.6 V | 3.8 V |
| 74HCシリーズ(5 V) | 1.5 V | 3.5 V | 0.1 V | 4.4 V | 5.5 V |
| 74HCTシリーズ(5 V) | 0.8 V | 2.0 V | 0.1 V | 4.4 V | 5.5 V |
この表から3つの重要なことが分かります。まず、5 Vで動くUnoのHIGH出力(4.2〜5 V)は、ESP32の3.6 V、Picoの3.8 Vという上限を明らかに超えるため、この方向では変換が必須です。次に、ESP32の3.3 VのHIGH出力は通常UnoのVIHしきい値3.0 Vを超えますが、データシートが保証するVOHの最低値は2.64 Vです。つまり、多くの場合は接続できても、配線が長くなったりピンの負荷が増えたりすると余裕がなくなります。そして、5 Vで動く74HCチップ、PCF8574のようにしきい値が0.7 × VCCのI2C拡張チップ、WS2812B LEDは、3.5 V未満を確実にHIGHと認識できません。これらのチップには3.3 V信号では不十分です。74HCTシリーズのVIHは2.0 Vなので、3.3 Vを5 Vに変換するのに適した方法の1つです。
ESP32やPicoのピンに5 Vを加えられないのはなぜ?
3.3 Vチップの各入力ピンには、ピンを3.3 Vの電源ラインおよびGNDに接続する小さな保護ダイオードがあります。これは静電気放電などの非常に短いパルスを吸収するためのもので、連続した電流を流すためのものではありません。ピンに5 Vを加えると上側のダイオードが導通し、5 Vの電源から3.3 Vの電源ラインに電流が流れ込みます。電源の内部抵抗が低いと、電流は数十ミリアンペアに達し、ダイオードとピン周辺の回路が発熱して壊れます。電流が小さければピンはすぐには壊れませんが、チップは徐々に劣化します。さらに3.3 Vの電源ラインの電圧が押し上げられ、ボードがピン経由で給電されることもあります。電源ケーブルを抜いてもESP32のLEDが薄く光り続けるのはこのためです。ESP32のデータシートではピンの上限は電源電圧+ 0.3 V(約3.6 V)、RP2040では電源電圧+ 0.5 V(約3.8 V)です。「一度試して壊れなかった」からといって、ピンに5 V耐性があるわけではありません。
どの場面で何が必要?
| 条件 | 例 | 方法 |
|---|---|---|
| 5 V出力→3.3 V入力 | Uno TX → ESP32 RX, HC-SR04 ECHO → Pico | 分圧回路(低速信号)、または74LVCバッファ(高速信号) |
| 3.3 V出力→5 V入力(VIHが約3 V) | ESP32 TX → Uno RX | 多くの場合は直接接続で動作しますが、余裕を確保するには74HCTを使用 |
| 3.3 V出力→5 V入力(VIHが3.5 V) | ESP32→WS2812B、5 Vの74HCチップ | 74HCT125 / 74AHCT125などのバッファ |
| 双方向のオープンドレイン信号線 | I2C(SDA、SCL)、1-Wire | BSS138 MOSFET変換回路 |
| 双方向の高速プッシュプル信号線 | パラレルデータバス | 方向指定ピンのある74LVC245、またはTXS0108E |
分圧回路による一方向変換(5 V→3.3 V)
5 Vの出力を3.3 Vの入力に接続する最も簡単な方法は、2本の抵抗を使うことです。信号を上側の抵抗R1に入力し、中点を3.3 Vのピンに、下側の抵抗R2をGNDに接続します。出力はVout = 5 V × R2 / (R1 + R2)となり、R2をR1の2倍にすると5 Vを3.33 Vに下げられます。分圧回路が使えるのは高い電圧から低い電圧への一方向だけなので、3.3 V側からも応答する双方向の信号線には使えません。速度にも制限があります。分圧回路の出力抵抗とピンの静電容量で小さなRCフィルタができ、信号のエッジが丸くなるためです。抵抗値の選定には分圧計算ツールを、詳しい説明には分圧回路の記事をご利用ください。
| R1(信号側) | R2(GND側) | 5 V入力時の出力 | 出力抵抗 | 適した用途 |
|---|---|---|---|---|
| 1 kΩ | 2 kΩ(1 kΩを2本直列接続) | 3.33 V | 667 Ω | 高速信号を含む多くの用途。HIGH時に1.7 mA消費 |
| 2.2 kΩ | 3.3 kΩ | 3.00 V | 1.3 kΩ | 最も安全な余裕を確保。UART、HC-SR04 ECHO |
| 10 kΩ | 20 kΩ | 3.33 V | 6.7 kΩ | 低消費電流。115200ボーまでのUARTや低速信号 |
| 4.7 kΩ | 10 kΩ | 3.40 V | 3.2 kΩ | 余裕が少なく、5 Vの電源ラインが5.25 Vになると3.57 Vを出力するため非推奨 |
例:Arduino UnoとESP32間のUART通信
Unoがセンサーを読み取り、ESP32がWi-Fiでデータをインターネットに送るプロジェクトでは、2枚のボードはUARTで通信します。UnoのTXは5 Vを出力するため、1 kΩ + 2 kΩの分圧回路を介してESP32のRXピンにつなぎます。Unoは3.0 Vを超える信号をHIGHと認識するので、ESP32の3.3 VのTXはUnoのRXピンに直接つなげます。UnoのUSBシリアルポート(D0、D1)をコンピューター用に空けておくため、Uno側はD10とD11でSoftwareSerialを使います。ESP32側では2つ目のハードウェアシリアルポートSerial2をGPIO 16(RX)と17(TX)で動かします。2枚のボードのGNDは必ず共通にしてください。
1// Arduino Uno: SoftwareSerial ile ESP32'ye veri gönder / send data to the ESP32 with SoftwareSerial
2// Uno D11 (TX, 5 V) -> 1k -> ESP32 GPIO 16 ; GPIO 16 -> 2k -> GND
3// ESP32 GPIO 17 (TX, 3,3 V) -> Uno D10 (RX) doğrudan / directly ; GND <-> GND
4#include <SoftwareSerial.h>
5
6SoftwareSerial link(10, 11); // RX, TX
7
8void setup() {
9 Serial.begin(9600); // bilgisayar / computer
10 link.begin(9600); // ESP32 hattı / ESP32 line
11}
12
13void loop() {
14 int raw = analogRead(A0);
15 link.print(F("A0="));
16 link.println(raw); // ör. / e.g. "A0=512"
17
18 unsigned long start = millis();
19 while (millis() - start < 1000) { // 1 sn cevap bekle / wait 1 s for a reply
20 if (link.available()) {
21 String reply = link.readStringUntil('\n');
22 Serial.print(F("ESP32: "));
23 Serial.println(reply);
24 }
25 }
26}1// ESP32: Serial2 ile Uno'dan gelen satırları oku ve cevap ver / read lines from the Uno on Serial2 and reply
2const int RX2_PIN = 16; // bölücünün orta noktası / divider midpoint
3const int TX2_PIN = 17; // Uno D10'a doğrudan / straight to Uno D10
4
5void setup() {
6 Serial.begin(115200);
7 Serial2.begin(9600, SERIAL_8N1, RX2_PIN, TX2_PIN);
8}
9
10void loop() {
11 if (Serial2.available()) {
12 String line = Serial2.readStringUntil('\n');
13 line.trim();
14 Serial.print("Uno: ");
15 Serial.println(line);
16 Serial2.print("OK "); // 3,3 V çıkış Uno için yeterli / 3.3 V output is enough for the Uno
17 Serial2.println(line.length());
18 }
19}書き込む前に、分圧回路の中点をテスターで測定してください。Unoが動作中で何も送信していないときは、約3.3 Vになるはずです。UARTの信号線は待機中にHIGHになるためです。Unoのシリアルモニタに「ESP32: OK 6」などの行が毎秒表示されれば、双方向で通信できています。9600ボーでは1ビットの長さが104 µsなのに対し、1 kΩ + 2 kΩの分圧回路による遅延はナノ秒単位なので、速度はまったく問題になりません。
例:HC-SR04をRaspberry Pi Picoに接続

HC-SR04が安定して動作するのは5 Vのときだけです。PicoにUSBから給電する場合、センサーのVCCをPicoのVBUSピン(40番ピン)に接続してください。TRIG入力はPicoの3.3 Vパルスを問題なく認識するため、GP15に直接接続します。一方、ECHOは5 Vパルスを返すので、ECHOとGP14の間に1 kΩ、GP14とGNDの間に2 kΩの抵抗を入れます。コードはtime_pulse_usでECHOパルスの長さをマイクロ秒単位で測定し、空気中の音速(約343 m/s)を使って距離に換算します。
1# Raspberry Pi Pico + HC-SR04 (ECHO bölücüyle) / Raspberry Pi Pico + HC-SR04 (ECHO through a divider)
2# VCC -> VBUS (pin 40), GND -> GND, TRIG -> GP15, ECHO -> 1k -> GP14 -> 2k -> GND
3from machine import Pin, time_pulse_us
4import time
5
6trig = Pin(15, Pin.OUT)
7echo = Pin(14, Pin.IN)
8
9
10def distance_cm():
11 trig.value(0)
12 time.sleep_us(2)
13 trig.value(1) # 10 µs tetik darbesi / 10 µs trigger pulse
14 time.sleep_us(10)
15 trig.value(0)
16 t = time_pulse_us(echo, 1, 30000) # en fazla 30 ms bekle / wait at most 30 ms
17 if t < 0:
18 return None # yankı yok / no echo
19 return t * 0.0343 / 2 # gidiş-dönüş / round trip
20
21
22while True:
23 d = distance_cm()
24 if d is None:
25 print("Olcum yok / No echo")
26 else:
27 print("Mesafe / Distance: {:.1f} cm".format(d))
28 time.sleep(0.5)BSS138の双方向レベル変換モジュール
「4チャンネルレベル変換モジュール」として販売されている小型ボードの多くは、1チャンネルごとにBSS138のNチャンネルMOSFETを1個と、10 kΩのプルアップ抵抗を2本備えています。回路は非常に単純で、MOSFETのゲートを3.3 V(LV)、ソースを低電圧側、ドレインを高電圧側に接続します。各側のプルアップ抵抗が、信号線をそれぞれの電源電圧まで引き上げます。この構成は、信号線を0に引き下げるだけで、1のレベルはプルアップ抵抗に任せるI2Cなどのオープンドレイン信号線向けに設計されています。自動で双方向に動作するため、どちら側が送信しているかを指定する方向ピンはありません。
- 両側が待機中:MOSFETのゲートとソースはどちらも3.3 Vで、その間の電圧がゼロなのでMOSFETはオフです。各側はそれぞれの抵抗でHIGHに引き上げられ、LV側は3.3 V、HV側は5 Vになります。
- 3.3 V側がLOWに引き下げる場合:ソースが0 Vに下がります。ゲートは3.3 Vのままなので、ゲート・ソース間電圧が3.3 Vになり、MOSFETがオンになります。MOSFETを通じてHV側もLOWに引き下げられます。
- 5 V側がLOWに引き下げる場合:MOSFET内部のボディダイオードが導通し、ソースを約0.7 Vまで引き下げます。ゲート・ソース間電圧が約2.6 Vになると、MOSFETが完全にオンになり、LV側も完全にLOWになります。
| モジュールのピン | 接続先 | 補足 |
|---|---|---|
| LV | 3.3 Vボードの3V3ピン | 低電圧側の電源とMOSFETのゲート電圧 |
| HV | 5 V電源(Unoの5V、またはESP32のVIN) | 高電圧側のプルアップ用電源 |
| GND(2本) | 両方のボードのGND | 共通GNDが必要 |
| LV1〜LV4 | ESP32またはPicoのピン | 3.3 V側の信号 |
| HV1〜HV4 | 5 Vモジュールのピン | それぞれ同じ番号のLVピンと対になる |
例:ESP32を5 VのI2C LCDに接続
16x2文字のLCDは、5 Vで給電しないと十分なコントラストが得られません。また、背面のPCF8574 I2C変換基板は、4.7 kΩの抵抗でSDAとSCLを5 Vにプルアップしています。さらにPCF8574のVIHしきい値は0.7 × VCCで、5 V時には3.5 Vとなり、ESP32の3.3 Vはこれを下回ります。そのため、I2C LCDとESP32の間にBSS138変換モジュールを入れると、ピンを保護すると同時に通信を安定させられます。配線は、ESP32の3V3をLVへ、VIN(USBからの5 V)をHVとLCDのVCCへ接続し、すべてのGNDを共通にします。GPIO 21をLV1、HV1をLCDのSDAへ、GPIO 22をLV2、HV2をLCDのSCLへ接続してください。以下のスキャナーコードでLCDが見つかれば(通常は0x27または0x3F)、変換モジュールは動作しています。
1// ESP32 I2C tarayıcı: BSS138 dönüştürücü üzerinden 5 V'luk cihazları bul
2// ESP32 I2C scanner: find 5 V devices through a BSS138 converter
3// GPIO 21 -> LV1 / HV1 -> SDA ; GPIO 22 -> LV2 / HV2 -> SCL ; 3V3 -> LV ; VIN (5 V) -> HV
4#include <Wire.h>
5
6const int SDA_PIN = 21;
7const int SCL_PIN = 22;
8
9void setup() {
10 Serial.begin(115200);
11 Wire.begin(SDA_PIN, SCL_PIN);
12 Wire.setClock(100000); // 100 kHz, BSS138 için rahat hız / comfortable speed for the BSS138
13}
14
15void loop() {
16 int found = 0;
17 for (byte addr = 1; addr < 127; addr++) {
18 Wire.beginTransmission(addr);
19 if (Wire.endTransmission() == 0) { // 0 = ACK, cihaz var / device present
20 Serial.printf("Cihaz / Device: 0x%02X\n", addr);
21 found++;
22 }
23 }
24 if (found == 0) Serial.println("Cihaz yok / No device found");
25 Serial.println("---");
26 delay(3000);
27}74HCTチップ:高速な一方向信号
分圧回路やBSS138では遅すぎる場合、本格的な解決策はバッファICです。74HCTシリーズは5 Vで動作しますが、入力しきい値はTTL互換(VIH = 2.0 V)なので、ESP32やPicoの3.3 V信号を容易にHIGHと認識し、鋭いエッジを持つ5 Vの信号を出力します。最もよく使われるのはWS2812Bテープのデータ線です。ESP32のピンを74AHCT125の入力に接続し、その出力を330 Ωの抵抗を介してテープのDINに接続します。74AHCT125のOE(イネーブル)ピンはGNDに接続します。逆方向に高速の5 V信号を3.3 Vへ下げる場合は、3.3 Vで給電した74LVC125または74LVC245を使います。これらのチップの入力は、自身の電源電圧に関係なく5.5 Vまで耐えられます。
| 方法 | 電源 | 方向 | チャンネル数 | 主な用途 |
|---|---|---|---|---|
| 74AHCT125 / 74HCT125 | 5 V | 3.3 V → 5 V | 4 | WS2812Bのデータ、SPI、MAX7219 |
| 74HCT245 | 5 V | 3.3 V → 5 V | 8 | パラレルデータバス、多数の出力 |
| 74LVC125 / 74LVC245 | 3.3 V | 5 V → 3.3 V | 4 / 8 | 高速な5 Vセンサーの出力、SDカードモジュール |
| BSS138モジュール | 3.3 Vと5 V | 双方向 | 4 | I2C、1-Wire、低速UART |
| 分圧回路 | 不要 | 5 V → 3.3 V | 1 | UART RX、HC-SR04 ECHO、ボタン |
3.3 Vで直接使えるモジュールは?
以下の表は、ESP32やPicoのプロジェクトでよく使うモジュールを、変換モジュールなしで3.3 Vボードに接続できるかまとめたものです。「可」のモジュールは3V3ピンから給電し、信号ピンを直接接続できます。ただし、同じ名前で販売されていても異なるバージョンがあるため、基板にレギュレーターやレベル変換回路があるか確認してください。不明な場合は、VCCを給電した状態で信号ピンの電圧をテスターで測定してください。
| モジュール | 3.3 Vでの直接接続 | 補足 |
|---|---|---|
| BME280 / BMP280モジュール | 可 | チップ自体の上限は3.6 Vです。3V3から給電してください。 |
| DHT11 / DHT22 | 可 | 3.3〜5.5 V。3.3 Vではケーブルを短くしてください。 |
| DS18B20 | 可 | 3.0〜5.5 V。4.7 kΩで3.3 Vにプルアップ |
| 0.96インチOLED(SSD1306) | 可 | モジュールにはレギュレーターがあります。3V3から給電するとI2Cも3.3 Vになります。 |
| MPU6050(GY-521) | 可 | モジュールのプルアップはVCCに接続されています。3V3から給電してください。 |
| RC522 RFID | 可、3.3 Vのみ | 5 Vで給電するとモジュールが壊れます。 |
| nRF24L01 | 可、3.3 Vのみ | 電源に10〜100 µFのコンデンサを追加してください。 |
| HC-SR04 | 不可 | 5 Vで給電し、ECHOを分圧してください。3.3 V版はHC-SR04Pです。 |
| I2C 16x2 LCD(PCF8574) | 一部可 | LCDには5 Vが必要です。SDAとSCLにはBSS138を使ってください。 |
| WS2812B LEDテープ | 一部可 | 5 Vで給電します。3.3 Vのデータは余裕が少ないため、74AHCT125をおすすめします。 |
| 5 Vリレーモジュール | 一部可 | アクティブLOWのモジュールでは、3.3 VのHIGHでリレーが完全にオフにならない場合があります。3.3 Vトリガー対応のモジュールを選んでください。 |
| SG90サーボモーター | 信号は可 | モーターには5 Vで給電してください。PWM信号は通常3.3 Vで十分です。 |
よくある間違いと対処方法
| 症状 | 考えられる原因 | 対処方法 |
|---|---|---|
| BSS138変換モジュールがまったく動作しません。 | LVとHVの電源が未接続、または逆になっています。 | LVに3.3 V、HVに5 Vを供給し、GNDを共通にしてください。 |
| USBを抜いてもESP32のLEDが薄く光ります。 | 5 V信号からピンを介してボードに給電されています。 | その信号線に分圧回路または変換モジュールを追加してください。 |
| 分圧回路を通した信号がひずむ、または丸くなります。 | 高速な信号線に対して抵抗値が大きすぎます。 | 1 kΩ + 2 kΩに下げるか、74LVCバッファを使ってください。 |
| WS2812Bテープの最初のLEDがちらつきます。 | 3.3 VのデータがVIHしきい値の3.5 Vを下回っています。 | 74AHCT125で5 Vに変換し、データ線に330 Ωを追加してください。 |
| I2Cが動作することも、停止することもあります。 | 5 Vへのプルアップと、デバイスの高いVIHしきい値 | BSS138を使い、速度を100 kHzに下げてください。 |
| リレーがオフになりません。 | アクティブLOWのリレーモジュールが3.3 VをHIGHと認識していません。 | 3.3 Vトリガー対応モジュールかトランジスタドライバを使ってください。 |
| 変換モジュールを通すとUARTの文字が化けます。 | GNDが共通になっていません。 | 両方のボードのGNDを接続してください。 |
ロジックレベルの変換は難しそうに聞こえますが、要点は3つです。5 Vから3.3 Vへ向かう信号線は必ず保護し、3.3 Vから5 Vへ向かう信号線は受信側のVIHしきい値を確認し、I2Cなどの双方向の信号線にはBSS138を使います。このルールを守れば、Arduino、ESP32、Picoを同じプロジェクトで安心して組み合わせられます。BlueGraysアプリのESP32とRaspberry Pi Picoのプロジェクトでは、ボードのロジックレベルに適したピンを使い、ステップごとの配線図ですべての接続を説明しています。
よくある質問
ESP32には5 V耐性がある?
ありません。ESP32のデータシートでは、GPIOピンの上限は電源電圧+ 0.3 V、約3.6 Vです。5 Vを加えるとピンの保護ダイオードが導通し、3.3 Vの電源ラインに電流が流れ込み、時間の経過とともに、または瞬時にピンが壊れるおそれがあります。しばらく動作しているように見えても、安全とは限りません。
レベル変換モジュールなしでArduinoとESP32を接続できる?
一部は可能です。ESP32からArduinoに向かう3.3 V信号は通常Unoの3.0 Vのしきい値を超えるため、直接接続できます。一方、ArduinoからESP32に向かう5 V信号は、必ず分圧回路または変換モジュールを通す必要があります。いずれの場合も、2枚のボードのGNDは共通にしてください。
I2Cにはどのレベル変換モジュールを使う?
I2Cの信号線はオープンドレインなので、BSS138 MOSFETの双方向変換モジュールが最適です。100および400 kHzで問題なく動作します。PCA9306などのI2C向けチップも同じ役割を果たします。I2Cは信号線で双方向にデータをやり取りするため、分圧回路は使えません。
WS2812BはESP32の3.3 Vデータで動作する?
多くの場合は動作しますが、保証はされません。5 Vで給電するWS2812Bは、データ入力に最低3.5 Vを必要とし、3.3 Vはこのしきい値を下回ります。特に配線が長い場合や電源電圧が5 Vを超えた場合、最初のLEDがちらつくことがあります。確実な対策は、データ線に74AHCT125や74HCT125などのバッファを入れることです。
分圧回路とレベル変換モジュールのどちらを使う?
UART RXやHC-SR04 ECHOのような一方向の低速信号を5 Vから3.3 Vに下げるなら、2本の抵抗で十分で、最も安価な方法です。双方向の信号線(I2C)や、3.3 Vを5 Vに上げる場合には分圧回路は使えません。BSS138モジュールまたは74HCTバッファを使ってください。非常に高速な信号には、バッファICが適しています。
レベル変換モジュールのHVとLVは何を意味する?
HV(高電圧)は高電圧側で、通常は5 Vに接続します。LV(低電圧)は低電圧側で、3.3 Vに接続します。HV1〜HV4ピンは5 Vデバイスの信号に、対応するLV1〜LV4ピンは3.3 Vボードのピンに接続します。両側のGNDは、モジュールのGNDピンで共通にします。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
ESP32でLEDを点滅
ESP32のGPIO出力の基本を学びます。デジタルピンからLEDを点灯・消灯させて、点滅させます。Arduino UNOの定番のLED点滅プロジェクトのESP32版です。Arduino環境で使う基本的な点滅コマンドは同じですが、ESP32のピン配置と3.3 VのGPIO電圧レベルはArduino UNOとは異なります。

ESP32でボタンによるLED制御(押している間だけ点灯)
ボタンを押している間はLEDが点灯し、離すと消灯します。ESP32のデジタル入力ピンと内蔵プルアップ抵抗の使い方を学びます。INPUT_PULLUPモードを使うため、外付け抵抗は不要です。

ESP32とLDRモジュールで光の強さを読み取る
LDRモジュールの生のADC値と、暗い状態・明るい状態の基準値から計算した相対的な明るさの割合を、シリアルモニタでリアルタイムに確認します。この割合はルクスの測定値ではありません。モジュールの校正の仕組みを学べます。しきい値の決定に使うため、プロジェクト10の前に取り組むのが適しています。

Raspberry Pi Picoの内蔵LEDを点滅(PicoとPico W)
Raspberry Pi Picoシリーズの最初のプロジェクトです!ボード上の緑色LEDを点滅させて動作を確認する、定番の「Hello World」に相当する実験です。外付け部品は不要で、PicoとUSBケーブルだけで始められます。コードはMicroPython(Raspberry Pi Foundationが公式にサポートする言語)で書きます。Thonny IDEでmachine.Pinクラス、Pin.OUTモード、led.on()/off()メソッド、time.sleep()を学びます。シリアル(REPL)出力で、切り替わる様子をリアルタイムに確認できます。

ESP32 I2C LCDディスプレイ(16x2)
このプロジェクトでは、16x2文字のLCDをI2CでESP32に接続して文字を表示します。I2Cならデータ用の2本のピン(SDAとSCL)だけで制御でき、従来のパラレル接続のように6本以上のピンを使わずに済みます。コードでは1行目に固定メッセージ、2行目に毎秒増えるカウンターを表示します。また、起動時にI2Cスキャナーを実行し、ディスプレイのアドレス(通常は0x27または0x3F)をシリアルモニタに表示します。

ESP32とHC-SR04で作る超音波距離計
HC-SR04超音波センサーは、発した音波が物体に反射して戻るまでの時間(Time of Flight)を測定して距離を計算します。このプロジェクトでは、ESP32からセンサーのTRIGピンに10マイクロ秒のパルスを送り、ECHOピンからの反射波の持続時間をpulseIn()で読み取ります。計算した距離をcm単位で16x2 I2C LCDに表示します。HC-SR04は5Vで動作するため、ECHOピンには分圧回路が必須です。分圧しないとESP32の3.3V GPIOが破損します。

ESP32 WS2812B NeoPixel LEDテープの制御
WS2812B(NeoPixel)は、1本のデータピンで連結したLEDを個別に制御できるスマートなRGB LEDです。このプロジェクトでは、8個のLEDを備えたWS2812BテープをAdafruit_NeoPixelライブラリで制御し、滑らかな虹色のアニメーションを作ります。ESP32の3.3VロジックレベルはほとんどのWS2812Bのロットで問題なく動作しますが、不安定な場合に備え、470Ωの直列抵抗と1000µFのコンデンサを使う対策も紹介します。アニメーションは、HSV色空間の色相(hue)をずらして作ります。

Raspberry Pi Picoで外付けLEDを点灯(ブレッドボード)
Picoの内蔵LEDの次は、ブレッドボードに外付けLEDを接続し、GP14ピンで制御します。このプロジェクトでは、Picoの汎用GPIOピンを出力として使う方法、LEDの極性(長い足=アノード/+、短い足=カソード/−)、電流制限抵抗(220Ω)が必要な理由を学びます。抵抗を入れないと、LEDに過大な電流が流れて壊れることがあります。回路はとても簡単です。Pico GP14 → 220Ω抵抗 → LED(+)→ LED(−)→ Pico GND。Wokwiでシミュレーションできます。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

