Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Slider Kamera DIY dengan Pan and Tilt Head – Proyek Berbasis Arduino

Dalam tutorial ini kita akan belajar bagaimana membuat slider kamera bermotor dengan pan dan tilt head. Proyek berbasis Arduino ini 100% DIY, dibangun dengan bahan murah seperti MDF dan kayu lapis dan dikendalikan menggunakan Arduino, tiga motor stepper, beberapa tombol dan joystick yang terpasang pada PCB yang dirancang khusus. Meskipun demikian, hasil akhirnya cukup mengesankan, dengan gerakan kamera yang sangat halus memungkinkan kami mendapatkan bidikan sinematik yang terlihat profesional.

Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini.

Ringkasan

Dengan menggunakan pengontrol, kita dapat menggerakkan kamera secara manual atau kita dapat mengatur titik awal dan akhir dan kemudian kamera akan secara otomatis berpindah dari satu posisi ke posisi lainnya. Selain itu, dengan menggunakan lengan pendukung, kita dapat memasang penggeser bahkan pada tripod yang lebih kecil, pada sudut mana pun yang kita inginkan dan tetap mendapatkan gerakan yang stabil.

Untuk memulainya, saya mendesain penggeser menggunakan perangkat lunak pemodelan 3D.

Anda dapat menemukan dan mengunduh model 3D ini dan mendapatkan semua dimensi dari model 3D di bawah, serta menjelajahinya di browser Anda di Thangs.

Unduh model 3D rakitan dari Thangs.

Tautan katrol GT2 Cetak 3D:

 Thingiverse

Membuat penggeser kamera

Jadi saya mulai dengan membuat rel penggeser yang saya gunakan pipa tembaga tick 22mm. Saya memutuskan untuk membuat penggeser sepanjang 1 meter jadi saya memotong dua potong menjadi 1 meter. Pipa tembaga dapat dengan mudah teroksidasi sehingga kita perlu memolesnya dengan semir logam. Dalam kasus saya, saya tidak memilikinya, jadi saya menggunakan pasta gigi untuk tujuan itu.

Ini bukan solusi yang sempurna, namun saya dapat melihat perbedaannya dan membuat pipa sedikit lebih bersih.

Kemudian saya melanjutkan dengan membuat dasar kayu di mana kedua pipa akan dipasang dan juga akan berfungsi untuk memasang slider ke tripod. Dengan menggunakan gergaji bundar, saya memotong dua potong kayu lapis tick 21mm dan merekatkannya menjadi satu untuk mendapatkan satu potongan ticker. Kemudian dengan menggunakan kayu solid saya membuat replika plat dudukan tripod saya dan menempelkannya pada potongan kayu lapis menggunakan lem kayu dan sekrup. Sekarang alas penggeser dapat dengan mudah dipasang pada tripod.

Saya akan memasang rel penggeser ke alas menggunakan batang berulir 8mm jadi saya membuat dua lubang di alasnya dan memasukkan batang panjang 138mm yang sebelumnya saya potong sesuai ukuran. Selanjutnya saya harus mengebor lubang centang 8mm di pipa yang sebenarnya bisa sedikit rumit.

Untuk tujuan itu saya membuat jig sederhana di mana saya mengangkat pensil ke ketinggian 11mm atau itu setengah dari diameter pipa. Kemudian saya mengamankan pipa pada permukaan yang rata dan menggunakan jig yang menandai pipa dari kedua sisi. Hal ini memungkinkan untuk mendapatkan lubang yang tepat dari kedua sisi. Jadi pertama-tama saya menandai titik pengeboran dengan ujung sekrup yang tajam, lalu mengebornya secara bertahap menggunakan mata bor 2, 4, 6, dan 8 mm.

Setelah itu saya memasukkan rel melalui batang berulir dan menggunakan beberapa ring dan mur, saya mengamankannya ke dasar penggeser. Dengan cara yang sama, dengan menggunakan sepotong kayu lapis dan batang berulir, saya memperbaiki ujung rel.

Berikutnya adalah platform geser. Sekali lagi saya menggunakan gergaji bundar untuk memotong papan MDF tick 8mm agar ukurannya sesuai dengan model 3D. Saya juga membuat beberapa lubang 8mm untuk batang berulir di mana bantalan akan dipasang. Untuk merakit platform saya menggunakan lem kayu dan beberapa sekrup. Menggunakan bor tanpa kabel, pertama, saya membuat lubang pilot, lalu membuat penghitung tenggelam dan memasang sekrup 3mm pada tempatnya.

Setelah panel diamankan, saya melanjutkan dengan merakit sistem bantalan. Bantalan yang saya gunakan adalah 608Z dengan diameter luar 22mm. Dua ring dan mur di antara dua bantalan membuat jarak yang cukup di antara keduanya sehingga memungkinkan kontak yang baik dengan rel 22 mm.

Untuk membuat platform lebih aman saat menggunakan penggeser pada suatu sudut, dengan cara yang sama, saya memasukkan dua set bantalan lagi di sisi bawah platform. Pada akhirnya platform geser ternyata bekerja dengan sempurna.

Di sini kita dapat melihat bahwa sekarang ketika memindahkan platform di sepanjang slider pada tripod kecil saya yang tidak berat, kepala tidak dapat menahan berat platform jadi saya harus membuat lengan pendukung untuk menstabilkan slider. Jadi dengan menggunakan dua potong kayu dan beberapa mur dan baut, saya membuat penjepit sederhana yang dapat diikatkan ke salah satu kaki tripod.

Penjepit memiliki baut di mana lengan pendukung dapat diikat. Selanjutnya saya harus membuat slot pada lengan penyangga agar dapat memposisikan slider pada sudut yang berbeda. Saya membuat slot hanya dengan mengebor banyak lubang 6mm berdekatan satu sama lain, dan kemudian menggunakan serak membuat garis lurus yang halus. Sistem pendukung ini akhirnya bekerja dengan sempurna.

Saya melanjutkan build ini dengan menambahkan kaki ke penggeser, jika Anda tidak ingin atau perlu menggunakan tripod. Saya membuatnya dari MDF 8mm. Menggunakan gergaji tangan dan serak, saya dengan mudah mendapatkan bentuk kaki yang diinginkan. Kemudian menggunakan sedikit lem dan dua mur, saya mengencangkannya ke ujung penggeser.

Tahap selanjutnya adalah membangun sistem pan and tilt yang akan dipasang di bagian atas platform geser. Menggunakan gergaji bundar, saya memotong semua bagian yang diperlukan, dengan dimensi yang diambil dari model 3D. Saya menggunakan beberapa potong kayu lapis untuk membuat mekanisme engsel platform leveling untuk kamera saat penggeser diatur pada sudut, serta beberapa papan MDF tempat saya membuat lubang yang sesuai untuk motor dan bantalan untuk sistem panning.

Saya melanjutkan dengan memasang motor stepper dan timing belt untuk platform geser. Di satu sisi platform saya mengamankan motor stepper dengan sepotong papan MDF dan beberapa sekrup dan baut. Dan di sisi lain penggeser saya memasang katrol pemalas jadi sekarang saya bisa memasang sabuk waktu. Dengan menggunakan dua baut dan pengikat ritsleting, saya dengan mudah mengamankan timing belt ke platform geser.

Dengan langkah ini mekanisme geser benar-benar selesai.

Saya melanjutkan dengan membuat bagian atas sistem pan and tilt. Menurut model 3D, saya membuat semua lubang yang sesuai untuk motor stepper dan bantalan, dan merekatkan serta mengencangkan semuanya.

Seorang teman saya 3D mencetak 2 80 katrol gigi untuk saya. Dengan cara ini saya mendapatkan pengurangan kecepatan 5 kali lipat dibandingkan dengan 16 gigi katrol yang terpasang pada motor stepper.

Sekarang saya perlu membuat sabuk waktu loop tertutup sesuai dengan pengaturan saya, jadi saya mengukur berapa panjang sabuk yang saya butuhkan, memotongnya dan kemudian menempelkannya dengan lem CA dan menambahkan selotip di atasnya. Lem CA bekerja sangat baik dengan karet sehingga sabuk loop tertutup bekerja tanpa masalah.

Selanjutnya saya memulai perakitan akhir sistem pan and tilt. Pertama saya mengamankan motor miring menggunakan beberapa baut dan kemudian menambahkan dua bantalan di tempatnya sambil mengamankannya di slot dengan beberapa epoksi. Kemudian saya mengamankan platform kemiringan pada platform panci menggunakan beberapa baut 8mm dan pada saat yang sama saya memasang katrol gigi 80 bersama-sama dengan timing belt.

Di sini saya perhatikan bahwa sabuknya agak longgar tetapi saya menambahkan bantalan kecil di tempat baut motor stepper berfungsi sebagai tensioner sabuk. Hal ini berhasil dan sekarang sabuk memiliki ketegangan yang cukup untuk bekerja dengan baik.

Selanjutnya saya mengamankan motor panci dan menambahkan bantalan di sisi atas platform leveling, serta di sisi bawah. Kemudian saya memasukkan baut melalui mereka, menambahkan bantalan dorong, katrol gigi 80 dan timing belt, dan di atasnya tambahkan kepala kemiringan yang dirakit sebelumnya. Akhirnya saya kencangkan menggunakan baut dan itu saja, dengan langkah ini konstruksi slider selesai.

Diagram Sirkuit

Ok, selanjutnya adalah bagian fun atau pemasangan komponen elektronik. Berikut diagram sirkuit dari proyek penggeser kamera DIY ini.

Jadi ketiga motor stepper NEMA 17 dikendalikan melalui tiga driver stepper A4988. Untuk mengontrol gerakan slider kita menggunakan potensiometer yang terhubung ke input analog Arduino, dan untuk mengontrol pan dan tilt head kita menggunakan modul joystick yang sebenarnya terdiri dari dua potensiometer, sehingga terhubung ke dua input analog. Ada juga potensiometer lain yang digunakan untuk mengatur kecepatan gerakan otomatis dari posisi masuk dan keluar. Posisi masuk dan keluar ini diatur dengan bantuan tombol tekan. Tombol push ini memiliki resistor pull up dan terhubung ke pin digital papan Arduino. Ada juga tombol tekan reset, sakelar daya dan colokan listrik, serta sakelar batas untuk penggeser dan dua LED untuk menunjukkan status masuk dan keluar. Kami dapat menjalankan proyek ini dengan 9 atau 12V.

Anda bisa mendapatkan komponen yang diperlukan untuk proyek ini dari tautan di bawah:

  • Motor Langkah (NEMA17)……….
  • Pengandar Stepper A4988…………….
  • Adaptor 12V 2A…………………..….
  • Joystick …………………………………
  • Power Jack…………….………….……
  • Dewan Arduino ………………………

Desain PCB

Selanjutnya, sesuai dengan diagram sirkuit, saya merancang PCB khusus untuk menjaga komponen elektronik tetap teratur.

Saya melakukannya menggunakan perangkat lunak desain sirkuit online gratis EasyEDA. Sirkuit ini memiliki beberapa koneksi, jadi saya menggunakan lapisan atas dan bawah dan berhasil mendapatkan PCB yang fungsional dan terlihat bagus. Setelah selesai dengan langkah ini saya membuat file Gerber yang dibutuhkan untuk pembuatan PCB. Kemudian saya memesan PCB dari JLCPCB, yang sebenarnya adalah sponsor dari tutorial ini.

Di sini kita cukup mengunggah file Gerber dan setelah diunggah, kita dapat meninjau kembali PCB kita di penampil Gerber. Jika semuanya baik-baik saja maka kita dapat melanjutkan, memilih properti yang kita inginkan untuk PCB kita, dan kemudian kita dapat memesan PCB dengan harga yang wajar. Perhatikan bahwa jika ini adalah pesanan pertama Anda dari JLCPCB, Anda bisa mendapatkan hingga 10 PCB hanya dengan 2 dolar.

Namun demikian, setelah seminggu PCB telah tiba. Kualitas PCB sangat bagus dan harus saya akui cukup memuaskan untuk membuat desain PCB Anda sendiri.

Merakit elektronik

Ok, jadi selanjutnya saya melanjutkan dengan merakit komponen elektronik. Saya mulai dengan menyolder pin header PCB. Ini memungkinkan penyambungan dan pemutusan komponen yang lebih mudah saat dibutuhkan. Saya sebenarnya menggunakan pin header untuk semuanya kecuali kapasitor dan resistor yang saya solder langsung di PCB. Oleh karena itu saya melanjutkan dengan menyolder kabel jumper ke semua komponen elektronik.

Dengan cara ini saya dapat dengan mudah memasang komponen pada casing pengontrol dan pada saat yang sama menghubungkannya ke PCB.

Untuk casing pengontrol, saya memutuskan untuk membuatnya dari akrilik 4mm tick transparan karena saya ingin keindahan semua komponen elektronik terlihat. Saya menggunakan gergaji bundar untuk memotong panel sesuai ukuran. Kemudian menggunakan bor dan bit Forstner saya membuat lubang di panel depan untuk tombol, potensiometer, sakelar daya, dan joystick. Setelah itu menggunakan epoksi 5 menit saya merakit kasing, dan untuk bagian atas saya masukkan dan rekatkan dua baut yang melaluinya panel depan dapat dimasukkan dan diamankan menggunakan mur di atasnya.

Akhirnya saya mulai merakit elektronik dengan memasukkan papan Arduino dan driver stepper A4988 ke PCB. Kemudian saya melanjutkan dengan memasukkan dan mengamankan tombol dan komponen lainnya di panel depan.

Setelah saya mengamankannya, saya menghubungkan komponen ke header pin yang sesuai pada PCB. Di panel samping kasing saya menambahkan colokan listrik, dan kemudian memasukkan PCB ke dalam kasing. Pada panel yang sama juga terdapat lubang tempat saya memasang kabel jumper untuk menghubungkan driver dengan motor stepper, serta limit switch yang saya tempatkan di ujung slider.

Menggunakan beberapa tabung heat-shrink, saya mengatur kabel jumper yang keluar dari kotak pengontrol dan akhirnya, yang tersisa untuk dilakukan adalah menghubungkan pengontrol dengan tiga motor stepper dan sakelar batas.

Untuk menyalakan slider, saya menggunakan tiga baterai Li-ion 3.7V yang dihubungkan secara seri yang menghasilkan sekitar 11V. Dan hanya itu, penggeser sudah selesai dan berfungsi dengan sempurna.

Kode Arduino Penggeser Kamera DIY

Sekarang yang tersisa dalam tutorial ini adalah melihat kode Arduino dan menjelaskan cara kerja program. Karena kodenya sedikit lebih panjang, untuk pemahaman yang lebih baik, saya akan memposting kode sumber program di bagian dengan deskripsi untuk setiap bagian. Dan di akhir artikel ini saya akan memposting source code lengkapnya.

Program ini didasarkan pada perpustakaan AccelStepper oleh Mike McCauley. Ini adalah perpustakaan luar biasa yang memungkinkan kontrol yang mudah dari beberapa motor stepper secara bersamaan. Jadi setelah kita memasukkan library ini dan library MultiStepper.h yang merupakan bagian darinya, kita perlu mendefinisikan semua pin Arduino yang akan digunakan, mendefinisikan instance untuk stepper, serta beberapa variabel yang dibutuhkan 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)

Di bagian penyiapan, kami menetapkan nilai kecepatan awal untuk stepper, menentukan beberapa mode pin, serta menambahkan tiga stepper ke instance kontrol multi stepper yang disebut "StepperControl". Dengan menggunakan loop while kita pindahkan penggeser ke posisi awal, atau geser sampai menekan sakelar batas dan kemudian mundur 200 langkah untuk melepaskan sakelar batas.

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)

Di bagian loop, kita mulai dengan memeriksa apakah slider telah mencapai posisi batas, atau itu adalah sakelar batas 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, kami meningkatkan kecepatan Pan dan Tilt dengan setiap penekanan tombol joystick.

// If Joystick pressed increase the Pan and Tilt speeds
  if (digitalRead(JoySwitch) == 0) {
    currentSpeed = currentSpeed + 50;
    delay(200);
  }Code language: Arduino (arduino)

Kemudian kita cek apakah kita sudah menekan tombol Set yang digunakan untuk mengatur posisi IN dan OUT. Dengan menekan tombol pertama, kami 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 penekanan kedua kami menyimpan posisi KELUAR dan menyalakan LED KELUAR.

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)

Kemudian dengan menekan tombol berikutnya, kita membaca nilai potensiometer kecepatan otomatis yang digunakan untuk mengatur kecepatan maksimum motor. Kami juga menempatkan posisi IN ke dalam larik "gotoposition" yang digunakan dalam fungsi moveTo() yang menghitung kecepatan yang diperlukan untuk semua stepper secara terpisah. Kemudian menggunakan fungsi runSpeedToPosition(), penggeser 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)

Dengan cara yang persis sama, dalam kasus nomor 3 atau dengan menekan tombol lain, kami 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 yang ditekan lebih dari setengah detik, pernyataan kasus ke-4 akan dieksekusi, yang mengatur ulang posisi IN dan OUT sehingga kita dapat mengatur yang baru.

Berikutnya adalah kontrol Pan dan Tilt joystick. Nilai analog yang kita peroleh dari joystick adalah dari 0 hingga 1024, atau ketika diistirahatkan di tengah nilainya sekitar 500. Jadi jika kita memindahkan joystick ke kiri dan nilai analognya lebih besar dari 600, kita akan mengatur kecepatan dari motor tertentu ke positif, dan sebaliknya, dari kita menggerakkan joystick ke kanan, kita akan mengatur kecepatan motor ke negatif, yang berarti akan berputar ke arah yang berlawanan.

// 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 penggeser. Sebenarnya, dalam kasus potensiometer, kami menggunakan nilai analognya untuk juga meningkatkan kecepatan motor saat kami 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 masing-masing dari tiga motor stepper dan yang menjalankan perintah di atas, atau memutar motor dengan tepat.

// Execute the above commands - run the stepper motors
  stepper1.runSpeed();
  stepper2.runSpeed();
  stepper3.runSpeed();Code language: Arduino (arduino)

Berikut source code lengkapnya:

/*
  DIY Camera Slider with Pan and Tilt Head
  by Dejan Nedelkovski
  www.HowToMechatronics.com

  Library - AccelStepper by Mike McCauley:
  http://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)

Jadi itu saja, saya harap Anda menikmati proyek Arduino ini dan belajar sesuatu yang baru. Jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar di bawah dan periksa Koleksi Proyek Arduino saya.


Proses manufaktur

  1. Penggeser Kamera Bermotor yang Dikendalikan Bluetooth Arduino
  2. Membuat Monitor Ambilight Menggunakan Arduino
  3. Sistem Kehadiran Menggunakan Arduino dan RFID dengan Python
  4. Voltmeter DIY Menggunakan Arduino dan Smartphone
  5. Voltmeter DIY dengan Arduino dan Tampilan Nokia 5110
  6. Otomata Seluler berbasis Arduino dan OLED
  7. Penghitung RPM berbasis Arduino dengan algoritma baru dan lebih cepat
  8. Radio FM Menggunakan Arduino dan RDA8057M
  9. Sistem Kehadiran Berbasis Arduino dan Google Spreadsheet
  10. Cara membuat musik dengan Arduino