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

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のアイコン画像
ロビヲ@野江内代です。
ログインしてコメントを投稿する