Daftar Isi:
- Langkah 1: BoM - Bill of Material
- Langkah 2: Cara Kerja PWM
- Langkah 3: Memasang Hw
- Langkah 4: Kalibrasi Servo
- Langkah 5: Membuat Skrip Python
- Langkah 6: Mekanisme Pan-Tilt
- Langkah 7: Mekanisme Pan-Tilt - Konstruksi Mekanik
- Langkah 8: Rakitan Pan / Tilt Listrik
- Langkah 9: Skrip Python
- Langkah 10: Uji Loop Server
- Langkah 11: Kesimpulan
Video: Kontrol Multi Servo Pan-Tilt: 11 Langkah (dengan Gambar)
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:57
Pada tutorial ini, kita akan mengeksplorasi cara mengontrol beberapa servo menggunakan Python pada Raspberry Pi. Tujuan kami adalah mekanisme PAN/TILT untuk memposisikan kamera (PiCam).
Di sini Anda dapat melihat bagaimana proyek akhir kami akan bekerja:
Kontrol Servo Kontrol loop tes:
Langkah 1: BoM - Bill of Material
Bagian utama:
- Raspberry Pi V3 - US$ 32.00
- 5 Megapiksel 1080p Sensor OV5647 Modul Video Kamera Mini - US$13.00
- TowerPro SG90 9G 180 derajat Micro Servo (2 X)- US$ 4.00
- Mini Pan/Tilt Camera Platform Kamera Anti-Getaran Mount w/2 Servos (*) - US$ 8.00
- Resistor 1K ohm (2X) - Opsional
- Lain-lain: bagian logam, pita, dll (jika Anda akan membuat mekanisme Pan/Tilt)
(*) Anda dapat membeli platform Pan/Tilt lengkap dengan servos atau membuatnya sendiri.
Langkah 2: Cara Kerja PWM
Raspberry Pi tidak memiliki output analog, tetapi kita dapat mensimulasikannya, menggunakan pendekatan PWM (Pulse Width Modulation). Yang akan kita lakukan adalah membangkitkan sinyal digital dengan frekuensi tetap, dimana kita akan mengubah lebar rangkaian pulsa, yang akan “diterjemahkan” menjadi level tegangan output “rata-rata” seperti gambar di bawah ini:
Kita dapat menggunakan level tegangan "rata-rata" ini untuk mengontrol kecerahan LED misalnya:
Perhatikan bahwa yang penting di sini bukanlah frekuensi itu sendiri, tetapi "Duty Cycle", yaitu hubungan antara waktu pulsa "tinggi" dibagi dengan periode gelombang. Sebagai contoh, misalkan kita akan membangkitkan frekuensi pulsa 50Hz pada salah satu GPIO Raspberry Pi kita. Periode (p) adalah kebalikan dari frekuensi atau 20ms (1/f). Jika kita ingin LED kita dengan "setengah" terang, kita harus memiliki Siklus Tugas 50%, itu berarti "denyut" yang akan menjadi "Tinggi" selama 10ms.
Prinsip ini akan sangat penting bagi kita, untuk mengontrol posisi servo kita, setelah "Duty Cycle" akan menentukan posisi servo seperti gambar di bawah ini:
Servo
Langkah 3: Memasang Hw
Servo akan terhubung ke catu 5V eksternal, memiliki pin datanya (dalam kasus saya, kabel kuningnya) terhubung ke Raspberry Pi GPIO seperti di bawah ini:
- GPIO 17 ==> Miringkan Servo
- GPIO 27 ==> Pan Servo
Jangan lupa untuk menghubungkan GND bersama ==> Raspberry Pi - Servos - Catu Daya Eksternal)
Anda dapat memiliki sebagai opsi, resistor 1K ohm antara Raspberry Pi GPIO dan pin input data Server. Ini akan melindungi RPi Anda jika terjadi masalah servo.
Langkah 4: Kalibrasi Servo
Hal pertama yang harus dilakukan adalah mengkonfirmasi karakteristik utama servo Anda. Dalam kasus saya, saya menggunakan Power Pro SG90.
Dari lembar datanya, kita dapat mempertimbangkan:
- Rentang: 180o
- Catu Daya: 4.8V (eksternal 5VDC sebagai catu daya USB berfungsi dengan baik)
- Frekuensi kerja: 50Hz (Periode: 20 ms)
- Lebar pulsa: dari 1ms hingga 2ms
Secara teori, servo akan menyala
- Posisi Awal (0 derajat) ketika pulsa 1ms diterapkan ke terminal datanya
- Posisi Netral (90 derajat) ketika pulsa 1,5 ms diterapkan ke terminal datanya
- Posisi Akhir (180 derajat) ketika pulsa 2 ms diterapkan ke terminal datanya
Untuk memprogram posisi servo menggunakan Python akan sangat penting untuk mengetahui koresponden "Duty Cycle" untuk posisi di atas, mari lakukan beberapa perhitungan:
- Posisi Awal ==> (0 derajat) Lebar pulsa ==> 1ms ==> Duty Cycle = 1ms/20ms ==> 2.0%
- Posisi Netral (90 derajat) Lebar pulsa 1,5 ms ==> Siklus Kerja = 1,5 md/20 md ==> 7,5%
- Posisi Akhir (180 derajat) Lebar pulsa 2 ms ==> Duty Cycle = 2ms/20ms ==> 10%
Jadi Siklus Tugas harus bervariasi pada kisaran 2 hingga 10%.
Mari kita uji servos satu per satu. Untuk itu, buka terminal Raspberry Anda dan luncurkan editor shell Python 3 Anda sebagai "sudo" (karena Anda harus menjadi "pengguna super" untuk menangani dengan GPIO):
sudo python3
Di Python Shell
>>
Impor modul RPI. GPIO dan beri nama GPIO:
impor RPi. GPIO sebagai GPIO
Tentukan skema penomoran pin yang ingin Anda gunakan (BCM atau BOARD). Pengujian ini saya lakukan dengan BOARD, jadi pin yang saya gunakan adalah pin fisik (GPIO 17 = Pin 11 dan GPIO 27 Pin 13). Mudah bagi saya untuk mengidentifikasi mereka dan tidak membuat kesalahan selama tes (Dalam program akhir saya akan menggunakan BCM). Pilih salah satu dari preferensi Anda:
GPIO.setmode(GPIO. PAPAN)
Tentukan pin servo yang Anda gunakan:
kemiringanPin = 11
Jika Sebaliknya, Anda telah menggunakan skema BCM, 2 perintah terakhir harus diganti dengan:
GPIO.setmode(GPIO. BCM)
kemiringan Pin = 17
Sekarang, kita harus menentukan bahwa pin ini akan menjadi "output"
GPIO.setup(tiltPin, GPIO. OUT)
Dan, berapa frekuensi yang dihasilkan pada pin ini, sehingga untuk servo kami akan menjadi 50Hz:
kemiringan = GPIO. PWM(tiltPin, 50)
Sekarang, mari kita mulai menghasilkan sinyal PWM pada pin dengan siklus tugas awal (kita akan menyimpannya "0"):
miring = mulai(0)
Sekarang, Anda dapat memasukkan nilai siklus tugas yang berbeda, mengamati pergerakan servo Anda. Mari kita mulai dengan 2% dan lihat apa yang terjadi (kami berharap servo menuju ke "posisi nol"):
miring. UbahDutyCycle(2)
Dalam kasus saya, servo pergi ke posisi nol tetapi ketika saya mengubah siklus tugas menjadi 3% saya mengamati bahwa servo tetap di posisi yang sama, mulai bergerak dengan siklus tugas lebih besar dari 3%. Jadi, 3% adalah posisi awal saya (o derajat). Hal yang sama terjadi dengan 10%, servo saya melampaui nilai ini, mencapai puncaknya pada 13%. Jadi untuk servo khusus ini, hasilnya adalah:
- 0 derajat ==> siklus tugas 3%
- 90 derajat ==> siklus tugas 8%
- 180 derajat ==> siklus tugas 13%
Setelah Anda menyelesaikan tes Anda, Anda harus menghentikan PWM dan membersihkan GPIO:
miring = berhenti ()
GPIO.pembersihan()
Layar cetak Terminal di atas menunjukkan hasil untuk kedua servo saya (yang memiliki hasil yang serupa). Jangkauan Anda bisa berbeda.
Langkah 5: Membuat Skrip Python
Perintah PWM yang akan dikirim ke servo kita berada dalam "siklus tugas" seperti yang kita lihat pada langkah terakhir. Tapi biasanya, kita harus menggunakan "sudut" dalam derajat sebagai parameter untuk mengontrol servo. Jadi, kita harus mengonversi "sudut" yang merupakan pengukuran yang lebih alami bagi kita dalam siklus tugas seperti yang dapat dipahami oleh Pi kita.
Bagaimana cara melakukannya? Sangat sederhana! Kita tahu bahwa rentang siklus tugas berkisar dari 3% hingga 13% dan ini setara dengan sudut yang berkisar dari 0 hingga 180 derajat. Juga, kita tahu bahwa variasi tersebut linier, sehingga kita dapat membuat skema proporsional seperti yang ditunjukkan di atas. jadi, diberikan sudut, kita dapat memiliki siklus tugas koresponden:
dutycycle = sudut/18 + 3
Simpan rumus ini. Kami akan menggunakannya dalam kode berikutnya.
Mari buat skrip Python untuk menjalankan tes. Pada dasarnya, kami akan mengulangi apa yang kami lakukan sebelumnya di Python Shell:
dari waktu impor tidur
import RPi. GPIO sebagai GPIO GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) def setServoAngle(servo, angle): pwm = GPIO. PWM(servo, 50) pwm.start(8) dutyCycle = angle / 18. + 3. pwm. ChangeDutyCycle(dutyCycle) sleep(0.3) pwm.stop() if _name_ == '_main_': import sys servo = int(sys.argv[1]) GPIO.setup(servo, GPIO. OUT) setServoAngle (servo, int(sys.argv[2])) GPIO.cleanup()
Inti dari kode di atas adalah fungsi setServoAngle(servo, angle). Fungsi ini menerima sebagai argumen, nomor GPIO servo, dan nilai sudut ke tempat servo harus diposisikan. Setelah input dari fungsi ini adalah "sudut", kita harus mengubahnya menjadi siklus kerja dalam persentase, menggunakan rumus yang dikembangkan sebelumnya.
Saat skrip dijalankan, Anda harus memasukkan parameter, servo GPIO, dan sudut.
Sebagai contoh:
sudo python3 angleServoCtrl.py 17 45
Perintah di atas akan memposisikan servo terhubung pada GPIO 17 dengan 45 derajat dalam "elevasi". Perintah serupa dapat digunakan untuk kontrol Pan Servo (posisi hingga 45 derajat dalam "azimuth"):
sudo python angleServoCtrl.py 27 45
File angleServoCtrl.py dapat diunduh dari GitHub saya
Langkah 6: Mekanisme Pan-Tilt
Servo "Pan" akan menggerakkan "horizontal" kamera kita ("sudut azimuth") dan servo "Tilt" kita akan menggerakkannya "vertikal" (sudut elevasi).
Gambar di bawah ini menunjukkan cara kerja mekanisme Pan/Tilt:
Selama pengembangan kami, kami tidak akan pergi ke "ekstrim" dan kami akan menggunakan mekanisme Pan/Tilt kami dari 30 hingga 150 derajat saja. Rentang ini akan cukup untuk digunakan dengan kamera.
Langkah 7: Mekanisme Pan-Tilt - Konstruksi Mekanik
Sekarang mari kita merakit 2 servo kita sebagai mekanisme Pan/Tilt. Anda dapat melakukan 2 hal di sini. Beli mekanisme platform Pan-Tilt seperti yang ditunjukkan pada langkah terakhir atau buat sendiri sesuai kebutuhan Anda.
Salah satu contohnya adalah yang saya buat, hanya mengikat servo satu sama lain, dan menggunakan potongan logam kecil dari mainan lama seperti yang ditunjukkan pada foto di atas.
Langkah 8: Rakitan Pan / Tilt Listrik
Setelah mekanisme Pan/Tilt Anda terpasang, ikuti foto untuk sambungan listrik penuh.
- Matikan Pi Anda.
- Lakukan semua sambungan listrik.
- Periksa kembali.
- Nyalakan Pi Anda terlebih dahulu.
- Jika semuanya baik-baik saja, nyalakan servo Anda.
Kita tidak akan mengupas pada tutorial ini cara mengatur kamera, ini akan dijelaskan pada tutorial selanjutnya.
Langkah 9: Skrip Python
Mari buat Script Python untuk mengontrol kedua servo secara bersamaan:
dari waktu impor tidur
impor RPi. GPIO sebagai GPIO GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) pan = 27 tilt = 17 GPIO.setup(tilt, GPIO. OUT) # white => TILT GPIO.setup(pan, GPIO. OUT)) # abu-abu ==> PAN def setServoAngle(servo, angle): menegaskan sudut >=30 dan sudut 90 (titik tengah) ==> 150 setServoAngle(miring, int(sys.argv[2])) # 30 ==> 90 (titik tengah) ==> 150 GPIO.cleanup()
Saat skrip dijalankan, Anda harus memasukkan sebagai parameter, Sudut pan dan sudut kemiringan. Sebagai contoh:
sudo python3 servoCtrl.py 45 120
Perintah di atas akan memposisikan mekanisme Pan/Tilt dengan posisi "azimuth" 45 derajat (sudut Pan) dan "elevasi" 120 derajat (Sudut Miring). Perhatikan bahwa jika tidak ada parameter yang dimasukkan, defaultnya adalah keduanya, sudut pan dan tilt diatur hingga 90 derajat.
Di bawah ini Anda dapat melihat beberapa tes:
File servoCtrl.py dapat diunduh dari GitHub saya.
Langkah 10: Uji Loop Server
Sekarang mari kita buat Skrip Python untuk secara otomatis menguji rangkaian lengkap servos:
dari waktu impor tidur
impor RPi. GPIO sebagai GPIO GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) pan = 27 tilt = 17 GPIO.setup(tilt, GPIO. OUT) # white => TILT GPIO.setup(pan, GPIO. OUT)) # abu-abu ==> PAN def setServoAngle(servo, angle): menegaskan sudut >=30 dan sudut <= 150 pwm = GPIO. PWM(servo, 50) pwm.start(8) dutyCycle = angle / 18. + 3. pwm. ChangeDutyCycle(dutyCycle) sleep(0.3) pwm.stop() if _name_ == '_main_': for i in range (30, 160, 15): setServoAngle(pan, i) setServoAngle(tilt, i) for i in range (150, 30, -15): setServoAngle(pan, i) setServoAngle(tilt, i) setServoAngle(pan, 100) setServoAngle(tilt, 90) GPIO.cleanup()
Program akan mengeksekusi loop secara otomatis dari 30 hingga 150 derajat di kedua sudut.
Di bawah hasilnya:
Saya menghubungkan osiloskop hanya untuk mengilustrasikan teori PWM seperti yang dijelaskan sebelumnya.
Kode di atas, servoTest.py dapat diunduh dari GitHub saya.
Langkah 11: Kesimpulan
Seperti biasa, saya berharap proyek ini dapat membantu orang lain menemukan jalan mereka ke dunia elektronik yang menarik!
Untuk detail dan kode akhir, silakan kunjungi penyimpanan GitHub saya: RPi-Pan-Tilt-Servo-Control
Untuk proyek lainnya, silakan kunjungi blog saya: MJRoBot.org
Di bawah ini sekilas tutorial saya berikutnya:
Saludos dari selatan dunia!
Sampai jumpa di instruksi saya berikutnya!
Terima kasih, Marcelo
Direkomendasikan:
Kontrol Gerakan Sederhana - Kontrol Mainan RC Anda Dengan Gerakan Lengan Anda: 4 Langkah (dengan Gambar)
Kontrol Gerakan Sederhana - Kontrol Mainan RC Anda Dengan Gerakan Lengan Anda: Selamat datang di 'ible' saya #45. Beberapa waktu yang lalu saya membuat BB8 versi RC yang berfungsi penuh menggunakan bagian Lego Star Wars … https://www.instructables.com/id/Whats-Inside-My-R…Ketika saya melihat betapa kerennya itu Force Band yang dibuat oleh Sphero, saya berpikir: "Ok, saya c
Kontrol Tirai Dengan ESP8266, Integrasi Google Home dan Openhab dan Kontrol Web: 5 Langkah (dengan Gambar)
Kontrol Tirai Dengan ESP8266, Integrasi Google Home dan Openhab dan Kontrol Web: Dalam Instruksi ini saya menunjukkan kepada Anda bagaimana saya menambahkan otomatisasi ke tirai saya. Saya ingin dapat menambah dan menghapus otomatisasi itu, jadi semua instalasi adalah clip on. Bagian utama adalah: Motor stepper Driver stepper dikendalikan bij ESP-01 Gear dan pemasangan
Shadow Light Box - Kontrol dengan IR Remote Dengan Arduino: 8 Langkah (dengan Gambar)
Shadow Light Box - Kontrol dengan IR Remote Dengan Arduino: Instruksi ini akan memandu cara membuat kotak cahaya bayangan untuk Natal berikutnya. Anda dapat membuat sendiri untuk mendekorasi kamar Anda, atau menjadikannya untuk teman Anda sebagai hadiah. Kotak bayangan ini dapat membuat berbagai macam warna dengan mencampur warna dengan warna Merah, Biru, Hijau
Kontrol Kecerahan Kontrol LED Berbasis PWM Menggunakan Push Buttons, Raspberry Pi dan Scratch: 8 Langkah (dengan Gambar)
Kontrol Kecerahan Kontrol LED Berbasis PWM Menggunakan Push Buttons, Raspberry Pi dan Scratch: Saya mencoba mencari cara untuk menjelaskan cara kerja PWM kepada siswa saya, jadi saya menetapkan sendiri tugas untuk mencoba mengontrol kecerahan LED menggunakan 2 tombol tekan - satu tombol meningkatkan kecerahan LED dan yang lainnya meredupkannya. Untuk memprogram
Kontrol Banyak Servo Dengan Arduino!: 4 Langkah (dengan Gambar)
Kontrol Banyak Servo Dengan Arduino!: Pada awalnya saya harus mengatakan sesuatu. Saya tidak punya gambar yang indah. Jadi, saya telah mengambil gambar dari bildr.blog. Kita tahu, Arduino UNO tidak memiliki banyak pin pwm untuk mengontrol banyak servo. Jadi, kita sering tersandung masalah untuk mengontrol lebih banyak servo oleh arduino