編集履歴一覧に戻る
Ketunorobioのアイコン画像

Ketunorobio が 2022年07月29日22時45分43秒 に編集

初版

タイトルの変更

+

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

タグの変更

+

ESP32

+

ラジコン

+

ステアリング

+

M5Stack

+

Python

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

本文の変更

+

市販のバギー工作セットにESP32を載せて、ステアリングと前進後退の制御を出来るようにしてみます。 コントローラーはM5Stack core2のスライダーで行います。 ## 使う物 @[twitter](https://twitter.com/ketunorobio/status/1504741210287603712?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1504741210287603712%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fdenkenmusic.com%2Fesp32e381a7dce383a2e383bce382bfe383bce381a8e382b5e383bce3839ce383a2e383bce382bfe383bce38292pwme588b6e5bea1e38081e382b9e38386e382a2e383aa%2F) ・ESP32 ・M5Stack core2 ・DCモーター ・サーボモーター ・ブレッドボード、ジャンパーピン ・バッテリー ・タミヤバギーカークラシックセット ・ステアリング固定部品(3Dプリンターで印刷します) ## 構成 M5Stack ⇒ UDP ⇒ ESP32 ⇒ モーター制御 M5Stackのスライダーの情報をUDPでESP32に転送し、値に応じてESP32がモーターを制御します。左のスライダーでDCモーター、右のスライダーでサーボモーターを制御できるようにします。 市販のバギーセットを組立て後、ESP32を載せます。 ステアリングとサーボモーターの固定には別途部品が必要なので、3Dプリンター等で作成する必要があります。 今回は後述するPCN金沢さんのものを利用させていただきました。ありがとうございますm(__)m ## ステアリング @[twitter](https://twitter.com/ketunorobio/status/1504988667085049856?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1504988667085049856%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fdenkenmusic.com%2Fesp32e381a7dce383a2e383bce382bfe383bce381a8e382b5e383bce3839ce383a2e383bce382bfe383bce38292pwme588b6e5bea1e38081e382b9e38386e382a2e383aa%2F) PCN金沢さまのサイトにて以下のタイムリーな記事を見つけましたので参考にさせて頂きました。 [3Dプリンタで ステアリング操舵パーツを作ってみた](http://kanazawa.pcn.club/steeringparts/) 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ステアリング付ラジコン こんな感じで制御できています。↓ @[twitter](https://twitter.com/ketunorobio/status/1505722496246448131)