基礎 · 読了まで11分

レベル変換モジュール: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で直接使えるモジュールの一覧表と、よくある間違いをまとめます。

ESP32開発ボード
ESP32のGPIOピンはすべて3.3 Vロジックです。5 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 V4.2 V5.5 V
ESP32(3.3 V)0.83 V(0.25 × VDD)2.48 V(0.75 × VDD)0.33 V2.64 V3.6 V
RP2040、Raspberry Pi Pico(3.3 V)0.8 V2.0 V0.5 V約2.6 V3.8 V
74HCシリーズ(5 V)1.5 V3.5 V0.1 V4.4 V5.5 V
74HCTシリーズ(5 V)0.8 V2.0 V0.1 V4.4 V5.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耐性があるわけではありません。

Raspberry Pi Pico 2のRP2350チップのデジタルピンは、ボードに電源が入っている間は5 Vに耐える設計です。ただしアナログ入力(GP26〜GP29)は対象外で、出力電圧も3.3 Vのままです。ボードの電源が切れているときにピンに5 Vを加えるのは、いずれの場合も危険です。初代Pico(RP2040)、ESP32、ESP8266には、5 V耐性のあるピンは1つもありません。

どの場面で何が必要?

条件例方法
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-WireBSS138 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 V667 Ω高速信号を含む多くの用途。HIGH時に1.7 mA消費
2.2 kΩ3.3 kΩ3.00 V1.3 kΩ最も安全な余裕を確保。UART、HC-SR04 ECHO
10 kΩ20 kΩ3.33 V6.7 kΩ低消費電流。115200ボーまでのUARTや低速信号
4.7 kΩ10 kΩ3.40 V3.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は必ず共通にしてください。

C++ (Arduino IDE)
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}
C++ (Arduino IDE)
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超音波距離センサー
HC-SR04は5 Vで動作し、ECHOピンから5 Vのパルスを出力します。3.3 Vのボードには必ず分圧回路を介して接続してください。

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)を使って距離に換算します。

MicroPython
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などのオープンドレイン信号線向けに設計されています。自動で双方向に動作するため、どちら側が送信しているかを指定する方向ピンはありません。

  1. 両側が待機中:MOSFETのゲートとソースはどちらも3.3 Vで、その間の電圧がゼロなのでMOSFETはオフです。各側はそれぞれの抵抗でHIGHに引き上げられ、LV側は3.3 V、HV側は5 Vになります。
  2. 3.3 V側がLOWに引き下げる場合:ソースが0 Vに下がります。ゲートは3.3 Vのままなので、ゲート・ソース間電圧が3.3 Vになり、MOSFETがオンになります。MOSFETを通じてHV側もLOWに引き下げられます。
  3. 5 V側がLOWに引き下げる場合:MOSFET内部のボディダイオードが導通し、ソースを約0.7 Vまで引き下げます。ゲート・ソース間電圧が約2.6 Vになると、MOSFETが完全にオンになり、LV側も完全にLOWになります。
モジュールのピン接続先補足
LV3.3 Vボードの3V3ピン低電圧側の電源とMOSFETのゲート電圧
HV5 V電源(Unoの5V、またはESP32のVIN)高電圧側のプルアップ用電源
GND(2本)両方のボードのGND共通GNDが必要
LV1〜LV4ESP32またはPicoのピン3.3 V側の信号
HV1〜HV45 Vモジュールのピンそれぞれ同じ番号のLVピンと対になる
BSS138ボードの速度は10 kΩのプルアップ抵抗で決まります。100および400 kHzのI2Cや115200ボーのUARTには十分対応できますが、800 kHzのWS2812Bデータや数MHzのSPIにはエッジが遅すぎます。TXS0108Eなどの方向自動判別式8チャンネルボードは、プッシュプル信号でより高速に動作します。I2Cにも使えますが、信号線に強いプルアップ抵抗がある場合や配線が長い場合は不安定になることがあります。同系列のTXB0108はI2Cにはまったく適しません。

例: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)、変換モジュールは動作しています。

C++ (Arduino IDE)
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 / 74HCT1255 V3.3 V → 5 V4WS2812Bのデータ、SPI、MAX7219
74HCT2455 V3.3 V → 5 V8パラレルデータバス、多数の出力
74LVC125 / 74LVC2453.3 V5 V → 3.3 V4 / 8高速な5 Vセンサーの出力、SDカードモジュール
BSS138モジュール3.3 Vと5 V双方向4I2C、1-Wire、低速UART
分圧回路不要5 V → 3.3 V1UART 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.3 Vのボードをまだ接続しない状態で、そのボードにつながるすべての信号線をテスターで測定してください。どの信号線も3.6 Vを超えていなければ、安全にボードを接続できます。この簡単な習慣が、ESP32を守る最も安価な方法です。

ロジックレベルの変換は難しそうに聞こえますが、要点は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を点滅
#103初級

ESP32でLEDを点滅

ESP32のGPIO出力の基本を学びます。デジタルピンからLEDを点灯・消灯させて、点滅させます。Arduino UNOの定番のLED点滅プロジェクトのESP32版です。Arduino環境で使う基本的な点滅コマンドは同じですが、ESP32のピン配置と3.3 VのGPIO電圧レベルはArduino UNOとは異なります。

4.7(37)
100
ESP32でボタンによるLED制御(押している間だけ点灯)
#104初級

ESP32でボタンによるLED制御(押している間だけ点灯)

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

4.6(36)
55
ESP32とLDRモジュールで光の強さを読み取る
#113初級

ESP32とLDRモジュールで光の強さを読み取る

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

4.6(36)
55
Raspberry Pi Picoの内蔵LEDを点滅(PicoとPico W)
#147初級

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)出力で、切り替わる様子をリアルタイムに確認できます。

5.0(1)
10
ESP32 I2C LCDディスプレイ(16x2)
#119中級
プレミアム

ESP32 I2C LCDディスプレイ(16x2)

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

4.9(23)
40
ESP32とHC-SR04で作る超音波距離計
#116中級

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が破損します。

4.9(28)
46
ESP32 WS2812B NeoPixel LEDテープの制御
#126中級
プレミアム

ESP32 WS2812B NeoPixel LEDテープの制御

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

4.9(19)
30
Raspberry Pi Picoで外付けLEDを点灯(ブレッドボード)
#148初級

Raspberry Pi Picoで外付けLEDを点灯(ブレッドボード)

Picoの内蔵LEDの次は、ブレッドボードに外付けLEDを接続し、GP14ピンで制御します。このプロジェクトでは、Picoの汎用GPIOピンを出力として使う方法、LEDの極性(長い足=アノード/+、短い足=カソード/−)、電流制限抵抗(220Ω)が必要な理由を学びます。抵抗を入れないと、LEDに過大な電流が流れて壊れることがあります。回路はとても簡単です。Pico GP14 → 220Ω抵抗 → LED(+)→ LED(−)→ Pico GND。Wokwiでシミュレーションできます。

4.5(2)
7