このページの目次
プログラミング環境の整備
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ディスプレイ、温度・湿度センサー、加速度センサー |
X1 | D21 | 圧電スピーカー |
Q2 | D1(ADC) | 明るさセンサー(フォトトランジスタ)、アナログ値 |
CN2 | D20 | 人感センサー |
CN3 | D7 | RCサーボ |
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() # 全ピクセルにデータ書込み