先日ESP32を購入しまして、micropythonのファームウェアをインストールさせましたので、とりあえずLチカをさせてみました。ファームウェアのインストールについては前回の記事でまとめています。↓
普通にLチカさせるのもあれですので、ESP32の無線モジュールを使ってみました。今回はWIFIでM5Stackと接続させて、UDP通信でLEDを点灯させます。
※ESP32、M5Stackともにプログラムはmicropythonで書いています。
概要
M5StackでESP32を制御
M5Stackをコントローラーにして、ESP32に接続したLEDを点灯させます。
無線通信はWIFI接続のUDP通信とします。
構成
M5Stack(ボタンで値を送信) ⇒ UDP ⇒ ESP32(受信した値でPWM制御) ⇒ LED点灯、消灯
※M5StackとESP32は同じLAN配下に接続されていることが前提となります。
・M5stack
・ESP32
・LED、抵抗
プログラム
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 |
import network import time from socket import socket, AF_INET, SOCK_DGRAM from m5stack import * from m5ui import * from uiflow import * from m5stack import lcd posi = {"lx":90, "ly":90, "lr":10, "rx":230, "ry":90, "rr":10, "ux":110, "uy":170}<br>lcd.clear(lcd.BLACK)<br><br>lcd.circle(posi["lx"], posi["ly"], posi["lr"], lcd.WHITE, lcd.WHITE)<br>lcd.circle(posi["rx"], posi["ry"], posi["rr"], lcd.WHITE, lcd.WHITE)<br>lcd.rect(posi["ux"], posi["uy"], 100, 5, lcd.WHITE, lcd.WHITE) wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print('connecting to network...') wlan.connect('SSID', 'PASS') while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) serv_address = ("ESP32のIP", ポート番号) s = socket(AF_INET, SOCK_DGRAM) while True: if btnA.wasPressed(): # ボタンAが押されているか message = "A" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) elif btnB.wasPressed(): # ボタンBが押されているか message = "B" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) elif btnC.wasPressed(): # ボタンCが押されているか message = "C" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) s.close() |
無線LANに接続後、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 |
from socket import socket, AF_INET, SOCK_DGRAM import time import network HOST = "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)) p1 = Pin(32, Pin.OUT) p2 = Pin(33, Pin.OUT) while(True): msg, address = s.recvfrom(8192) #print(f"message: {msg}\nfrom: {address}") msg = msg.decode() print(msg) if msg == "A": p1.value(1) p2.value(0) elif msg == "B": p1.value(0) p2.value(1) elif msg == "C": p1.value(0) p2.value(0) time.sleep(0.1) s.close() |
WIFI接続後、サーバーのソケットを作成し、バインドさせます。
ループでサーバー宛てのソケットを受信し、データを取り出します。
取り出した値によって、GPIOの出力を制御させています。
完成
UDP通信でのLチカになります。↓
次回はM5Stack core2のスライダーを使ったPWM制御でLEDを点灯させてみようと思います。