前回、M5StackのスライダーでESP32のDCモーターをPWM制御させてみました。↓
今回は、DCモーター+サーボモーターを制御させてみます。
M5Stackに2つスライダーを用意しているので、左側の縦向きのスライダーをDCモーター、右側の横向きのスライダーをサーボモーターの制御として使用します。
初めに
概要
UDP通信でM5Stackのスライダーの値をESP32に転送し、ESP32は受信した値に応じて各モーターを制御します。
M5Stack ⇒ UDP ⇒ ESP32 ⇒ モーター
左側のスライダーは前回と同様DCモーターの制御、上にスライドで正転、下にスライドで後転、真ん中辺りで停止とします。
右側のスライダーはサーボモーターの制御で、左いっぱいが0度、中央が90度、右いっぱいを180度とします。
構成
・ESP32
・M5Stack core2
・DCモーター
・DCモータードライバ
・サーボモーター
・ブレッドボード、ジャンピングワイヤ
プログラム
クライアント側、M5Stack core2(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 = "サーバーIP" dstport = ポート番号 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()) 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(-1023,1023) Slider2.set_range(40,115) Slider.set_value(0) Slider2.set_value(75) 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.01) |
前半は過去記事で解説しているので割愛します。
Slider2のレンジを40~115としているのは、ホビー用サーボモータは、約 40〜115 のデューティを必要とし、77 を中心値としている為です。(0度~90度~180度に近い動きとなります。)
メインループでDCモーターとサーボモーターのスライダーの値を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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
from socket import socket, AF_INET, SOCK_DGRAM import time import network from machine import PWM, Pin 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)) print("bind") freque frequency = 5000 frequency2 = 50 p1 = PWM(Pin(32), frequency) p2 = PWM(Pin(33), frequency) servo1 = PWM(Pin(25), frequency2) while(True): msg = s.recv(64) msg = msg.decode() if "A" in msg: msgA = msg[1:] msgA = int(msgA) if msgA > 100: p2.duty(0) p1.duty(msgA) print(msgA) elif msgA < -100: msgA = str(msgA) msgA = msgA[1:] msgA = int(msgA) p1.duty(0) p2.duty(msgA) print(msgA) else: p1.duty(0) p2.duty(0) print(msgA) elif "B" in msg: msgB = msg[1:] msgB = int(msgB) servo1.duty(msgB) print(msgB) time.sleep(0.01) s.close() |
PWM制御のため、DCモーターには5KHz、サーボモーターには50Hzを定義しています。
ループ内では随時M5Stackからスライダーの値を受信し、DCモーターとサーボモーターの制御を行っています。
完成
2つのモーターを制御できています。↓
次回はステアリング付のラジコンキットを改造し、ESP32を載せてM5Stackのスライダーで操作できるラジコンを完成させたいと思います。