Ketunorobio が 2022年07月28日00時16分40秒 に編集
初版
タイトルの変更
M5StackとDCモーターで二足歩行ロボット、スタックチャンを作ってみる
タグの変更
M5Stack
ロボット
DCモーター
Python
揺動スライダークランク機構
メイン画像の変更
記事種類の変更
製作品
本文の変更
家にある↓のようなゼンマイのおもちゃを見て、仕組みが気になりました。 @[twitter](https://twitter.com/ketunorobio/status/1488838418754785283?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1488838418754785283%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fdenkenmusic.com%2Fm5stacke381a8dce383a2e383bce382bfe383bce381a7e4ba8ce8b6b3e6ada9e8a18ce383ade3839ce38383e38388e38081e382b9e382bfe38383e382afe38381e383a3%2F) 調べてみると、揺動スライダークランク機構(めちゃかっこいい。。)っていうらしいです。 分解してみます。 # 揺動スライダークランク機構 ![キャプションを入力できます](https://camo.elchika.com/2d56818afe29f270b24726a5aebac23dc0b382ec/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34653664313436612d363231302d343032322d393337642d3336306465323666623861662f39636439663034322d643336622d346434302d626336612d636332643934396232396531/) ギアが回り出すと右側の白い円柱が回転します。円柱には端にシャフトがついているので、シャフトを軸とした半径の大きさで円を描くように動きます。 左にも細い鉄線が軸としてあり、縦長の穴に通すことでx軸には動かないようになっています。 写真なので分かりずらいですが(-_-; とにかくこういうのを見ると、ほんと感動しますよね。 ちなみに、ゼンマイ自体の仕組みも知りたかったのでこれ以上も分解を試みましたが、開けた瞬間爆発するように小さな部品たちがどっかへ飛んでいきましたので、以下略。。 とにかく、この仕組みが使えそうでしたので、これをスタックチャンに応用すことにしました。 # 必要部材 @[twitter](https://twitter.com/ketunorobio/status/1489790838259343362?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1489790838259343362%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fdenkenmusic.com%2Fm5stacke381a8dce383a2e383bce382bfe383bce381a7e4ba8ce8b6b3e6ada9e8a18ce383ade3839ce38383e38388e38081e382b9e382bfe38383e382afe38381e383a3%2F) ・M5Stack ・タミヤDCモーターギアボックス(↑の小さいやつ) ・リポバッテリー ・スタックチャン足&ケース(3Dプリンタで自作) ・DCモータードライバー ・軸となる鉄線 M5stack付属のバッテリは容量が小さいので、交換します。 # 構成 M5Stack ⇒ DCモータードライバ ⇒ DCモーター M5StackとDCモータードライバの電源はリポ1つでまかなっています。 動作の流れとしては、 同じLAN配下に子機のデバイスを配置、子機はUDPでサーバー側のM5stackにデータを送信 ⇒ M5Stackは受信した値によってGPIOの出力を操作 としました。 # 寝違えスタックチャン @[twitter](https://twitter.com/ketunorobio/status/1490199781158752256?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1490199781158752256%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fdenkenmusic.com%2Fm5stacke381a8dce383a2e383bce382bfe383bce381a7e4ba8ce8b6b3e6ada9e8a18ce383ade3839ce38383e38388e38081e382b9e382bfe38383e382afe38381e383a3%2Fhttps://twitter.com/ketunorobio/status/1490258864423391232?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1490258864423391232%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fdenkenmusic.com%2Fm5stacke381a8dce383a2e383bce382bfe383bce381a7e4ba8ce8b6b3e6ada9e8a18ce383ade3839ce38383e38388e38081e382b9e382bfe38383e382afe38381e383a3%2F) # 閑話休題 @[twitter](https://twitter.com/ketunorobio/status/1490529968744402945?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1490529968744402945%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fdenkenmusic.com%2Fm5stacke381a8dce383a2e383bce382bfe383bce381a7e4ba8ce8b6b3e6ada9e8a18ce383ade3839ce38383e38388e38081e382b9e382bfe38383e382afe38381e383a3%2F) @[twitter](https://twitter.com/ketunorobio/status/1490534538803494912) 電源直付けでテスト、なんとか動いております。 # 回路作成 @[twitter](https://twitter.com/ketunorobio/status/1490635299084406789?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1490635299084406789%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fdenkenmusic.com%2Fm5stacke381a8dce383a2e383bce382bfe383bce381a7e4ba8ce8b6b3e6ada9e8a18ce383ade3839ce38383e38388e38081e382b9e382bfe38383e382afe38381e383a3%2F) 前途した構成で、回路をつなげていきます。 # 組立て完了 ![キャプションを入力できます](https://camo.elchika.com/bc41850e9c7cc66a17715bbd854bdfea4828844c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34653664313436612d363231302d343032322d393337642d3336306465323666623861662f64633038346539662d653338322d343937302d386363622d333830393534653661356164/) つづいてプログラムです。 # コントローラー側(micropython) ``` 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) ``` from socket import socket, AF_INET, SOCK_DGRAM import time import network from m5stack import * from m5stack import lcd from machine import Pin posi = {"lx":90, "ly":90, "lr":10, "rx":230, "ry":90, "rr":10, "ux":110, "uy":170} lcd.clear(lcd.BLACK) lcd.circle(posi["lx"], posi["ly"], posi["lr"], lcd.WHITE, lcd.WHITE) lcd.circle(posi["rx"], posi["ry"], posi["rr"], lcd.WHITE, lcd.WHITE) lcd.rect(posi["ux"], posi["uy"], 100, 5, lcd.WHITE, lcd.WHITE) 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()) s = socket(AF_INET, SOCK_DGRAM) s.bind((HOST, PORT)) p1 = Pin(2, Pin.OUT) p2 = Pin(5, 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() ``` # 完成! @[twitter](https://twitter.com/ketunorobio/status/1490878696017649664) 遅い、、けど、目を凝らしてください、動いています! 以上です、ありがとうございました。 最後に、兄弟のスティックチャンものせておきます。 @[twitter](https://twitter.com/ketunorobio/status/1494513896119357440)