ESP32のMicroPythonでLEDを点灯・制御する方法(2)【Lチカ完全解説】

この記事では、インストールしたMicroPythonでESP32のLEDを点滅させる方法を解説します。

この記事で学べること

  • MicroPythonのモジュールの調べ方
  • ESP32 の GPIO の基本が理解できる
  • MicroPython で LED を点灯・消灯できる
  • Lチカ(点滅制御)を実装できる

ステップごとの解説

  1. MicroPythonのモジュールを調べる
    MicroPythonのモジュールに、neopixelがあるか調べます。
    REPLにて、help(‘modules’)を実行します。neopixelがリストに表示されるのでモジュールにあることがわかります。
MicroPython v1.25.0 on 2025-04-15; Generic ESP32S3 module with ESP32S3
Type "help()" for more information or .help for custom vREPL commands.

>>> help('modules')
__main__          btree             io                ssl
_asyncio          builtins          json              struct
_boot             cmath             machine           sys
_espnow           collections       machine           time
_onewire          cryptolib         math              tls
_thread           deflate           micropython       uasyncio
_webrepl          dht               mip/__init__      uctypes
aioespnow         ds18x20           neopixel          umqtt/robust
apa106            errno             network           umqtt/simple
array             esp               ntptime           upysh
asyncio/__init__  esp32             onewire           urequests
asyncio/core      espnow            os                vfs
asyncio/event     flashbdev         platform          webrepl
asyncio/funcs     framebuf          random            webrepl_setup
asyncio/lock      gc                re                websocket
asyncio/stream    hashlib           requests/__init__
binascii          heapq             select
bluetooth         inisetup          socket
Plus any modules on the filesystem
>>> 
  1. neopixelのモジュールの関数を調べる
    neopixelのモジュールの関数一覧を表示させます。
    REPLにて、import neopixelの後、dir(neopixel)を実行すると、NeoPixelという関数があることがわかります。さらに、dir(neopixel.NeoPixel)を実行すると、writeという関数があることがわかります。
MicroPython v1.25.0 on 2025-04-15; Generic ESP32S3 module with ESP32S3
Type "help()" for more information or .help for custom vREPL commands.

>>> import neopixel
>>> dir(neopixel)
['__class__', '__name__', '__dict__', '__file__', 'bitstream', 'NeoPixel', '__version__']
>>> dir(neopixel.NeoPixel)
['__class__', '__getitem__', '__init__', '__len__', '__module__', '__name__', '__qualname__', '__setitem__', 'write', '__bases__', '__dict__', 'fill', 'ORDER']
  1. GPIOとは?
    GPIO(General Purpose Input / Output)とは、マイコンが外部の機器と信号をやり取りするための汎用ピンのことです。
    ESP32 では、この GPIO を使って以下のような制御を行います。
  • LED を点灯・消灯する
  • ボタンの押下を検出する
  • センサーの値を読み取る
  • 外部回路を ON / OFF する

ESP32 には複数の GPIO ピンがありますが、すべてが自由に使えるわけではないので注意が必要です

  1. 入力と出力の違い
    出力(Output)
     ESP32 から 信号を出す 使い方です。
     ・LED を点灯させる
     ・リレーを制御する

      Pin(2, Pin.OUT) 

    入力(Input)
     外部からの 信号を受け取る 使い方です。
     ・ボタンの ON / OFF を検出
     ・センサーの状態を読む

      Pin(0, Pin.IN)
  1. なぜ GPIO の理解が重要なのか?
    GPIO は、ESP32 を使った開発の すべての基本 になります。
    ・LED 制御
    ・ボタン入力
    ・センサー
    ・通信状態の表示
    これらはすべて GPIO の理解が前提です。
    GPIO が理解できれば、ESP32 を使った開発の幅が一気に広がります。
  1. NeoPixelを駆動するためのGPIOを調べる
    NeoPixel 駆動のためにGPIOを使うのですが、GPIOは下図のピンレイアウトに載っていますので、 21 を出力に設定します。
  1. neopixelモジュールをインポートして、GPIOを設定する
    main.pyに、import neopixelを記入します。次に、NeoPixel 駆動のためにGPIOを使うので、import machineを記入します。neopixelを駆動するためのGPIOは21を出力に設定します。
    NeoPixelはRGBのLEDなので、白を設定して点灯させます。
import neopixel
import machine

pin = machine.Pin(21, machine.Pin.OUT)   # NeoPixel 駆動のための GPIO 21 を出力に設定
np = neopixel.NeoPixel(pin, 8)   # 8ピクセル用の NeoPixel ドライバーを GPIO 21 で作成
np[0] = (255, 255, 255) # 第1ピクセルを白に設定
np.write() # 全ピクセルにデータ書込み
  1. main.pyを実行してLEDを点灯させる
    4の内容を、main.pyに書き込み、保存させます。左のエクスプローラにて、main.pyを選択して、右クリックから、「Run current file on Pico」をクリックすると、M5StampS3上のLEDが白で点灯します。
  1. LEDを点滅させる
    点滅させるために、timeモジュールをインポートします。3回点滅させるので、for文でループさせて、点滅間隔は、500msにします。下記の内容で保存して、左のエクスプローラにて、main.pyを選択して、右クリックから、「Run current file on Pico」をクリックすると、M5StampS3上のLEDが白で3回点滅します。
import neopixel
import machine
import time

pin = machine.Pin(21, machine.Pin.OUT)
np = neopixel.NeoPixel(pin, 8)

for _ in range(3): # 3回ループさせる
      np[0] = (255, 255, 255) # 第1ピクセルを白に設定
      np.write() # 全ピクセルにデータ書込み
      time.sleep_ms(500) # 500msecのタイマー設定
      np[0] = (0, 0, 0) # 第1ピクセルを消灯に設定
      np.write() # 全ピクセルにデータ書込み
      time.sleep_ms(500) # 500msecのタイマー設定
  1. main.pyを自動実行させる
    for文以下をmain関数にします。最後に下記を記入します。
if __name__ == "__main__":
    main()

これの意味は:
➡ 「このファイルを直接実行したときだけ main() を動かす」
➡ 「import されたときには main() を動かさない」

import neopixel
import machine
import time

pin = machine.Pin(21, machine.Pin.OUT) # NeoPixel 駆動のための GPIO 21 を出力に設定
np = neopixel.NeoPixel(pin, 8) # 8ピクセル用の NeoPixel ドライバーを GPIO 21 で作成

def main():
    for _ in range(3): # 3回ループさせる
          np[0] = (255, 255, 255) # 第1ピクセルを白に設定
          np.write() # 全ピクセルにデータ書込み
          time.sleep_ms(500) # 500msecのタイマー設定
          np[0] = (0, 0, 0) # 第1ピクセルを消灯に設定
          np.write() # 全ピクセルにデータ書込み
          time.sleep_ms(500) # 500msecのタイマー設定

if __name__ == "__main__":
    main()
  1. main.pyをESP32S3に転送する
    7の内容で保存して、左のエクスプローラにて、main.pyを選択して、右クリックから、「Upload file to Pico」をクリックします。すると、M5StampS3上のLEDが白で3回点滅します。
  1. M5StampS3をUSB電源に接続する
    M5StampS3をPCから切断して、USB電源に接続します。すると、M5StampS3上のLEDが白で3回点滅します。

まとめ

  • LED 制御は ESP32 学習の第一歩
  • GPIO の仕様を理解することが重要
  • Lチカができれば他の制御も簡単

ESP32にMicroPythonをインストールすれば、シンプルなコードでLEDを点灯させたり、センサーを動かしたりできます。応用すればIoTデバイスに簡単に組み込めます。

類似投稿