プログラミング環境の整備

ESP32-C3M-TRYを利用するためには、MicroPythonの実行環境に少なくとも以下の3つのドライバが導入されている必要があります。

  • OLEDディスプレイssd1306用ドライバ
  • 温度・湿度センサーAHT21用ドライバ
  • 加速度センサーKXTJ3-1057用ドライバ

しかしながら、以下に示すページからESP32-C3M-TRY専用のMicroPythonファームウェアを取得してESP32-C3M-TRYに書き込むことにより、これらのドライバーがすべて導入された状態となり、個別に導入する必要はなくなります。

参考のため、上記のドライバに関する説明ページを以下に示します。


ESP32-C3M-TRYでのプログラム例

この章では、ESP32-C3M-TRYのプログラム例を示しています。

端子の割り当て

シンボル信号線備考
SW1
SW2
SW3
SW4
SW5
D2
D3
D6
D9/SCL
RST
負倫理
負論理
負論理
BOOTローダーモード移行用
リセット
LED1
LED10-LED12
D0
D10
正論理
WS2812B(NeoPixel), CN4
SCL0
SDA0
D9
D10
OLEDディスプレイ、温度・湿度センサー、加速度センサー
X1D21圧電スピーカー
Q2D1(ADC)明るさセンサー(フォトトランジスタ)、アナログ値
CN2D20人感センサー
CN3D7RCサーボ
CN5 TRIG
CN5 ECHO
D4
D5
超音波距離センサー

SW4 は、リセット時のブートモード(MicroPythonのファームウェアの書き込み)の切り替え
用ですが、信号線が I2C の SCL 信号と共用のため、プログラムが走り始めたあとは、一般的な入
力用のスイッチとして利用するこはできません。

CN2-CN5 のコネクタは、標準的な使用法は決まっていますが、電源や信号線を適切に使用する
ならば、標準的な使用法以外の拡張用端子として使用することができます。

OLEDディスプレイへの文字表示

OLEDディスプレイに文字列を表示するプログラム例です。

I2Cの引数には、一般的にはコメントで書いている例のように、それぞれのMCUやボードの端子の設定に合わせたSCL,SDA端子の指定が必要です。しかしながら、マイクロファンのファームウェアを使用している場合には、ファームウェアの中に端子情報が埋め込まれているため、明示的に端子を指定する必要はありません。これは、ESP32-C3M-TRY以外のマイクロファンの開発ボードでも同様で、異なる開発ボードを使用する場合でも、I2Cの初期化処理の端子設定など、個別の情報に惑わされずプログラムを書くことができます。

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C

i2c = I2C(0) #
# i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)

oled.text('-ESP32-C3M-TRY-', 8, 0, 1)
oled.text('MicroFan', 32, 8, 1)
oled.text('OLED Display', 0, 16, 1)
oled.text('Piezo Speaker', 0, 24, 1)
oled.text('Brightness SNSR', 0, 32, 1)
oled.text('Temp. Hum. SNSR ', 0, 40, 1)
oled.text('Accelerometer', 0, 48, 1)
oled.text('WS2812 RGB LED', 0, 56, 1)
oled.show()

OLEDディスプレイへのグラフィックス表示

OLEDディスプレイにグラフィックス表示するプログラム例です。

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import time

i2c = I2C(0)
# i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)

oled.fill(0) # 画面のクリア
for y in range(0,64,8):
    oled.line(0,0,127,y,1) # 斜線
    oled.show()

for x in range(127,0,-8):
    oled.line(0,0,x,63,1) # 斜線
    oled.show()

time.sleep_ms(500)

oled.fill(0) # 画面のクリア
for n in range(0,32,4):
    oled.rect(64-n*2,32-n,n*4,n*2,1) # 方形
    oled.show()

time.sleep_ms(500)

oled.fill(0) # 画面のクリア
for n in range(0,32,2):
    oled.fill_rect(64-n*2,32-n,n*4,n*2,1) # 塗潰し方形
    oled.show()

time.sleep_ms(500)

oled.fill(0) # 画面のクリア
for n in range(2,32,2):
    oled.ellipse(64,32,n*4,n*2,1) # 楕円
    oled.show()

time.sleep_ms(500)

oled.fill(0) # 画面のクリア
for n in range(2,18,2):
    oled.ellipse(64,32,n*4,n*2,1,True) # 塗潰し楕円
    oled.show()

気温・湿度・明るさセンサー

OLEDディスプレイに気温・湿度センサーAHT21で得られた気温と湿度、明るさセンサー(フォトトランジスタ)で得られた明るさを表示するプログラム例です。

from machine import Pin, I2C, ADC
import time
from ssd1306 import SSD1306_I2C
from aht21 import AHT21

i2c = I2C(0)
oled = SSD1306_I2C(128, 64, i2c)
aht21 = AHT21(i2c)
brt = ADC(Pin('BRT')) # 明るさセンサーに割り当てられている端子には'BRT'という名前が割り当てられています。
# brt = ADC(Pin(1))

while True:
    oled.fill(0)
    oled.text('TEMP: {:.1f}\''.format(aht21.temperature),0,0,1)
    oled.text('HUM: {:.1f}%'.format(aht21.relative_humidity),0,16,1)
    oled.text('BRT: {:.3f}'.format(brt.read()/4095),0,32,1)
    oled.show()
    time.sleep_ms(1000)

# CTRL-Cで終了

スイッチと圧電スピーカー

SW1,SW2を押すと、それぞれ異なる音を出力するプログラム例です。

from machine import Pin, PWM
import time

class TONE:
    def __init__(self, pin):
        self._tone = PWM(Pin(pin), duty=512)
        self._tone.deinit()

    def on(self, hz):
        self._tone.init(hz)

    def off(self):
        self._tone.deinit()

snd=TONE('SND') # 圧電スピーカー
# snd=TONE(21) # 圧電スピーカー

sw1=Pin('SW1', Pin.IN)
sw2=Pin('SW2', Pin.IN)
# sw1=Pin(2, Pin.IN)
# sw2=Pin(3, Pin.IN)

while True:
    hz = 0
    if (sw1.value() == 0):
        hz += 440
    if (sw2.value() == 0):
        hz += 880
        
    if (hz == 0):
        snd.off()
    else:
        snd.on(hz)

    time.sleep_ms(100)

加速度センサー

OLEDディスプレイに3軸の加速度と、基板の傾きを表示するプログラム例です。

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
from kxtj3 import KXTJ3
import time
import math

i2c = I2C(0)
oled = SSD1306_I2C(128, 64, i2c)
acc = KXTJ3(i2c)

while True:
    oled.fill(0)
    vacc = acc.getXYZ()
    oled.text('X: {:.2f}'.format(vacc[0] / 16384), 0, 0, 1)
    oled.text('Y: {:.2f}'.format(vacc[1] / 16384), 0, 16, 1)
    oled.text('Z: {:.2f}'.format(vacc[2] / 16384), 0, 32, 1)
    t = math.degrees(math.atan2(-vacc[1], vacc[0]))
    oled.text('DEG: {:.1f}'.format(t), 0, 48, 1)
    oled.show()
    time.sleep_ms(100)

OLEDディスプレイに水平線を表示する(いわゆる水平儀)プログラム例です。

from machine import Pin, I2C
import time
from ssd1306 import SSD1306_I2C
from kxtj3 import KXTJ3
import math

i2c = I2C(0)
oled = SSD1306_I2C(128, 64, i2c)
acc = KXTJ3(i2c)

while True:
    oled.fill(0)
    vacc = acc.getXYZ()
    x = int(vacc[0] / 16384 * 40)
    y = int(vacc[1] / 16384 * 40)
    oled.line(64-x,32-y,64+x,32+y,1)
    oled.ellipse(64,32,40,40,1)
    t = math.degrees(math.atan2(-vacc[1], vacc[0]))
    oled.text('{:4.1f}'.format(t), 45, 36, 1)
    oled.show()
    time.sleep_ms(100)

WS2812カラーLED

3個のWS2812タイプのカラーLEDに赤、緑、青色を出力するプログラム例です。

各LEDの明るさは、0-255の範囲で指定できますが、LEDの点灯確認目的であれば、10程度の明るさ指定でも十分な明るさで発光します。

# Ws2812 カラーLEDの点灯
from neopixel import NeoPixel
from machine import Pin

rgb = NeoPixel(Pin('RGB', Pin.OUT), 3) # 3ピクセル用の NeoPixel ドライバーを'RGB'に設定
# rgb = NeoPixel(Pin(20, Pin.OUT), 3) # 3ピクセル用の NeoPixel ドライバーを21ピンに設定
rgb[0] = (10,0,0) # 赤
rgb[1] = (0,10,0) # 緑
rgb[2] = (0,0,10) # 青
rgb.write() # 全ピクセルにデータ書込み