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

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


このページでは、ESP-WROOM-02のUART/SPI/I2C/1-wareを行ってみようと思います。
尚、ESP-WROOM-02の端子配列一覧は前ページのこちらを参照願います。

《UART》

ESP8266には、UART0UART1の2つが有ります、ハードウェアで実装されています。
UART0は、GPIO1(TX)/GPIO3(RX)のピンをを使い双方向通信でUSBと繋がっていて"REPL"(デフォルト)
で使われます、UART1は、GPIO2(TX)のピンのみの片方向通信となります。

@ 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 UART, Pin

# UART0を初期化
uart0 = UART(0, 115200)
uart0.init(115200, bits=8, parity=None, stop=1)
# ピン4番(GPIO4)をLED出力で割り付ける
led = Pin(4, Pin.OUT)

i = 0
led.on()                       # LED点灯
while True:
    if i > 30 : break          # 30カウントで終了
    uart0.write(str(i)+'\r\n') # UART出力
    i=i+1
    time.sleep_ms(1000)        # 1000msで繰り返す
led.off()                      # LED消灯
--------------------------------------------------------------------------------
Myボード"ESP8266-CORE-R1"は、GPIO16にLEDが内蔵されているので下記記述行と上の行を
入れ替えれば外でLEDを繋ぐ必要は無い、但し、出力がLOWで点灯する。
--------------------------------------------------------------------------------
# ピン16番(GPIO16)をボードの内臓LED出力で割り付ける
led = Pin(16, Pin.OUT)
led.value(0)                   # LED点灯(又は led.off())
led.value(1)                   # LED消灯(又は led.on())
--------------------------------------------------------------------------------
動作はLEDが点灯し1秒毎のカウントを行い30カウントしたらLED消灯で終了です。

D "MicroPython REPL"を動作させましょう。
  メニューバーから[ツール]->[MicroPython]->[MicroPython REPL]を順番にクリックします。

MicroPython REPL 操作
REPLが表示され、">>>"のプロンプトが表示されるのを待ちます。
表示されたら[CTRL]+[D]キーを押しましょう。
ソフトリセットが実行されスクリプトが動作し、こんな感じになるでしょう。

machine.UART
ボードの起動時は、UART0は必ず"REPL"接続で初期化されています。
UART0を"REPL"にアタッチしている場合、UART0に入ってくる全ての文字は標準入力(REPL)に
直行するので、uart.read() は常に None を返します。
UART0から文字を読み取る必要がある場合は、sys.stdin.read() を使い標準入力から直接読みます。

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


REPLを止めて普通のUARTの様に使いた〜い

REPLをデタッチするとUART0は他の目的に使えるようになりますが....
デタッチしたら必ずREPLに再アタッチしてください再アタッチする前にプログラムエラーで停止したり
プログラムを途中で止めたりするとぉ、大変な事になります
、(私はアタッチ記述を忘れました<(`^´)>)
ボードの起動時にREPLがなくなってしまうのでMicroPythonが立ち上がりません!、
勿論プログラムも書き込めません、焦ります。 (;゚Д ゚)
こんな時は落ち着いて、"esptool"の出番ですチップのフラッシュメモリを削除して、再びMicroPythonを
再インストールします
、ふぅ、良かったぁ、やれやれ。 ┐(´∀`)┌.
あ、そうそうボーレトを"115200bps"に戻す事をお忘れなく!

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

uos.dupterm(None, 1)           # REPLをデタッチする
# UART0を初期化
uart0 = UART(0, 9600)
uart0.init(9600, bits=8, parity=None, stop=1)
# ピン4番(GPIO4)をLED出力で割り付ける
led = Pin(4, Pin.OUT)

i = 0
led.on()                       # LED点灯
while True:
    if i > 30 : break          # 30カウントで終了
    uart0.write(str(i)+'\r\n') # UART出力
    i=i+1
    time.sleep_ms(1000)        # 1000msで繰り返す
uart0.init(baudrate=115200)    # ボーレトも戻す
uos.dupterm(uart0, 1)          # REPLに再アタッチする
led.off()                      # LED消灯
--------------------------------------------------------------------------------
動作は上記と同じです。

シリアル端末での結果
D シリアル端末(ここではTerTerm)を起動しましょう。

数字表示部分は"9600bps"で出力ですね。
出力終わりで端末側のボーレトを"115200bps"にして、
[ENTER]キーを押して見ましょう、"REPL"に戻ていますね。
まぁ、REPLのデタッチはお勧めしません。

《SPI》

ハードウェアSPIで高速(通信速度最大80Mhz)ですが、GPIO12(MISO)/GPIO13(MOSI)/GPIO14(SCK)の
ピンでのみ動作します。
複数のデバイスが同じバスを共有できます。各デバイスには、通信を行うバス上の特定のデバイスを
選択する為の個別の4番目の信号 SS(Slave Select)が必要です。
SSシグナルの管理はユーザーコードで(machine.Pin クラス経由で)行う必要があります。

SPIの接続相手として”7セグメントLEDシリアルドライバモジュール”を使ってみます。

SPI配線図
電源はUSB接続で、
回路電源はボード出力3.3Vです。
SPIはGPIO14(SCK)/GPIO13(MOSI)/
GPIO12(MISO)と、SS(CS)はLATCH信号として
GPIO4を使っています。
尚、今回はGPIO12(MISO)は使っていません。

@ 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 SPI, Pin

# 7セグデータ
data = b'\x3F\x06\x5B\x4F\x66\x6D\x7D\x07\x7F\x6F'
buff = bytearray(1)

# SPIを初期化
spi = SPI(1, baudrate=2000000, polarity=0, phase=0)
# ピン4番(GPIO4)をSS(CS:LATCH)出力で割り付ける
ss = Pin(4, Pin.OUT)

x = 0
while True:
    ss.value(0)            # LATCH信号OFF
    buff[0] = data[x]
    x = x + 1
    if x > 9 : x = 0
    spi.write(buff)        # 7セグデータの出力
    ss.value(1)            # LATCH信号ON
    time.sleep_ms(1000)    # 1000msで繰り返す
--------------------------------------------------------------------------------
動作は数字0から9の表示を繰り返すだけです。

machine.SPI
polarity はクロック極性でアイドリング時のクロック状態(HIGHTかLOWか)を示します。
(0=LOWで0V、1=HIGTで5V)
phas はクロック位相でシフトされたデータを読取るタイミング(立上がりエッジか立下がりエッジか)を
示します。(0=SCKの第1エッジ読み取る、1=SCKの第2エッジ読み取るを意味)

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

sk7SEG_74HC.py】 *1)

7セグメントLEDに数値を表示させるライブライです。
この7セグモジュールを複数個配線させる場合はこちらを参照しましょう。
↓ファイルはここからダウンロードして下さい。
"sk7SEG_74HC.py"

@ ダウンロードし解凍させ、"sk7SEG_74HC.py"ファイルを"PyCharm"の
  プロジェクトディレクトリ(ここでは"espTest"を作成している)へコピーします。
A ESP8266ボードをUSBでPCに繋ぎます。
B "PyCharm"を起動させ、こちらのCを操作する必要が有ります。(起動時最初のみ設定)
C ESP8266に書き込みます
  左側プロジェクトウインドウから"sk7SEG_74HC.py"の文字を右クリックをし、
  [実行(U)'Flash sk7SEG_74HC.py']を選んでクリックします。
D "MicroPython REPL"を動作させましょう。
  メニューバーから[ツール]->[MicroPython]->[MicroPython REPL]を順番にクリックします。

REPL(sk7SEG_74HC.py操作)
7セグモジュールを3個接続した場合の例です。
小数点を指定する場合は、"12.3"や"-1.5"と文字列で指定します。
使い方は"sk7SEG_74HC.py"ファイル内の"demo()"関数を参照しましょう。
尚、"demo()"内のSPI接続はESP8266となっています、他のESP32等は書き換えましょう。

 例えば、この様に配線した場合で、
 [ESP(MOSI)]--[(SDI) LED1 (SDO)]--[(SDI) LED2 (SDO)]--[(SDI) LED3 (SDO)]
 "123"を出力した場合は、[3][2][1]と表示されます。[1][2][3]としたい場合は、
 [(SDO) LED1 (SDI)]--[(SDO) LED2 (SDI)]--[(SDO) LED3 (SDI)]--[ESP(MOSI)]
 と接続します。

《I2C》

I2Cドライバはソフトウェアで実装され、全てのピンで動作します。
(ESP8266はI2Cインターフェースがある様なのだがぁ....使わないのぉ?)

I2Cの接続相手として”DAコンバータ MCP4725を利用しD/A変換を行う”を使ってみます。

I2C配線図
電源はUSB接続で、
回路電源はボード出力3.3Vです。
I2CはGPIO4(SDA)/GPIO5(SCL)を使っています
ピンのプルアップ抵抗はチップ内蔵を使います
I2Cアドレスは"0x60"です。


@ 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 I2C, Pin

buff = bytearray(2)

# I2Cを初期化(I2Cのプルアップ抵抗はチップ内蔵を使う)
Pin(4, Pin.OUT, Pin.PULL_UP)
Pin(5, Pin.OUT, Pin.PULL_UP)
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)

x = 2000                      # 2000-4095ステップで繰り返します
while True:
    buff[0] = x >> 8          # Fast Mode/Normal Mode/D11-D8
    buff[1] = x & 0xff        # D7-D0(電圧のステップ数12bit)hex
    x = x + 1
    if x >= 4095 : x = 2000
    i2c.writeto(0x60, buff)   # I2Cアドレス0x60のデバイスにデータを送る
    time.sleep_ms(5)          # 5msで繰り返す
--------------------------------------------------------------------------------
動作は約1.6V(2000)-3.3V(4095)の出力を5ms毎に繰り返すだけです。
又、確認用としてLEDを付けときました。

machine.I2C

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


《1−ware》

1-wireはマキシム社の登録商標であり、接地線(GND)と一本の信号線(兼電力供給線)の2本だけで低速な
データ転送を行う非同期シリアルインターフェイス規格らしい。(って事はMCUピンは1本ですね)
この通信もマスター・スレーブ構成で、スレーブデバイスは64ビットの固有IDを持っている様です。
それに最長500mの通信が可能で、低速と書いたがスタンダードモードで約16kbps、
オーバードライブモードで約120kbpsらしい。とぉ良さげな塩梅だがぁ...
1-wireに対応したデバイスがほとんど無い買えそうなのは温度センサー位です。
又、1-wireに対応したペリフェラルを持ったMCUが無い等で......

MicroPython REPL 操作
詳しい説明は、こちらこちらのページを参照しましょう。
尚、”from onewire import OneWire”にしましょう。

dht

AM2302 以前に、Arduinoで実験した"DHT22(AM2302)"を持っていたので
チョットぉ動作させました。
13. 温度と湿度”のページを参考に進めます。

 電源は3.3V〜5.5Vで、独自の1wire通信方式です。
 SDAピンで通信し、プルアップ抵抗は必要です。
 尚、NCピンは使用しません。

AM2302のデータシートは、秋月電子の販売サイトからダウンロードすれば良いでしょう。

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

pin = Pin(14, Pin.IN, Pin.PULL_UP)
d = dht.DHT22(pin)

while True:
    d.measure()
    print('temp:' + str(d.temperature()) + '°C')
    print('humi:' + str(d.humidity()) + '%')
    time.sleep(2)
--------------------------------------------------------------------------------
REPLを起動させれば温度と湿度が2秒毎に表示されるでしょう。
尚、DHT22 では2秒に1回だけ呼び出せます、だそうらしい。



sk7SEG_74HC.pyを追加(*1) 2021/06/16

[GPIO編へ] [ページ上へ] [ファイル編へ]


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