M5stackで初めに2足歩行ロボ(手乗りサイズ)を作ったのは、恐らく@PONDA_makeさんで、いわば#スタックチャンの始祖的存在であります。エルチカのサイトに作品が掲載されているので是非見てみて下さい。あの小さいボディにサーボを4つ埋め込んでて手も動くと、、足合わせて6個、もう凄いとしか言いようがありません(;^ω^)真似できない。。まさに理想のM5stack手乗りロボット。いわばM5wakemanを数年前から個人で開発していたようなものです。。
続いて、これを世間一般に広めてメジャーな感じにさせたのが@meganetaaanししかわさんです。#スタックチャンの生みの親ですね。これもすごくかわいくて良いですよね。
で、#スタックチャンをまた歩かせたのが@KantenNamakoさん!これがまた目からウロコのオリジナル機構を自作なさったようで、もう凄いとしか言いようがないです。。歩く=最低でもサーボ4つの概念をぶっつぶした方です。
ということで、私もこの界隈に足を踏み込んで、少しでも自分らしい要素を取りいれた作品が出来れば、、と思い、初スタックチャンに挑戦してみました。
ご紹介させて頂いた偉人様には到底およびませんが、一応オリジナルなやつが出来ましたので、ここでご紹介させていただこうかと思います。
目次
はじめに
ゼンマイ仕掛けの歩くおもちゃ
家にある↑のようなゼンマイのおもちゃを見て、仕組みが気になりました。
調べてみると、揺動スライダークランク機構(めちゃかっこいい。。)っていうらしいです。
分解してみます。
揺動スライダークランク機構
ギアが回り出すと右側の白い円柱が回転します。円柱には端にシャフトがついているので、シャフトを軸とした半径の大きさで円を描くように動きます。
左にも細い鉄線が軸としてあり、縦長の穴に通すことでx軸には動かないようになっています。
語彙があれですが(-_-;)つまりは動画のような動きになります!裏側にある円柱の向きを180度変えれば、歩くようなモーションを再現できるんですね~。こういうのを見ると、ほんと感動しますよね。
ちなみに、ゼンマイ自体の仕組みも知りたかったのでこれ以上も分解を試みましたが、開けた瞬間爆発するように小さな部品たちがどっかへ飛んでいきましたので、以下略。。
とにかく、この仕組みが使えそうでしたので、これをスタックチャンに応用すことにしました。
おおまかな構成と必要部材
必要部材
・M5Stack
・タミヤDCモーターギアボックス(↑の小さいやつ)
・リポバッテリー
・スタックチャン足&ケース(3Dプリンタで自作)
・DCモータードライバー
・軸となる鉄線
M5stack付属のバッテリは容量が小さいので、交換します。
構成
M5Stack ⇒ DCモータードライバ ⇒ DCモーター
M5StackとDCモータードライバの電源はリポ1つでまかなっています。
動作の流れとしては、
同じLAN配下に子機のデバイスを配置、子機はUDPでサーバー側のM5stackにデータを送信 ⇒ M5Stackは受信した値によってGPIOの出力を操作
としました。
余談
寝違えスタックチャン
閑話休題
ケース&足作成
歩行テスト
電源直付けでテスト、なんとか動いております。
本体組立て
回路作成
前途した構成で、回路をつなげていきます。
組立て完了
つづいてプログラムです。
プログラム
コントローラー側(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 48 |
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() |
完成
遅い、、けど、目を凝らしてください、動いています!(;^ω^)
以上です、ありがとうございました。