ESP-WROOM-02でMicroPythonを使い開発(GPIO編)

〔ESP32-WROOM-32E〕 〔マイコンのトップに戻る〕
[準備編] [module編]   [通信編] [ファイル編] [OLED編] [WiFi編] [メール編] [並行処理編] [色々編]


前ページでMicroPythonを使い開発を行う為の準備は整ったはずですね。
このページでは、ESP-WROOM-02のI/O入出力を行ってみようと思います。

私が購入した"ESP-WROOM-02ボード"は、"ESP8266-CORE-R1"と言う物でぇ
[マイクロファン Yahoo!ショップ]からです、なのでぇ、これに沿った説明になるかもぉですぅ。
秋月通商ならこちら、スイッチサイエンスならこちら辺りです、色々販売されているので検索してみて。
USB付きが便利なのと安かったのでこれにしたのですがぁ他の物も基本は同じです、
ピン名称や配列等が若干異なります。
(いじった感じ今では"ESP32"がピン数が多いので良かったかもぉとチョット後悔)

尚、"ESP8266-CORE"ボードのマニュアルは、マイクロファンYahoo!ショップの商品説明の所に有ります
又、"ESP8266EX"チップのデータシートは秋月通商のここからダウンロードしましょう。

ESP関連のドキュメントは"EAPRESSIF SYSTEMS"のここから色々落せます。

 
ESP-WROOM-02(ESP8266EX)の端子配列一覧表
端子
番号 名称
Myボード
物理PinNo
ESP-WROOM-02端子の一般的な機能
1
3V3


3.0V〜3.6Vまでの+電源(VDD)
2
EN


VDDに接続する事によりチップが動作します
3
IO14
D14/SCK
14
GPIO14/CLK(SPI)/SCL(I2C)/IR_T(赤外線38KHz)/I2SI_WS
4
IO12
D12/MISO
12
GPIO12/MISO(SPI)/PWM/I2SI_DATA
5
IO13
D13/MOSI
13
GPIO13/MOSI(SPI)/CTS(UART0)/PWM/I2SI_BCK
6
Io15
D15
15
GPIO15/CS(SPI)/RTS(UART0)/PWM/I2SO_BCK
7
IO2
D2
2
GPIO2/TXD(UART1)/SDA(I2C)/I2SO_WS UART1はこのTXDのみ
8
IO0
D0(SW1)
0
GPIO0
9
GND


GND
10
IO4
D4/SDA
4
GPIO4
11
RXD
D3/RX
3
RXD(UART0)/GPIO3/I2SO_DATA ここにマイコン/PCは接続する
12
TXD
D1/TX
1
TXD(UART0)/GPIO1       ここにマイコン/PCは接続する
13
GND


GND
14
IO5
D5/SCL
5
GPIO5/IR_R
15
RST


リセット、通常はVDD、LOW(GND)でリセットが掛かる
16
TOUT
AD

AD変換(0.0-1.0Vの範囲)が可能なピンです。
17
IO16
D16(LED1)
16
GPIO16(スリープから目覚める場合にも使用する)
18
GND


GND
MYボードのその他機能
※ 3V3端子は出力(600mA)のみ可能です。
※ 5V端子は、USBケーブルからUSBバッテリー等で接続なら5V出力(3A)できます、PCからなら500mA程
  USBを使わないなら外部から5V入力できて、電源レギュレータAP2112K-3.3の入力電圧最大値は6.5V
※ D0端子はプルアップされたスイッチと繋がっています。(起動後は通常のスイッチで使えると思います)
※ D2端子はプルアップされ、D15端子はプルダウンされている。(起動後は通常ピンで使えると思います)
※ EN端子はVDDに繋がれピン出力は無しです。
※ RX/TXはUSB使わないならD3/D1で利用できそう?。(但し、REPLが動作します)
※ D16端子はLED1に配線(LEDはLOWで点灯)されている、利用する場合は注意が必要かも。

ESP8266 用クイックリファレンスを参照しましょう。

《デジタル入出力》

ここではスイッチを押せばLEDが点灯する事を行います。

デジタル入出力配線図
電源はUSB接続で、回路電源はボード出力3.3Vです。
LEDはD4(GPIO4)に配線しています、
物理ピン番号は"4"と記述します。
スイッチはD5(GPIO5)に配線しています、
物理ピン番号は"5"と記述します。
プルアップ抵抗はチップ内蔵を使います。
他に"GPIO12/13/14"ピンが利用可能です。

@ ESP-WROOM-02ボードをUSBでPCに繋ぎます。
A "PyCharm"を起動させ、こちらのCを操作する必要が有ります。(起動時最初のみ設定)
B "main.py"を新規登録して下記スクリプトを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
C ESP8266に書き込みます
  左側プロジェクトウインドウから"main.py"の文字を右クリックをして、[実行(U)'Flash main.py']を
  クリックします。
--------------------------------------------------------------------------------
import time
from machine import Pin

led = Pin(4, Pin.OUT)              # ピン4番(GPIO4)をLED出力で割り付ける
sw1 = Pin(5, Pin.IN, Pin.PULL_UP)  # ピン5番(GPIO5)をスイッチ入力で割り付ける

while True:
    if sw1.value() == 0:           # スイッチが押された
        led.on()                   # LED点灯
    else :
        led.off()                  # LED消灯
    time.sleep_ms(100)             # 100msで繰り返す
--------------------------------------------------------------------------------
Myボードなら"GPIO16"にLEDが接続され、"GPIO0"はモード切替スイッチに接続されているのでぇ
下記の様に書き換えれば、上記の様な配線は要らなくボードのみで同じ動作が出来ます。
書き換えれば外でLEDを繋ぐ必要は無い、但し、出力がLOWで点灯する。
--------------------------------------------------------------------------------
led = Pin(16, Pin.OUT)             # ピン16番(GPIO16)をLED出力で割り付ける
sw1 = Pin(0, Pin.IN)               # ピン0番(GPIO0)をスイッチ入力で割り付ける

while True:
    if sw1.value() == 0:           # スイッチが押された
        led.value(0)               # LED点灯
    else :
        led.value(1)               # LED消灯
    time.sleep_ms(100)             # 100msで繰り返す
--------------------------------------------------------------------------------
"led.off()"でLED点灯なのでぇ、led.value(0)と書き換えた次第です。
"led.on()"で点けたいぞぉってぇ人は、"Signal"関数を使ってみては如何だろうか。
 from machine import Pin, Signal
 led = Pin(16, Pin.OUT)
 led = Signal(led, invert=True)
 led.on()
こんな感じぃ。
クラス Signal -- 外部 I/O デバイスの制御と検知”にサンプルコードがあります是非見てみましょう。

machine.Pin
ピンオブジェクトは、I/O ピン (GPIO - 汎用入出力)を制御する為に使われます。

「使用可能なピンは、ESP8266チップの実際のGPIOピン番号(物理ピン番号)に対応する 0, 1, 2, 3, 4, 5,
 12, 13, 14, 15, 16 です。(1,3番はUART0で使用している避けましょう)
 多くのエンドユーザ用ボードは、独自のピン番号(例:D0, D1, ...)を使っています。
 MicroPythonは様々なESP8266ボード/モジュールをサポートする為、慣用番号として物理ピン番号を
 採用します。ボードの論理ピンと物理ピンとのマッピングについては、各ボードのマニュアルを
 参照してください。」

ESP8266 用クイックリファレンスより

ヘルプ(machine.Pin)
詳しい説明は、ここ又は、ここを参照しましょう。

time
このモジュールには、現在の日時の取得、時間隔の測定、遅延の機能があります。

ヘルプ(time)
"ticks"とは、稼働時間の事で、"ticks_ms"なら起動してからの時間をms時間で得る事が出来ます。
詳しい説明は、ここ又は、ここ或いはオリジナルのここを参照しましょう。

《外部割込み》

ここではスイッチを押して離したタイミングでLEDが100ms間点灯する事を行います。
回路配線図は上記と同じです。

@ ESP-WROOM-02ボードをUSBでPCに繋ぎます。
A "PyCharm"を起動させ、こちらのCを操作する必要が有ります。(起動時最初のみ設定)
B "main.py"を新規登録して下記スクリプトを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
C ESP8266に書き込みます
  左側プロジェクトウインドウから"main.py"の文字を右クリックをして、[実行(U)'Flash main.py']を
  クリックします。
--------------------------------------------------------------------------------
import time
from machine import Pin

# 割り込みが発生したら呼ばれるコールバック関数
def LED_ON(p) :
    print("OK!")
    led.on()
    time.sleep_ms(100)   # 100ms間点灯
    led.off()

led = Pin(4, Pin.OUT)              # ピン4番(GPIO4)をLED出力で割り付ける
sw1 = Pin(5, Pin.IN, Pin.PULL_UP)  # ピン5番(GPIO5)をスイッチ入力で割り付ける
# スイッチの立ち上がりエッジで割り込みをかける
sw1.irq(trigger=Pin.IRQ_RISING, handler=LED_ON)

while True:
    time.sleep(1)                  # 1秒間隔で繰り返す
--------------------------------------------------------------------------------
割り込みサンプルとしては、この例はあまり良いとは言えません、
それはスイッチがチャタリングを起こすのでその度に割り込みが発生します、
だからスイッチを押したら3秒程そのままにして離せばそこで割り込みが発生するのが分かるでしょう。
(チャタリングがあるのでその回数分LEDは点灯するから100ms以上点灯する事でしょう)

machine.Pin.irq
16番を除くすべてのピンは、入力が変化するとハード割り込みを発生させるように設定できます。
トリガで実行されるプログラム(コールバック関数)を設定できます。
又、"sw1.irq()"には"wake"オプションは使えなさそうです
詳しい説明は、ここ又は、ここを参照しましょう。

machine.time_pulse_us
パルスの計測を行う様です、但し、連続するパルスの計測には不向きだと思えます。
  machine.time_pulse_us(machine.Pin(0), pulse_level, timeout_us=1000000)
"pulse_level"が1ならHIGH時のパルスを計測で0ならLOW時のパルスを計測。
「ピンの現在の入力値が pulse_level と異なる場合、関数は最初にピン入力が pulse_level に等しくなる
 まで待機し、次にそのピンが pulse_level に等しい時間を測ります。
 ピンが既に pulse_level に等しい場合、計測はすぐに開始されます。」
この関数は計測終了かタイムアウトまでは戻ってきません、戻り値はus秒です。
詳しい説明は、ここを参照しましょう。

《アナログ入力》

ESP8266には、アナログ電圧(0.0-1.0V)を読取ってデジタル値(0-1023)に変換する為に使用できるピンが
1つだけある様です。

アナログ入力配線図
電源はPCからのUSB接続で、
回路電源はボード出力3.3Vです。
アナログは1.0Vまでの入力なので47Kと20Kでの
分圧回路です。
アナログピンは、AD(TOUT)から入力し、
ADCピン番号は"0"と記述します。

@ ESP-WROOM-02ボードをUSBでPCに繋ぎます。
A "PyCharm"を起動させ、こちらのCを操作する必要が有ります。(起動時最初のみ設定)
B "main.py"を新規登録して下記スクリプトを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
C ESP8266に書き込みます
  左側プロジェクトウインドウから"main.py"の文字を右クリックをして、[実行(U)'Flash main.py']を
  クリックします。
--------------------------------------------------------------------------------
import time
from machine import ADC

adc = ADC(0)   # ADCのオブジェクト作成

while True:
    print(adc.read())
    time.sleep(1)  # 1秒で繰り返す
--------------------------------------------------------------------------------
※ "PyCharm"で記述すると、"ADC"が無いと怒られますがESP8266に入れたMicroPythonには
  "ADC"のクラスが存在しているので構わず書き込みましょう。

D 書き込めたら"REPL"で出力を確かめましょう。
  メニューバーから[ツール]->[MicroPython]->[MicroPython REPL]と順番にクリックし起動します。
  [CTRL]+[D]キーを押します。
E 1秒毎に値が表示されるので半固定抵抗を回してみましょう。

machine.ADC
ADC クラスはアナログ-デジタルコンバーターへのインターフェイスを提供します。

ヘルプ(machine.ADC)
詳しい説明は、ここ又は、ここを参照しましょう。

《PWM出力》

D4ピンにLEDを配線し消えた状態からだんだん明るくなると言う事を行ってみます。
(回路はスイッチは使わないがデジタル入出力時の物を参照ください)

@ ESP-WROOM-02ボードをUSBでPCに繋ぎます。
A "PyCharm"を起動させ、こちらのCを操作する必要が有ります。(起動時最初のみ設定)
B "main.py"を新規登録して下記スクリプトを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
C ESP8266に書き込みます
  左側プロジェクトウインドウから"main.py"の文字を右クリックをして、[実行(U)'Flash main.py']を
  クリックします。
--------------------------------------------------------------------------------
import time
from machine import Pin, PWM

led = Pin(4, Pin.OUT)      # ピン4番(GPIO4)をLED出力で割り付ける
pwm = PWM(led)             # PWMのオブジェクト作成
pwm.freq(1000)             # 1KHzで周波数を設定

while True:
    for i in range(1024):
        pwm.duty(i)        # デューティ比を設定(0-1023で可変)
        time.sleep_ms(10)  # 10msで繰り返す
--------------------------------------------------------------------------------
※ "PyCharm"で記述すると、"PWM"が無いと怒られますがESP8266に入れたMicroPythonには
  "PWM"のクラスが存在しているので構わず書き込みましょう。

machine.PWM
Pin(16) を除く全てのピンで PWM を有効化できます。
全てのチャンネルに1つの周波数があり、範囲は 1Hz-1KHzです。デューティ比は 0-1023 です。

ヘルプ(machine.PWM)
詳しい説明は、ここを参照しましょう。



[module編へ] [ページ上へ] [通信編へ]


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2021 Shigehiro Kimura All Rights Reserved.