2022年 SPRESENSE™ 活用コンテスト 」開催中!ローパワーでハイパフォーマンスなエッジコンピューティングを、あなたの手で活用してみませんか?

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

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のアイコン画像
ロビヲ@野江内代です。 ヘルニアで人生ハードモード☑️ 電子工作戦闘力3☑️ 普通の戦闘力1☑️ ブログとweb制作と電子工作しつつ四コマ漫画制作予定で人生のラビリンスに迷い込み中☑️ 都知事がストライクゾーン☑️ blogはコチラ⇒https://denkenmusic.com
ログインしてコメントを投稿する