ドライバ
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 ピンソケット | 開発ボード 端子 |
---|---|---|---|
1 | BRT (明るさセンサー) | CN2: 5 | D2 (A2) |
2 | SND (圧電スピーカー) | CN3: 6 | D21 (TXD) |
3 | GND | CN2: 1 | GND |
4 | 5V | CN2: 2 | 5V |
5 | SCL | CN2: 3 | SCL (D9) |
6 | SDA | CN2: 4 | SDA (D8) |
7 | 3V3 | - | |
8 | SW2 | CN3: 2 | D5 |
9 | SW1 | CN3: 3 | D6 |
10 | RGB (WS2812) | CN3: 5 | D20 |
11 | 3V3 | CN2: 6 | 3V3 |
12 | GND | CN3: 1 | GND |
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 端子 |
---|---|---|
1 | BRT (明るさセンサー) | GP28 |
2 | SND (圧電スピーカー) | GP15 |
3 | GND | GND |
4 | 5V | 5V |
5 | SCL | GP13 |
6 | SDA | GP12 |
7 | 3V3 | 3.3V |
8 | SW2 | GP11 |
9 | SW1 | GP10 |
10 | RGB (WS2812) | GP9 |
11 | 3V3 | |
12 | GND |
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() # 全ピクセルにデータ書込み