- Diagram Sirkuit
- Membangkitkan sinyal PWM pada pin GPIO untuk Kontrol Motor Servo
- Pemrograman PIC16F8771A untuk Lengan Robot
- Simulasi Kode Lengan Robot PIC
- Desain PCB menggunakan EasyEDA
- Menghitung dan Memesan Sampel secara online
- Bekerja dari Lengan Robot PIC
Dari jalur perakitan industri manufaktur mobil hingga robot telesurgery di luar angkasa, Robotic Arms dapat ditemukan di mana-mana. Mekanisme robot ini mirip dengan manusia yang dapat diprogram untuk fungsi serupa dan peningkatan kemampuan. Mereka dapat digunakan untuk melakukan tindakan berulang dengan lebih cepat dan akurat daripada manusia atau dapat digunakan di lingkungan yang keras tanpa membahayakan nyawa manusia. Kami telah membuat Rekam dan Mainkan Lengan Robot menggunakan Arduino yang dapat dilatih untuk melakukan tugas tertentu dan dibuat berulang selamanya.
Dalam tutorial ini kita akan menggunakan Mikrokontroler 8-bit PIC16F877A standar industri untuk mengontrol lengan robot yang sama dengan potensiometer. Tantangan dengan proyek ini adalah bahwa PIC16F877A hanya memiliki dua pin berkemampuan PWN, tetapi kami perlu mengontrol sekitar 5 motor servo untuk robot kami yang memerlukan 5 pin PWM individu. Jadi kita harus memanfaatkan pin GPIO dan menghasilkan sinyal PWM pada pin PIC GPIO menggunakan interupsi timer. Sekarang, tentu saja kita dapat meningkatkan ke mikrokontroler yang lebih baik atau menggunakan IC de-multiplexer untuk membuat segalanya lebih mudah di sini. Tapi tetap saja, proyek ini patut dicoba untuk pengalaman belajar.
Struktur mekanik lengan robot yang saya gunakan dalam proyek ini sepenuhnya dicetak 3D untuk proyek saya sebelumnya; Anda dapat menemukan file desain lengkap dan prosedur perakitan di sini. Atau, jika Anda tidak memiliki printer 3D, Anda juga dapat membuat Lengan Robot sederhana menggunakan karton seperti yang ditunjukkan pada tautan. Dengan asumsi bahwa Anda entah bagaimana telah memegang Lengan robot Anda, mari kita lanjutkan ke proyek.
Diagram Sirkuit
Diagram rangkaian lengkap untuk Robotic Arm berbasis Mikrokontroler PIC ini ditunjukkan di bawah ini. Skema digambar menggunakan EasyEDA.
Diagram sirkuit cukup sederhana; proyek lengkap ini didukung oleh adaptor 12V. 12V ini kemudian diubah menjadi + 5V menggunakan dua regulator Tegangan 7805. Satu diberi label sebagai + 5V dan yang lainnya diberi label sebagai + 5V (2). Alasan untuk memiliki dua regulator adalah ketika servo berputar, ia menarik banyak arus yang menyebabkan penurunan tegangan. Penurunan tegangan ini memaksa PIC untuk memulai kembali sendiri, oleh karena itu kami tidak dapat mengoperasikan PIC dan motor servo pada rel + 5V yang sama. Jadi yang berlabel + 5V digunakan untuk menyalakan Mikrokontroler PIC, LCD dan Potensiometer dan output regulator terpisah yang diberi label sebagai + 5V (2) digunakan untuk menyalakan motor servo.
Lima pin output dari potensiometer yang memberikan tegangan variabel dari 0V ke 5V dihubungkan ke pin analog An0 ke AN4 dari PIC. Karena kami berencana menggunakan timer untuk menghasilkan PWM, motor servo dapat dihubungkan ke pin GPIO mana pun. Saya telah memilih pin dari RD2 hingga RD6 untuk motor servo, tetapi bisa jadi GPIO apa pun pilihan Anda.
Karena program ini melibatkan banyak debugging, layar LCD 16x2 juga dihubungkan ke portB dari PIC. Ini akan menampilkan siklus kerja motor servo yang dikendalikan. Selain itu, saya juga telah memperluas koneksi untuk semua GPIO dan pin analog, untuk berjaga-jaga jika ada sensor yang perlu dihubungkan di masa mendatang. Akhirnya saya juga telah menghubungkan pin programmer H1 untuk langsung memprogram PIC dengan pickit3 menggunakan opsi pemrograman ICSP.
Membangkitkan sinyal PWM pada pin GPIO untuk Kontrol Motor Servo
Setelah rangkaian siap kita harus mencari cara untuk menghasilkan sinyal PWN pada pin GPIO PIC untuk mengontrol motor servo. Kami telah menyelesaikan sesuatu yang serupa menggunakan metode interupsi Timer dan berhasil. Di sini kita hanya akan membangun di atasnya, jadi jika Anda baru di sini, saya sangat menyarankan Anda untuk membaca tutorial sebelumnya ini sebelum melanjutkan lebih jauh.
Semua motor servo hobi bekerja dengan frekuensi 50Hz. Artinya satu siklus pulsa lengkap untuk motor servo akan menjadi 1/50 (F = 1 / T) yaitu 20ms. Dari total 20ms ini, sinyal kontrol hanya dari 0 hingga 2ms sedangkan sinyal lainnya selalu mati. Gambar di bawah ini menunjukkan bagaimana waktu ON hanya bervariasi dari 0 hingga 2ms untuk memutar motor dari 0 derajat hingga 180 derajat dari total durasi 20ms.
Dengan pemikiran ini kita harus menulis program sedemikian rupa sehingga PIC membaca 0 to1204 dari potensiometer dan memetakannya ke 0 hingga 100 yang akan menjadi siklus kerja motor servo. Dengan menggunakan duty cycle ini kita dapat menghitung waktu ON motor servo. Kemudian kita dapat menginisialisasi interupsi pengatur waktu untuk meluap pada interval reguler sehingga berfungsi mirip dengan fungsi millis () di Arduino. Dengan itu, kita dapat mengubah status GPIO pin menjadi tinggi untuk durasi yang diinginkan dan mematikannya setelah 20ms (satu siklus lengkap) dan kemudian mengulangi proses yang sama. Sekarang, setelah kita memahami logikanya, mari kita masuk ke program.
Pemrograman PIC16F8771A untuk Lengan Robot
Seperti biasa, program lengkap dengan Video dapat ditemukan di akhir halaman ini, kode juga dapat diunduh dari sini dengan semua file yang diperlukan. Pada bagian ini kita akan membahas logika di balik program. Program ini menggunakan modul ADC, Modul Timer dan Modul LCD untuk mengontrol Lengan Robot. Jika Anda tidak mengetahui cara menggunakan fitur ADC atau fitur Timer atau untuk menghubungkan LCD dengan PIC, Anda dapat kembali ke link masing-masing untuk mempelajarinya. Penjelasan di bawah ini diberikan dengan asumsi bahwa pembaca sudah familiar dengan konsep-konsep ini.
Timer 0 Konfigurasi Port
Bagian terpenting dalam kode ini adalah menyetel Timer 0 agar mengalir secara berlebihan untuk setiap penundaan tertentu. Rumus untuk menghitung penundaan ini dapat diberikan sebagai
Penundaan = ((256-REG_val) * (Prescal * 4)) / Fosc
Dengan menggunakan register OPTION_REG dan TMR0 kami telah menyetel Timer 0 untuk beroperasi dengan nilai prescalar 32 dan REG val disetel ke 248. Frekuensi kristal (Fosc) yang digunakan di perangkat keras kami adalah 20Mhz. Dengan nilai-nilai ini penundaan dapat dihitung sebagai
Delay = ((256-248) * (32 * 4)) / (20000000) = 0,0000512 detik (atau) = 0,05 msec
Jadi sekarang kami telah mengatur pengatur waktu agar meluap pada setiap 0,05 ms. Kode untuk melakukan hal yang sama diberikan di bawah ini
/ ***** Konfigurasi Port untuk Timer ****** / OPTION_REG = 0b00000100; // Timer0 dengan freq eksternal dan 32 sebagai prescalar // Juga Mengaktifkan PULL UPs TMR0 = 248; // Muat nilai waktu untuk 0,0001s; delayValue bisa antara 0-256 hanya TMR0IE = 1; // Aktifkan bit interupsi pengatur waktu di register PIE1 GIE = 1; // Aktifkan Global Interrupt PEIE = 1; // Aktifkan Interupsi Periferal / *********** ______ *********** /
Dari total 0ms hingga 2ms control window motor servo kita dapat mengontrolnya dengan resolusi 0.05msec, yang memungkinkan kita memiliki (2 / 0.05) 40 posisi berbeda untuk motor antara 0 derajat hingga 180 derajat. Anda dapat menurunkan nilai ini lebih jauh jika MCU Anda dapat mendukungnya untuk mendapatkan lebih banyak posisi dan kontrol yang tepat.
Interrupt Service Routine (ISR)
Sekarang kita memiliki Timer 0 yang diatur ke aliran berlebih untuk setiap 0,05 ms, kita akan mengatur bendera interupsi TMR0IF untuk 0,05ms. Jadi di dalam fungsi ISR kita bisa mereset flag itu dan menaikkan variabel yang disebut count per satu. Jadi sekarang variabel ini akan bertambah 1 untuk setiap 0,05 ms.
void interrupt timer_isr () { if (TMR0IF == 1) // Flag timer telah dipicu karena timer overflow -> disetel ke overflow untuk setiap 0.05ms { TMR0 = 248; // Muat Nilai timer TMR0IF = 0; // Hapus penghitung waktu bendera interupsi ++; // Hitung kenaikan sebesar 1 untuk setiap 0,05 md }
Menghitung Siklus Kerja dan Tepat Waktu
Selanjutnya kita harus menghitung duty cycle dan tepat waktu untuk kelima motor servo. Kami memiliki lima motor servo yang masing-masing digunakan untuk mengontrol bagian lengan individu. Jadi kita harus membaca nilai ADC dari kelimanya dan menghitung duty cycle dan tepat waktu untuk masing-masing.
Nilai ADC akan berada dalam rentang 0 hingga 1024 yang dapat diubah menjadi siklus kerja 0% hingga 100% hanya dengan mengalikan 0,0976 (100/1024 = 0,0976) dengan nilai yang diperoleh. Siklus kerja 0 hingga 100% ini harus diubah menjadi waktu ON. Kita tahu bahwa pada siklus kerja 100% waktu ON harus 2ms (untuk 180 derajat) jadi mengalikan 0,02 (2/100 = 0,02) akan mengubah siklus kerja 0 hingga 100 menjadi 0 hingga 2ms. Tapi kemudian jumlah variabel pengatur waktu kami diatur untuk meningkat sekali untuk setiap 0,05 ms. Artinya nilai hitungannya adalah 20 (1 / 0,05 = 20) untuk setiap 1ms. Jadi kita harus mengalikan 20 dengan 0,02 untuk menghitung waktu yang tepat untuk program kita yang akan memberi kita nilai 0,4 (0,02 * 20 = 0,4). Kode untuk hal yang sama ditunjukkan di bawah ini, Anda dapat melihatnya diulang sebanyak 5 kali untuk semua 5 pot menggunakan for loop. Nilai yang dihasilkan disimpan dalam array T_ON.
untuk (int pot_num = 0; pot_num <= 3; pot_num ++) { int Pev_val = T_ON; POT_val = (ADC_Read (pot_num)); // Membaca nilai POT menggunakan ADC Duty_cycle = (POT_val * 0.0976); // Petakan 0 hingga 1024 hingga 0 hingga 100 T_ON = Duty_cycle * 0.4; // 20 * 0.02
Memilih motor mana yang akan diputar
Kita tidak dapat mengontrol kelima motor secara bersamaan karena akan membuat kode ISR menjadi sangat lambat dan memperlambat seluruh mikrokontroler. Jadi kita harus memutar hanya satu motor servo pada satu waktu. Untuk memilih servo mana yang akan diputar, mikrokontroler memonitor waktu ON dari kelima motor servo dan membandingkannya dengan waktu sebelumnya. Jika terjadi perubahan waktu ON maka kita dapat menyimpulkan bahwa servo tertentu harus dipindahkan. Kode yang sama ditampilkan di bawah ini.
jika (T_ON! = Pev_val) { Lcd_Clear (); servo = pot_num; Lcd_Set_Cursor (2,11); Lcd_Print_String ("S:"); Lcd_Print_Char (servo + '0'); jika (pot_num == 0) {Lcd_Set_Cursor (1,1); Lcd_Print_String ("A:");} lain jika (pot_num == 1) {Lcd_Set_Cursor (1,6); Lcd_Print_String ("B:");} lain jika (pot_num == 2) {Lcd_Set_Cursor (1,11); Lcd_Print_String ("C:");} lain jika (pot_num == 3) {Lcd_Set_Cursor (2,1); Lcd_Print_String ("D:");} lain jika (pot_num == 4) {Lcd_Set_Cursor (2,6); Lcd_Print_String ("E:");} char d2 = (Duty_cycle)% 10; char d1 = (Duty_cycle / 10)% 10; Lcd_Print_Char (d1 + '0'); Lcd_Print_Char (d2 + '0');
Kami juga mencetak siklus tugas servo pada layar LCD sehingga pengguna dapat mengetahui posisinya saat ini. Berdasarkan perubahan waktu ON, servo variabel diperbarui dengan angka dari 0 menjadi 4 masing-masing mewakili motor individu.
Mengontrol Motor Servo di dalam ISR
Di dalam ISR kita memiliki jumlah variabel yang bertambah untuk setiap 0,05ms, ini berarti bahwa untuk setiap 1ms variabel akan bertambah 20. Dengan menggunakan ini kita harus mengontrol pin untuk menghasilkan sinyal PWM. Jika nilai hitungan kurang dari waktu on maka GPIO motor tersebut dihidupkan menggunakan baris di bawah ini
PORTD = PORTD - servo_code;
Di sini servo_code larik memiliki detail pin dari kelima motor servo dan berdasarkan nilai dalam variabel servo, kode untuk motor servo tersebut akan digunakan. Kemudian secara logis OR (-) dengan bit PORTD yang ada sehingga kami tidak mengganggu nilai motor lain dan hanya memperbarui motor khusus ini. Demikian pula untuk mematikan pin
PORTD = PORTD & ~ (servo_code);
Kami telah membalikkan nilai bit menggunakan operator logika invers (~) dan kemudian telah melakukan operasi AND (&) pada PORTD untuk mematikan hanya pin yang diinginkan sambil membiarkan pin lain dalam keadaan sebelumnya. Potongan kode lengkap ditampilkan di bawah ini.
void interrupt timer_isr () { if (TMR0IF == 1) // Flag timer telah dipicu karena timer overflow -> disetel ke overflow untuk setiap 0.05ms { TMR0 = 248; // Muat Nilai timer TMR0IF = 0; // Hapus penghitung waktu bendera interupsi ++; // Hitung kenaikan sebesar 1 untuk setiap 0,05 md -> hitungan akan menjadi 20 untuk setiap 1 md (0,05 / 1 = 20)) } int servo_code = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100}; jika (hitung> = 20 * 20) hitung = 0; jika (hitung <= (T_ON)) PORTD = PORTD - servo_code; lain PORTD = PORTD & ~ (servo_code); }
Kami tahu bahwa siklus total harus berlangsung selama 20ms sebelum pin GPIO dihidupkan kembali. Jadi kami memeriksa apakah hitungan telah melebihi 20ms dengan membandingkan nilai hitungan dengan 400 (perhitungan sama seperti yang dibahas di atas) dan jika ya kita harus menginisialisasi hitungan menjadi nol lagi.
Simulasi Kode Lengan Robot PIC
Itu selalu lebih baik untuk mensimulasikan kode sebelum membawanya ke perangkat keras sebenarnya. Jadi saya menggunakan Proteus untuk mensimulasikan kode saya dan memverifikasinya agar berfungsi dengan benar. Sirkuit yang digunakan untuk simulasi ditunjukkan di bawah ini, Kami telah menggunakan osiloskop untuk memeriksa apakah sinyal PWM dihasilkan sesuai kebutuhan. Kami juga dapat memverifikasi apakah LCD dan motor Servo berputar seperti yang diharapkan.
Seperti yang Anda lihat display LCD siklus motor D menjadi 07 berdasarkan nilai pot yang merupakan 3 rd bermotor. Mirip jika pot lain dipindahkan, siklus kerja pot itu dan nomor motornya akan ditampilkan pada LCD. Sinyal PWM yang ditunjukkan pada osiloskop ditunjukkan di bawah ini.
Periode siklus total diukur menjadi 22,2 md menggunakan opsi kursor pada osiloskop, yang sangat dekat dengan 20 md yang diinginkan. Akhirnya kami yakin bahwa kodenya berfungsi, jadi untuk melanjutkan rangkaian kami dapat menyoldernya di papan kinerja atau menggunakan PCB. Ini tidak akan bekerja dengan mudah pada papan tempat memotong roti karena POT selalu cenderung memberikan beberapa masalah karena koneksi yang buruk.
Desain PCB menggunakan EasyEDA
Untuk mendesain Lengan Robot PIC ini, kami telah memilih alat EDA online yang disebut EasyEDA. Saya telah menggunakannya untuk waktu yang lama sekarang dan merasa sangat nyaman karena ketersediaan tapak yang luas dan alam yang mudah digunakan. Setelah mendesain PCB, kita dapat memesan sampel PCB melalui layanan fabrikasi PCB berbiaya rendah. Mereka juga menawarkan layanan sumber komponen di mana mereka memiliki stok besar komponen elektronik dan pengguna dapat memesan komponen yang diperlukan bersama dengan pesanan PCB.
Saat mendesain sirkuit dan PCB, Anda juga dapat membuat desain sirkuit dan PCB Anda menjadi publik sehingga pengguna lain dapat menyalin atau mengeditnya dan dapat memanfaatkan pekerjaan Anda, kami juga telah membuat seluruh layout Sirkuit dan PCB kami publik untuk sirkuit ini, periksa tautan di bawah ini:
easyeda.com/circuitdigest/pic-development-board-for-robotic-arm
Menggunakan tautan ini Anda dapat langsung memesan PCB yang sama yang kami gunakan dalam proyek ini dan menggunakannya. Setelah desain selesai, papan dapat dilihat sebagai model 3D yang akan sangat membantu dalam memvisualisasikan bagaimana papan akan muncul setelah pembuatan. Model 3D papan yang kami gunakan ditunjukkan di bawah ini. Selain itu, Anda juga dapat melihat lapisan atas dan bawah papan untuk memeriksa apakah layar licin seperti yang diharapkan.
Menghitung dan Memesan Sampel secara online
Setelah menyelesaikan desain PCB Robot PIC ini, Anda dapat memesan PCB tersebut melalui JLCPCB.com. Untuk memesan PCB dari JLCPCB, Anda membutuhkan File Gerber. Untuk mendownload file Gerber dari PCB anda cukup klik tombol Generate Fabrication File di halaman editor EasyEDA, kemudian download file Gerber dari sana atau anda bisa klik Order di JLCPCB seperti gambar dibawah ini. Ini akan mengarahkan Anda ke JLCPCB.com, di mana Anda dapat memilih jumlah PCB yang ingin Anda pesan, berapa banyak lapisan tembaga yang Anda butuhkan, ketebalan PCB, berat tembaga, dan bahkan warna PCB, seperti gambar di bawah ini:
Setelah Anda memilih semua opsi, klik "Simpan ke Keranjang" dan kemudian Anda akan dibawa ke halaman di mana Anda dapat mengunggah File Gerber Anda yang telah kami unduh dari EasyEDA. Unggah file Gerber Anda dan klik "Simpan ke Keranjang". Dan terakhir klik Checkout Securely untuk menyelesaikan pesanan Anda, lalu Anda akan mendapatkan PCB beberapa hari kemudian. Mereka membuat PCB dengan harga sangat rendah yaitu $ 2. Waktu pembuatannya juga sangat kurang yaitu 48 jam dengan pengiriman DHL 3-5 hari, pada dasarnya Anda akan mendapatkan PCB dalam waktu seminggu setelah pemesanan.
Setelah memesan PCB, Anda dapat memeriksa Progres Produksi PCB Anda dengan tanggal dan waktu. Anda memeriksanya dengan masuk ke halaman Akun dan klik "Kemajuan Produksi".
Setelah beberapa hari memesan PCB, saya mendapatkan sampel PCB dalam kemasan yang bagus seperti yang ditunjukkan pada gambar di bawah ini.
Dan setelah mendapatkan potongan-potongan ini saya telah menyolder semua komponen yang diperlukan di atas PCB. Saya juga langsung menyolder POT secara langsung daripada menggunakan kabel penghubung karena kabel perempuan ke perempuan yang awalnya saya gunakan di mana memberikan tegangan keluaran analog yang aneh mungkin karena kontak yang longgar. Setelah semua komponen dirakit, PCB saya terlihat seperti ini.
Anda mungkin telah memperhatikan bahwa hanya ada satu 7805 di papan ini. Itu karena awalnya saya pikir saya bisa lolos hanya dengan regulator untuk menyalakan PIC dan motor servo dan kemudian saya menyadari bahwa saya membutuhkan dua. Jadi saya telah menggunakan sirkuit eksternal untuk memberi daya motor servo melalui kabel hijau yang Anda lihat di sini.
Namun demikian Anda tidak perlu terlalu khawatir karena; Saya telah melakukan perubahan pada PCB sekarang. Anda dapat menggunakan PCB yang dimodifikasi dan menyolder kedua regulator di papan itu sendiri.
Bekerja dari Lengan Robot PIC
Setelah semua pekerjaan yang melelahkan sekarang saatnya untuk melunasi. Solder semua komponen di papan dan unggah program ke pengontrol PIC. Kode Lengkap diberikan di bawah ini atau dapat diunduh dari sini. Konektor pemrograman yang disediakan di papan akan membantu Anda mengunggah program secara langsung menggunakan Pickit 3 tanpa banyak kerumitan. Setelah program di-upload, Anda akan melihat LCD yang menampilkan servo yang saat ini sedang dikontrol. Untuk mempelajari lebih lanjut tentang pemrograman Mikrokontroler PIC, ikuti saja tutorial sebelumnya.
Dari sana Anda cukup memutar panci dan memeriksa bagaimana motor servo merespons setiap potensiometer. Setelah Anda memahami formatnya, Anda dapat mengontrol lengan robotik untuk melakukan tindakan apa pun yang Anda perlukan untuk dilakukan dan bersenang-senang. Anda dapat menemukan pekerjaan lengkap proyek dalam video yang ditautkan di bawah ini.
Itulah harapan orang-orang Anda memahami proyek dan belajar sesuatu yang baru darinya. Jika Anda memiliki pertanyaan, tinggalkan di bagian komentar atau gunakan forum untuk diskusi teknis lainnya.