段ボール製ロボットアームを自作しよう – Arduinoとサーボで簡単記録・再生
必要な部品と材料
- Arduino UNO × 1
- 標準サイズ サーボモーター × 3
- SG90 マイクロサーボモーター × 1
- ブレッドボード (汎用) × 1
- 5V 電源 × 1
必要な工具
- ホットグルーガン (汎用)
使用するアプリとオンラインサービス
- Arduino IDE
- Python
プロジェクト概要
このロボットアームは、位置を記録し再生する機能を備えています。段ボールとホットグルーといった身近な材料で作れるため、誰でも簡単に組み立てられます。
操作はPCのグラフィカルインターフェースから行います。各サーボをスライダーで制御し、位置を記録・再生するボタンを用意。記録データはファイルとして保存・読み込みも可能です。
作り方
- ページ下部「カスタムパーツ」のテンプレートをダウンロード・印刷し、段ボールを切り出します。
- 動画 (0:22〜) を参考にアームを組み立てます。
- 回路図に従って配線します。
- 「Robot Arm Arduino Code」をダウンロードし、Arduinoに書き込みます。
- 「Python User Interface」をダウンロードし、Python (https://www.python.org/) と PySerial (
pip install pyserial) をインストールして実行します。 - 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デジタルダイス: LCD表示の乱数ジェネレーター自作
- MeArmロボットアーム V1.0 – Arduino/Raspberry Piで作るロボットアーム
- Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduino駆動3Dプリントロボットアームの製作:ステップバイステップガイド
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- MobBob:Arduino製ロボットをAndroidスマホでシームレスに制御
- PiBot:Arduino駆動の精密ピアノ演奏ロボット
- LittleArm 2C: 3Dプリント製Arduinoロボットアーム – STEM教育向け耐久設計
- ゲーム用カスタムArduinoジョイスティックハンドルの製作
- Arduino 101で作る万歩計:DHT11温湿度センサー&LCD表示付き