前回、ESP32でDCモーターとサーボモーターの制御を行いました。↓
今回は市販のバギー工作セットに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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
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() |
M5Stackからのスライダーの値が、サーボモーターの場合今回の機構だと反転(右にスライドで左に傾く)するので、それを逆にするために上記のような感じになっています。
それ以外はほぼ過去記事と同じなので説明は割愛します。
ESP32ステアリング付ラジコン
こんな感じで制御できています。↓
一連の記事随分と参考になりました。今までArudinoでC++で動かせていましたが、今回学習を兼ねてPYTHONを習得しています。今後のご活躍を期待しています。有難うございました。
天野さま
はじめして、管理人です。
そう言っていただけると本当に励みになります、こちらこそありがとうございます。m(__)m