Ketunorobioのアイコン画像
Ketunorobio 2022年07月28日作成 (2022年07月28日更新)
製作品 製作品 閲覧数 1467
Ketunorobio 2022年07月28日作成 (2022年07月28日更新) 製作品 製作品 閲覧数 1467

M5StackとDCモーターで二足歩行ロボット、スタックチャンを作ってみる

M5StackとDCモーターで二足歩行ロボット、スタックチャンを作ってみる

家にある↓のようなゼンマイのおもちゃを見て、仕組みが気になりました。

調べてみると、揺動スライダークランク機構(めちゃかっこいい。。)っていうらしいです。

分解してみます。

揺動スライダークランク機構

キャプションを入力できます

ギアが回り出すと右側の白い円柱が回転します。円柱には端にシャフトがついているので、シャフトを軸とした半径の大きさで円を描くように動きます。

左にも細い鉄線が軸としてあり、縦長の穴に通すことでx軸には動かないようになっています。

写真なので分かりずらいですが(-_-;

とにかくこういうのを見ると、ほんと感動しますよね。

ちなみに、ゼンマイ自体の仕組みも知りたかったのでこれ以上も分解を試みましたが、開けた瞬間爆発するように小さな部品たちがどっかへ飛んでいきましたので、以下略。。

とにかく、この仕組みが使えそうでしたので、これをスタックチャンに応用すことにしました。

必要部材

・M5Stack

・タミヤDCモーターギアボックス(↑の小さいやつ)

・リポバッテリー

・スタックチャン足&ケース(3Dプリンタで自作)

・DCモータードライバー

・軸となる鉄線

M5stack付属のバッテリは容量が小さいので、交換します。

構成

M5Stack ⇒ DCモータードライバ ⇒ DCモーター

M5StackとDCモータードライバの電源はリポ1つでまかなっています。

動作の流れとしては、

同じLAN配下に子機のデバイスを配置、子機はUDPでサーバー側のM5stackにデータを送信 ⇒ M5Stackは受信した値によってGPIOの出力を操作

としました。

寝違えスタックチャン

閑話休題

電源直付けでテスト、なんとか動いております。

回路作成

前途した構成で、回路をつなげていきます。

組立て完了

キャプションを入力できます

つづいてプログラムです。

コントローラー側(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()

完成!

遅い、、けど、目を凝らしてください、動いています!

以上です、ありがとうございました。

最後に、兄弟のスティックチャンものせておきます。

1
Ketunorobioのアイコン画像
ロビヲ@野江内代です。
ログインしてコメントを投稿する