ドライバ

SENSOR-PLUSを利用するためには、以下の3つのドライバを導入する必要があります。

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

OLEDディスプレイssd1306のドライバは、ESP8266はMicroPythonのファームウェアに最初から組み込まれています。それ以外のMCUは以下のページを参考にして導入してください。

温度・湿度センサーAHT21のドライバは、以下のページを参考にして導入してください。

加速度センサーKXTJ3-1057のドライバは、以下のページから取得して、開発ボードに登録してください。


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

この章では、SENSOR-PLUSをESP32-C3M-SLIMに接続して使用する例を示しています。ただし、ここで示しているプログラム例は、ESP32-C3固有の機能を使用していないので、ESP32/ESP32-S3を使用している開発ボードでも、SENSOR-PLUSに接続する端子の接続に注意すれば、同様に使用することができます。

端子の割り当て

ESP32-C3M-SLIMとSENSOR-PLUSの接続は、ESP32-C3M-SLIMのCN2,CN3端子にピンソケットを取り付け、そのピンソケットとSENSOR-PLUSのCN1のピンソケット間でジャンパー線で接続しています。

SENSOR-PLUS
ピンソケット
機能ESP32-C3M-SLIM
ピンソケット
開発ボード
端子
1BRT (明るさセンサー)CN2: 5D2 (A2)
2SND (圧電スピーカー)CN3: 6D21 (TXD)
3GNDCN2: 1GND
45VCN2: 25V
5SCLCN2: 3SCL (D9)
6SDACN2: 4SDA (D8)
73V3
8SW2CN3: 2D5
9SW1CN3: 3D6
10RGB (WS2812)CN3: 5D20
113V3CN2: 63V3
12GNDCN3: 1GND
ESP32-C3M-SLIMとの接続例

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

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

from machine import Pin, I2C
import ssd1306

i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=400000) # ESP32-S3, ESP32-C3
# i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000) # ESP32
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

oled.text('- SENSOR-PLUS -', 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ディスプレイにグラフィックス表示するプログラム例です。

ESP32-C3では、なぜだかわかりませんがellipse()メソッドが実装されていません。

from machine import Pin, I2C
import ssd1306
import time

i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=400000) # ESP32-S3, ESP32-C3
# i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000) # ESP32
oled = ssd1306.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()

# ESP32-C3ではこれ以降を削除
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
import ssd1306
import ahtx0

i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=400000) # ESP32-S3, ESP32-C3
# i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000) # ESP32
oled = ssd1306.SSD1306_I2C(128, 64, i2c) # OLEDディスプレイ
aht21 = ahtx0.AHT20(i2c) # 温度・湿度センサー
brt = ADC(Pin(2)) # 明るさセンサー

while True:
    oled.fill(0)
    oled.text("TEMP: " + str(round(aht21.temperature,1)),0,0,1)
    oled.text("HUM: " + str(round(aht21.relative_humidity,1)),0,16,1)
    oled.text("BRT: " + str(round(brt.read_u16()/65535,3)),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))
        self._tone.deinit()

    def on(self, hz):
        self._tone.freq(hz)
        self._tone.duty_u16(32768)

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

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

sw1=Pin(6, Pin.IN)
sw2=Pin(5, 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
import time
import ssd1306
import kxtj3
import math

i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=400000) # ESP32-S3, ESP32-C3
# i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000) # ESP32
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
acc = kxtj3.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)

# CTRL-Cで終了

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

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

i2c = I2C(0, scl=Pin(13), sda=Pin(12), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
acc = kxtj3.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) # ESP-C3では当面この行を削除
    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(20, Pin.OUT), 3) # 3ピクセル用の NeoPixel ドライバーを21ピンに設定
rgb[0] = (10,0,0) # 赤
rgb[1] = (0,10,0) # 緑
rgb[2] = (0,0,10) # 青
rgb.write() # 全ピクセルにデータ書込み

Raspberry Pi Pico/RP2040-Zeroでのプログラム例

この章では、SENSOR-PLUSをRP2040-Zeroに接続して使用する例を示しています。ただし、ここで示しているプログラム例は、Raspberry Pi Picoでも、SENSOR-PLUSに接続する端子を合わせれば、同様に使用することができます。

端子の割り当て

RP2040-ZeroとSENSOR-PLUSの接続は、本来はブレッドボードなどを介して接続すべきでしょうが、ここではRP2040-Zeroの端子にピンヘッダーを取り付け、そのピンヘッダーとSENSOR-PLUSのCN1のピンソケット間でジャンパー線で接続しています。

SENSOR-PLUS
ピンソケット
機能RP2040-Zero
端子
1BRT (明るさセンサー)GP28
2SND (圧電スピーカー)GP15
3GNDGND
45V5V
5SCLGP13
6SDAGP12
73V33.3V
8SW2GP11
9SW1GP10
10RGB (WS2812)GP9
113V3
12GND
RP2040-Zeroとの接続例

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

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

from machine import Pin, I2C
import ssd1306

i2c = I2C(0, scl=Pin(13), sda=Pin(12), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

oled.text('- SENSOR-PLUS -', 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
import ssd1306
import time

i2c = I2C(0, scl=Pin(13), sda=Pin(12), freq=400000)
oled = ssd1306.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
import ssd1306
import ahtx0

i2c = I2C(0, scl=Pin(13), sda=Pin(12), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c) # OLEDディスプレイ
aht21 = ahtx0.AHT20(i2c) # 温度・湿度センサー
brt = ADC(28) # 明るさセンサー

while True:
    oled.fill(0)
    oled.text("TEMP: " + str(round(aht21.temperature,1)),0,0,1)
    oled.text("HUM: " + str(round(aht21.relative_humidity,1)),0,16,1)
    oled.text("BRT: " + str(round(brt.read_u16()/65535,3)),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))
        self._tone.deinit()

    def on(self, hz):
        self._tone.freq(hz)
        self._tone.duty_u16(32768)

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

snd=TONE(15) # 圧電スピーカー

sw1=Pin(10, Pin.IN)
sw2=Pin(11, 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
import time
import ssd1306
import kxtj3
import math

i2c = I2C(0, scl=Pin(13), sda=Pin(12), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
acc = kxtj3.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)

# CTRL-Cで終了

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

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

i2c = I2C(0, scl=Pin(13), sda=Pin(12), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
acc = kxtj3.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(9, Pin.OUT), 3) # 3ピクセル用の NeoPixel ドライバーを9ピンに設定
rgb[0] = (10,0,0) # 赤
rgb[1] = (0,10,0) # 緑
rgb[2] = (0,0,10) # 青
rgb.write() # 全ピクセルにデータ書込み