Slider Kamera Motoris DIY dengan Pan & Tilt – Proyek Arduino
Dalam tutorial ini kita akan mempelajari cara membuat slider kamera motoris dengan head pan dan tilt. Proyek berbasis Arduino ini 100% DIY, dibangun dengan bahan murah seperti MDF dan multiplex, dan dikontrol menggunakan Arduino, tiga motor stepper, beberapa tombol, serta joystick yang dipasang pada PCB dirancang sendiri. Meskipun demikian, hasil akhirnya cukup mengesankan, dengan gerakan kamera yang sangat halus yang memungkinkan kita mendapatkan gambar sinematis dengan tampilan profesional.
Anda dapat menonton video berikut atau membaca tutorial tertulis di bawahnya.
Ringkasan
Menggunakan pengontrol, kita dapat memindahkan kamera secara manual atau menetapkan titik awal dan akhir, lalu kamera akan secara otomatis bergerak dari satu posisi ke posisi lainnya. Selain itu, menggunakan bantang pendukung, kita dapat memasang slider bahkan pada tripod kecil, dengan sudut apa pun yang diinginkan, dan tetap mendapatkan gerakan yang stabil.
Untuk memulai, saya merancang slider menggunakan perangkat lunak pemodelan 3D.
Anda dapat menemukan dan mengunduh model 3D ini serta mendapatkan semua dimensi dari model 3D di bawahnya, dan menjelajahnya di browser Anda melalui Thangs.
Unduh model 3D rangkaian dari Thangs.
Taut puli GT2 hasil cetak 3D:
Thingiverse
Membangun Slider Kamera
Jadi saya memulai dengan pembuatan rel slider untuk itu saya menggunakan pipa tembaga tebal 22mm. Saya memutuskan untuk membuat slider sepanjang 1 meter sehingga saya memotong dua potongan sepanjang 1 meter. Pipa tembaga mudah teroksidasi oleh karena itu kita perlu memolesnya dengan poles logam. Dalam kasus saya, saya tidak memilikinya jadi saya menggunakan pasta gigi untuk tujuan itu.
Ini bukan solusi yang sempurna tetapi saya masih bisa melihat perbedaan dan pipa menjadi sedikit lebih bersih.
Selanjutnya saya melanjutkan dengan pembuatan dasar kayu di mana dua pipa akan dipasang dan juga akan berfungsi untuk memasang slider pada tripod. Menggunakan gergaji bundar saya memotong dua potongan multiplex tebal 21mm dan merekatkan mereka bersama-sama untuk mendapatkan satu potongan yang lebih tebal. Selanjutnya menggunakan kayu solid saya membuat replika papan pemasangan tripod saya dan memasangnya pada potongan multiplex menggunakan lem kayu dan baut. Sekarang dasar slider dapat dengan mudah dipasang pada tripod.
Saya akan memasang rel slider ke dasar menggunakan baut berulir 8mm jadi saya membuat dua lubang di dasar dan memasang baut berulir panjang 138mm yang sebelumnya saya potong menurut ukuran. Selanjutnya saya harus membuat lubang tebal 8mm di pipa yang sebenarnya bisa sedikit sulit.
Untuk tujuan itu saya membuat jig sederhana di mana saya mengangkat pensil ke ketinggian 11mm atau setengah diameter pipa. Kemudian saya mengamankan pipa pada permukaan datar dan menggunakan jig untuk menandai pipa dari kedua sisi. Ini memungkinkan untuk mendapatkan lubang yang teratur dengan tepat dari kedua sisi. Jadi pertama saya menandai titik bor dengan ujung baut yang tajam dan kemudian saya bor secara bertahap menggunakan bor 2, 4, 6 dan 8mm.
Setelah itu saya memasang rel melalui baut berulir dan menggunakan beberapa pelapis dan baut saya mengamankannya ke dasar slider. Dengan cara yang sama, menggunakan potongan multiplex dan baut berulir saya memasang ujung rel.
Selanjutnya adalah platform geser. Lagi saya menggunakan gergaji bundar untuk memotong papan MDF tebal 8mm menurut ukuran dari model 3D. Saya juga membuat beberapa lubang 8mm untuk baut berulir yang akan dipasang bearing. Untuk merakit platform saya menggunakan lem kayu dan beberapa baut. Menggunakan bor nirkabel, pertama saya membuat lubang pilot, kemudian membuat lubang bersenakan dan memasang baut 3mm ke tempatnya.
Setelah panel diamankan saya melanjutkan dengan merakit sistem bearing. Bearing yang saya gunakan adalah 608Z dengan diameter luar 22mm. Dua pelapis dan baut antara dua bearing memberikan jarak yang cukup di antara mereka sehingga memungkinkan kontak yang baik dengan rel 22mm.
Untuk membuat platform lebih aman saat menggunakan slider dengan sudut, dengan cara yang sama, saya memasang dua set bearing tambahan di sisi bawah platform. Akhirnya platform geser terbukti bekerja dengan sempurna.
Di sini kita dapat memperhatikan bahwa sekarang saat memindahkan platform sepanjang slider pada tripod kecil saya, yang bukan beban berat, head tidak dapat menahan bobot platform jadi saya harus membuat bantang pendukung untuk menstabilkan slider. Jadi menggunakan dua potongan kayu dan beberapa baut dan baut saya membuat klip sederhana yang dapat dipasang ke salah satu kaki tripod.
Klip memiliki baut yang dapat digunakan untuk memasang bantang pendukung. Selanjutnya saya harus membuat slot pada bantang pendukung untuk dapat memosisikan slider dengan sudut berbeda. Saya membuat slot dengan cara bor banyak lubang 6mm yang berdekatan, dan kemudian menggunakan ras untuk membuat garis lurus halus. Sistem pendukung ini berakhir bekerja dengan sempurna.
Saya melanjutkan pembangunan ini dengan menambahkan kaki ke slider, jika Anda tidak ingin atau tidak perlu menggunakan tripod. Saya membuatnya dari MDF 8mm. Menggunakan gergaji tangan dan ras saya dengan mudah mendapatkan bentuk kaki yang diinginkan. Selanjutnya menggunakan sedikit lem dan dua baut saya mengamankannya ke ujung slider.
Tahap selanjutnya adalah membangun sistem pan dan tilt yang akan dipasang di atas platform geser. Menggunakan gergaji bundar, saya memotong semua potongan yang diperlukan, dengan dimensi yang diambil dari model 3D. Saya menggunakan beberapa potongan multiplex untuk membuat mekanisme selang dari platform leveling untuk kamera ketika slider disetel dengan sudut, serta beberapa papan MDF di mana saya membuat lubang yang sesuai untuk motor dan bearing untuk sistem panning.
Saya melanjutkan dengan pemasangan motor stepper dan sabuk timing untuk platform geser. Di satu sisi platform saya memasang motor stepper dengan potongan papan MDF dan beberapa baut dan baut. Dan di sisi lain slider saya memasang puli pengendali jadi sekarang saya dapat memasang sabuk timing. Menggunakan dua baut dan ikat kabel saya dengan mudah mengamankan sabuk timing ke platform geser.
Dengan langkah ini mekanisme geser selesai sepenuhnya.
Saya melanjutkan dengan pembuatan bagian atas sistem pan dan tilt. Menurut model 3D, saya membuat semua lubang yang sesuai untuk motor stepper dan bearing, dan melekat dan memasang semuanya bersama-sama.
Sahabat saya mencetak 3D 2 puli 80 gigi untuk saya. Dengan cara ini saya mendapatkan reduksi kecepatan 5 kali lipat relatif terhadap puli 16 gigi yang dipasang pada motor stepper.
Sekarang saya perlu membuat sabuk timing loop tertutup sesuai pengaturan saya, jadi saya mengukur seberapa panjang sabuk yang saya butuhkan, memotongnya dan kemudian cukup melekatkannya dengan lem CA dan menambahkan potongan lembar di atasnya. Lem CA bekerja sangat baik dengan karet jadi sabuk loop tertutup bekerja tanpa masalah.
Selanjutnya saya memulai rangkaian akhir dari sistem pan dan tilt. Pertama saya memasang motor tilt menggunakan beberapa baut dan kemudian menambahkan dua bearing ke tempatnya sambil mengamankannya di slot dengan beberapa epoksi. Kemudian saya memasang platform tilt pada platform pan menggunakan beberapa baut 8mm dan pada saat yang sama saya memasang puli 80 gigi padanya bersama dengan sabuk timing.
Di sini saya memperhatikan bahwa sabuk sedikit longgar tetapi saya menambahkan bearing kecil di tempat baut motor stepper berfungsi sebagai penegangan sabuk. Hal ini berhasil dan jadi sekarang sabuk memiliki cukup tegangan untuk bekerja dengan baik.
Selanjutnya saya memasang motor pan dan menambahkan bearing di sisi atas platform leveling, serta di sisi bawah. Kemudian saya memasukkan baut melalui mereka, menambahkan bearing dorong, puli 80 gigi dan sabuk timing, dan di atasnya menambahkan head tilt yang telah dirakit sebelumnya. Akhirnya saya mengamankannya menggunakan baut dan itu saja, dengan langkah ini konstruksi slider selesai.
Diagram Rangkaian
Oke, selanjutnya bagian menyenangkan atau pemasangan komponen elektronik. Berikut adalah diagram rangkaian dari proyek slider kamera DIY ini.
Jadi tiga motor stepper NEMA 17 dikontrol melalui tiga driver stepper A4988. Untuk mengontrol gerakan slider kita menggunakan potensiometer yang terhubung ke input analog Arduino, dan untuk mengontrol head pan dan tilt kita menggunakan modul joystick yang sebenarnya terdiri dari dua potensiometer, jadi terhubung ke dua input analog. Ada juga potensiometer lain yang digunakan untuk mengatur kecepatan gerakan otomatis dari posisi in dan out. Posisi in dan out ini diatur dengan bantuan tombol tekan. Tombol tekan ini memiliki resistor pull up dan terhubung ke pin digital pada papan Arduino. Ada juga tombol reset, saklar daya dan soket daya, serta limit switch untuk slider dan dua LED untuk menunjukkan status in dan out. Kita dapat menyuayi proyek ini dengan 9 atau 12V.
Anda dapat mendapatkan komponen yang diperlukan untuk proyek ini dari tautan di bawah ini:
Motor Stepper (NEMA17)……….
Driver Stepper A4988…………….
Adapter 12V 2A…………………..….
Joystick …………………………………
Soket Daya…………….………….……
Papan Arduino ………………………
Desain PCB
Selanjutnya, sesuai diagram rangkaian saya merancang PCB kustom untuk menjaga komponen elektronik tetap terorganisir.
Saya melakukannya menggunakan perangkat lunak desain rangkaian online gratis EasyEDA. Rangkaian memiliki cukup banyak koneksi, jadi saya menggunakan lapisan atas dan bawah dan berhasil mendapatkan PCB yang fungsional dan tampak bagus. Setelah selesai dengan langkah ini saya menghasilkan file Gerber yang diperlukan untuk manufaktur PCB. Kemudian saya memesan PCB dari JLCPCB, yang sebenarnya adalah sponsor tutorial ini.
Di sini kita cukup mengunggah file Gerber dan setelah diunggah kita dapat meninjau PCB kita lagi di Gerber viewer. Jika semuanya baik maka kita dapat melanjutkan, memilih properti yang kita inginkan untuk PCB kita, dan kemudian kita dapat memesan PCB dengan harga yang wajar. Perhatikan jika ini adalah pesanan pertama Anda dari JLCPCB, Anda bisa mendapatkan hingga 10 PCB hanya dengan 2 dolar.
Meskipun demikian, setelah seminggu PCB telah tiba. Kualitas PCB sangat bagus dan saya harus mengakui bahwa sangat memuaskan memiliki desain PCB sendiri yang diproduksi.
Merakit Komponen Elektronik
Oke, jadi selanjutnya saya melanjutkan dengan merakit komponen elektronik. Saya memulai dengan memasang pin header pada PCB. Ini memungkinkan pemasangan dan pemasangan ulang komponen dengan lebih mudah saat diperlukan. Saya sebenarnya menggunakan pin header untuk semuanya kecuali kapasitor dan resistor yang saya pasang langsung pada PCB. Oleh karena itu saya melanjutkan dengan memasang kabel jumper ke semua komponen elektronik.
Dengan cara ini saya dapat dengan mudah memasang komponen pada kotak pengontrol dan pada saat yang sama menghubungkannya ke PCB.
Seperti yang diketahui, untuk kotak pengontrol, saya memutuskan untuk membuatnya dari akrilik transparan tebal 4mm karena saya ingin keindahan semua komponen elektronik terlihat. Saya menggunakan gergaji bundar untuk memotong panel untuk kotak menurut ukuran. Kemudian menggunakan bor dan bor Forstner saya membuat pembukaan pada panel depan untuk tombol, potensiometer, saklar daya dan joystick. Setelah itu menggunakan epoksi 5 menit saya merakit kotak, dan untuk bagian atas saya memasukkan dan melekat dua baut yang melalui panel depan dapat dimasukkan dan diamankan dengan baut di atasnya.
Akhirnya saya memulai merakit elektronik dengan memasukkan papan Arduino dan driver stepper A4988 ke PCB. Kemudian saya melanjutkan dengan memasukkan dan mengamankan tombol dan komponen lain pada panel depan.
Setelah saya mengamankannya saya menghubungkan komponen ke pin header yang sesuai pada PCB. Di panel sisi kotak saya menambahkan soket daya, dan kemudian memasukkan PCB ke dalam kotak. Di panel yang sama juga terdapat lubang yang melalui saya memasukkan kabel jumper untuk menghubungkan driver dengan motor stepper, serta limit switch yang saya tempatkan di ujung slider.
Menggunakan beberapa tabung susut saya mengatur kabel jumper yang keluar dari kotak pengontrol dan akhirnya, yang tersisa dilakukan adalah menghubungkan pengontrol dengan tiga motor stepper dan limit switch.
Seperti yang diketahui, untuk menyuayi slider saya menggunakan tiga baterai Li-ion 3.7V yang disusun secara beruntun menghasilkan sekitar 11V. Dan itu saja, slider selesai dan bekerja dengan sempurna.
Kode Arduino Slider Kamera DIY
Sekarang yang tersisa dalam tutorial ini adalah untuk melihat kode Arduino dan menjelaskan bagaimana program bekerja. Karena kode cukup panjang, untuk pemahaman yang lebih baik, saya akan memposting kode sumber program dalam bagian-bagian dengan deskripsi untuk setiap bagian. Dan di akhir artikel ini saya akan memposting kode sumber lengkap.
Program didasarkan pada library AccelStepper oleh Mike McCauley. Ini adalah library luar biasa yang memungkinkan kontrol mudah beberapa motor stepper secara bersamaan. Jadi setelah kita menyertakan library ini dan library MultiStepper.h yang merupakan bagian darinya, kita perlu menentukan semua pin Arduino yang akan digunakan, mendefinisikan instance untuk steppers, serta beberapa variabel yang diperlukan untuk program di bawah ini.
#include <AccelStepper.h> #include <MultiStepper.h> #define JoyX A0 // Joystick X pin #define JoyY A1 // Joystick Y pin #define slider A2 // Slider potentiometer #define inOutPot A3 // In and Out speed potentiometer #define JoySwitch 10 // Joystick switch connected #define InOutSet 12 // Set Button #define limitSwitch 11 #define inLED 8 #define outLED 9 // Define the stepper motors and the pins the will use AccelStepper stepper1(1, 7, 6); // (Type:driver, STEP, DIR) AccelStepper stepper2(1, 5, 4); AccelStepper stepper3(1, 3, 2); MultiStepper StepperControl; // Create instance of MultiStepper long gotoposition[3]; // An array to store the In or Out position for each stepper motor int JoyXPos = 0; int JoyYPos = 0; int sliderPos = 0; int currentSpeed = 100; int inOutSpeed = 100; int XInPoint = 0; int YInPoint = 0; int ZInPoint = 0; int XOutPoint = 0; int YOutPoint = 0; int ZOutPoint = 0; int InandOut = 0;Code language: Arduino (arduino)
Dalam bagian setup kita mengatur nilai kecepatan awal untuk steppers, menentukan beberapa mode pin, serta menambahkan tiga steppers ke instance multi stepper control yang disebut "StepperControl". Menggunakan loop while kita memindahkan slider ke posisi awal, atau bergerak hingga menekan limit switch lalu bergerak kembali 200 langkah untuk melepaskan limit switch.
void setup() { // Set initial seed values for the steppers stepper1.setMaxSpeed(3000); stepper1.setSpeed(200); stepper2.setMaxSpeed(3000); stepper2.setSpeed(200); stepper3.setMaxSpeed(3000); stepper3.setSpeed(200); pinMode(JoySwitch, INPUT_PULLUP); pinMode(InOutSet, INPUT_PULLUP); pinMode(limitSwitch, INPUT_PULLUP); pinMode(inLED, OUTPUT); pinMode(outLED, OUTPUT); // Create instances for MultiStepper - Adding the 3 steppers to the StepperControl instance for multi control StepperControl.addStepper(stepper1); StepperControl.addStepper(stepper2); StepperControl.addStepper(stepper3); // Move the slider to the initial position - homing while (digitalRead(limitSwitch) != 0) { stepper1.setSpeed(3000); stepper1.runSpeed(); stepper1.setCurrentPosition(0); // When limit switch pressed set position to 0 steps } delay(20); // Move 200 steps back from the limit switch while (stepper1.currentPosition() != -200) { stepper1.setSpeed(-3000); stepper1.run(); } }Code language: Arduino (arduino)
Dalam bagian loop kita memulai dengan memeriksa apakah slider telah mencapai posisi batas, atau limit switch atau 80cm di sisi lain.
// Limiting the movement - Do nothing if limit switch pressed or distance traveled in other direction greater then 80cm while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < -64800) {}Code language: Arduino (arduino)
Dengan pernyataan if berikutnya kita meningkatkan kecepatan Pan dan Tilt dengan setiap tekanan tombol joystick.
// If Joystick pressed increase the Pan and Tilt speeds if (digitalRead(JoySwitch) == 0) { currentSpeed = currentSpeed + 50; delay(200); }Code language: Arduino (arduino)
Selanjutnya kita memeriksa apakah kita telah menekan tombol Set, yang digunakan untuk mengatur posisi IN dan OUT. Dengan tekanan pertama tombol kita menyimpan posisi IN dari motor stepper dan juga menyalakan LED IN.
switch (InandOut) { case 0: // Set IN position InandOut = 1; XInPoint = stepper1.currentPosition(); // Set the IN position for steppers 1 YInPoint = stepper2.currentPosition(); // Set the IN position for steppers 2 ZInPoint = stepper3.currentPosition(); // Set the IN position for steppers 3 digitalWrite(inLED, HIGH); // Light up inLed break;Code language: Arduino (arduino)
Dengan cara yang sama, dengan tekanan kedua kita menyimpan posisi OUT dan menyalakan LED OUT.
case 1: // Set OUT position InandOut = 2; XOutPoint = stepper1.currentPosition(); // Set the OUT Points for both steppers YOutPoint = stepper2.currentPosition(); ZOutPoint = stepper3.currentPosition(); digitalWrite(outLED, HIGH); break;Code language: Arduino (arduino)
Selanjutnya dengan tekanan tombol berikutnya, kita membaca nilai potensiometer kecepatan otomatis yang digunakan untuk mengatur kecepatan maksimal motor. Selain itu kita memasukkan posisi IN ke dalam array "gotoposition" yang digunakan dalam fungsi moveTo() yang menghitung kecepatan yang diperlukan untuk semua steppers secara terpisah. Kemudian menggunakan fungsi runSpeedToPosition() slider secara otomatis bergerak ke posisi In.
case 2: // Move to IN position / go to case 3 InandOut = 3; inOutSpeed = analogRead(inOutPot); // Auto speed potentiometer // Place the IN position into the Array gotoposition[0] = XInPoint; gotoposition[1] = YInPoint; gotoposition[2] = ZInPoint; stepper1.setMaxSpeed(inOutSpeed); stepper2.setMaxSpeed(inOutSpeed); stepper3.setMaxSpeed(inOutSpeed); StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors StepperControl.runSpeedToPosition(); // Blocks until all steppers are in position delay(200); break;Code language: Arduino (arduino)
Sama persis dengan cara yang sama, dalam kasus nomor 3 atau dengan tekanan tombol lainnya, kita memindahkan slider ke posisi OUT.
case 3: // Move to OUT position / go back to case 2 InandOut = 2; inOutSpeed = analogRead(inOutPot); // Place the OUT position into the Array gotoposition[0] = XOutPoint; gotoposition[1] = YOutPoint; gotoposition[2] = ZOutPoint; stepper1.setMaxSpeed(inOutSpeed); stepper2.setMaxSpeed(inOutSpeed); stepper3.setMaxSpeed(inOutSpeed); StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors StepperControl.runSpeedToPosition(); // Blocks until all are in position delay(200); break;Code language: Arduino (arduino)
Jika kita menahan tombol Set lebih dari setengah detik, pernyataan case ke-4 akan dieksekusi, yang mereset posisi IN dan OUT sehingga kita dapat menetapkan yang baru.
Selanjutnya adalah kontrol Pan dan Tilt joystick. Nilai analog yang kita peroleh dari joystick adalah dari 0 hingga 1024, atau saat berada di tengah nilai sekitar 500. Jadi jika kita memindahkan joystick ke kiri dan nilai analog lebih besar dari 600, kita akan mengatur kecepatan motor tertentu menjadi positif, dan sebaliknya, jika kita memindahkan joystick ke kanan, kita akan mengatur kecepatan motor menjadi negatif, yang berarti akan berputar ke arah sebaliknya.
// Joystick X - Pan movement JoyXPos = analogRead(JoyX); // if Joystick is moved left, move stepper 2 or pan to left if (JoyXPos > 600) { stepper2.setSpeed(currentSpeed); } // if Joystick is moved right, move stepper 2 or pan to right else if (JoyXPos < 400) { stepper2.setSpeed(-currentSpeed); } // if Joystick stays in middle, no movement else { stepper2.setSpeed(0); }Code language: Arduino (arduino)
Jika tetap di tengah, kecepatan diatur ke 0. Metode ini digunakan untuk kedua sumbu joystick serta potensiometer slider. Sebenarnya, dalam kasus potensiometer kita menggunakan nilai analognya untuk juga meningkatkan kecepatan motor saat kita memutar potensiometer lebih jauh.
// Slider potentiometer sliderPos = analogRead(slider); // If potentiometer is turned left, move slider left if (sliderPos > 600) { sliderPos = map(sliderPos, 600, 1024, 0, 3000); stepper1.setSpeed(sliderPos); // Increase speed as turning } // If potentiometer is turned right, move slider right else if (sliderPos < 400 ) { sliderPos = map(sliderPos, 400, 0, 0, 3000); stepper1.setSpeed(-sliderPos); // Increase speed as turning } // If potentiometer in middle, no movement else { stepper1.setSpeed(0); }Code language: Arduino (arduino)
Terakhir, kita memanggil fungsi runSpeed() untuk setiap dari tiga motor stepper dan itu menjalankan perintah di atas, atau memutar motor dengan sesuai.
// Execute the above commands - run the stepper motors stepper1.runSpeed(); stepper2.runSpeed(); stepper3.runSpeed();Code language: Arduino (arduino)
Berikut adalah kode sumber lengkap:
/* DIY Camera Slider with Pan and Tilt Head by Dejan Nedelkovski www.HowToMechatronics.com Library - AccelStepper by Mike McCauley: https://www.airspayce.com/mikem/arduino/AccelStepper/index.html */ #include <AccelStepper.h> #include <MultiStepper.h> #define JoyX A0 // Joystick X pin #define JoyY A1 // Joystick Y pin #define slider A2 // Slider potentiometer #define inOutPot A3 // In and Out speed potentiometer #define JoySwitch 10 // Joystick switch connected #define InOutSet 12 // Set Button #define limitSwitch 11 #define inLED 8 #define outLED 9 // Define the stepper motors and the pins the will use AccelStepper stepper1(1, 7, 6); // (Type:driver, STEP, DIR) AccelStepper stepper2(1, 5, 4); AccelStepper stepper3(1, 3, 2); MultiStepper StepperControl; // Create instance of MultiStepper long gotoposition[3]; // An array to store the In or Out position for each stepper motor int JoyXPos = 0; int JoyYPos = 0; int sliderPos = 0; int currentSpeed = 100; int inOutSpeed = 100; int XInPoint = 0; int YInPoint = 0; int ZInPoint = 0; int XOutPoint = 0; int YOutPoint = 0; int ZOutPoint = 0; int InandOut = 0; void setup() { // Set initial seed values for the steppers stepper1.setMaxSpeed(3000); stepper1.setSpeed(200); stepper2.setMaxSpeed(3000); stepper2.setSpeed(200); stepper3.setMaxSpeed(3000); stepper3.setSpeed(200); pinMode(JoySwitch, INPUT_PULLUP); pinMode(InOutSet, INPUT_PULLUP); pinMode(limitSwitch, INPUT_PULLUP); pinMode(inLED, OUTPUT); pinMode(outLED, OUTPUT); // Create instances for MultiStepper - Adding the 3 steppers to the StepperControl instance for multi control StepperControl.addStepper(stepper1); StepperControl.addStepper(stepper2); StepperControl.addStepper(stepper3); // Move the slider to the initial position - homing while (digitalRead(limitSwitch) != 0) { stepper1.setSpeed(3000); stepper1.runSpeed(); stepper1.setCurrentPosition(0); // When limit switch pressed set position to 0 steps } delay(20); // Move 200 steps back from the limit switch while (stepper1.currentPosition() != -200) { stepper1.setSpeed(-3000); stepper1.run(); } } void loop() { // Limiting the movement - Do nothing if limit switch pressed or distance traveled in other direction greater then 80cm while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < -64800) {} // If Joystick pressed increase the Pan and Tilt speeds if (digitalRead(JoySwitch) == 0) { currentSpeed = currentSpeed + 50; delay(200); } // If Set button is pressed - toggle between the switch cases if (digitalRead(InOutSet) == 0) { delay(500); // If we hold set button pressed longer then half a second, reset the in and out positions if (digitalRead(InOutSet) == 0) { InandOut = 4; } switch (InandOut) { case 0: // Set IN position InandOut = 1; XInPoint = stepper1.currentPosition(); // Set the IN position for steppers 1 YInPoint = stepper2.currentPosition(); // Set the IN position for steppers 2 ZInPoint = stepper3.currentPosition(); // Set the IN position for steppers 3 digitalWrite(inLED, HIGH); // Light up inLed break; case 1: // Set OUT position InandOut = 2; XOutPoint = stepper1.currentPosition(); // Set the OUT Points for both steppers YOutPoint = stepper2.currentPosition(); ZOutPoint = stepper3.currentPosition(); digitalWrite(outLED, HIGH); break; case 2: // Move to IN position / go to case 3 InandOut = 3; inOutSpeed = analogRead(inOutPot); // Auto speed potentiometer // Place the IN position into the Array gotoposition[0] = XInPoint; gotoposition[1] = YInPoint; gotoposition[2] = ZInPoint; stepper1.setMaxSpeed(inOutSpeed); stepper2.setMaxSpeed(inOutSpeed); stepper3.setMaxSpeed(inOutSpeed); StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors StepperControl.runSpeedToPosition(); // Blocks until all steppers are in position delay(200); break; case 3: // Move to OUT position / go back to case 2 InandOut = 2; inOutSpeed = analogRead(inOutPot); // Place the OUT position into the Array gotoposition[0] = XOutPoint; gotoposition[1] = YOutPoint; gotoposition[2] = ZOutPoint; stepper1.setMaxSpeed(inOutSpeed); stepper2.setMaxSpeed(inOutSpeed); stepper3.setMaxSpeed(inOutSpeed); StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors StepperControl.runSpeedToPosition(); // Blocks until all are in position delay(200); break; case 4: // If Set button is held longer then half a second go back to case 0 InandOut = 0; digitalWrite(inLED, LOW); digitalWrite(outLED, LOW); delay(1000); break; } } // Joystick X - Pan movement JoyXPos = analogRead(JoyX); // if Joystick is moved left, move stepper 2 or pan to left if (JoyXPos > 600) { stepper2.setSpeed(currentSpeed); } // if Joystick is moved right, move stepper 2 or pan to right else if (JoyXPos < 400) { stepper2.setSpeed(-currentSpeed); } // if Joystick stays in middle, no movement else { stepper2.setSpeed(0); } //Joystick Y - Tilt movement JoyYPos = analogRead(JoyY); if (JoyYPos > 600) { stepper3.setSpeed(currentSpeed); } else if (JoyYPos < 400) { stepper3.setSpeed(-currentSpeed); } else { stepper3.setSpeed(0); } // Slider potentiometer sliderPos = analogRead(slider); // If potentiometer is turned left, move slider left if (sliderPos > 600) { sliderPos = map(sliderPos, 600, 1024, 0, 3000); stepper1.setSpeed(sliderPos); // Increase speed as turning } // If potentiometer is turned right, move slider right else if (sliderPos < 400 ) { sliderPos = map(sliderPos, 400, 0, 0, 3000); stepper1.setSpeed(-sliderPos); // Increase speed as turning } // If potentiometer in middle, no movement else { stepper1.setSpeed(0); } // Execute the above commands - run the stepper motors stepper1.runSpeed(); stepper2.runSpeed(); stepper3.runSpeed(); }Code language: Arduino (arduino)
Itu saja, saya harap Anda menikmati proyek Arduino ini dan mempelajari hal baru. Jangan ragu untuk bertanya di bagian komentar di bawah dan cek Koleksi Proyek Arduino saya.