少し前に、タミヤのなんとかバギーのステアリングをサーボモータで制御し、ラジコン化しました。↓
今回はこの時の応用で、ミニ四駆にステアリングを付けてラジコン化してみようと思います。
ステアリングについては3Dプリンタで自作する手段もありましたが、面倒なのでネットで買いました。
ちょうど良さげなものがAliExpressで売っていましたので、それを使った作品になります。↓
ミニ四駆のラジコン化が比較的簡単に出来る内容となっていますので、参考にしていただければ幸いです。
準備するもの
・ミニ四駆
・ステアリング(サーボ付き)
・ESP32
・DCモータードライバ
・リポバッテリー(マイコンの電源)
・単三電池3本(モーターの電源)
見栄えは悪いが、上手く走る
組みあがったミニ四駆に、ステアリングを載せてみます。
見た目はあれですが、とりあえずネジ止めして走行させてみます。
なかなか良いです。
それでは、配線に取り掛かります。
配線
写真では分かりづらいですので、下記に詳細をまとめます。
サーボモータ — ESP32(リポ電源)– DCモータードライバ(単三電池×3電源)— DCモーター
単三電池が2本しか本体に入らないので、1つはケースにいれて外部に設置します。(回路は直列で)
組立て
突貫で作ったのでまあ汚い見栄えですが。。ちゃんとやれば配線は隠せますし、リポもワンサイズ小さいので行けるので後ろ辺りに隠せます。
つづいてプログラム。
今回はM5StickCのジョイコンHATからUDPでESP32を制御するようにしています。言語はmicropythonです。
プログラム
M5StickC
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 |
import network from socket import socket, AF_INET, SOCK_DGRAM from m5stack import * from m5ui import * from uiflow import * import hat import time setScreenColor(0x111111) wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print('connecting to network...') wlan.connect('SSID', 'PASS') while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) serv_address = ("esp32のip", ポート番号) s = socket(AF_INET, SOCK_DGRAM) hat_joyc0 = hat.get(hat.JOYC) while True: #y = hat_joyc0.GetX(0) x = hat_joyc0.GetY(0) y = hat_joyc0.GetX(1) #xx = hat_joyc0.GetY(1) #print(x) # x = str(x) y = str(y) print(x) print(y) message = "A" + x message2 = "B" + y s.sendto(message.encode("utf-8"), serv_address) s.sendto(message2.encode("utf-8"), serv_address) time.sleep(0.1) |
JOYC HATのプログラムについてはこちらでまとめています。↓
ESP32
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
from socket import socket, AF_INET, SOCK_DGRAM import time import network from machine import PWM, Pin import _thread #import socket #import usocket as socket HOST = "IP" PORT = ポート番号 wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print('connecting to network...') wlan.connect('SSID', 'PASS') while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) print('network config:', wlan.ifconfig()) #s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s = socket(AF_INET, SOCK_DGRAM) #s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT)) print("bind") #p1 = PWM(Pin(33)) #p2 = PWM(Pin(32)) #p1.freq(100) #p2.freq(100) frequency = 500 frequency2 = 50 p1 = PWM(Pin(0), frequency) p2 = PWM(Pin(2), frequency) servo1 = PWM(Pin(4), frequency2)#freq = 50) #max_duty = 1023 #p1.duty_u16(0) #p2.duty_u16(0) while(True): #msg, address = s.recvfrom(64) msg = s.recv(64) #print('received:',msg,'from',address) #msg = s.recv(128) #print(msg) msg = msg.decode() #print(msg) if "A" in msg: msgA = msg[1:] msgA = int(msgA) if msgA > 100: #time.sleep(0.01) msgA = (msgA - 100) * 10 p2.duty(0) p1.duty(msgA) print(msgA) #print(msgA) elif msgA < 100: #msgA = str(msgA) #msgA = msgA[1:] #msgA = int(msgA) #time.sleep(0.01) msgA = (msgA - 100) * 10 print(msgA) msgA = str(msgA) msgA = msgA[1:] msgA = int(msgA) p1.duty(0) p2.duty(msgA) else: #msgA == 0: p1.duty(0) p2.duty(0) #print(msgA) if "B" in msg: msgB = msg[1:] msgB = int(msgB) msgB = msgB - 23 if msgB < 77: msgB = int(77 - (msgB - 77) / 3) servo1.duty(msgB) print(msgB) elif msgB > 77: msgB = int(77 - (msgB - 77) / 3) servo1.duty(msgB) print(msgB) elif msgB == 77: servo1.duty(msgB) print(msgB) #msgB = int((msgB - 77) / 6 + 77) #print(msgB) #time.sleep(0.01) #print(msgB) time.sleep(0.01) #print("...") s.close() |
これで完成です。
完成
こんな感じで、主に電子工作をメインに活動していますので、よろしければブックマークと、Twitterのフォローしていただけると嬉しいです。m(__)m