Merhaba arkadaşlar, ilginç arduino projeleri yazı dizimizin yeni makalesi olan arduino ile basit tel bükme makinası yapımı ile karşınızdayız. Şimdi gelin hep birlikte nasıl yapılır öğrenelim. Aşağıdaki videoyu izleyerek projenizi çok daha hızlı gerçekleştirebilirsiniz.
Basit Tel Bükme Makinası Yapımı - Genel Bakış
3B basit tel bükme makinası çalışma prensibi; İlk önce, tel bir seri merdane veya düzleştiriciden geçer. Tel, step motor vasıtası ile bükülme işlemi için servo motor ile çalışan tel bükme mekanizmasına doğru itilir.
Ayrıca makinenin üç boyutlu formlar oluşturmasını sağlayan Z ekseni üzerinde başka bir step motoru da vardır. Makinenin beyni, diğer elektronik bileşenlerle birlikte özel olarak tasarlanmış bir pcb kart türü olan Arduino Nano'dur.
Programda, bir yıldız, küp ve basit bir stand gibi çeşitli şekiller yapmak için birkaç özel işlev ve ayrıca 16x2 lcd ekran üzerinden komut girerek tel formları oluşturabileceğimiz manuel bir mod mevcuttur.
Basit Tel Bükme Makinesi 3D Parçaları
Her zaman olduğu gibi, projeyi bir 3D modelleme yazılımı kullanarak yapmaya başlayalım.
Dişliler, yatak, geçiş blokları ve bazı şaft kuplörleri gibi parçaları yapmak için 3D yazıcı kullanacağız. 3D baskı için kullanılan bu parçaların STL dosyalarını, üstteki linkten indirebilirsiniz.
Tel Bükme Makinesi Yapımı
MDF ve kontrplak'dan oluşan diğer parçaları hazırlayalım. 3 boyutlu parçaların tüm ölçülerini alarak, elektrikli testere yardımıyla parçaları boyutlandıralım. 8 mm MDF ve 18 mm kontrplak kullanabiliriz. Parçaları hazırladıktan sonra birleştirmeye başlayabiliriz. İlk önce kaideyi iki MDF plakasından ve 4 kontrplak kolonundan oluşturalım. Sabitlemek için tahta tutkalı ve vida kullanabilirsiniz.
Üst panelde bulunan 3D parçaları 8 mm civata ve somun kullanarak tutturalım. Burada, demir veya bakır boru geçirdiğimiz 3d parçaların altına yükselti için 3 mm kalınlığında MDF plakaları ekleyelim ki; böylece uygun yüksekliği elde edebiliriz. Borunun geçtiği noktalara 6202 Rulman takmalıyız.
Rulmanın dış çapı 35 mm ve iç çapı 15 mm'dir. Şimdi, bu rulmanların içinden, telin içinden geçebilmesi için 15 mm'lik boş bir mil(boru) takmamız gerekiyor. Bu kısım aslında Z-ekseni ile alakalıdır. Bükme mekanizmasının tel etrafında dönmesini ve bu şekilde üç boyutlu formlar oluşturmasını sağlar. Bu amaçla biz bakır bir boru kullandık. Uzunluğu 30 cm civarında olmalıdır.
İki yatak arasına 1.5 ve 30 dişli çark yerleştirelim. Çarklar, M3 somunlarını yerleştirebileceğimiz özel tasarım yuvalarına sahiptir. Daha sonra M3 cıvatalarını kullanarak dişliyi mile sıkıştırabiliriz.
Sonra Z ekseni için step motoru kurmamız gerekiyor. Bunun için 3D özel bir montaj braketimiz mevcut. M3 cıvataları kullanarak braketimizi motorumuza sabitleyelim ve ardından 18 dişli çarkı motor şaftına yerleştirelim.
Sonra 6 mm'lik bir uca sahip matkap kullanarak montaj braketinin üzerine sabitleneceği tabana iki delik açalım.
Besleme mekanizması için step motor takılarak devam edelim. Bu motor doğrudan üst plakaya alttan monte edilecektir, bu yüzden üzerinde uygun delikleri açacağız. Sonra dört cıvatayı kullanarak motoru plakaya tutturalım.
Şimdi bu adım da şaft üzerine besleyiciyi yani tel düzelticiyi yerleştirmemiz gerekiyor. Bu amaçla üzerine geniş bir bakır boru yerleştirdiğimiz özel bir şaft kuplörü yazdırdık.
Bakır düzleştiricinin karşı tarafına, teli ezecek bir kol yerleştirelim. Besleyicinin teli düzleştirerek hareket ettirebilmesi için yeterli tutuş elde edebileceği destek, üzerinde bir T-somun bulunan bir kontrplak parçasıdır.
Bir sonraki adım tel düzleştirme sistemini yapmaktır. Üç adet M8 cıvata kullanarak daha önce 3D parçalara göre deldiğimiz bir kontrplak parçasını sabitleyelim. Şimdi bunun üzerine silindirleri yerleştireceğiz. Hareket edebilmesi için yuvarlak 3d parçaların içerisine rulman yerleştirmeliyiz.
Bir tarafa üç silindir, diğer tarafa iki silindir yerleştireceğiz. Kontrplak parçaları arasında karşılıklı delikler açalım ki cıvatalar parçayla aynı hizada kalsın. Şimdi sadece iki cıvata kullanarak iki tarafı eşleştireceğiz ve somunları kullanarak düzleştiricileri uygun şekilde hizalayıp sıkalım.
Bu adımı da bitirdikten sonra, düzleştiricilerin önüne iki kontrplak parçası daha ekleyeceğiz. Öncelikle bir MDF parçasına bükme motorunu takmamız gerekiyor. Bunu yapmadan önce, biraz şekillendirmeye ihtiyaç duyduğumuz için MDF parçasını, matkap ve sabitleyici kullanarak kolayca istenen şekle sokabiliriz. Daha sonra 38 mm'lik bir metkap kullanarak, bükme için kullanacağımız büyük STEP motor NEMA 23 ayarladık. Ayrıca diğer parçaları bağlamak için gereken daha küçük delikler de açtık.
NEMA 23 kademesini M4 cıvatalar ve somunlar kullanarak sabitledik ve çıkış milinde 2.5 ve 18 dişlilerden oluşan bir çark seti taktık. Bu dişli MG996R servoyu monte etmek için entegre plakalı özel tasarlanmış bir dişli olan daha büyük 30 dişli çark ile eşleştirilecektir. Bu servo, gerçekte dişliden çıkacak ve teli bükmeye yarayacak bir pim olan bir kremayer ve pinyon mekanizmasını hareket ettirecektir. Hızlı bir şekilde bir yapıştırıcı kullanarak, dişliyi bir yatağa sabitledik ve ayrıca teli bükerken temas yüzeyi olacak parçaya bakır boru ekledik.
Yapıştırıcı kuruduktan sonra, büyük dişliyi bir M8 cıvatası ve bir somunla sabitleyerek iki dişliyi eşleştirelim. Sonra rafı ve servoyu yerleştirip, servo paketinden çıkan vidaları kullanarak sabitleyelim. Daha sonra, pinyon dişlisini iki M3 cıvata ve somun kullanarak servonun yuvarlak başlığına sabitleyelim.
Servo tutturulduktan sonra bükme mekanizması tamamlanmış olacaktır.
Şimdi yapılması gereken, bükücüyü Z eksenine bağlamaktır. Bunu iki adet 3D çıktısı mil kıskacını kullanarak yapacağız. Önce M6 cıvataları ve somunları kullanarak onları bükme plakasına sabitleyelim ve sonra onları Z eksenine yerleştirelim. İki somunu yerine taktık ve cıvataları kullanarak kelepçeleri mile sıkıştırdık. Şimdi tüm hareketli parçalar düzgün çalışıyor.
Aslında eklenecek iki küçük detay daha var. Telin çıktığı şafttaki 3 mm'lik nozul.
Bükücünün altına, bükücünün başlangıç konumunu ayarlamak için kullanılacak olan bir mikro limit anahtarı yerleştirelim.
Ve tamam... 3D tel bükme makinemiz neredeyse bitti. Neredeyse dedim, çünkü şimdi bu makineye elektrik vermek ve elektronik bileşenleri bağlayıp programlamamız gerekiyor.
Devre şeması
İşte ilginç arduino projemiz basit tel bükme makinası devre şeması.
3 step motor, 3 DRV8825 step sürücü kullanılarak kontrol edilir. Step motorlara ve tüm projeye güç sağlamak için en az 3 A akım oranına sahip 12V güç kaynağı kullanacağız. Servoyu çalıştırmak için, Arduino'dan gelen 5V enerjiyi kullanabiliriz, ancak MG996R servo için yeterli olmayabilir. Bu nedenle, bu proje de servoyu çalıştırmak için LM7805 5V voltaj regülatörü kullanmaya karar verdik. Bu proje için ihtiyaç duyduğunuz bileşenleri aşağıdaki bağlantılardan satın alabilirsiniz:
PCB Kart Tasarımı
Kablo karmaşasından kurtulmak ve elektronik bileşenlerin düzenli kalmasını sağlamak için, EasyEDA ücretsiz çevrimiçi devre tasarım yazılımını kullanarak özel bir PCB tasarladık. Devre birçok bağlantıya sahip, bu yüzden onları düzenlemek için hem üst hem de alt katmanları kullandık. Ayrıca step motorlar için pinler ekledik, bir tane sınır anahtarı bağlantısı ekledik ve Arduino'dan gelen veriler için ihtiyaç duymamız durumunda ilave dijital ve analog pinler ekledik.
Kartı bastırmak için JLCPCB'den sipariş verebilirsiniz.
Burada Gerber dosyasını yükledikten sonra, PCB'imizi Gerber görüntüleyicide inceleyebiliriz. Her şey yolunda giderse devam edebiliriz, PCB için istediğimiz özellikleri seçip PCB'lerimizi makul bir fiyatla sipariş edebiliriz. JLCPCB'den ilk siparişiniz ise, sadece $ 2 karşılığında 10'a kadar PCB alabileceğinizi bilmenizi isteriz.
PCB'ler geldi. PCB'lerin kalitesi mükemmel ve her şey tasarımdakiyle tamamen aynı.
Artık elektronik bileşenleri PCB'ye takabiliriz. PCB üzerine pin başlıklarını lehimleme ile başlayalım. Kondansatörler, dirençler, voltaj regülatörü ve terminal blokları gibi daha küçük bileşenlere gelince, bunları doğrudan PCB'ye lehimledik.
Bu adımı tamamladıktan sonra, şimdi step sürücülerini ve Arduino'yu yerine yerleştirebiliriz. Güç kablosunu ve güç anahtarını terminal bloklarına bağlamalı, kabloları bir taraftaki step motorlara ve diğer taraftaki PCB'ye bağlamalıyız. Servo, 2 numaralı dijital pine bağlı ve LM7805 voltaj regülatörü üzerinden gelen 5V ile çalışmaktadır. Son olarak, sürücülerin altındaki pinleri bağlayarak kademeli çözünürlüğü seçebiliriz.
Biz çözünürlüğü kullanmaya karar verdik, bu yüzden yukarıdaki fotoğrafta görüldüğü gibi ortadakiler yerine doğru pinleri bağlamamız gerekiyor. Böylece elektronik bileşenler hazır olacaktır ve tel bükme makinesini programlamaya devam edebiliriz.
3D Tel Bükme Makinesi Projesi için Arduino Kodu
Kod biraz uzun olduğu ve daha iyi anlaşılması için programın kaynak kodunu bölümlere açıklamalarıyla birlikte ayırdık. Ve bu yazının sonunda kaynak kodun tamamını bulabilirsiniz. Step motorları kontrol etmek için AccelStepper kütüphanesini Mike McCauley kullanacağız. Bu yüzden bu kütüphaneyi ve aynı zamanda servo motoru kontrol etmek için servo kütüphanesini dahil etmemiz gerekiyor. Ardından, stepperlerin bağlı olduğu pinleri ve aşağıdaki program için bazı değişkenleri tanımlamamız gerekir.
#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;
Kurulum bölümünde servonun veya bükme piminin başlangıç pozisyonunu ve ayrıca bükme tertibatının başlangıç pozisyonunu ayarladık. Bu ayar sınır anahtarı ile yapılır. Step, anahtara doğru döner ve bir kez basıldığında motor, basamakları sıfırdan saymaya başlar ve teli eğmeye hazır hale gelir.
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);
}
Şimdi döngü bölümünde ekran üzerine gelen komutları bekliyoruz. Eğer manuel yazarsak, manuel bükme moduna gireriz ya da örneğin yıldız için star yazarsak, start() özel fonksiyonu çalıştırılır ve makine bizim için otomatik olarak bir yıldız formu oluşturur.
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();
}
}
Bu özel fonksiyona bir göz atalım.
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++;
}
}
Burada 5 kez yürütülen bir süre döngüsüne giriyoruz, çünkü yıldızın 5 kolu vardır. Besleme değerini ayarlayarak milimetre cinsinden ne kadar tel ilerlemesi gerektiğini belirleriz. Bu değer daha sonra step motorun hareket etmesi için besleme değerini uygun adımlara dönüştüren 48 ile çarpılır. Daha sonra run() işlevini kullanarak, besleyici motorunu setSpeed() işlevi tarafından ayarlanan bir hızda döndürürüz. Motor yukarıdaki feedDistance değerine ulaştığında durur ve hemen ardından adımın sıfıra ait geçerli konum değerini belirleriz.
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
Bir sonraki adımda teli 52 derece bükeriz. Bu yukarıda açıklandığı gibi yapılır. Burada da istenen açıyla çarpılan bir açı sabitine sahibiz. Bu değere motor tarafından ulaşıldığında motor durur, mevcut konumunu 0'a sıfırlar ve ardından aynı sayıda adımı ters yönde, motoru ilk konumuna geri döndürür.
// 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);
Sonra yine aynı uzunlukta teli ilerletiriz ve pimi aşağı indiririz, böylece bükücü diğer yönde bükme için kullanılan yeni bir başlangıç konumuna geçebilir. Bükme pimi daha sonra kaldırılır ve böylece teli ters yönde 105 derece bükeriz. Komutlar 5 kez tekrarlanır ve yıldız biçimini böylece elde etmiş oluruz.
Yukarıda açıklandığı gibi, küp şeklini veya aslında bulabileceğimiz diğer şekilleri de yapıyoruz. Manuel modda, komutların çalışma prensibi aynıdır, ancak ekrandan gelen komutları okumak için birkaç satır daha vardır. Örneğin tel beslemesi için, “f”, artı milimetre cinsinden uzaklık, teli bükmek için “b”, artı derece cinsinden açı ve Z eksenini döndürmek için ihtiyacımız var. "z", artı derece cinsinden yazın.
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);
}
Yaptığım program bu şekilde çalışıyor, ama elbette, kodlanmanın başka yolları da var. İşte şimdi sizlerle Arduino ile çalışan Basit Tel Bükme Makinesi için gerekli eksiksiz tam Arduino kodunu paylaşıyoruz:
/*
Arduino ile Basit Tel Bükme Makinası
www.HayaletVeYap.com
Arduino Kütüphanesi:
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;
}
}
Sonunda, tel bükme makinesinin tel doğrultma sisteminin aslında çalışması gerektiği gibi çalışmadığını belirtmek isterim, çünkü teli düzleştirme için kullandığımız bakır ezici yumuşak bir maden olduğu için tam düzgünlük elde edemedik. Bunun yerine demir kullanabilirsiniz.
Bu sorunu çözmek için, bakır borudan farklı, daha güçlü malzemeler kullanmaya çalışabilir veya farklı bir besleme sistemi oluşturabilirsiniz.