Arduino制御3Dワイヤーベンディングマシンの自作:ステップバイステップガイド
概要
機械・電気・コンピュータ工学が融合した典型的なメカトロニクスシステムである、Arduinoベースの3Dワイヤーベンディングマシンを自作します。工学系学生やメカトロニクス初心者にとって格好の学習プロジェクトです。
ワイヤーは複数のローラー(ストレートナー)を通って矯正され、ステッピングモーターで精密に送り出されます。曲げ機構にはステッピングモーターと小型サーボを使用。さらにZ軸用ステッピングモーターで曲げ機構全体をワイヤー周りに回転させ、立体形状を創出します。全制御はArduinoとカスタムPCBで行います。


プログラムには星形、立方体、シンプルなスタンドなどの自動成形機能と、シリアルモニターからコマンド入力して手動で形状を作るマニュアルモードを実装。
3Dモデル設計
3Dモデリングソフトで設計。Thangsでモデル公開中(STLファイルダウンロード可、ブラウザ閲覧可)。ギア、ベアリングピローブロック、シャフトカプラーなど一部パーツは3Dプリントで製作。設計参考:YouTube動画。



機械組み立て
MDF(8mm)と合板(18mm)でフレームを製作。円鋸で切り出し、木工用ボンドとネジで組み立て(90°アングルクランプ使用)。ベースはMDF2枚と合板柱4本。

天板に3DプリントしたベアリングピローブロックをM8ボルトで固定(高さ調整用に3mm MDFスペーサー挿入)。6202ベアリング(外径35mm、内径15mm)を嵌め、その中に15mm中空シャフト(銅管、約30cm)を通します。これがZ軸で、曲げ機構をワイヤー周りに回転させます。

ベアリング間にモジュール1.5、30歯の3Dプリントギアを配置(M3ナットスロット付き、ボルトでシャフトに固定)。Z軸ステッピングモーター(NEMA 17)を専用ブラケットに取り付け、18歯ギアをシャフトに固定。ブラケットはスロット穴でギア噛み合い調整可能。



フィーダー機構
フィーダー用ステッピングモーター(NEMA 17)を天板に直接取り付け。シャフトに3Dプリントシャフトカプラーと銅管(フィーダー接触面)を装着。反対側にレバーとベアリングを配置、合板片とTナット・ボルトで押し付け圧力を調整し、ワイヤー把持力を確保。



ワイヤーストレートナー
M8ボルト3本で合板固定、ベアリングと3Dプリント溝付き外輪でローラーを製作。片側3ローラー、反対側2ローラー(スロット加工でボルト頭をフラッシュ化)。2本のボルトで両側を挟み、ナットで圧力調整。


前後にワイヤーガイド用合板を追加。
曲げ機構(ベンダー)
MDFプレートにNEMA 23ステッピングモーター(大型)を搭載(38mmホールソーで穴開け)。出力軸にモジュール2.5、18歯ギアを固定。これに噛み合う30歯ギアは、MG996Rサーボ搭載プレート一体型のカスタム設計。サーボがラック&ピニオン機構(ピン)を駆動し、ワイヤーを曲げます。エポキシでベアリングと銅管(接触面)をギアに固定。


大ギアをM8ボルトで固定、ラックとサーボを取り付け、ピニオンギアをサーボホーンにM3ボルトで固定。ホーンをサーボに装着で曲げ機構完成。


Z軸への取り付けと仕上げ
3Dプリントシャフトクランプ2個でベンダーをZ軸シャフトに固定(M6ボルト)。3mmノズルをシャフト先端に取り付け(ワイヤー吐出口)。ベンダー底部にマイクロリミットスイッチを配置(ベンダー原点復帰用)。



回路図

3つのステッピングモーターをDRV8825ドライバー3個で制御。電源は12V/3A以上。サーボ(MG996R)は電流が大きいためArduino 5Vレギュレーターではなく、別途LM7805 5Vレギュレーターで供給。リミットスイッチはプルアップ抵抗付きでデジタルピン接続。
必要な部品
- ステッピングモーター NEMA 17 ×2(フィーダー、Z軸)
- ステッピングモーター NEMA 23 ×1(ベンダー)
- DRV8825ステッピングドライバー ×3
- マイクロリミットスイッチ
- 12V 2A以上ACアダプター
- DCジャック
- Arduinoボード(Uno等)
PCB設計
EasyEDAでカスタムPCB設計(両面配線)。ステッピングドライバーのマイクロステップ選択ピン、追加リミットスイッチ接続、Arduino未使用ピンも引き出し。JLCPCBで発注、品質良好。




PCB組み立て
ピンヘッダーをはんだ付け(着脱容易に)。小型部品(コンデンサー、抵抗、LM7805、ターミナルブロック)は直接実装。ステッピングドライバーとArduinoを装着、電源コネクターとスイッチ、モーターケーブル、サーボ(D2ピン、LM7805給電)を接続。マイクロステップは1/16に設定(該当ピンをショート)。


Arduinoコード解説
ステッピング制御にAccelStepperライブラリ(Mike McCauley作)、サーボ制御にServoライブラリを使用。
#include <AccelStepper.h>
#include <Servo.h>
#define limitSwitch 11
AccelStepper feederStepper(1, 5, 6); // (Driver, STEP, DIR)
AccelStepper zAxisStepper(1, 7, 8);
AccelStepper benderStepper(1, 9, 10);
Servo servo01;
String dataIn = ""; String manualStatus = "";
int count = 0; int dist;
setup()でサーボ初期位置(ピン収納)、ベンダー原点復帰(リミットスイッチまで回転→0設定→1400ステップ戻って曲げ開始位置に設定)。各ステッピングの最大速度2000ステップ/秒に設定。
void setup() {
Serial.begin(9600);
pinMode(limitSwitch, INPUT_PULLUP);
servo01.attach(2); servo01.write(40); // ピンアップ
feederStepper.setMaxSpeed(2000);
zAxisStepper.setMaxSpeed(2000);
benderStepper.setMaxSpeed(2000);
// ホーミング
while (digitalRead(limitSwitch) != 0) {
benderStepper.setSpeed(1200); benderStepper.runSpeed();
benderStepper.setCurrentPosition(0);
}
delay(40);
while (benderStepper.currentPosition() != -1400) {
benderStepper.setSpeed(-1200); benderStepper.run();
}
benderStepper.setCurrentPosition(0);
}
loop()でシリアルコマンド待受。「manual」で手動モード、「star」「cube」「stand」で自動成形実行。
void loop() {
String mode = Serial.readString();
if (mode.startsWith("manual")) manual();
if (mode.startsWith("star")) star();
if (mode.startsWith("cube")) cube();
if (mode.startsWith("stand")) stand();
}
星形成形関数
5回繰り返し(星の5頂点)。フィード長38mm(ステップ換算×48)、ピンアップ、52°曲げ、戻し、再フィード、ピンダウン、ベンダーを逆方向初期位置(-42°)へ、ピンアップ、105°逆曲げ、-63°戻し、ピンダウンで1サイクル完了。
void star() {
while (count != 5) {
int feed = 38; int feedDistance = feed * 48;
// フィード
while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); }
feederStepper.setCurrentPosition(0); servo01.write(40); delay(200);
int angleConst = 18;
// 52°曲げ
while (benderStepper.currentPosition() != -52 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); }
benderStepper.setCurrentPosition(0); delay(100);
// 戻し
while (benderStepper.currentPosition() != 52 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); }
benderStepper.setCurrentPosition(0); delay(100);
// 再フィード
while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); }
feederStepper.setCurrentPosition(0); delay(100);
servo01.write(130); delay(200); // ピンダウン
// 逆方向初期位置へ
while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); }
benderStepper.setCurrentPosition(0); delay(200);
servo01.write(40); delay(200); // ピンアップ
// 105°逆曲げ
while (benderStepper.currentPosition() != 105 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); }
benderStepper.setCurrentPosition(0); delay(50);
// -63°戻し
while (benderStepper.currentPosition() != -63 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); }
delay(100); servo01.write(130); benderStepper.setCurrentPosition(0); count++;
}
}
立方体、スタンドも同様の手法で座標計算し実装。マニュアルモードでは「f[mm]」でフィード、「b[度]」で曲げ、「z[度]」でZ軸回転を対話制御可能。
if (dataIn.startsWith("f")) {
dataInS = dataIn.substring(1); dist = dataInS.toInt();
dist = dist * 48;
while (feederStepper.currentPosition() != dist) { feederStepper.setSpeed(1200); feederStepper.run(); }
feederStepper.setCurrentPosition(0); delay(100);
}
完全なコード
完全なArduinoコードはこちら(記事末尾に掲載:star(), cube(), stand(), manual()全関数含む)
既知の問題と改善点
ワイヤーストレートナーを強く締めるとフィーダーが把持力を失いワイヤーが送れなくなる問題があります。銅管より強度の高い材料を使うか、フィーダー機構を再設計することで解決可能です。

メカトロニクスの基礎を学ぶには最適なプロジェクトです。質問はコメント欄へ。Arduinoプロジェクトコレクションもご覧ください。
製造プロセス