🐝

ESP32でLちか

2022/11/01に公開
2

はじめに

この記事ではLEDをESP32開発ボードに接続し、Micropythonプログラムにより点灯、消灯する方法について記述しています。

In English

This article describes how to turn on/off the LEDs connected to ESP32 development board in Japanese.

GPIOポートについて

GPIOはGeneral Purpose Input/Outputの略で、日本語では汎用入出力と訳されています。

一般的なパソコンにはGPIOのポートはありませんが、制御用のワンボードコンピュータ(ESP32やRaspberry Piなど)では標準で備わっています。

それぞれのI/Oポートをプログラミングにより、入力用に使用したり、出力用に使用したりできます。

これらのポートにセンサやLED、リレー、スイッチ、サーボモータなどを接続し、プログラムにより制御することができます。

ESP32開発ボードのpinout

ここではESP32-WROVER-DEVとESP32-WROOM-DEVのpinoutを示します。
対応するアコーディオンを展開して確認して下さい。

ESP32-WROVER-DEVのpinout

ESP32-WROVER-DEVのpinout

この記事で使用しているESP32-WROVER-DEVのピンは次のようになっています。
altESP32-WROVER-DEVのpinout
引用元:https://i.imgur.com/EVthNWr.png

ESP32-WROOM-DEVのpinout

ESP32-WROOM-DEVのpinout

ESP32-WROOM-DEV30ピン36ピンのバージョンがあります。

ESP32-WROOM-DEV 30ピンバージョンのpinout

altESP32-WROOM-DEV(30pin)のpinout
引用元:https://www.electronicshub.org/wp-content/uploads/2021/02/ESP32-Pinout-1.jpg

ESP32-WROOM-DEV 36ピンバージョンのpinout

altESP32-WROOM-DEV(36pin)のpinout
引用元:https://www.electronicshub.org/wp-content/uploads/2021/02/ESP32-36-Pin-Pinout.jpg

LEDについて

LEDについては以下のサイトを閲覧して下さい。
https://pochiweb.com/ledの使い方(初心者向け)基本的にわかりや/

ブレッドボードについて

ブレッドボードは電子回路のプロットタイプ(試作品)を作成する時によく使われます。
ボード上に多数の穴(ホール)が開いていて、部品やリード線を差し込むことによって電子回路を簡単に構成することができます。穴の間隔はICのピッチに合うように、2.54ミリとなっています。

下の図に示すように、ピンク色の穴は内部で電気的に接続されています。

altブレッドボード
引用元: https://fabkura.gitbooks.io/arduino-docs/content/bb2.jpeg

結線


手持ちの開発キットに同梱されていた都合上、赤、緑、青のLEDを使用していますが、何色のLEDでも大丈夫です。

GPIOポートから直接、LEDのアノードに接続します。LEDのカソードは220Ωの電流制限抵抗を経由してGNDに接続します。

ここでは、赤色LEDをGPIO4、緑色LEDをGPIO0、青色LEDをGPIO15に接続しています。
下の結線図ではLEDが下向きになっていますが、実際はブレッドボード上に垂直に立てて下さい。

下の図はクリックすると拡大されます。

altブレッドボードの結線
ブレッドボードの結線

回路図は次のようになります。
altLちか回路図
Lちか回路図

MicroPythonのドキュメントについて

Micropythonのドキュメントは以下のリンクを参照して下さい。

日本語
https://micropython-docs-ja.readthedocs.io/ja/latest/

本家(英語)
https://docs.micropython.org/en/latest/

サンプルプログラム1(オンボードLEDの点滅)

ESP32-WROVER-DEV本体に搭載されているオンボードLEDを点灯/消灯するサンプルコードです。
この記事の動作確認で使用したESP32-WROVER-DEVはオンボードLEDがGPIO2に接続されています。

altled1.py
led1.py

コピペ用 led1.py
led1l.py
# Turn ON/OFF on-board LED

from machine import Pin
import time

# On-board LED GPIO port 
LED = 2

onboard_led = Pin(LED, Pin.OUT)

while True:
    onboard_led.on()
    print("ON")
    time.sleep(1)
    print("OFF")
    onboard_led.off()
    time.sleep(1)

サンプルプログラム2(赤色LEDの点滅)

GPIO4に接続された赤色LEDを点滅させるサンプルプログラム

altled2.py
led2.py

コピペ用 led2.py
led2.py
# Turn ON/OFF a LED

from machine import Pin
import time

# Red 4, green 0, blue 15
RED_LED = 4

red_led = Pin(RED_LED, Pin.OUT)

while True:
    # Turn ON LED
    red_led.on()
    print("ON")
    time.sleep(1)

    # Turn OFF LED
    red_led.off()
    print("OFF")
    time.sleep(1)

サンプルプログラム3(3色のLEDを同時点滅)

GPIO4に接続された赤色LED、GPIO0に接続された緑色LED、GPIO15に接続された青色LEDを3つ同時に点滅させるサンプルプログラムです。
(コードのエレガントさを考慮しない、一番単純なやり方です。京ことばでは もっさいプログラムと言います。)

altled3.py
led3.py

コピペ用 led3.py
led3.py
# Turn ON/OFF all the LEDs at onece (very simple way)

from machine import Pin
import time

# We don't use GPIO2 as it is connected to on-board LED
# Red 4, green 0, blue 15
RED_LED = 4
GREEN_LED = 0
BLUE_LED = 15

# Make led objects
red_led = Pin(RED_LED, Pin.OUT)
green_led = Pin(GREEN_LED, Pin.OUT)
blue_led = Pin(BLUE_LED, Pin.OUT)

while True:
    # Turn ON leds
    red_led.on()
    green_led.on()
    blue_led.on()
    print("ON")
    time.sleep(1)

    # Turn OFF leds
    red_led.off()
    green_led.off()
    blue_led.off()
    print("OFF")
    time.sleep(1)

サンプルプログラム4(3色のLEDをタプルを使って同時点滅)

タプルを使用して上のサンプルコードを書き換えたものです。

altled4.py
led4.py

コピペ用 led4.py
led4.py
# Turn ON/OFF LEDs using tuple

from machine import Pin
import time

# We don't use GPIO2 cause, it is connected to on-board LED
# Red 4, green 0, blue 15
RED_LED = 4
GREEN_LED = 0
BLUE_LED = 15

# Make led objects
red_led = Pin(RED_LED, Pin.OUT)
green_led = Pin(GREEN_LED, Pin.OUT)
blue_led = Pin(BLUE_LED, Pin.OUT)

# Make led tuple
leds = (red_led, green_led, blue_led)

while True:
    # Read from tuple and turn ON leds
    for x in leds:
        x.on()
    print("ON")
    time.sleep(1)

    # Read from tuple and turn OFF leds
    for x in leds:
        x.off()
    print("OFF")
    time.sleep(1)

サンプルプログラム5(CTRL-CでLED消灯)

CTRL-Cでプログラムを止めた場合、タイミングによってはLEDが点灯したままになります。
次のサンプルプログラムはCTRL-Cが押されたら、全てのLEDを消灯してからプログラムを終了します。

altled5.py
led5.py

コピペ用 led5.py
led5.py
# Turn ON/OFF LEDs
# Turn OFF all LEDs if CTRL-C is pressed

from machine import Pin
import time

# We don't use GPIO2 cause, it is connected to on-board LED
# Red 4, green 0, blue 15
RED_LED = 4
GREEN_LED = 0
BLUE_LED = 15

red_led = Pin(RED_LED, Pin.OUT)
green_led = Pin(GREEN_LED, Pin.OUT)
blue_led = Pin(BLUE_LED, Pin.OUT)

leds = (red_led, green_led, blue_led)

# Do this until CTRL-C is pressed
try:
    while True:
        # Turn ON leds
        for x in leds:
            x.on()
        print("ON")
        time.sleep(1)

        # Turn OFF leds
        for x in leds:
            x.off()
        print("OFF")
        time.sleep(1)

# Turn off all LEDs if CTRL-C is pressed
except KeyboardInterrupt:
    print("Trun off all LEDs")
    for x in leds:
        x.off()

演習問題

  1. 3色のLEDが順次点滅して、流れるように表示するプログラムを作成して下さい。(ファイル名:led-ex1.py)
  2. led_onoff(color, status)のように、色を第1引数で与え、ON/OFFの情報を第2引数で与え、引数にしたがって該当する色のLEDがON/OFFする関数を作成し、その関数を利用して3色のLEDをON/OFFさせて下さい。(ファイル名:led-ex2.py)
  3. 3つのLEDを2進数の1桁に見立てて、0から7までの2進数を表示するプログラムを作成して下さい。ただし、赤色LEDをLSB(最下位ビット)とし、青色LEDをMSB(最上位ビット)とします。(ファイル名;led-ex3.py)

Discussion

EdwilEdwil

Can you share where you got the Fritzing design from?