前回、M5StackとDCモーターで2足歩行ロボット”スタックチャン”を作ってみました。↓
今回は前回の応用で、M5stickCを使った2足歩行ロボット、スタックチャンならぬ”スティックチャン”を作ってみましたので、ここでまとめておこうかと思います。
目次
はじめに
揺動スライダークランク機構
前回同様、この機構を使って動かします。
おおまかな構成と必要部材
必要部材
・M5StickC
・タミヤDCモーターギアボックス(ミニモーター低速ギアボックス4速)
・リポバッテリー(M5Stackから引っぺがしたやつを使いました)
・スティックチャン足&ケース(3Dプリンタで自作)
・DCモータードライバー
・軸となる鉄線
構成
M5StickC ⇒ DCモータードライバ ⇒ DCモーター
DCモータードライバの電源はリポから取ります。
動作の流れとしては、
同じLAN配下に子機のデバイスを配置、子機はUDPでサーバー側のM5stickCにデータを送信 ⇒ M5StickCは受信した値によってGPIOの出力を操作
としました。
余談
シャフトが長い。。
モーターのシャフトがM5StickCで使うには長すぎたので、コーナンで適度な長さに切り落としました。
当初機械でやってくれると思ってましたが、道具の貸し出しはやっているものの作業は個人でやってね的な感じだったので、機械を操作できない私は手動で切るという無謀な行動に打って出ました。30分くらいかかりましたが、無事切り落とす事ができました。
閑話休題
ケース&足作成
歩行テスト
電源直付けでテスト、なんとか動いております。
本体組立て
回路作成
前途した構成で、回路をつなげていきます。
組立て完了
つづいてプログラムです。
プログラム
コントローラー側(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 |
import network import time from socket import socket, AF_INET, SOCK_DGRAM from m5stack import * from m5ui import * from uiflow import * from m5stack import lcd 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) while True: if btnA.wasPressed(): # ボタンAが押されているか lcd.clear(lcd.BLACK) lcd.clear(lcd.BLUE) message = "forword" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) elif btnB.wasPressed(): # ボタンBが押されているか lcd.clear(backword) lcd.clear(lcd.RED) message = "B" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) elif btnC.wasPressed(): # ボタンCが押されているか lcd.clear(lcd.BLACK) lcd.clear(lcd.GREEN) message = "stop" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) s.close() |
今回、コントローラにはM5Stackを使用しました。
スティックチャン側(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 |
from socket import socket, AF_INET, SOCK_DGRAM import time import network from m5stack import * from m5stack import lcd from machine import Pin lcd.fill(0x000000) lcd.circle(20, 50, 2, fillcolor=0xffffff) lcd.circle(60, 50, 2, fillcolor=0xffffff) lcd.rect(20, 70, 40, 5, fillcolor=0xffffff) #lcd.line(20, 70, 60, 70, 0xffffff) HOST = "192.168.11.23" PORT = 5000 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)) p1 = Pin(26, Pin.OUT) p2 = Pin(0, Pin.OUT) while(True): msg, address = s.recvfrom(8192) #print(f"message: {msg}\nfrom: {address}") msg = msg.decode() print(msg) if msg == "forward": p1.value(1) p2.value(0) elif msg == "backward": p1.value(0) p2.value(1) elif msg == "stop": p1.value(0) p2.value(0) time.sleep(0.1) s.close() |
完成
よく見てみれば、動いています!(;^ω^)