Arduino3Dワイヤー曲げ機
このチュートリアルでは、Arduinoベースの3Dワイヤー曲げ機をどのように構築したかを紹介します。これは、機械、電気、およびコンピューターエンジニアリングを伴うため、実際には典型的なメカトロニクスシステムです。したがって、多くの工学部の学生やメカトロニクスに不慣れな人なら誰でも、このプロジェクトが面白いと感じたと思います。
次のビデオを見るか、以下のチュートリアルを読むことができます。
この3Dワイヤー曲げ機の動作原理は次のとおりです。したがって、最初に、ワイヤは直列ローラーまたはストレートヘアアイロンを通過します。ステッピングモーターを使用すると、ワイヤーはワイヤー曲げ機構に正確に送られます。ワイヤー曲げ機構は、ステッピングモーターと曲げプロセス用の小さなサーボも使用します。
Z軸と呼ばれる別のステッピングモーターもあります。これにより、実際に機械で3次元フォームを作成できます。もちろん、マシンの頭脳はArduinoボードであり、他の電子部品と一緒にカスタム設計されたPCBに取り付けられています。
プログラムは、星型、立方体型、シンプルなスタンド型など、さまざまな形を作るためのカスタム機能や、シリアルモニターからコマンドを入力してワイヤーフォームを作成できる手動モードをいくつか作成しました。
いつものように、私は3Dモデリングソフトウェアを使用してプロジェクトを作成することから始めました。以下の3Dモデルをダウンロードできます。
デザインのインスピレーション:YouTubeビデオ
この3Dモデルを見つけてダウンロードしたり、Thangsのブラウザで調べたりすることができます。
アセンブリの3DモデルはThangsでダウンロードできます。
3D印刷用のSTLファイル:
ギア、ベアリングピローブロック、シャフトカプラーなどの一部の部品については、3Dプリンターを使用して作成しました。 3D印刷に使用されるこれらのパーツのSTLファイルは、上記のファイルからダウンロードできます。
私の新しい3DプリンターであるCrealityCR-10は素晴らしい仕事をし、パーツを素晴らしい品質で印刷しました。チェックアウトしたい場合に備えて、この3Dプリンターへのリンクは次のとおりです。
MDFと合板を使用した他の部品の準備を続けました。そのため、丸鋸を使用して3Dモデルからすべての寸法を取得したら、ピースを適切なサイズにカットしました。私は8mmティックMDFと18mmティック合板を使用しました。準備ができたら、組み立てを開始しました。まず、2枚のMDFプレートと4枚の合板の柱でベースを作りました。それらを固定するために、私は木工用ボンドといくつかのネジを使用しました。
次にトップパネルに、8mmのボルトとナットを使用して3Dプリントされたベアリングピローブロックを取り付けました。ここで、適切な高さになるように、上部とピローブロックの間に3mmティックのMDFプレートを追加したことがわかります。これらのブロックに、6202ベアリングを取り付けることができます。
外径は35mm、内径は15mmです。そこで、これらのベアリングを通して、ワイヤーが通過できるように15mmの中空シャフトを挿入する必要があります。このシャフトは実際にはZ軸であり、曲げ機構がワイヤーの周りを回転し、そのようにして3次元の形状を作ることができます。そのために銅管を使用しましたが、長さは約30cm必要です。
2つのベアリングの間に、1.5歯と30歯のモジュールを備えた3Dプリントギアも挿入しました。ギアにはカスタムデザインのスロットがあり、M3ナットを挿入してから、M3ボルトを使用してギアをシャフトに締め付けることができます。
次に、Z軸ステッピングモーターを取り付ける必要があります。その目的のために、私はカスタム取り付けブラケットを3D印刷しました。そこで、M3ボルトでステッパーをブラケットに固定し、モーターシャフトに18歯のギアを挿入しました。前に示したのと同じ方法でギアをシャフトに固定しました。
次に、6 mmのドリルを使用して、取り付けブラケットを固定する上部に2つの穴を開けました。穴の代わりにブラケットにスロットがあり、2つの歯車を適切にペアリングできることがわかります。
フィーダー機構用のステッピングモーターの取り付けに移りました。このモーターは天板に直接取り付けられるので、適切な穴を開けました。次に、4本のボルトを使用してステッパーをプレートに固定しました。これらのナットがここで何をするのか疑問に思われる場合は、私が持っていたボルトが長く、モータースレッドに収まらなかったため、実際にはディスタンスナットとして機能します。
したがって、このステッパーのシャフトにフィーダーを挿入する必要があります。そのために、実際にフィーダーの接触面となる銅管を挿入したカスタムシャフトカプラーを3D印刷しました。
次に、モーターの反対側にレバーを挿入し、その上にフィーダーを押すベアリングを取り付けました。フィーダーがワイヤーを動かすのに十分なグリップを得るために、Tナットが付いた合板を取り付け、ボルトを使用してフィーダーのグリップを制御できるようにします。
次のステップは、ワイヤー矯正システムを作ることです。 3本のM8ボルトを使用して、以前に3Dモデルに従って穴をあけた合板を固定しました。その上にローラーを挿入しました。ローラーはベアリングと3Dプリントの溝付き外輪で作りました。
この側に3つのローラーがあり、反対側に2つのローラーがあります。反対側では、ボルトがピースと同じ高さを保つように、合板ピースにスロットを作りました。これで、2本のボルトを使用して、2つの側面をペアリングでき、ナットを使用して、ストレートヘアアイロンを適切に締めることができます。
この手順が完了したら、ワイヤーガイドとして機能するストレートヘアアイロンの前後にさらに2枚の合板を追加しました。
さて、これでワイヤー曲げ機構の作成に進むことができます。まず、MDFの一部に、ベンダーモーターを取り付ける必要があります。その前に、形を整える必要があったMDFピースを使っていたので、ハンドソー、コーピングソー、ラスプを使用して、簡単に目的の形状を得ることができました。次に、38 mmのホールソーを使用して、曲げに使用するより大きなステッピング、NEMA23ステッピングモーター用の開口部を作成しました。また、他の部品を取り付けるために必要な小さな穴をいくつか開けました。
M4ボルトとナットを使用してNEMA23ステッパーを固定し、その出力シャフトに2.5歯と18歯のモジュールを備えたギアを取り付けました。このギアは、MG996Rサーボを取り付けるための統合プレートを備えたカスタム設計のギアであるより大きな30歯のギアとペアになります。このサーボは、ラックアンドピニオンメカニズムを動かします。これは、実際にはギアから飛び出すピンであり、ワイヤーを曲げる役割を果たします。 5分間のエポキシを使用して、ベアリングをギアに固定し、ワイヤーを曲げるときの接触面となるラックに銅管を追加しました。
エポキシが乾いた後、M8ボルトとナットで大きい方のギアを固定して2つのギアをペアリングしました。次に、ラックとサーボを所定の位置に挿入し、サーボパッケージに付属のネジを使用して固定しました。次に、2本のM3ボルトとナットを使用して、ピニオンギアをサーボの丸いホーンに固定しました。
最後にホーンをサーボに取り付け、これで曲げ機構が完成しました。
あとは、ベンダーをZ軸に取り付けるだけです。私は2つの3Dプリントシャフトクランプを使用してそれを行いました。まず、M6ボルトとナットを使用してベンダープレートに固定し、次にZ軸に挿入しました。 2つのナットを所定の位置に挿入し、ボルトを使用してクランプをシャフトに締めました。これで、すべての可動部品が正常に機能しています。
実際には、さらに2つの小さな詳細を追加する必要があります。これが、ワイヤーが出ているシャフトの3mmノズルです。
そして、ベンダーの下部に、ベンダーの初期位置を設定するために使用されるマイクロリミットスイッチを配置しました。
これで、3Dワイヤー曲げ機はほぼ完成しました。私はほとんど言います、なぜなら今、私たちはこのマシンにライブを与えるか、電子部品を接続してそれをプログラムする必要があるからです。
これがこのプロジェクトの回路図です。
したがって、3つのステッピングモーターは、3つのDRV8825ステッピングドライバーを使用して制御されます。ステッパーとプロジェクト全体に電力を供給するために、少なくとも3Aの電流レートの12V電源を使用します。
サーボへの電力供給には、Arduinoからの5Vを使用できますが、MG996Rサーボは電力を大量に消費する可能性があり、Arduinoの5V電圧レギュレーターはそれを処理できない可能性があります。そのため、このプロジェクトのサーボに電力を供給するのに十分な、別の5V電圧レギュレーターLM7805を使用することにしました。 Arduinoボードのデジタルピンに接続されたプルアップ抵抗を備えたベンダー用のリミットスイッチもあります。
このプロジェクトに必要なコンポーネントは、以下のリンクから入手できます。
次に、配線の混乱を取り除き、電子部品を整理するために、EasyEDAの無料オンライン回路設計ソフトウェアを使用してカスタムPCBを設計しました。回路には多くの接続があるので、私はそれらを整理するために上層と下層の両方を使用しました。また、ステッパーの解像度を選択するためのピンを追加し、リミットスイッチ接続をもう1つ追加し、何かに必要な場合に備えて、Arduinoからのデジタルピンとアナログピンを追加しました。
このPCBデザインのプロジェクトファイルへのリンクは次のとおりです。したがって、この設計が完了したら、PCBの製造に必要なガーバーファイルを生成しました。
ガーバーファイル:
次に、実際にこのプロジェクトのスポンサーであるJLCPCBにPCBを注文しました。
ここでは、ガーバーファイルをドラッグアンドドロップするだけで、アップロードしたら、ガーバービューアでPCBを確認できます。すべてが順調であれば、先に進み、PCBに必要なプロパティを選択してから、PCBをリーズナブルな価格で注文できます。 JLCPCBからの最初の注文の場合、わずか2ドルで最大10個のPCBを入手できることに注意してください。
数日後、PCBが到着しました。 PCBの品質は素晴らしく、すべてが設計とまったく同じです。
これで、次に進んで電子部品をPCBに取り付けることができます。まず、ピンヘッダーをPCBにはんだ付けしました。これにより、必要なときにコンポーネントを簡単に接続および切断できます。コンデンサ、抵抗、電圧レギュレータ、端子台などの小さなコンポーネントについては、PCBに直接はんだ付けしました。
この手順が完了したら、ステッパードライバーとArduinoを所定の位置に挿入できます。次に、電源プラグと電源スイッチを端子台に接続し、ケーブルを一方のステッピングモーターに接続し、もう一方のPCBに接続する必要があります。サーボはデジタルピン番号2に接続され、LM7805電圧レギュレータからの5Vで電力が供給されます。最後に、ドライバーの下に解像度ピンを接続することで、ステッパーの解像度を選択できます。
上の写真のように真ん中のピンではなく、右のピンを接続する必要があるため、16番目のステップの解像度を使用することにしました。これで電子部品の準備が整い、ワイヤー曲げ機のプログラミングに進むことができます。
コードが少し長いので、理解を深めるために、プログラムのソースコードを各セクションの説明とともにセクションに投稿します。そして、この記事の最後に、完全なソースコードを投稿します。
ステッピングモーターの制御には、MikeMcCauleyによるAccelStepperライブラリを使用します。したがって、このライブラリと、サーボモーターを制御するためのサーボライブラリを含める必要があります。次に、ステッパーが接続されているピンと、以下のプログラムに必要ないくつかの変数を定義する必要があります。
セットアップセクションでは、サーボまたはベンディングピンの初期位置を設定し、ベンダーギアの初期位置も設定します。これは、リミットスイッチの助けを借りて行われます。ステッパーはスイッチに向かって回転し、それが押されると、モーターはゼロからの歩数のカウントを開始し、それ自体をゼロ度に配置して、曲げる準備をします。
ループセクションでは、シリアルモニターからのコマンドを待ちます。 manualと入力すると、手動曲げモードになります。たとえば、starと入力すると、start()カスタム関数が実行され、マシンが自動的に星の形を作成します。
このカスタム関数を見てみましょう。
明らかに星には5つのポイントがあるため、ここでは5回実行されるwhileループに入ります。まず、送り値を設定します。これは、ミリメートル単位で送られるワイヤの量です。次に、この値に48を掛けて、送り値をステッピングモーターが移動するための適切なステップに変換します。次に、run()関数を使用して、setSpeed()関数で設定された速度でフィーダーモーターを回転させます。上記のfeedDistance値に達すると停止し、その直後にステッパーの現在位置値をゼロに設定します。
次のステップでは、ワイヤーを52度曲げます。これは、上記で説明したのと同様の方法で行われます。ここには、目的の角度を掛けた角度定数もあります。モーターがその値に達すると、モーターは停止し、現在の位置を0にリセットしてから、反対方向に同じステップ数を実行して、実際にモーターを初期位置に戻します。
次に、同じ長さのワイヤーを送り、ピンを下に置いて、ベンダーが反対方向に曲げるために使用される新しい初期位置に移動できるようにします。次にベンダーピンを上げて、ワイヤーを反対方向に105度曲げます。コマンドは5回繰り返され、それがスターフォームを取得する方法です。
上で説明したのと同じように、立方体の形、または実際に思いつく他の形を作ります。手動モードに関しては、コマンドの動作原理は同じですが、シリアルモニターからのコマンドを読み取るための行が数行残っている点が異なります。たとえば、ワイヤをフィードする場合は、「f」とミリメートル単位の距離を入力する必要があります。ワイヤを曲げる場合は、「b」と角度を度単位で入力する必要があります。Z軸を回転させる場合は、 「z」と角度を度数で入力します。
これが私が作成したプログラムの仕組みですが、もちろん、これをコーディングする方法は他にもたくさんあります。この3Dワイヤー曲げ機の完全なArduinoコードは次のとおりです。
At the end I would like to point out that the wire straightening system of the wire bending machine is actually not working like it should work, because if I tighten it more, the feeder loses grip and the wire doesn’t move.
For solving this issue you could try to use different, stronger material than the copper tube or make a different feeder system.
So that’s it.このビデオを楽しんで、何か新しいことを学んだことを願っています。以下のコメントセクションで質問をして、Arduinoプロジェクトコレクションを確認してください。DIY3Dワイヤー曲げ機3Dモデル
PCBデザイン
3DワイヤーベンディングマシンプロジェクトのArduinoコード
#include <AccelStepper.h>
#include <Servo.h>
#define limitSwitch 11
// Define the stepper motors and the pins the will use
AccelStepper feederStepper(1, 5, 6); // (Type:driver, STEP, DIR)
AccelStepper zAxisStepper(1, 7, 8);
AccelStepper benderStepper(1, 9, 10);
Servo servo01;
String dataIn = "";
String manualStatus = "";
int count = 0;
int dist;
Code language: Arduino (arduino)void setup() {
Serial.begin(9600);
pinMode(limitSwitch, INPUT_PULLUP);
servo01.attach(2);
servo01.write(40); // Initial position, bending pin up
// Stepper motors max speed
feederStepper.setMaxSpeed(2000);
zAxisStepper.setMaxSpeed(2000);
benderStepper.setMaxSpeed(2000);
// Homing
while (digitalRead(limitSwitch) != 0) {
benderStepper.setSpeed(1200);
benderStepper.runSpeed();
benderStepper.setCurrentPosition(0); // When limit switch pressed set position to 0 steps
}
delay(40);
// Move 1400 steps from the limit switch to starting position
while (benderStepper.currentPosition() != -1400) {
benderStepper.setSpeed(-1200); // if negative rotates anti-clockwise
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
}
Code language: Arduino (arduino)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();
}
}
Code language: Arduino (arduino)void star() {
while (count != 5) {
int feed = 38; // mm
int feedDistance = feed * 48; // 48- constats that map the mm value to number of steps the stepper show move
while (feederStepper.currentPosition() != feedDistance) { // run until it reaches the distance value
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0); // reset the current position to 0
servo01.write(40); // Set the bender pin up
delay(200);
int angleConst = 18; // angle constant
// Bend the wire 52 degrees
while (benderStepper.currentPosition() != -52 * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
// Go back 52 degrees to initial position
while (benderStepper.currentPosition() != 52 * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
// Feed the same distance again
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
delay(100);
servo01.write(130); // Set the bender pin down
delay(200);
// Set bender to new initial position, for bending in the other direction
while (benderStepper.currentPosition() != -42 * angleConst) {
benderStepper.setSpeed(-1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(200);
servo01.write(40); // Bender pin up
delay(200);
while (benderStepper.currentPosition() != 105 * angleConst) {
benderStepper.setSpeed(700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(50);
while (benderStepper.currentPosition() != -63 * angleConst) {
benderStepper.setSpeed(-1200);
benderStepper.run();
}
delay(100);
servo01.write(130);
benderStepper.setCurrentPosition(0);
count++;
}
}
Code language: Arduino (arduino)int feed = 38; // mm
int feedDistance = feed * 48; // 48- constats that map the mm value to number of steps the stepper show move
while (feederStepper.currentPosition() != feedDistance) { // run until it reaches the distance value
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0); // reset the current position to 0
Code language: Arduino (arduino)// Bend the wire 52 degrees
while (benderStepper.currentPosition() != -52 * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
// Go back 52 degrees to initial position
while (benderStepper.currentPosition() != 52 * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
Code language: Arduino (arduino)if (dataIn.startsWith("f")) {
dataInS = dataIn.substring(1, dataIn.length()); // reads the feed value
dist = dataInS.toInt();
Serial.print("Feed ");
Serial.print(dist);
Serial.println("mm wire.");
dist = dist * 48;
while (feederStepper.currentPosition() != dist) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
delay(100);
}
Code language: Arduino (arduino)/*
Arduino 3D Wire Bending Machine
by Dejan Nedelkovski
www.HowToMechatronics.com
Library - AccelStepper by Mike McCauley:
http://www.airspayce.com/mikem/arduino/AccelStepper/index.html
*/
#include <AccelStepper.h>
#include <Servo.h>
#define limitSwitch 11
// Define the stepper motors and the pins the will use
AccelStepper feederStepper(1, 5, 6); // (Type:driver, STEP, DIR)
AccelStepper zAxisStepper(1, 7, 8);
AccelStepper benderStepper(1, 9, 10);
Servo servo01;
String dataIn = "";
String manualStatus = "";
int count = 0;
int dist;
void setup() {
Serial.begin(9600);
pinMode(limitSwitch, INPUT_PULLUP);
servo01.attach(2);
servo01.write(40); // Initial position, bending pin up
// Stepper motors max speed
feederStepper.setMaxSpeed(2000);
zAxisStepper.setMaxSpeed(2000);
benderStepper.setMaxSpeed(2000);
// Homing
while (digitalRead(limitSwitch) != 0) {
benderStepper.setSpeed(1200);
benderStepper.runSpeed();
benderStepper.setCurrentPosition(0); // When limit switch pressed set position to 0 steps
}
delay(40);
// Move 1400 steps from the limit switch to starting position
while (benderStepper.currentPosition() != -1400) {
benderStepper.setSpeed(-1200); // if negative rotates anti-clockwise
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
}
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();
}
}
void star() {
while (count != 5) {
int feed = 38; // mm
int feedDistance = feed * 48; // 48- constats that map the mm value to number of steps the stepper show move
while (feederStepper.currentPosition() != feedDistance) { // run until it reaches the distance value
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0); // reset the current position to 0
servo01.write(40); // Set the bender pin up
delay(200);
int angleConst = 18; // angle constant
// Bend the wire 52 degrees
while (benderStepper.currentPosition() != -52 * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
// Go back 52 degrees to initial position
while (benderStepper.currentPosition() != 52 * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
// Feed the same distance again
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
delay(100);
servo01.write(130); // Set the bender pin down
delay(200);
// Set bender to new initial position, for bending in the other direction
while (benderStepper.currentPosition() != -42 * angleConst) {
benderStepper.setSpeed(-1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(200);
servo01.write(40); // Bender pin up
delay(200);
while (benderStepper.currentPosition() != 105 * angleConst) {
benderStepper.setSpeed(700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(50);
while (benderStepper.currentPosition() != -63 * angleConst) {
benderStepper.setSpeed(-1200);
benderStepper.run();
}
delay(100);
servo01.write(130);
benderStepper.setCurrentPosition(0);
count++;
}
}
void cube() {
int feed = 40; // mm
int feedDistance = feed * 48;
int angleConst = 16;
// Step 1
while (count != 3) {
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != -90 * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != 90 * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
count++;
}
count = 0;
// Step 2
while (zAxisStepper.currentPosition() != 88 * angleConst) {
zAxisStepper.setSpeed(500);
zAxisStepper.run();
}
zAxisStepper.setCurrentPosition(0);
delay(100);
//Step 3
while (count != 2) {
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != -90 * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != 90 * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
count++;
}
count = 0;
// Step 4
while (zAxisStepper.currentPosition() != 85 * angleConst) {
zAxisStepper.setSpeed(500);
zAxisStepper.run();
}
zAxisStepper.setCurrentPosition(0);
delay(100);
// Step 5
servo01.write(130);
delay(200);
while (benderStepper.currentPosition() != -42 * angleConst) {
benderStepper.setSpeed(-1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
while (count != 3) {
delay(100);
servo01.write(40);
delay(200);
// Step 6
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != 90 * angleConst) {
benderStepper.setSpeed(700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != -90 * angleConst) {
benderStepper.setSpeed(-1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
count++;
}
count = 0;
}
void stand() {
int feed = 20; // mm
int feedDistance = feed * 48;
int angleConst = 16;
// Step 1
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != -90 * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != 90 * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
// Step 2
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != -70 * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != 70 * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
// Step 3
feed = 80; // mm
feedDistance = feed * 48;
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
delay(100);
// Step 4
servo01.write(130);
delay(200);
while (benderStepper.currentPosition() != -42 * angleConst) {
benderStepper.setSpeed(-1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
servo01.write(40);
delay(200);
while (benderStepper.currentPosition() != 108 * angleConst) {
benderStepper.setSpeed(700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != -66 * angleConst) {
benderStepper.setSpeed(-1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
//Step 5
servo01.write(130);
delay(200);
// Step 6
feed = 80; // mm
feedDistance = feed * 48;
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
servo01.write(40);
delay(200);
// Step 7
while (zAxisStepper.currentPosition() != -90 * angleConst) {
zAxisStepper.setSpeed(-500);
zAxisStepper.run();
}
zAxisStepper.setCurrentPosition(0);
delay(100);
// Step 8
while (benderStepper.currentPosition() != -90 * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != 90 * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
// Step 6
feed = 45; // mm
feedDistance = feed * 48;
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
// Step 10
while (benderStepper.currentPosition() != -90 * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != 48 * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
// Step 11
while (zAxisStepper.currentPosition() != 90 * angleConst) {
zAxisStepper.setSpeed(500);
zAxisStepper.run();
}
zAxisStepper.setCurrentPosition(0);
delay(100);
feed = 80; // mm
feedDistance = feed * 48;
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
// Step 12
while (benderStepper.currentPosition() != 110 * angleConst) {
benderStepper.setSpeed(700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != -68 * angleConst) {
benderStepper.setSpeed(-1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
//Step 13
servo01.write(130);
delay(200);
feed = 80; // mm
feedDistance = feed * 48;
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
servo01.write(40);
delay(200);
// Step 14
while (benderStepper.currentPosition() != -70 * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != 70 * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
//Step 15
feed = 25; // mm
feedDistance = feed * 48;
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
delay(100);
// Step 16
while (benderStepper.currentPosition() != -90 * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != 90 * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
// Step 17
while (feederStepper.currentPosition() != feedDistance) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
}
void manual() {
int sign;
String dataInS;
int angle;
int angleConst;
Serial.println(" // MANUAL MODE //");
while (!dataIn.startsWith("end")) {
servo01.write(130);
delay(200);
dataIn = Serial.readString();
if (dataIn.startsWith("f")) {
dataInS = dataIn.substring(1, dataIn.length()); // reads the feed value
dist = dataInS.toInt();
Serial.print("Feed ");
Serial.print(dist);
Serial.println("mm wire.");
dist = dist * 48;
while (feederStepper.currentPosition() != dist) {
feederStepper.setSpeed(1200);
feederStepper.run();
}
feederStepper.setCurrentPosition(0);
delay(100);
}
if (dataIn.startsWith("b")) {
if (dataIn.charAt(1) == '-') {
dataInS = dataIn.substring(2, dataIn.length()); ///reads the angle value
angle = dataInS.toInt();
Serial.print("Bend -");
Serial.print(angle);
Serial.println(" degrees.");
angleConst = 16;
// Set "negative" bending initial position
while (benderStepper.currentPosition() != -43 * angleConst) {
benderStepper.setSpeed(-1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
servo01.write(40);
delay(200);
// Bend the wire
while (benderStepper.currentPosition() != angle * angleConst) {
benderStepper.setSpeed(700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != (-1) * angle * angleConst) {
benderStepper.setSpeed(-1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
servo01.write(130);
delay(200);
// Get back to original "positive" bending initial poistion
while (benderStepper.currentPosition() != 43 * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
}
else {
dataInS = dataIn.substring(1, dataIn.length());
angle = dataInS.toInt();
Serial.print("Bend ");
Serial.print(angle);
Serial.println(" degrees.");
angleConst = 16;
servo01.write(40);
delay(200);
while (benderStepper.currentPosition() != (-1) *angle * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != angle * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
}
dataInS = dataIn.substring(2, dataIn.length());
angle = dataInS.toInt();
angleConst = 16;
while (benderStepper.currentPosition() != sign * angle * angleConst) {
benderStepper.setSpeed(-700);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
while (benderStepper.currentPosition() != sign * angle * angleConst) {
benderStepper.setSpeed(1200);
benderStepper.run();
}
benderStepper.setCurrentPosition(0);
delay(100);
}
// Z-Axis Control
if (dataIn.startsWith("z")) {
if (dataIn.charAt(1) == '-') {
dataInS = dataIn.substring(2, dataIn.length());
angle = dataInS.toInt();
Serial.print("Move Z-Axis -");
Serial.print(angle);
Serial.println(" degrees.");
angleConst = 16;
while (zAxisStepper.currentPosition() != angle * angleConst) {
zAxisStepper.setSpeed(500);
zAxisStepper.run();
}
zAxisStepper.setCurrentPosition(0);
delay(100);
}
else {
dataInS = dataIn.substring(1, dataIn.length());
angle = dataInS.toInt();
Serial.print("Move Z-Axis ");
Serial.print(angle);
Serial.println(" degrees.");
angleConst = 16;
while (zAxisStepper.currentPosition() != (-1) *angle * angleConst) {
zAxisStepper.setSpeed(-500);
zAxisStepper.run();
}
zAxisStepper.setCurrentPosition(0);
delay(100);
}
}
manualStatus = dataIn;
}
}
Code language: Arduino (arduino)
製造プロセス