ESP32でDCモーターとサーボモーターをPWM制御、ステアリング付ラジコンの作成
市販のバギー工作セットにESP32を載せて、ステアリングと前進後退の制御を出来るようにしてみます。
コントローラーはM5Stack core2のスライダーで行います。
使う物
・ESP32
・M5Stack core2
・DCモーター
・サーボモーター
・ブレッドボード、ジャンパーピン
・バッテリー
・タミヤバギーカークラシックセット
・ステアリング固定部品(3Dプリンターで印刷します)
構成
M5Stack ⇒ UDP ⇒ ESP32 ⇒ モーター制御
M5Stackのスライダーの情報をUDPでESP32に転送し、値に応じてESP32がモーターを制御します。左のスライダーでDCモーター、右のスライダーでサーボモーターを制御できるようにします。
市販のバギーセットを組立て後、ESP32を載せます。
ステアリングとサーボモーターの固定には別途部品が必要なので、3Dプリンター等で作成する必要があります。
今回は後述するPCN金沢さんのものを利用させていただきました。ありがとうございますm(__)m
ステアリング
PCN金沢さまのサイトにて以下のタイムリーな記事を見つけましたので参考にさせて頂きました。
STLデータを公開して下さっていて、ご自由にお使い下さいとのこと。。神です。
PCN金沢さま、ありがとうございますm(__)m
少し改造しましたが、基本的にPCN金沢さまのデータで固定が可能です。素晴らしい。
プログラム
M5Stack core2(micropython)
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 = "ESP32のIP"
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(-700,700)
Slider2.set_range(67,93)
Slider.set_value(0)
Slider2.set_value(80)
while(True):
data = str(Slider.get_value())
data = "A" + data
print(data)
s.sendto(data, (dstip, dstport))
#print(Slider2.get_value())
data2 = str(Slider2.get_value())
data2 = "B" + data2
print(data2)
s.sendto(data2, (dstip, dstport))
time.sleep(0.01)
バギーカーのギア比だとスピードが出過ぎたので、DCモーターのデューティー比となるスライダーの値を700に下げています。
ステアリングの角度は曲げすぎると本体に当たってしまうので、通常40〜115(0~180度)のデューティー比ところを67~93に狭めています。
この辺りは良い塩梅で調整していただければと思います。
ESP32(micropython)
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
frequency2 = 50
p1 = PWM(Pin(32), frequency)
p2 = PWM(Pin(26), 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:
#time.sleep(0.01)
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:
#msgA == 0:
p1.duty(0)
p2.duty(0)
print(msgA)
elif "B" in msg:
msgB = msg[1:]
msgB = int(msgB)
if msgB > 80:
msgB = 80 - (msgB - 80)
servo1.duty(msgB)
print(msgB)
elif msgB < 80:
msgB = 80 + (80 - msgB)
servo1.duty(msgB)
print(msgB)
elif msgB == 80:
servo1.duty(msgB)
print(msgB)
time.sleep(0.01)
#print("...")
s.close()ay(1000);
}
M5Stackからのスライダーの値が、サーボモーターの場合今回の機構だと反転(右にスライドで左に傾く)するので、それを逆にするために上記のような感じになっています。
ESP32ステアリング付ラジコン
こんな感じで制御できています。↓
投稿者の人気記事
-
Ketunorobio
さんが
2022/07/29
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する