Isi kandungan:

Lengan Robotik: Jensen: 4 Langkah
Lengan Robotik: Jensen: 4 Langkah

Video: Lengan Robotik: Jensen: 4 Langkah

Video: Lengan Robotik: Jensen: 4 Langkah
Video: Robot lengan (ARM) automatic kontrol 4 DOF (Degree of freedom) 2024, Oktober
Anonim
Lengan Robotik: Jensen
Lengan Robotik: Jensen

Jensen adalah lengan robot yang dibina di platform Arduino dengan fokus pada perancangan gerak intuitif, yang dilakukan sebagai projek bebas kredit 1 di bawah bimbingan dari Charles B. Malloch, PhD. Ia dapat meniru rangkaian pergerakan yang diprogramkan dengan menggerakkan lengan secara manual. Saya mendapat inspirasi untuk membinanya dengan melihat senjata robotik lain yang dibina di ruang pembuat UMass Amherst M5. Tambahan pula, saya ingin belajar bagaimana menggunakan perisian CAD dan saya ingin membuat projek Arduino yang maju. Saya melihat ini sebagai peluang untuk melakukan semua perkara itu.

Langkah 1: Reka Bentuk dan Skop Asal

Reka Bentuk dan Skop Asal
Reka Bentuk dan Skop Asal

Perisian CAD yang saya pilih untuk belajar untuk projek ini adalah OnShape, dan perkara pertama yang saya modelkan adalah servo analog HiTec HS-422. Saya memilih servo kerana ia tersedia untuk saya secara tempatan dan harganya berpatutan. Ini juga menjadi amalan yang baik untuk belajar OnShape sebelum beralih ke merancang bahagian saya sendiri. Pada peringkat awal projek ini, saya mempunyai idea umum mengenai apa yang saya mahukan. Saya mahukan ia mempunyai gerakan yang baik dan pegangan untuk mengambil barang. Spesifikasi umum ini memberitahu reka bentuk ketika saya terus memodelkannya dalam CAD. Satu kekangan reka bentuk lain yang saya hadapi ketika ini adalah ukuran cetakan pada pencetak 3D saya. Itulah sebabnya asas yang anda lihat dalam foto di atas adalah segi empat tepat.

Semasa peringkat projek ini, saya juga melakukan sumbang saran bagaimana saya mahu mengawal lengan. Satu lengan robot yang saya terinspirasi oleh ruang pembuat menggunakan lengan boneka untuk kawalan. Yang lain menggunakan kaedah pengaturcaraan jalur intuitif di mana lengan dipindahkan ke pelbagai posisi oleh pengguna. Lengan kemudian akan memutar kembali kedudukan tersebut.

Rancangan asal saya adalah untuk menyelesaikan pembinaan lengan dan kemudian melaksanakan kedua-dua kaedah kawalan ini. Saya juga ingin membuat aplikasi komputer untuk mengendalikannya pada satu ketika selepas itu. Seperti yang anda tahu, saya akhirnya mengurangkan skop aspek projek ini. Semasa saya mula menggunakan dua kaedah kawalan pertama, saya dengan cepat mendapati bahawa pengaturcaraan jalan intuitif lebih rumit daripada yang saya sangka. Ketika itulah saya memutuskan untuk menjadikannya fokus saya dan menggunakan kaedah kawalan lain untuk sementara waktu.

Langkah 2: Kawal

Kawal
Kawal

Kaedah kawalan yang saya pilih berfungsi seperti ini: anda menggerakkan lengan dengan tangan anda ke pelbagai posisi dan "simpan" kedudukan tersebut. Setiap kedudukan mempunyai maklumat mengenai sudut antara setiap pautan lengan. Setelah selesai menyimpan kedudukan, anda menekan butang main balik dan lengan kembali ke setiap posisi tersebut mengikut urutan.

Dalam kaedah kawalan ini, ada banyak perkara yang perlu difahami. Agar setiap servo kembali ke sudut yang disimpan, saya harus entah bagaimana "menyimpan" sudut tersebut dari awal. Ini memerlukan Arduino Uno yang saya gunakan untuk dapat menerima sudut semasa setiap servo. Rakan saya Jeremy Paradie, yang membuat lengan robot yang menggunakan kaedah kawalan ini, memberi petunjuk kepada saya untuk menggunakan potensiometer dalaman setiap servo hobi. Ini adalah potensiometer yang digunakan servo untuk mengekodkan sudut. Saya memilih servo ujian, menyolder wayar ke pin tengah potensiometer dalaman, dan mengebor lubang di kandang untuk memberi makan wayar di luar.

Saya sekarang dapat menerima sudut semasa dengan membaca voltan pada pin tengah potensiometer. Namun, terdapat dua masalah baru. Pertama, terdapat bunyi dalam bentuk lonjakan voltan pada isyarat yang berasal dari pin tengah. Masalah ini menjadi masalah sebenarnya kelak. Kedua, rentang nilai untuk mengirim sudut dan menerima sudut berbeza.

Memberitahu motor servo hobi untuk bergerak ke beberapa sudut antara 0 dan 180 darjah melibatkan menghantarnya isyarat PWM dengan waktu tinggi yang sepadan dengan sudut. Sebaliknya, menggunakan pin input analog Arduino untuk membaca voltan pada pin tengah potensiometer sambil menggerakkan tanduk servo antara 0 dan 180 darjah mengembalikan julat nilai yang berasingan. Oleh itu, beberapa matematik diperlukan untuk menterjemahkan nilai input yang disimpan ke nilai output PWM yang sesuai yang diperlukan untuk mengembalikan servo ke sudut yang sama.

Pemikiran pertama saya adalah menggunakan peta jarak sederhana untuk mencari output PWM yang sesuai untuk setiap sudut yang disimpan. Ini berjaya, tetapi tidak begitu tepat. Bagi projek saya, julat nilai masa tinggi PWM yang sepadan dengan julat sudut 180 darjah jauh lebih besar daripada julat nilai input analog. Selain itu, kedua-dua julat ini tidak berterusan dan terdiri daripada bilangan bulat sahaja. Oleh itu, ketika saya memetakan nilai input yang disimpan ke nilai output, ketepatan hilang. Pada ketika ini saya fikir saya memerlukan gelung kawalan untuk mendapatkan servos saya di mana mereka mesti berada.

Saya menulis kod untuk gelung kawalan PID di mana inputnya adalah voltan pin tengah dan outputnya adalah output PWM, tetapi dengan cepat mendapati bahawa saya hanya memerlukan kawalan integral. Dalam senario ini, output dan input keduanya mewakili sudut, jadi menambahkan kawalan proporsional dan derivatif cenderung menjadikannya berlebihan atau mempunyai tingkah laku yang tidak diingini. Setelah menyesuaikan kawalan integral, masih ada dua masalah. Pertama, jika ralat awal antara sudut semasa dan yang diinginkan adalah besar, servo akan mempercepat terlalu cepat. Saya dapat mengurangkan pemalar untuk kawalan integral, tetapi pergerakan keseluruhan menjadi terlalu perlahan. Kedua, gerakan itu gelisah. Ini adalah hasil daripada bunyi pada isyarat input analog. Gelung kawalan terus membaca isyarat ini, jadi lonjakan voltan menyebabkan pergerakan gelisah. (Pada ketika ini saya juga berpindah dari servo satu ujian saya ke pemasangan yang digambarkan di atas. Saya juga membuat objek gelung kawalan untuk setiap servo dalam perisian.)

Saya menyelesaikan masalah pecutan terlalu cepat dengan meletakkan penapis rata-rata bergerak berwajaran eksponensial (EWMA) pada output. Dengan rata-rata output, lonjakan besar pergerakan dikurangkan (termasuk gangguan dari bunyi). Walau bagaimanapun, bunyi pada isyarat input masih menjadi masalah, jadi tahap seterusnya projek saya berusaha menyelesaikannya.

Langkah 3: Bunyi

Bising
Bising

Bergambar Di Atas

Dengan warna merah: isyarat input asal

Dengan warna biru: isyarat input selepas diproses

Langkah pertama untuk mengurangkan kebisingan pada isyarat input adalah memahami penyebabnya. Menguji isyarat pada osiloskop menunjukkan bahawa lonjakan voltan berlaku pada kadar 50Hz. Saya kebetulan tahu bahawa isyarat PWM yang dihantar ke servo juga pada kadar 50Hz, jadi saya menduga lonjakan voltan ada kaitan dengan itu. Saya membuat hipotesis bahawa pergerakan servos entah bagaimana menyebabkan lonjakan voltan pada pin V + potensiometer, yang seterusnya merosakkan bacaan pada pin tengah.

Di sinilah saya membuat percubaan pertama untuk mengurangkan kebisingan. Saya membuka kembali setiap servo dan menambahkan wayar yang berasal dari pin V + pada potensiometer. Saya memerlukan lebih banyak input analog untuk membacanya daripada Arduino Uno, jadi saya juga beralih ke Arduino Mega pada ketika ini. Dalam kod saya, saya menukar input sudut daripada bacaan analog voltan pada pin tengah menjadi nisbah antara voltan pada pin tengah ke voltan pada pin V +. Harapan saya ialah sekiranya terdapat lonjakan voltan pada pin, nisbah itu akan hilang.

Saya menyatukan semuanya dan mengujinya, tetapi lonjakan masih berlaku. Apa yang harus saya lakukan ketika ini adalah menyelidiki alasan saya. Sebaliknya, idea saya seterusnya adalah meletakkan potensiometer pada bekalan kuasa yang berasingan sepenuhnya. Saya memutuskan wayar V + dari input analog pada Arduino, dan menyambungkannya ke bekalan kuasa yang berasingan. Saya telah memeriksa pin sebelum ini, jadi saya tahu voltan untuk mengaktifkannya. Saya juga memotong sambungan antara papan kawalan dan pin V + di setiap servo. Saya menyatukan semuanya, mengembalikan kod input sudut seperti sebelumnya, dan kemudian mengujinya. Seperti yang dijangkakan, tidak ada lagi lonjakan voltan pada pin input. Namun, ada masalah baru - meletakkan potensiometer pada bekalan kuasa yang berasingan telah merosakkan gelung kawalan dalaman servos. Walaupun pin V + menerima voltan yang sama seperti sebelumnya, pergerakan servo tidak menentu dan tidak stabil.

Saya tidak faham mengapa ini berlaku, jadi saya akhirnya menyiasat hubungan asas saya dalam perkhidmatan. Terdapat penurunan voltan rata-rata sekitar 0,3 Volt di permukaan tanah, dan ia melambung lebih tinggi ketika servo menarik arus. Pada masa itu jelas bagi saya bahawa pin tersebut tidak lagi dapat dianggap "landasan", dan lebih baik dapat digambarkan sebagai pin "rujukan". Papan kawalan di servo mestilah mengukur voltan pada pin tengah potensiometer berbanding dengan voltan pada V + dan pin rujukan. Menghidupkan potensiometer secara berasingan mengacaukan pengukuran relatif kerana sekarang bukannya lonjakan voltan yang berlaku pada semua pin, ia hanya berlaku pada pin rujukan.

Mentor saya, Dr. Malloch, menolong saya menyelesaikan semua ini dan mencadangkan saya juga mengukur voltan pada pin tengah berbanding dengan pin yang lain. Itulah yang saya lakukan untuk percubaan ketiga dan terakhir saya untuk mengurangkan kebisingan input sudut. Saya membuka setiap servo, memasang kembali wayar yang saya potong, dan menambahkan wayar ketiga yang berasal dari pin rujukan pada potensiometer. Dalam kod saya, saya membuat input sudut setara dengan ungkapan berikut: (pin tengah - pin rujukan) / (pin + pin - pin rujukan). Saya mengujinya dan berjaya mengurangkan kesan lonjakan voltan. Di samping itu, saya juga meletakkan penapis EWMA pada input ini. Isyarat yang diproses ini dan isyarat asal digambarkan di atas.

Langkah 4: Mengemas Perkara

Mengemas Perkara
Mengemas Perkara

Dengan masalah kebisingan yang diselesaikan dengan sebaik mungkin, saya menetapkan untuk memperbaiki dan membuat bahagian akhir reka bentuk. Lengan meletakkan berat terlalu banyak pada servo di pangkalan, jadi saya membuat pangkalan baru yang menyokong berat lengan menggunakan galas besar. Saya juga mencetak pencengkam dan melakukan pengamplasan di atasnya agar berfungsi.

Saya sangat gembira dengan keputusan akhir. Perancangan gerakan intuitif berfungsi secara konsisten dan pergerakannya lancar dan tepat, dengan mempertimbangkan semuanya. Sekiranya orang lain ingin membuat projek ini, saya terlebih dahulu akan mendorong mereka untuk membuat versi yang lebih mudah. Pada pandangan belakang, membuat sesuatu seperti ini dengan menggunakan motor servo hobi sangat naif, dan kesukaran yang saya alami untuk membuatnya berfungsi menunjukkannya. Saya menganggapnya sebagai keajaiban lengan berfungsi begitu juga. Saya masih mahu membuat lengan robot yang dapat berinteraksi dengan komputer, menjalankan program yang lebih kompleks, dan bergerak dengan ketepatan yang lebih besar, jadi untuk projek seterusnya saya akan melakukannya. Saya akan menggunakan servo robotik digital berkualiti tinggi, dan mudah-mudahan ini akan membolehkan saya mengelakkan banyak masalah yang saya hadapi dalam projek ini.

Dokumen CAD:

cad.onshape.com/documents/818ea878dda7ca2f…

Disyorkan: