Daftar Isi:

Lengan Robot: Jensen: 4 Langkah
Lengan Robot: Jensen: 4 Langkah

Video: Lengan Robot: Jensen: 4 Langkah

Video: Lengan Robot: Jensen: 4 Langkah
Video: How to assemble and control a 4 DOF robot mechanical arm kit with Arduino | Step by step 2024, Oktober
Anonim
Lengan Robot: Jensen
Lengan Robot: Jensen

Jensen adalah lengan robot yang dibangun di atas platform Arduino dengan fokus pada perencanaan gerakan intuitif, dilakukan sebagai proyek independen 1 kredit di bawah bimbingan dari Charles B. Malloch, PhD. Itu dapat mereplikasi serangkaian gerakan yang diprogram dengan menggerakkan lengan secara manual. Saya mendapat inspirasi untuk membangunnya dari melihat lengan robot lain yang dibuat di ruang pembuat UMass Amherst M5. Selanjutnya, saya ingin belajar cara menggunakan perangkat lunak CAD dan saya ingin membuat proyek Arduino tingkat lanjut. Saya melihat ini sebagai kesempatan untuk melakukan semua hal itu.

Langkah 1: Desain dan Cakupan Asli

Desain dan Ruang Lingkup Asli
Desain dan Ruang Lingkup Asli

Perangkat lunak CAD yang saya pilih untuk dipelajari untuk proyek ini adalah OnShape, dan hal pertama yang saya modelkan adalah servo analog HiTec HS-422. Saya memilih servo karena tersedia untuk saya secara lokal dan harganya masuk akal. Ini juga berfungsi sebagai praktik yang baik untuk mempelajari OnShape sebelum beralih ke merancang bagian saya sendiri. Pada titik awal proyek ini, saya memiliki gagasan umum tentang kemampuan yang saya inginkan dari lengan itu. Saya ingin memiliki jangkauan gerak yang layak dan gripper untuk mengambil sesuatu. Spesifikasi umum ini menginformasikan desain saat saya melanjutkan pemodelan dalam CAD. Satu kendala desain lain yang saya miliki saat ini adalah ukuran tempat tidur cetak pada printer 3D saya. Itu sebabnya alas yang Anda lihat pada foto di atas adalah persegi yang relatif primitif.

Selama tahap proyek ini, saya juga melakukan brainstorming bagaimana saya ingin mengendalikan lengan. Satu lengan robot yang saya terinspirasi di ruang pembuat menggunakan lengan boneka untuk kontrol. Yang lain menggunakan metode pemrograman jalur intuitif di mana lengan dipindahkan ke berbagai posisi oleh pengguna. Lengan kemudian akan berputar kembali melalui posisi tersebut.

Rencana awal saya adalah menyelesaikan konstruksi lengan dan kemudian menerapkan kedua metode kontrol ini. Saya juga ingin membuat aplikasi komputer untuk mengendalikannya di beberapa titik setelah itu. Seperti yang mungkin Anda ketahui, saya akhirnya mengurangi ruang lingkup aspek proyek ini. Ketika saya mulai mengerjakan dua metode kontrol pertama itu, saya segera menemukan bahwa pemrograman jalur intuitif lebih rumit daripada yang saya kira. Saat itulah saya memutuskan untuk menjadikannya fokus saya dan menempatkan metode kontrol lainnya pada penangguhan yang tidak terbatas.

Langkah 2: Kontrol

Kontrol
Kontrol

Metode kontrol yang saya pilih bekerja seperti ini: Anda menggerakkan lengan dengan tangan Anda ke berbagai posisi dan "menyimpan" posisi itu. Setiap posisi memiliki informasi tentang sudut antara setiap tautan lengan. Setelah Anda selesai menyimpan posisi, Anda menekan tombol pemutaran dan lengan kembali ke masing-masing posisi tersebut secara berurutan.

Dalam metode kontrol ini, ada banyak hal yang perlu diketahui. Agar setiap servo kembali ke sudut yang disimpan, saya harus "menyimpan" sudut tersebut di tempat pertama. Ini membutuhkan Arduino Uno yang saya gunakan untuk dapat menerima sudut arus dari setiap servo. Teman saya Jeremy Paradie, yang membuat lengan robot yang menggunakan metode kontrol ini, memberi petunjuk kepada saya untuk menggunakan potensiometer internal dari setiap servo hobi. Ini adalah potensiometer yang digunakan servo sendiri untuk mengkodekan sudutnya. Saya memilih servo uji, menyolder kabel ke pin tengah potensiometer internal, dan mengebor lubang di selungkup untuk memberi makan kabel di luar.

Saya sekarang dapat menerima sudut arus dengan membaca tegangan pada pin tengah potensiometer. Namun, ada dua masalah baru. Pertama, terdapat noise berupa lonjakan tegangan pada sinyal yang berasal dari pin tengah. Masalah ini menjadi masalah nyata kemudian. Kedua, rentang nilai untuk mengirim sudut dan menerima sudut berbeda.

Memberitahu motor servo hobi untuk bergerak ke beberapa sudut antara 0 dan 180 derajat melibatkan pengiriman sinyal PWM dengan waktu tinggi yang sesuai dengan sudut. Sebaliknya, menggunakan pin input analog Arduino untuk membaca tegangan pada pin tengah potensiometer sambil menggerakkan tanduk servo antara 0 dan 180 derajat mengembalikan rentang nilai yang terpisah. Oleh karena itu, beberapa matematika diperlukan untuk menerjemahkan nilai input yang disimpan ke dalam nilai output PWM yang sesuai yang diperlukan untuk mengembalikan servo ke sudut yang sama.

Pikiran pertama saya adalah menggunakan peta jangkauan sederhana untuk menemukan PWM keluaran yang sesuai untuk setiap sudut yang disimpan. Ini berhasil, tetapi tidak terlalu tepat. Dalam kasus proyek saya, rentang nilai waktu tinggi PWM yang sesuai dengan rentang sudut 180 derajat jauh lebih besar daripada rentang nilai input analog. Selain itu, kedua rentang ini tidak kontinu dan hanya terdiri dari bilangan bulat. Oleh karena itu ketika saya memetakan nilai input yang disimpan ke nilai output, presisi hilang. Pada titik inilah saya pikir saya membutuhkan loop kontrol untuk mendapatkan servos saya di tempat yang seharusnya.

Saya menulis kode untuk loop kontrol PID di mana inputnya adalah tegangan pin tengah dan outputnya adalah output PWM, tetapi dengan cepat menemukan bahwa saya hanya membutuhkan kontrol integral. Dalam skenario ini, output dan input keduanya mewakili sudut, sehingga menambahkan kontrol proporsional dan derivatif cenderung membuat overshoot atau memiliki perilaku yang tidak diinginkan. Setelah menyetel kontrol integral, masih ada dua masalah. Pertama, jika kesalahan awal antara arus dan sudut yang diinginkan besar, servo akan berakselerasi terlalu cepat. Saya bisa mengurangi konstanta untuk kontrol integral, tapi itu membuat gerakan keseluruhan terlalu lambat. Kedua, gerakannya gelisah. Ini adalah hasil dari gangguan pada sinyal input analog. Loop kontrol terus membaca sinyal ini, sehingga lonjakan tegangan menyebabkan gerakan gelisah. (Pada titik ini saya juga pindah dari satu servo uji saya ke rakitan yang digambarkan di atas. Saya juga membuat objek loop kontrol untuk setiap servo dalam perangkat lunak.)

Saya memecahkan masalah akselerasi yang terlalu cepat dengan memasang filter rata-rata bergerak (EWMA) tertimbang eksponensial pada output. Dengan rata-rata output, lonjakan besar dalam gerakan berkurang (termasuk jitter dari kebisingan). Namun, noise pada sinyal input masih menjadi masalah, jadi tahap selanjutnya dari proyek saya mencoba menyelesaikannya.

Langkah 3: Kebisingan

Kebisingan
Kebisingan

gambar di atas

Merah: sinyal input asli

Warna biru: sinyal input setelah diproses

Langkah pertama dalam mengurangi noise pada sinyal input adalah memahami penyebabnya. Menyelidiki sinyal pada osiloskop mengungkapkan bahwa lonjakan tegangan terjadi pada tingkat 50Hz. Saya kebetulan tahu bahwa sinyal PWM yang dikirim ke servos juga pada kecepatan 50Hz, jadi saya kira lonjakan tegangan ada hubungannya dengan itu. Saya berhipotesis bahwa pergerakan servos entah bagaimana menyebabkan lonjakan tegangan pada pin V+ dari potensiometer, yang pada gilirannya mengacaukan pembacaan pada pin tengah.

Di sinilah saya melakukan upaya pertama saya untuk mengurangi kebisingan. Saya membuka setiap servo lagi dan menambahkan kabel yang berasal dari pin V+ pada potensiometer. Saya membutuhkan lebih banyak input analog untuk membacanya daripada yang dimiliki Arduino Uno, jadi saya juga pindah ke Arduino Mega pada saat ini. Dalam kode saya, saya mengubah input sudut dari pembacaan analog tegangan pada pin tengah menjadi rasio antara tegangan pada pin tengah dengan tegangan pada pin V+. Harapan saya adalah jika ada lonjakan tegangan pada pin, itu akan membatalkan rasio.

Saya mengumpulkan semuanya kembali dan mengujinya, tetapi lonjakan masih terjadi. Apa yang seharusnya saya lakukan pada saat ini adalah menyelidiki tanah saya. Sebagai gantinya, ide saya selanjutnya adalah menempatkan potensiometer pada catu daya yang terpisah seluruhnya. Saya memutuskan kabel V+ dari input analog pada Arduino, dan menghubungkannya ke catu daya terpisah. Saya telah memeriksa pin sebelumnya, jadi saya tahu voltase apa yang memberi daya pada mereka. Saya juga memotong koneksi antara papan kontrol dan pin V+ di setiap servo. Saya menyatukan semuanya kembali, mengembalikan kode input sudut seperti sebelumnya, dan kemudian mengujinya. Seperti yang diharapkan, tidak ada lagi lonjakan tegangan pada pin input. Namun, ada masalah baru - menempatkan potensiometer pada catu daya terpisah benar-benar mengacaukan loop kontrol internal servo. Meskipun pin V+ menerima tegangan yang sama seperti sebelumnya, pergerakan servo tidak menentu dan tidak stabil.

Saya tidak mengerti mengapa ini terjadi, jadi saya akhirnya memeriksa koneksi ground saya di servos. Ada penurunan tegangan rata-rata sekitar 0,3 Volt di seluruh tanah, dan itu melonjak lebih tinggi ketika servos menarik arus. Jelas bagi saya saat itu bahwa pin itu tidak lagi dapat dianggap sebagai "tanah", dan lebih baik dapat digambarkan sebagai pin "referensi". Papan kontrol di servos harus telah mengukur tegangan pada pin tengah potensiometer relatif terhadap tegangan pada V+ dan pin referensi. Menghidupkan potensiometer secara terpisah mengacaukan pengukuran relatif itu karena sekarang alih-alih lonjakan tegangan terjadi pada semua pin, itu hanya terjadi pada pin referensi.

Mentor saya, Dr. Malloch, membantu saya men-debug semua ini dan menyarankan agar saya juga mengukur tegangan pada pin tengah relatif terhadap pin lainnya. Itulah yang saya lakukan untuk upaya ketiga dan terakhir saya dalam mengurangi kebisingan input sudut. Saya membuka setiap servo, memasang kembali kabel yang telah saya potong, dan menambahkan kabel ketiga yang berasal dari pin referensi pada potensiometer. Dalam kode saya, saya membuat input sudut setara dengan ekspresi berikut: (pin tengah - pin referensi) / (V+pin - pin referensi). Saya mengujinya dan berhasil mengurangi efek lonjakan tegangan. Selain itu, saya juga memasang filter EWMA pada input ini. Sinyal yang diproses ini dan sinyal asli digambarkan di atas.

Langkah 4: Mengakhiri Semuanya

Membungkus Semuanya
Membungkus Semuanya

Dengan masalah kebisingan diselesaikan dengan kemampuan terbaik saya, saya mulai memperbaiki dan membuat bagian akhir dari desain. Lengan itu terlalu membebani servo di pangkalan, jadi saya membuat alas baru yang menopang berat lengan menggunakan bantalan besar. Saya juga mencetak gripper dan melakukan sedikit pengamplasan untuk membuatnya bekerja.

Saya sangat senang dengan hasil akhirnya. Perencanaan gerakan intuitif bekerja secara konsisten dan gerakannya halus dan akurat, mempertimbangkan segalanya. Jika orang lain ingin membuat proyek ini, pertama-tama saya akan sangat menganjurkan mereka untuk membuat versi yang lebih sederhana. Kalau dipikir-pikir, membuat sesuatu seperti ini menggunakan motor servo hobi sangat naif, dan kesulitan yang saya alami untuk membuatnya bekerja menunjukkan hal itu. Saya menganggapnya sebagai keajaiban bahwa lengan itu bekerja sebaik itu. Saya masih ingin membuat lengan robot yang dapat berinteraksi dengan komputer, menjalankan program yang lebih kompleks, dan bergerak dengan lebih presisi, jadi untuk proyek berikutnya saya akan melakukannya. Saya akan menggunakan servos robotika digital berkualitas tinggi, dan mudah-mudahan itu akan membuat saya terhindar dari banyak masalah yang saya temui dalam proyek ini.

dokumen CAD:

cad.onshape.com/documents/818ea878dda7ca2f…

Direkomendasikan: