前回、M5StackからUDP通信でESP32のLチカをやってみました。↓
今回はM5Stackからスライダーを使い、その値をESP32へ渡してLEDをPWM制御したいと思います。
スライダーの機能はM5Stack core2ならUiFlowで超絶簡単に実装できるので、今回はcore2を使用しました。
他は前回と同じような構成です。プログラムはどちらのデバイスもmicropythonで記述しています。
目次
初めに
使うもの
・M5Stack core2
・ESP32
・ブレッドボード
・LED2個、抵抗
・ジャンピングワイヤー
構成
M5Stack core2(スライダーを2つ実装) ⇒ UDP ⇒ ESP32(受け取った値でLEDをPWM制御)
サーバー側にESP32を配置し、クライアント側のM5Stackからスライダーの値をUDPでESP32に送り続けます。
ESP32は受け取った値をもとに、2つのLEDをPWM制御します。
スライダーについて
M5Stack core2 Uiflow
core2ではuiflowでスライダーが簡単に実装できます。
左は端にスライダーのアイコンがあるので、ドラッグアンドドロップでM5Stacの画面内にもってくるとmicropythonに記述が反映されます。
基本、スライダーの実装だけならこれでOKです。
後は後述しますが、このインスタンスからvalueで値を読み出したりすることができます。
プログラム
M5Stack側(micropython)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
from m5stack_ui import * from socket import socket, AF_INET, SOCK_DGRAM import time import network from m5stack import * from machine import Pin from uiflow import * screen = M5Screen() screen.clean_screen() screen.set_screen_bg_color(0xFFFFFF) dstip = "サーバーアドレス" dstport = ポート番号 wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print('connecting to network...') wlan.connect('Buffalo-G-29CE', 'AKANE0918') while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) s = socket(AF_INET, SOCK_DGRAM) Slider = M5Slider(50,50,12,150,0,100,0x888888,0x000fff) Slider2 = M5Slider(150,111,150,12,0,100,0x888888,0x000fff) Slider.set_bg_color(0x888888) Slider2.set_bg_color(0x888888) Slider.set_color(0x000fff) Slider2.set_color(0x000fff) Slider.set_range(0,1023) Slider2.set_range(0,1023) Slider.set_value(0) Slider2.set_value(0) while(True): data = str(Slider.get_value()) data = "A" + data print(data) s.sendto(data, (dstip, dstport)) data2 = str(Slider2.get_value()) data2 = "B" + data2 print(data2) s.sendto(data2, (dstip, dstport)) time.sleep(0.1) |
WIFI接続後、サーバー宛て(ESP32)のソケットを作成します。
スライダーの記述ですが、set_rangeの引数に任意の最小~最大値を入れる事でスライダーの位置に応じた値を決めることが出来ます。ちなみに今回はデューティーサイクルの最小と最大値をそのまま入れています。
set_valueは、スライダーの初期位置です。
ループ処理では、サーバーにスライダーの位置情報(値)を随時転送しています。
転送するデータの先頭に”A”もしくは”B”を付けているのは、ESP32で受信した際に、どちらのスライダーからの情報かを判断させるための強引な手法です(-_-;)。。(多分もっとスマートなやりかたはあるはず。。)
ESP32側(micropython)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
from socket import socket, AF_INET, SOCK_DGRAM import time import network from machine import PWM, Pin HOST = "ESP32のIP" PORT = ポート番号 wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print('connecting to network...') wlan.connect('Buffalo-G-29CE', 'AKANE0918') while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) s = socket(AF_INET, SOCK_DGRAM) s.bind((HOST, PORT)) print("bind") frequency = 5000 p1 = PWM(Pin(32), frequency) p2 = PWM(Pin(33), frequency) while(True): msg = s.recv(64) msg = msg.decode() if "A" in msg: msgA = msg[1:] msgA = int(msgA) p1.duty(msgA) print(msgA) elif "B" in msg: msgB = msg[1:] msgB = int(msgB) p2.duty(msgB) print(msgB) time.sleep(0.1) s.close() |
WIFI接続後、サーバーのソケットを作成。バインドさせます。
PWMのインスタンスを作成、周波数は5KHzとします。
ループ内ではクライアントからのソケットのvalueを受信し、データの中に”A”があればp1、”B”があればp2のpwmを実行するようにしています。
dutyの引数には0~1023が直接入るので、スライダーの位置に応じたLEDの発光を再現できます。
完成
こんな感じになります。↓
ゆくゆくはこれを応用してラジコンを作成したいので、次回は左側のスライダーでDCモーターのPWM制御をやってみたいと思います。