当初はESP32ベースのマイコンを使ってラジコンを作り、それをドリフト仕様にしたものをブログでまとめようと思っていたのですが、結局上手くいかず断念しちゃいました。。
しかしせっかくですので、その過程で出来たM5StickCの三輪車ラジコンについて、今回は作成方法などをまとめる事にします。
簡単に出来るので、是非参考にして下さい。
概要
マイコンボードにはM5StickCを使用し、タミヤのモーターギアボックス、及び前輪を左右に切るためのサーボモータを制御させます。
リモコンは同じくM5StickCを使ったJoyCのアナログコントローラーを使用し、UDPにて無線操作します。
M5StickC ⇒ DCモータードライバ ⇒ モーターギアボックス
M5StickC ⇒ サーボモータ
DCモータードライバの電源は専用でLIPOバッテリをつなげます。
作成手順
3Dプリンタで車体を印刷
ギアボックスやマイコンが良い感じで収まるように車体をスケッチし、3Dプリンタで印刷します。
もし当記事の車体のSTLデータが欲しい方がいましたら、一報いただけると幸いです。
組立て
各部品を車体に取り付けます。
上のツイートでは後輪を浮かしてドリフトに挑戦していた頃のものですので、後ろ側にもサーボが付いてますが今回は使用しません。
プログラム
車側(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 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 104 |
from socket import socket, AF_INET, SOCK_DGRAM import time import network from machine import PWM, Pin import _thread from servo import Servo #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) p1 = PWM(Pin(25))#, frequency) p2 = PWM(Pin(26))# frequency) #servo1 = PWM(Pin(0)), frequency2)#freq = 50) servo0 = Servo(0,50,500,2500,180) #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 > 110: #time.sleep(0.01) msgA = (msgA - 100) p2.duty(0) p1.duty(100) print(msgA) #print(msgA) elif msgA < 90: #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(100) else: #msgA == 0: p1.duty(0) p2.duty(0) #print(msgA) if "B" in msg: msgB = msg[1:] msgB = int(msgB) msgB = msgB - 20 print(msgB) if msgB < 80: msgB = 80 - (msgB - 80) * -1 / 3 servo0.write_angle(msgB) #servo1.duty(msgB) print(msgB) elif msgB > 80: msgB = 80 + (msgB - 80) / 3 servo0.write_angle(msgB) print(msgB) else:# msgB == 77: servo0.write_angle(80) print(msgB) #msgB = int((msgB - 77) / 6 + 77) #print(msgB) #time.sleep(0.01) #print(msgB) time.sleep(0.01) #print("...") s.close() |
今回、モーターの回転にPWM制御は使用していません。
アナログコントローラーから送られてくる値によってDCモーターの正転、後転、サーボの制御を行っています。
アナログコントローラー側(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 |
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 = ("車の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) |
左右のスティックの識別のために、アナログ値+文字をくっつけてUDP送信しています。
右がサーボの制御、左が前進、後退になります。
完成
この他、2足歩行ロボットなども作ってますので、良ければご覧になって行ってください。