Ketunorobioのアイコン画像
Ketunorobio 2022年07月29日作成
製作品 製作品 閲覧数 4242
Ketunorobio 2022年07月29日作成 製作品 製作品 閲覧数 4242

ESP32でDCモーターとサーボモーターをPWM制御、ステアリング付ラジコンの作成

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金沢さまのサイトにて以下のタイムリーな記事を見つけましたので参考にさせて頂きました。

3Dプリンタで ステアリング操舵パーツを作ってみた

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ステアリング付ラジコン

こんな感じで制御できています。↓

1
Ketunorobioのアイコン画像
ロビヲ@野江内代です。
ログインしてコメントを投稿する