- Rajah Litar
- Menghasilkan isyarat PWM pada pin GPIO untuk Kawalan Motor Servo
- Pengaturcaraan PIC16F8771A untuk Robotic Arm
- Simulasi Kod Lengan Robotik PIC
- Reka Bentuk PCB menggunakan EasyEDA
- Mengira dan Memesan Sampel dalam talian
- Kerja Lengan Robotik PIC
Dari barisan pemasangan industri pembuatan kenderaan hingga robot telesurgeri di angkasa lepas, Robotic Arms terdapat di mana-mana sahaja. Mekanisme robot ini serupa dengan manusia yang dapat diprogram untuk fungsi serupa dan peningkatan kemampuan. Mereka dapat digunakan untuk melakukan tindakan berulang lebih cepat dan tepat daripada manusia atau dapat digunakan dalam lingkungan yang keras tanpa membahayakan nyawa manusia. Kami sudah membuat Arm and Robotic Record and Play menggunakan Arduino yang dapat dilatih untuk melakukan tugas tertentu dan dibuat untuk mengulanginya selamanya.
Dalam tutorial ini kita akan menggunakan PIC16F877A 8-bit Microcontroller standard industri untuk mengawal lengan robot yang sama dengan potensiometer. Cabaran dengan projek ini adalah bahawa PIC16F877A hanya mempunyai dua pin mampu PWN, tetapi kita perlu mengawal kira-kira 5 motor servo untuk robot kita yang memerlukan 5 pin PWM individu. Oleh itu, kita harus menggunakan pin GPIO dan menghasilkan isyarat PWM pada pin PIC GPIO menggunakan pemasa selang. Sekarang, sudah tentu kita boleh meningkatkan ke mikrokontroler yang lebih baik atau menggunakan IC de-multiplexer untuk membuat perkara menjadi lebih mudah di sini. Tetapi tetap ada, patut diberikan projek ini untuk pengalaman pembelajaran.
Struktur mekanikal lengan robot yang saya gunakan dalam projek ini dicetak sepenuhnya 3D untuk projek saya sebelumnya; anda boleh mendapatkan fail reka bentuk lengkap dan prosedur pemasangan di sini. Sebagai alternatif, jika anda tidak mempunyai pencetak 3D, anda juga boleh membina Robotic Arm sederhana menggunakan kadbod seperti yang ditunjukkan dalam pautan. Dengan andaian bahawa anda entah bagaimana memegang lengan robot anda, mari kita meneruskan projek.
Rajah Litar
Gambarajah litar Lengkap untuk Lengan Robotik PIC Microcontroller ini ditunjukkan di bawah. Skema dilukis menggunakan EasyEDA.
Gambarajah litar cukup mudah; projek yang lengkap dikuasakan oleh penyesuai 12V. 12V ini kemudian ditukar menjadi + 5V menggunakan dua pengatur Voltan 7805. Satu dilabel sebagai + 5V dan yang lain dilabel sebagai + 5V (2). Sebab untuk mempunyai dua pengatur adalah bahawa ketika servo berputar, ia menarik banyak arus yang menyebabkan penurunan voltan. Penurunan voltan ini memaksa PIC menghidupkan semula dirinya sendiri, oleh itu kita tidak dapat mengoperasikan motor PIC dan servo pada rel + 5V yang sama. Jadi yang dilabelkan sebagai + 5V digunakan untuk memberi kuasa pada PIC Microcontroller, LCD dan Potentiometers dan output regulator yang berasingan yang dilabel sebagai + 5V (2) digunakan untuk menggerakkan motor servo.
Lima pin keluaran potensiometer yang memberikan voltan berubah dari 0V hingga 5V disambungkan ke pin analog An0 hingga AN4 PIC. Oleh kerana kami merancang untuk menggunakan pemasa untuk menghasilkan PWM, motor servo dapat disambungkan ke pin GPIO mana pun. Saya telah memilih pin dari RD2 hingga RD6 untuk motor servo, tetapi ia boleh menjadi GPIO pilihan anda.
Oleh kerana program ini melibatkan banyak penyahpepijatan, paparan LCD 16x2 juga dihubungkan ke portB PIC. Ini akan memaparkan putaran tugas motor servo yang sedang dikendalikan. Selain daripada ini, saya juga telah memperluas sambungan untuk semua pin GPIO dan pin analog, sekiranya ada sensor yang perlu dihubungkan pada masa akan datang. Akhirnya saya juga menghubungkan pin pengaturcara H1 untuk memprogram PIC secara langsung dengan pickit3 menggunakan pilihan pengaturcaraan ICSP.
Menghasilkan isyarat PWM pada pin GPIO untuk Kawalan Motor Servo
Setelah litar siap, kita harus memikirkan cara menghasilkan isyarat PWN pada pin GPIO PIC untuk mengawal motor servo. Kami telah melelahkan sesuatu yang serupa dengan menggunakan kaedah Timer interrupt dan berjaya. Di sini kita hanya akan membangun di atasnya, jadi jika anda baru di sini, saya sangat mengesyorkan anda membaca tutorial sebelumnya sebelum meneruskan lebih lanjut.
Semua motor servo hobi berfungsi dengan frekuensi 50Hz. Bermakna satu pusingan nadi lengkap untuk motor servo adalah 1/50 (F = 1 / T) iaitu 20ms. Dari jumlah 20ms yang lengkap ini, isyarat kawalan hanya dari 0 hingga 2ms sementara selebihnya isyarat selalu mati. Gambar di bawah menunjukkan bagaimana waktu ON hanya berbeza dari 0 hingga 2ms untuk memutar motor dari 0 darjah hingga 180 darjah dari keseluruhan jangka masa 20ms.
Dengan ini, kita harus menulis program sedemikian rupa sehingga PIC membaca di 0 hingga 1204 dari potensiometer dan memetakannya ke 0 hingga 100 yang akan menjadi kitaran tugas motor servo. Dengan menggunakan kitaran tugas ini kita dapat mengira masa ON motor servo. Kemudian kita dapat menginisialisasi pemasa interupsi untuk meluap pada selang waktu yang tetap sehingga ia bertindak serupa dengan fungsi milis () di Arduino. Dengan itu, kita dapat menukar pin GPIO status menjadi tinggi untuk jangka masa yang diinginkan dan mematikannya setelah 20ms (satu kitaran lengkap) dan kemudian mengulangi proses yang sama. Sekarang, bahawa kita telah memahami logiknya mari kita masuk ke dalam program ini.
Pengaturcaraan PIC16F8771A untuk Robotic Arm
Seperti biasa program lengkap dengan Video boleh didapati di hujung halaman ini, kod juga boleh dimuat turun dari sini dengan semua fail yang diperlukan. Di bahagian ini kita akan membincangkan logik di sebalik program ini. Program ini menggunakan modul ADC, Modul Pemasa dan Modul LCD untuk mengawal Lengan Robotik. Sekiranya anda tidak mengetahui cara menggunakan ciri ADC atau ciri Pemasa atau untuk menyambungkan LCD dengan PIC, maka anda boleh kembali ke pautan masing-masing untuk mempelajarinya. Penjelasan di bawah diberikan dengan anggapan bahawa pembaca sudah biasa dengan konsep-konsep ini.
Pemasa Port 0 Timer
Bahagian yang paling penting dalam kod ialah menetapkan aliran Pemasa 0 ke lebih untuk setiap kelewatan tertentu. Rumus untuk mengira kelewatan ini dapat diberikan sebagai
Kelewatan = ((256-REG_val) * (Prescal * 4)) / Fosc
Dengan menggunakan register OPTION_REG dan TMR0, kami telah menetapkan Timer 0 untuk beroperasi dengan nilai prakiraan 32 dan REG val ditetapkan ke 248. Frekuensi kristal (Fosc) yang digunakan dalam perkakasan kami adalah 20Mhz. Dengan nilai-nilai ini kelewatan dapat dikira sebagai
Kelewatan = ((256-248) * (32 * 4)) / (20000000) = 0.0000512 saat (atau) = 0.05 msec
Jadi sekarang kita telah menetapkan pemasa untuk meluap pada setiap 0.05ms. Kod untuk melakukan perkara yang sama diberikan di bawah
/ ***** Konfigurasi Port untuk Pemasa ****** / OPTION_REG = 0b00000100; // Timer0 dengan freq luaran dan 32 sebagai prescalar // Juga Membolehkan PULL UPs TMR0 = 248; // Muatkan nilai masa untuk 0.0001s; delayValue boleh antara 0-256 hanya TMR0IE = 1; // Aktifkan bit gangguan pemasa dalam daftar PIE1 GIE = 1; // Dayakan Global Interrupt PEIE = 1; // Dayakan Periferal Interrupt / *********** ______ *********** /
Dari jumlah tetingkap kawalan 0ms hingga 2ms motor servo, kita dapat mengawalnya dengan resolusi 0.05msec, yang membolehkan kita mempunyai (2 / 0.05) 40 kedudukan yang berbeza untuk motor antara 0 darjah hingga 180 darjah. Anda dapat menurunkan nilai ini lebih jauh jika MCU anda dapat menyokongnya untuk mendapatkan lebih banyak kedudukan dan kawalan yang tepat.
Rutin Perkhidmatan Ganggu (ISR)
Setelah kita menetapkan Timer 0 untuk aliran lebih untuk setiap 0,05 ms, kita akan menetapkan bendera gangguan TMR0IF untuk 0,05 ms. Supaya dalam majlis itu ISR kita boleh menetapkan semula bendera itu dan kenaikan pembolehubah dipanggil kiraan oleh satu. Jadi sekarang pemboleh ubah ini akan meningkat sebanyak 1 untuk setiap 0.05ms.
batal interrupt timer_isr () { if (TMR0IF == 1) // Bendera pemasa telah dicetuskan kerana laju pemasa -> ditetapkan untuk meluap untuk setiap 0.05ms { TMR0 = 248; // Muatkan pemasa Nilai TMR0IF = 0; // Hapus kiraan bendera gangguan pemasa ++; // Hitung kenaikan sebanyak 1 untuk setiap 0.05ms }
Mengira Kitaran Tugas dan Tepat Masa
Seterusnya kita mesti mengira putaran tugas dan tepat pada masanya untuk kelima-lima motor servo. Kami mempunyai lima motor servo yang masing-masing digunakan untuk mengawal bahagian lengan masing-masing. Oleh itu, kita mesti membaca nilai ADC kelima-lima dan mengira kitaran tugas dan tepat pada masanya.
Nilai ADC akan berada dalam julat 0 hingga 1024 yang dapat ditukar menjadi 0% hingga 100% kitaran tugas dengan hanya mengalikan 0,0976 (100/1024 = 0,0976) ke nilai yang diperoleh. Kitaran tugas 0 hingga 100% ini mesti ditukar kepada waktu ON. Kami tahu bahawa pada 100% kitaran tugas, masa ON mesti 2ms (untuk 180 darjah) jadi mengalikan 0.02 (2/100 = 0.02) akan menukar 0 hingga 100 kitaran tugas menjadi 0 hingga 2ms. Tetapi kemudian jumlah pemboleh ubah pemasa kami ditetapkan untuk meningkat sekali untuk setiap 0.05ms. Ini bermaksud bahawa nilai kiraan akan menjadi 20 (1 / 0.05 = 20) untuk setiap 1ms. Oleh itu, kita harus mengalikan 20 dengan 0.02 untuk mengira tepat waktu untuk program kita yang akan memberi kita nilai 0.4 (0.02 * 20 = 0.4). Kod untuk yang sama ditunjukkan di bawah, anda dapat melihatnya berulang 5 kali untuk semua 5 pot menggunakan loop for. 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)); // Baca nilai POT menggunakan ADC Duty_cycle = (POT_val * 0.0976); // Peta 0 hingga 1024 hingga 0 hingga 100 T_ON = Duty_cycle * 0.4; // 20 * 0.02
Memilih motor mana yang hendak dipusingkan
Kami tidak dapat mengawal kelima motor bersama-sama kerana ini akan menjadikan kod ISR menjadi perlahan sehingga melambatkan keseluruhan pengawal mikro. Oleh itu, kita mesti memutarkan hanya satu motor servo pada satu masa. Untuk memilih servo mana yang hendak diputar mikrokontroler memantau masa ON dari kelima motor servo dan membandingkannya dengan yang sebelumnya tepat pada waktunya. Sekiranya terdapat perubahan dalam waktu ON maka kita dapat menyimpulkan bahawa servo tertentu harus dipindahkan. Kod untuk yang sama ditunjukkan di bawah.
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 servo duty cycle pada layar LCD sehingga pengguna dapat mengetahui kedudukannya sekarang. Berdasarkan perubahan waktu ON pemboleh ubah servo dikemas kini dengan nombor dari 0 hingga 4 masing-masing mewakili motor individu.
Mengawal Servo Motor di dalam ISR
Di dalam ISR, jumlah pemboleh ubah bertambah setiap 0.05ms, ini bermaksud bahawa setiap 1ms pemboleh ubah akan meningkat sebanyak 20. Dengan menggunakan ini, kita mesti mengawal pin untuk menghasilkan isyarat PWM. Sekiranya nilai kiraan kurang dari waktu yang tepat maka GPIO motor itu dihidupkan menggunakan garis di bawah
PORTD = PORTD - servo_code;
Di sini array servo_code mempunyai perincian pin dari kelima motor servo dan berdasarkan nilai dalam servo berubah-ubah, kod untuk motor servo tertentu akan digunakan. Kemudian secara logik ATAU (-) dengan bit PORTD yang ada supaya kita tidak mengganggu nilai motor lain dan hanya mengemas kini motor tertentu ini. Begitu juga untuk mematikan pin
PORTD = PORTD & ~ (servo_code);
Kami telah membalikkan nilai bit menggunakan pengendali logik songsang (~) dan kemudian telah melakukan operasi AND (&) pada PORTD untuk mematikan hanya pin yang diingini sambil meninggalkan pin yang lain dalam keadaan sebelumnya. Coretan kod lengkap ditunjukkan di bawah.
batal interrupt timer_isr () { if (TMR0IF == 1) // Bendera pemasa telah dicetuskan kerana laju pemasa -> ditetapkan untuk meluap untuk setiap 0.05ms { TMR0 = 248; // Muatkan pemasa Nilai TMR0IF = 0; // Hapus kiraan bendera gangguan pemasa ++; // Kenaikan kenaikan sebanyak 1 untuk setiap 0,05 ms -> kiraan akan menjadi 20 untuk setiap 1 ms (0,05 / 1 = 20)) } int servo_code = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100}; jika (kiraan> = 20 * 20) kiraan = 0; jika (kiraan <= (T_ON)) PORTD = PORTD - kod servo; lain PORTD = PORTD & ~ (servo_code); }
Kami tahu bahawa kitaran keseluruhan harus berlangsung selama 20ms sebelum pin GPIO dihidupkan semula. Oleh itu, kita periksa sama ada kiraannya melebihi 20ms dengan membandingkan nilai kiraan dengan 400 (pengiraan yang sama seperti yang dibincangkan di atas) dan jika ya kita harus menginisialisasi kiraan untuk menjadi sifar lagi.
Simulasi Kod Lengan Robotik PIC
Lebih baik simulasi kod sebelum membawanya ke perkakasan sebenar. Oleh itu, saya menggunakan Proteus untuk mensimulasikan kod saya dan mengesahkannya agar berfungsi dengan betul. Litar yang digunakan untuk simulasi ditunjukkan di bawah, Kami telah menggunakan osiloskop untuk memeriksa apakah isyarat PWM dihasilkan seperti yang diperlukan. Kita juga dapat memastikan sama ada motor LCD dan Servo berputar seperti yang diharapkan.
Seperti yang anda lihat paparan LCD kitar tugas motor D menjadi 07 berdasarkan nilai periuk yang merupakan 3 rd motor. Sama jika periuk lain digerakkan kitaran tugas periuk itu dan nombor motornya akan dipaparkan di LCD. Isyarat PWM yang ditunjukkan pada osiloskop ditunjukkan di bawah.
Tempoh kitaran keseluruhan diukur menjadi 22.2ms menggunakan pilihan kursor pada osiloskop, yang sangat dekat dengan 20ms yang diinginkan. Akhirnya kami yakin bahawa kodnya berfungsi, jadi untuk meneruskan litar, kita boleh menyoldernya pada papan perfusi atau menggunakan PCB. Ia tidak akan berfungsi dengan mudah di papan roti kerana POT cenderung memberikan beberapa masalah kerana sambungannya tidak baik.
Reka Bentuk PCB menggunakan EasyEDA
Untuk merancang Lengan Robotik PIC ini, kami telah memilih alat EDA dalam talian yang dipanggil EasyEDA. Saya telah menggunakannya sejak sekian lama dan merasa sangat selesa kerana ketersediaan tapak kaki yang luas dan alam yang mudah digunakan. Setelah merancang PCB, kami dapat memesan sampel PCB dengan perkhidmatan fabrikasi PCB kos rendah mereka. Mereka juga menawarkan perkhidmatan sumber komponen di mana mereka mempunyai stok komponen elektronik yang besar dan pengguna dapat memesan komponen yang diperlukan bersama dengan pesanan PCB.
Semasa merancang litar dan PCB anda, anda juga dapat menjadikan reka bentuk litar dan PCB anda menjadi umum sehingga pengguna lain dapat menyalin atau menyuntingnya dan dapat memanfaatkan pekerjaan anda, kami juga telah menjadikan keseluruhan susunan Litar dan PCB kami untuk umum untuk litar ini, periksa pautan di bawah:
easyeda.com/circuitdigest/pic-development-board-for-robotic-arm
Dengan menggunakan pautan ini, anda boleh memesan PCB yang sama dengan yang kami gunakan dalam projek ini dan menggunakannya secara langsung. Setelah reka bentuk selesai, papan dapat dilihat sebagai model 3D yang akan sangat membantu dalam menggambarkan bagaimana papan akan muncul setelah fabrikasi. Model 3D papan yang kami gunakan ditunjukkan di bawah. Selain itu, anda juga dapat melihat lapisan papan atas dan bawah untuk memeriksa sama ada skrin licin seperti yang diharapkan.
Mengira dan Memesan Sampel dalam talian
Setelah menyelesaikan reka bentuk PIC Robot PCB ini, anda boleh memesan PCB melalui JLCPCB.com. Untuk memesan PCB dari JLCPCB, anda memerlukan Gerber File. Untuk memuat turun fail Gerber dari PCB anda, cukup klik butang Hasilkan Fail Fabrikasi di halaman editor EasyEDA, kemudian muat turun fail Gerber dari sana atau anda boleh mengklik Pesanan di JLCPCB seperti yang ditunjukkan dalam gambar di bawah. Ini akan mengarahkan anda ke JLCPCB.com, di mana anda dapat memilih jumlah PCB yang anda ingin pesan, berapa banyak lapisan tembaga yang anda perlukan, ketebalan PCB, berat tembaga, dan juga warna PCB, seperti gambar yang ditunjukkan di bawah:
Setelah anda memilih semua pilihan, klik "Simpan ke Troli" dan kemudian anda akan dibawa ke halaman di mana anda boleh memuat naik Fail Gerber anda yang telah kami muat turun dari EasyEDA. Muat naik fail Gerber anda dan klik "Simpan ke Troli". Dan akhirnya klik pada Checkout dengan selamat untuk menyelesaikan pesanan anda, maka anda akan mendapatkan PCB anda beberapa hari kemudian. Mereka membuat PCB dengan kadar yang sangat rendah iaitu $ 2. Masa pembuatannya juga sangat kurang iaitu 48 jam dengan penghantaran DHL 3-5 hari, pada dasarnya anda akan mendapatkan PCB anda dalam seminggu dari pesanan.
Setelah memesan PCB, anda boleh memeriksa Kemajuan Pengeluaran PCB anda dengan tarikh dan waktu. Anda memeriksanya dengan pergi ke halaman Akaun dan klik pada "Kemajuan Pengeluaran".
Setelah beberapa hari memesan PCB, saya mendapat sampel PCB dalam pembungkusan yang bagus seperti gambar di bawah.
Dan setelah mendapatkan kepingan ini, saya telah menyolder semua komponen yang diperlukan di atas PCB. Saya juga menyolder POT secara langsung dan bukannya menggunakan wayar penyambung kerana wayar wanita ke wanita yang pada mulanya saya gunakan di mana memberikan voltan output analog yang pelik mungkin kerana hubungan yang longgar. Setelah semua komponen dipasang PCB saya kelihatan seperti ini.
Anda mungkin menyedari bahawa hanya ada satu 7805 di papan ini. Ini kerana pada awalnya saya fikir saya boleh melepaskan hanya pengatur untuk menghidupkan motor PIC dan servo dan kemudian saya menyedari bahawa saya memerlukan dua. Oleh itu, saya telah menggunakan litar luaran untuk menghidupkan motor servo melalui wayar hijau yang anda lihat di sini.
Walaupun begitu anda tidak perlu risau kerana; Saya telah membuat perubahan pada PCB sekarang. Anda boleh menggunakan PCB yang diubah suai dan menyolder kedua-dua pengatur di atasnya.
Kerja Lengan Robotik PIC
Selepas semua kerja yang melelahkan, inilah masanya untuk membayar. Selesaikan semua komponen di papan tulis dan muat naik program ke pengawal PIC. Kod Lengkap diberikan di bawah atau boleh dimuat turun dari sini. Penyambung pengaturcaraan yang disediakan di papan akan membantu anda memuat naik program secara langsung menggunakan Pickit 3 tanpa banyak kerumitan. Setelah program dimuat, anda akan melihat LCD memaparkan servo yang sedang dikendalikan. Untuk mengetahui lebih lanjut mengenai pengaturcaraan PIC Microcontroller, ikuti tutorial sebelumnya.
Dari situ anda boleh menghidupkan periuk dan memeriksa bagaimana motor servo bertindak balas setiap potensiometer. Setelah anda memahami formatnya, anda boleh mengawal lengan robot untuk melakukan apa sahaja tindakan yang anda perlukan untuk melakukan dan bersenang-senang. Anda boleh mendapatkan kerja projek yang lengkap dalam video yang dipautkan di bawah.
Itulah harapan anda untuk memahami projek ini dan mengetahui sesuatu yang baru daripadanya. Sekiranya anda mempunyai pertanyaan, tinggalkan di bahagian komen atau gunakan forum untuk perbincangan teknikal yang lain.