ESP32-WROOM-32EでMicroPythonを使い開発(GPIO編)

〔ESP-WROOM-02〕 〔マイコンのトップに戻る〕
[準備編] [module編]   [通信編] [I2S編] [WiFi編] [BLE編1] [BLE編2] [BLE編3] [色々編]


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

やっぱりぃ買ってしまいましたね、本当は16Mbyte版を買うつもりがまだぁボード無いですぅ。
私が購入した"ESP32-WROOM-32Eボード"は、"ESP32-DevKitC-32E"と言う物でぇ純正品です。
買ったのは、秋月通商のこちらです。
ボードの回路図やESP32-WROOM-32E PDFデータシートは秋月通商のページからダウンロード
しましょう、ボードの入門ガイドはここを参照しましょう。

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

 
ESP32ピン構成 ESP32−WROOM−32E(ESP32-DevKitC-32E)の端子配列一覧表
この一覧表はMicroPython環境で使用可能なピン構成です
端子名称 Myボード
機能
GND

GND
3V3

3.3Vまでの+電源(VDD)出力
EN
EN
VDDに接続する事によりチップが動作します。(10KΩPull-UP)
リセットボタンに接続されています。
SENSOR_VP VP
GPIO36, ADC1_CH0, LAN in+ (入力専用),
SENSOR_VN VN
GPIO39, ADC1_CH3, LAN in- (入力専用)
IO34
34
GPIO34, ADC1_CH6 (入力専用)
IO35
35
GPIO35, ADC1_CH7 (入力専用)
IO32
32
GPIO32, ADC1_CH4, TOUCH9, XTAL_32K_P(32.768 kHz 水晶発振入力)
IO33
33
GPIO33, ADC1_CH5, TOUCH8, XTAL_32K_N(32.768 kHz 水晶発振出力)
IO25
25
GPIO25, DAC_1, I2C_SCL1
IO26
26
GPIO26, DAC_2, I2C_SDA1
IO27
27
GPIO27, TOUCH7
IO14
14
GPIO14, TOUCH6, HSPI_SCK, SD_CLK
IO12
12
GPIO12, TOUCH5, HSPI_MISO, SD_DATA2
IO13
13
GPIO13, TOUCH4, HSPI_MOSI, SD_DATA3
IO15
15
GPIO15, TOUCH3, HSPI_SS, SD_CMD
IO2
2
GPIO2, TOUCH2, SD_DATA0
IO0
0
GPIO0, TOUCH1(ボタンに接続プルアップは無し)
IO4
4
GPIO4, TOUCH0, SD_DATA1
IO16 16
GPIO16, HS1_DATA4, UART_RX1
IO17 17
GPIO17, HS1_DATA5, UART_TX1
IO5
5
GPIO5, VSPI_SS
IO18
18
GPIO18, VSPI_SCK, I2C_SCL0
IO19
19
GPIO19, VSPI_MISO, I2C_SDA0
IO21
21
GPIO21
RXD0
RX
GPIO3, Serial_RX0(シリアルでPCに繋がりREPL等が操作できるピン)
TXD0
TX
GPIO1, serial_TX0(シリアルでPCに繋がりREPL等が操作できるピン)
IO22
22
GPIO22
IO23
23
GPIO23, VSPI_MOSI
※ D2/D3/CMD/CLK/D0/D1ピンが有りますが、Flashメモリのインターフェースに使われているので
  利用不可です。
※ GPIO1/3は其々 REPL UART の TX と RXです使用しない様にしましょう。
※ GPIO34−39は入力専用で、内部プルアップ抵抗もありません。
※ ソフトSPI/ソフトI2CとPWMは全ての入出力対応ピンで有効にできます。
※ スイッチサイエンスに"ESP-WROOM-32に関するTIPS"と言う記事があるので一読して置きましょう。

ESP32の起動時注意するピン

GPIO0/GPIO2/GPIO5/GPIO12/GPIO15の5ピンはストラップピンとされ起動時の設定に使われるので
其々が、内蔵のプルアップ・プルダウンにデフォルト接続されます
。ストラップビット値を変更するには、
ユーザーは外部プルダウン/プルアップ抵抗を適用してレジスタ「GPIO_STRAPPING」を変更できます。
設定完了後、ストラップピンは通常の機能ピンとして機能します

起動モード
ピン
 デフォルト
SPIブートモード
ダウンロードブートモード
GPIO0
プルアップ


GPIO2
プルダウン
ドントケア

通常の操作は[GPIO0ボタン]を押しながら、[リセットボタン(ENに接続)]を押して
ダウンロードブートモードにします。

内部LDOの電圧(VDD_SDIO)
ピン
デフォルト 3.3V
1.8V
GPIO12
プルダウン

モジュールには3.3V SPIフラッシュが組み込まれている為、モジュールの電源を入れた時にピンを1に
設定する事はできません。
(プルアップになる様な配線はするなって事ですね、配線するとぉ立ち上がりません!)

U0TXD(シリアル)を介したデバッグ出力の有効/無効
ピン
デフォルト 有効
無効
GPIO15
プルアップ


SDIOスレーブのタイミング
ピン
デフォルト FEサンプリング
FE出力
FEサンプリング
RE出力
REサンプリング
FE出力
REサンプリング
RE出力
GPIO15
プルアップ



GPIO5
プルアップ



何かぁ、SPIフラッシュが使っていない時SDIOスレーブとして使える様な事が書いて有るがぁ
使い方も解らないがぁ、使えないって事かぁ、わからん!、まあ、触らぬ神に祟りなし (( ;゚Д゚))
こちらにごちゃごちゃとぉ何か書いて有ります。

《デジタル入出力》

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

デジタル入出力配線図
ブレッドボード1個では、横行穴が1行しかできない。
これではダメ、2個続きのブレッドボードなら何とか
挿せます。

電源はUSB接続で、回路電源はボード出力3.3Vです。
LEDはD4(GPIO4)に配線しています、
物理ピン番号は"4"と記述します。
スイッチはD5(GPIO5)に配線しています、
物理ピン番号は"5"と記述します。
プルアップ抵抗はチップ内蔵を使います。

@ ESP32-WROOM-32EボードをUSBでPCに繋ぎます。
A "PyCharm"を起動させ、こちらのCを操作する必要が有ります。(起動時最初のみ設定)
B "main.py"を新規登録して下記スクリプトを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
C ESP32-WROOM-32Eに書き込みます
  左側プロジェクトウインドウから"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で繰り返す
--------------------------------------------------------------------------------
machine.Pin
ピンオブジェクトは、I/O ピン (GPIO - 汎用入出力)を制御する為に使われます。

「使用可能なピンは、ESP32 チップの実際の GPIO ピン番号に対応する 0,2,4,5,12-19,21-23,25-27,  32-36,39 です。これらは ESP32 チップの実際の GPIO ピン番号に対応しています。
 (0,2,5,12,15番ピン使用時は注意が必要です、上記ピン構成を見ましょう)
 多くのエンドユーザーボードでは、独自のアドホックピン番号(D0、D1、... など)が使われています。
 ボードの論理ピンと物理的なチップピンとのマッピングについては、ボードのマニュアルを参照して
 ください。」

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

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

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

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

《外部割込み》

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

@ ESP32-WROOM-32EボードをUSBでPCに繋ぎます。
A "PyCharm"を起動させ、こちらのCを操作する必要が有ります。(起動時最初のみ設定)
B "main.py"を新規登録して下記スクリプトを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
C ESP32-WROOM-32Eに書き込みます
  左側プロジェクトウインドウから"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
0,2,4,5,12-19,21-23,25-27,32-36,39ピンで入力が変化するとハード割り込みを発生させる様に
設定できます。トリガで実行されるプログラム(コールバック関数)を設定できます。
詳しい説明は、ここ(ESP8266)又は、ここを参照しましょう。

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秒です。
詳しい説明は、ここを参照しましょう。

《アナログ入力》

ESP32 で ADC 機能はピン 32-36,39 で利用できます。デフォルト設定を使用する場合、
ADC ピンの入力電圧は 0.0V-1.0V である必要があります(1.0V を超える値は 4095 となります)。
この電圧範囲を広げるには attenuation (減衰率)を適用する必要があります
アナログ入力配線図
電源はPCからのUSB接続で、
回路電源はボード出力3.3Vです。
アナログは1.0Vまでの入力なので47Kと20Kでの
分圧回路です。
"ADC.atten(ADC.ATTN_11DB)"とすると0-3.6Vで
読み込む様です。
分解能力は12ビット(0-4095)です。
(9-12ビットで変更可能)

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

adc = ADC(Pin(32))   # ADC(GPIO32)のオブジェクト作成

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

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

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

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

《PWM出力》

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

@ ESP32-WROOM-32EボードをUSBでPCに繋ぎます。
A "PyCharm"を起動させ、こちらのCを操作する必要が有ります。(起動時最初のみ設定)
B "main.py"を新規登録して下記スクリプトを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)
C ESP32-WROOM-32Eに書き込みます
  左側プロジェクトウインドウから"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"が無いと怒られますがESP32-WROOM-32Eに入れた
  MicroPythonには"PWM"のクラスが存在しているので構わず書き込みましょう。

machine.PWM
PWMは 0,2,4,5,12-19,21-23,25-27,32-36,39 ピンで有効にできます。
基本周波数は 1Hz から 40MHz の範囲ですが、トレードオフがあります。
(テスターで調べた限り、1Hz-75KHz辺りまでしか出なかったがぁ.....?40KHzの間違いじゃね)
ベース周波数が高くなると、デューティ分解能は低下します。
(テスターで測って見た、1Hz=0.999Hz 1KHz=999.9Hz・・・50KHz=49.99KHz・・・75KHz=75.18KHz)
今の所、デューティ比は 0-1023 の範囲内でなければなりません。

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

※ 尚、周波数変更にはハードリセットしないと切換らなかったがぁ....?
※ 1MHzそこらまでのパルスなら"RMT"モジュールで出来ます、その話はこちらを参照しましょう。

《DAC出力》

ESP8266にはDAC機能は無いのですがぁ、ESP32には有る様なので記述して置きます。
出力可能なピンは、GPIO25(DAC1)とGPIO26(DAC2)の2本です。
DACは8ビットで 0 - 255 が指定可能範囲です。

REPLでDACの操作
テスターで測定したら"3.141V"でVDDは"3.292V"でした。

《静電容量タッチ》

ESP32で使える静電容量タッチ対応ピンは 0, 2, 4, 12, 13 14, 15, 27, 32, 33 の10本です。
(ピン0,2,15を使う場合は注意が必要です、上記ピン構成を見ましょう)
この機能は、以前にPIC12F1822で実験した"静電容量式センシングモジュール(CSM)"と同じ機能の様です
なので、どんな検出方法か知りたい人はそちらを参照しましょう。

先ずは、どんな数値が返ってくるかチェックをしましょう。
下記スクリプトを書き込んで、REPLで表示します。
--------------------------------------------------------------------------------
import time
from machine import TouchPad, Pin

t4 = TouchPad(Pin(13))  # 13番ピンをタッチピンで設定

while True:
    print('Touch4 :' + str(t4.read()))
    time.sleep_ms(500)
--------------------------------------------------------------------------------
表示結果  以前にPIC12F1822で実験した時作成の"銅板電極"を
 タッチ部として使った場合の数値が左図です。
 触れていない時は"470"台で、触れた時は"110-60"付近でした。
 因みに、普通のジャンパーリード線では、
 触れていない時は"540"台で、触れた時は"170-70"付近でした。
 なので、自分が使う電極により調整が必要でしょう。

次のは、触れたらLEDを点灯させる物です、閾値は"200"としました。
--------------------------------------------------------------------------------
import time
from machine import TouchPad, Pin

t4 = TouchPad(Pin(13))  # ピン13番をタッチピンで設定
led = Pin(4, Pin.OUT)   # ピン4番(GPIO4)をLED出力で設定

while True:
    # 数値が200以下ならタッチしたと判断する
    if t4.read() <= 200:
        led.on()
    else:
        led.off()
    time.sleep_ms(100)
--------------------------------------------------------------------------------

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

《チャタリング》

チャタリングの詳しい話はこちらを参照して下さい。
↓からスイッチ入力時のチャタリング防止用スクリプトをダウンロードして下さい。
[ScanSW]
"ESP8266"も動作するでしょう、恐らく
解凍すると下記スクリプトが展開されます。
 main.py    - skScanSW.pyを利用するサンプルスクリプト
 skScanSW.py - スイッチのチャタリングをソフトウエアで防止する為のライブラリ
例)
sw_pin = [26]              # GPIO26にスイッチを配線する
sw = ScanSW(Pin, sw_pin)   # スキャンするスイッチのピン情報を登録する
                           # ピン26は、Pin.IN, Pin.PULL_UPで初期化されます。
led = Pin(4, Pin.OUT)      # ピン4番(GPIO4)をLED出力で割り付ける

time.sleep(0.1)  # 登録後、直ぐにピンをreadする場合は100ms位開けてから利用します。
while True:
    if sw.read(26) == 0:
        led.on()
    else:
        led.off()








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


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