工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

段ボール製ロボットアームを自作しよう – Arduinoとサーボで簡単記録・再生

必要な部品と材料

必要な工具

使用するアプリとオンラインサービス

プロジェクト概要

このロボットアームは、位置を記録し再生する機能を備えています。段ボールとホットグルーといった身近な材料で作れるため、誰でも簡単に組み立てられます。

操作はPCのグラフィカルインターフェースから行います。各サーボをスライダーで制御し、位置を記録・再生するボタンを用意。記録データはファイルとして保存・読み込みも可能です。

作り方

  1. ページ下部「カスタムパーツ」のテンプレートをダウンロード・印刷し、段ボールを切り出します。
  2. 動画 (0:22〜) を参考にアームを組み立てます。
  3. 回路図に従って配線します。
  4. 「Robot Arm Arduino Code」をダウンロードし、Arduinoに書き込みます。
  5. 「Python User Interface」をダウンロードし、Python (https://www.python.org/) と PySerial (pip install pyserial) をインストールして実行します。
  6. Arduinoを接続し、Pythonスクリプトを起動。デバイスマネージャーで確認したCOMポートを入力すれば操作可能です。

ヒント: 動作が不安定な場合、Pythonコード20行目の time.sleep(0.15) を 0.2〜0.3 に増やしてみてください。

コード

Python ユーザーインターフェース

from tkinter import *
from tkinter import filedialog
import serial
import time

port_opened = False

def set_port():
    global port_opened, arduino
    com_port = port_input.get()
    arduino = serial.Serial(com_port, 9600)
    port_opened = True
    print("COM port set to: " + com_port)

def send_positions(position):
    message = "{0:0=3d}".format(position[0]) + \
              "{0:0=3d}".format(position[1]) + \
              "{0:0=3d}".format(position[2]) + \
              "{0:0=3d}".format(position[3]) + \
              "{0:0=3d}".format(position[4]) + "\n"
    arduino.write(str.encode(message))
    print(message, end='')
    time.sleep(0.2)

saved_positions = []

def save_positions():
    saved_positions.append([servo1_slider.get(), servo2_slider.get(),
                            servo3_slider.get(), servo4_slider.get(),
                            servo5_slider.get()])
    print("saved positions: " + str(saved_positions))

def play_positions():
    for position in saved_positions:
        print("playing: " + str(position))
        send_positions(position)
        time.sleep(1)

def clear_all_positions():
    global saved_positions
    saved_positions = []
    print("cleared all positions")

def clear_last_positions():
    global saved_positions
    removed = saved_positions.pop()
    print("removed: " + str(removed))
    print("saved positions: " + str(saved_positions))

def open_file():
    global saved_positions
    filename = filedialog.askopenfilename(initialdir="/", title="Select a File",
                                          filetypes=(("Text files", "*.txt*"), ("all files", "*.*")))
    file = open(filename, "r")
    data = file.read()
    saved_positions = eval(data)
    file.close()
    print("opened: " + filename)

def save_file():
    save_file = filedialog.asksaveasfile(mode='w', defaultextension=".txt")
    save_file.write(str(saved_positions))
    save_file.close()
    print("saved file")

def instructions():
    print("1.) ArduinoのCOMポートを設定しEnterを押す (Windowsのデバイスマネージャーで確認)")
    print("2.) スライダーで各サーボを動かす")
    print("3.) 位置を記録するには「Record Position」をクリック")
    print("4.) 再生するには「Replay Positions」をクリック")
    print("\n保存: File > Save File")
    print("読み込み: File > Open File")

window = Tk()
window.title("Robot Arm Controller 2")
window.minsize(355, 300)

port_label = Label(window, text="Set Port:")
port_label.place(x=10, y=10)
port_input = Entry(window)
port_input.place(x=10, y=35)
port_button = Button(window, text="Enter", command=set_port)
port_button.place(x=135, y=32)

servo1_slider = Scale(window, from_=180, to=0)
servo1_slider.place(x=0, y=100)
servo1_label = Label(window, text="Servo 1")
servo1_label.place(x=10, y=80)

servo2_slider = Scale(window, from_=180, to=0)
servo2_slider.place(x=70, y=100)
servo2_label = Label(window, text="Servo 2")
servo2_label.place(x=80, y=80)

servo3_slider = Scale(window, from_=180, to=0)
servo3_slider.place(x=140, y=100)
servo3_label = Label(window, text="Servo 3")
servo3_label.place(x=150, y=80)

servo4_slider = Scale(window, from_=180, to=0)
servo4_slider.place(x=210, y=100)
servo4_label = Label(window, text="Servo 4")
servo4_label.place(x=220, y=80)

servo5_slider = Scale(window, from_=180, to=0)
servo5_slider.place(x=280, y=100)
servo5_label = Label(window, text="Servo 5")
servo5_label.place(x=290, y=80)

save_button = Button(window, text="Record Position", command=save_positions)
save_button.place(x=10, y=220)

clear_button = Button(window, text="Clear Last Position", command=clear_last_positions)
clear_button.place(x=120, y=220)

clear_button = Button(window, text="Clear All Positions", command=clear_all_positions)
clear_button.place(x=120, y=255)

play_button = Button(window, text="Replay Positions", command=play_positions, height=3)
play_button.place(x=250, y=220)

menubar = Menu(window)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Open File", command=open_file)
filemenu.add_command(label="Save File", command=save_file)
menubar.add_cascade(label="File", menu=filemenu)

editmenu = Menu(menubar, tearoff=0)
editmenu.add_command(label="Clear last position", command=clear_last_positions)
editmenu.add_command(label="Clear all positions", command=clear_all_positions)
menubar.add_cascade(label="Edit", menu=editmenu)

helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="How to use (printed in console)", command=instructions)
menubar.add_cascade(label="Help", menu=helpmenu)

window.config(menu=menubar)

while True:
    window.update()
    if port_opened:
        send_positions([servo1_slider.get(), servo2_slider.get(),
                        servo3_slider.get(), servo4_slider.get(),
                        servo5_slider.get()])

Arduino スケッチ

#include 

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;

int servoPositions[5];

void setup() {
    Serial.begin(9600);
    servo1.attach(3);
    servo2.attach(5);
    servo3.attach(6);
    servo4.attach(9);
    servo5.attach(10);
}

void loop() {
    while (Serial.available()) {
        String input = Serial.readStringUntil('\n');
        servoPositions[0] = input.substring(0, 3).toInt();
        servoPositions[1] = input.substring(3, 6).toInt();
        servoPositions[2] = input.substring(6, 9).toInt();
        servoPositions[3] = input.substring(9, 12).toInt();
        servoPositions[4] = input.substring(12, 15).toInt();
    }
    servo1.write(servoPositions[0]);
    servo2.write(servoPositions[1]);
    servo3.write(servoPositions[2]);
    servo4.write(servoPositions[3]);
    servo5.write(servoPositions[4]);
    delay(500);
}

回路図

段ボール製ロボットアームを自作しよう – Arduinoとサーボで簡単記録・再生

製造プロセス

  1. Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
  2. MeArmロボットアーム V1.0 – Arduino/Raspberry Piで作るロボットアーム
  3. Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
  4. ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
  5. Arduino駆動3Dプリントロボットアームの製作:ステップバイステップガイド
  6. DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
  7. MobBob:Arduino製ロボットをAndroidスマホでシームレスに制御
  8. PiBot:Arduino駆動の精密ピアノ演奏ロボット
  9. LittleArm 2C: 3Dプリント製Arduinoロボットアーム – STEM教育向け耐久設計
  10. ゲーム用カスタムArduinoジョイスティックハンドルの製作
  11. Arduino 101で作る万歩計:DHT11温湿度センサー&LCD表示付き