Isi kandungan:
- Langkah 1: BoM - Bil Bahan
- Langkah 2: Bagaimana PWM Berfungsi
- Langkah 3: Memasang Hw
- Langkah 4: Penentukuran Servos
- Langkah 5: Membuat Skrip Python
- Langkah 6: Mekanisme Pan-Tilt
- Langkah 7: Mekanisme Pan-Tilt - Pembinaan Mekanikal
- Langkah 8: Pemasangan Pan / Tilt Elektrik
- Langkah 9: Skrip Python
- Langkah 10: Ujian Gelung Pelayan
- Langkah 11: Kesimpulannya
Video: Pan-Tilt Multi Servo Control: 11 Langkah (dengan Gambar)
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:12
Pada tutorial ini, kita akan meneroka cara mengendalikan pelbagai servo menggunakan Python pada Raspberry Pi. Matlamat kami adalah mekanisme PAN / TILT untuk meletakkan kamera (PiCam).
Di sini anda dapat melihat bagaimana projek akhir kami akan berfungsi:
Uji gelung kawalan Servo kawalan:
Langkah 1: BoM - Bil Bahan
Bahagian utama:
- Raspberry Pi V3 - US $ 32.00
- Modul Video Kamera Mini Sensor OV5647 5 Megapiksel 1080p - US $ 13.00
- TowerPro SG90 9G 180 darjah Mikro Servo (2 X) - US $ 4.00
- Mini Pan / Tilt Camera Platform Anti-Getaran Kamera Mount dengan 2 Servos (*) - US $ 8.00
- Perintang 1K ohm (2X) - Pilihan
- Pelbagai: bahagian logam, jalur, dan lain-lain (sekiranya anda akan membina mekanisme Pan / Tilt anda)
(*) anda boleh membeli platform Pan / Tilt lengkap dengan servo atau membina sendiri.
Langkah 2: Bagaimana PWM Berfungsi
Raspberry Pi tidak mempunyai output analog, tetapi kita dapat mensimulasikannya, menggunakan pendekatan PWM (Pulse Width Modulation). Apa yang akan kita lakukan adalah menghasilkan isyarat digital dengan frekuensi tetap, di mana kita akan mengubah lebar kereta nadi, apa yang akan "diterjemahkan" sebagai tahap voltan output "rata-rata" seperti yang ditunjukkan di bawah:
Kita boleh menggunakan tahap voltan "rata-rata" ini untuk mengawal kecerahan LED misalnya:
Perhatikan bahawa yang penting di sini bukanlah frekuensi itu sendiri, tetapi "Duty Cycle", itulah hubungan antara waktu denyut nadi "tinggi" dibahagi dengan tempoh gelombang. Sebagai contoh, anggaplah bahawa kita akan menjana frekuensi nadi 50Hz pada salah satu daripada Raspberry Pi GPIO kami. Tempoh (p) akan terbalik frekuensi atau 20ms (1 / f). Sekiranya kita mahu LED kita dengan "setengah" terang, kita mesti mempunyai Duty Cycle 50%, itu bermaksud "denyut nadi" yang akan "Tinggi" selama 10ms.
Prinsip ini akan sangat penting bagi kita, untuk mengawal kedudukan servo kita, setelah "Duty Cycle" akan menentukan kedudukan servo seperti yang ditunjukkan di bawah:
Servo
Langkah 3: Memasang Hw
Servo akan disambungkan ke bekalan 5V luaran, dengan pin data mereka (dalam kes saya, pendawaian kuning mereka) menyambung ke Raspberry Pi GPIO seperti di bawah:
- GPIO 17 ==> Tilt Servo
- GPIO 27 ==> Pan Servo
Jangan lupa untuk menghubungkan GND bersama ==> Raspberry Pi - Servos - Bekalan Kuasa Luaran)
Sebagai pilihan, perintang 1K ohm antara Raspberry Pi GPIO dan pin input data Pelayan. Ini akan melindungi RPi anda sekiranya berlaku masalah servo.
Langkah 4: Penentukuran Servos
Perkara pertama yang perlu dilakukan adalah mengesahkan ciri utama servos anda. Dalam kes saya, saya menggunakan Power Pro SG90.
Dari lembar datanya, kita dapat mempertimbangkan:
- Julat: 180o
- Bekalan Kuasa: 4.8V (5VDC luaran kerana bekalan kuasa USB berfungsi dengan baik)
- Kekerapan kerja: 50Hz (Tempoh: 20 ms)
- Lebar nadi: dari 1ms hingga 2ms
Secara teori, servo akan terus berjalan
- Kedudukan Awal (0 darjah) apabila nadi 1ms digunakan pada terminal datanya
- Kedudukan Neutral (90 darjah) apabila nadi 1.5 ms digunakan pada terminal datanya
- Kedudukan Akhir (180 darjah) apabila nadi 2 ms digunakan pada terminal datanya
Untuk memprogram kedudukan servo menggunakan Python sangat penting untuk mengetahui koresponden "Duty Cycle" untuk kedudukan di atas, mari kita lakukan beberapa pengiraan:
- Kedudukan Awal ==> (0 darjah) Lebar nadi ==> 1ms ==> Duty Cycle = 1ms / 20ms ==> 2.0%
- Kedudukan Neutral (90 darjah) Lebar nadi 1.5 ms ==> Duty Cycle = 1.5ms / 20ms ==> 7.5%
- Kedudukan Akhir (180 darjah) Lebar nadi 2 ms ==> Duty Cycle = 2ms / 20ms ==> 10%
Jadi Duty Cycle harus berbeza pada julat 2 hingga 10%.
Mari uji servo secara individu. Untuk itu, buka terminal Raspberry anda dan lancarkan editor shell Python 3 anda sebagai "sudo" (kerana anda harus menjadi "pengguna super" untuk menangani GPIO):
sudo python3
Pada Python Shell
>>
Import modul RPI. GPIO dan panggil ia GPIO:
import RPi. GPIO sebagai GPIO
Tentukan skema penomboran pin yang anda mahu gunakan (BCM atau DEWAN). Saya melakukan ujian ini dengan BOARD, jadi pin yang saya gunakan adalah pin fizikal (GPIO 17 = Pin 11 dan GPIO 27 Pin 13). Mudah untuk saya mengenalinya dan tidak melakukan kesalahan semasa ujian (Dalam program akhir saya akan menggunakan BCM). Pilih salah satu pilihan anda:
GPIO.setmode (GPIO. BOARD)
Tentukan pin servo yang anda gunakan:
tiltPin = 11
Sekiranya Sebaliknya, anda telah menggunakan skema BCM, 2 perintah terakhir harus diganti dengan:
GPIO.setmode (GPIO. BCM)
tiltPin = 17
Sekarang, kita mesti menentukan bahawa pin ini akan menjadi "output"
GPIO.setup (tiltPin, GPIO. OUT)
Dan, berapa frekuensi yang dihasilkan pada pin ini, bahawa untuk servo kami adalah 50Hz:
tilt = GPIO. PWM (tiltPin, 50)
Sekarang, mari mula menghasilkan isyarat PWM pada pin dengan kitaran tugas awal (kami akan menyimpannya "0"):
kecondongan = mula (0)
Sekarang, anda boleh memasukkan nilai kitaran tugas yang berbeza, memerhatikan pergerakan servo anda. Mari mulakan dengan 2% dan lihat apa yang berlaku (kami melihat bahawa servo menuju ke "kedudukan sifar"):
tilt. ChangeDutyCycle (2)
Dalam kes saya, servo pergi ke kedudukan sifar tetapi ketika saya menukar putaran tugas menjadi 3% saya melihat bahawa servo tetap berada di posisi yang sama, mula bergerak dengan kitaran tugas lebih besar dari 3%. Jadi, 3% adalah kedudukan awal saya (o darjah). Perkara yang sama berlaku dengan 10%, servo saya melebihi nilai ini, mendahului 13%. Jadi untuk servo ini, hasilnya adalah:
- 0 darjah ==> kitaran tugas 3%
- 90 darjah ==> kitaran tugas 8%
- 180 darjah ==> kitaran tugas 13%
Selepas anda menyelesaikan ujian, anda mesti menghentikan PWM dan membersihkan GPIO:
kecondongan = berhenti ()
GPIO.cleanup ()
Skrin cetak Terminal di atas menunjukkan hasil untuk kedua-dua servos saya (yang mempunyai hasil yang serupa). Jangkauan anda boleh berbeza.
Langkah 5: Membuat Skrip Python
Perintah PWM yang akan dikirim ke servo kami berada dalam "cycle cycle" seperti yang kita lihat pada langkah terakhir. Tetapi biasanya, kita mesti menggunakan "sudut" dalam darjah sebagai parameter untuk mengawal servo. Jadi, kita mesti menukar "sudut" yang merupakan ukuran yang lebih semula jadi kepada kita dalam kitaran tugas seperti yang dapat difahami oleh Pi kita.
Bagaimana hendak melakukannya? Sangat ringkas! Kami tahu bahawa julat kitaran tugas bermula dari 3% hingga 13% dan ini setara dengan sudut yang berkisar antara 0 hingga 180 darjah. Kita juga tahu bahawa variasi tersebut adalah linear, jadi kita dapat membina skema berkadar seperti yang ditunjukkan di atas. jadi, dengan sudut, kita boleh mempunyai kitaran tugas koresponden:
dutycycle = sudut / 18 + 3
Kekalkan formula ini. Kami akan menggunakannya dalam kod seterusnya.
Mari buat skrip Python untuk melaksanakan ujian. Pada dasarnya, kami akan mengulangi apa yang kami lakukan sebelumnya di Python Shell:
dari waktu tidur import
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 = sudut / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) tidur (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 kod di atas adalah fungsi setServoAngle (servo, angle). Fungsi ini diterima sebagai argumen, nombor GPIO servo, dan nilai sudut ke mana servo mesti diletakkan. Setelah input fungsi ini "sudut", kita mesti mengubahnya menjadi kitaran tugas dalam bentuk peratusan, menggunakan formula yang dikembangkan sebelumnya.
Apabila skrip dijalankan, anda mesti memasukkan parameter, servo GPIO, dan sudut.
Sebagai contoh:
sudo python3 angleServoCtrl.py 17 45
Perintah di atas akan meletakkan servo yang disambungkan pada GPIO 17 dengan 45 darjah "ketinggian". Perintah serupa boleh digunakan untuk kawalan Pan Servo (kedudukan hingga 45 darjah dalam "azimuth"):
sudo python angleServoCtrl.py 27 45
Sudut failServoCtrl.py boleh dimuat turun dari GitHub saya
Langkah 6: Mekanisme Pan-Tilt
Servo "Pan" akan bergerak "melintang" kamera kami ("sudut azimuth") dan servo "Tilt" kami akan menggerakkannya "menegak" (sudut ketinggian).
Gambar di bawah menunjukkan bagaimana mekanisme Pan / Tilt berfungsi:
Semasa pengembangan kami tidak akan pergi ke "ekstrem" dan kami akan menggunakan mekanisme Pan / Tilt kami dari 30 hingga 150 darjah sahaja. Julat ini akan cukup untuk digunakan dengan kamera.
Langkah 7: Mekanisme Pan-Tilt - Pembinaan Mekanikal
Mari sekarang, kumpulkan 2 servo kami sebagai mekanisme Pan / Tilt. Anda boleh melakukan 2 perkara di sini. Beli mekanisme platform Pan-Tilt seperti yang ditunjukkan pada langkah terakhir atau bina sendiri mengikut keperluan anda.
Salah satu contohnya ialah contoh yang saya bina, hanya mengikat servo satu sama lain, dan menggunakan kepingan logam kecil dari mainan lama seperti yang ditunjukkan dalam foto di atas.
Langkah 8: Pemasangan Pan / Tilt Elektrik
Setelah mekanisme Pan / Tilt anda dipasang, ikuti foto untuk sambungan elektrik sepenuhnya.
- Matikan Pi anda.
- Lakukan semua sambungan elektrik.
- Periksa semula.
- Hidupkan Pi anda terlebih dahulu.
- Sekiranya semuanya baik-baik saja, hidupkan servo anda.
Kami tidak akan menerangkan mengenai tutorial ini cara memasang kamera, ini akan dijelaskan pada tutorial seterusnya.
Langkah 9: Skrip Python
Mari buat Skrip Python untuk mengawal kedua-dua servo secara serentak:
dari waktu tidur import
import 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) # grey ==> PAN def setServoAngle (servo, angle): assert angle> = 30 dan sudut 90 (titik tengah) ==> 150 setServoAngle (tilt, int (sys.argv [2])) # 30 ==> 90 (titik tengah) ==> 150 GPIO.cleanup ()
Apabila skrip dijalankan, anda mesti memasukkan sebagai parameter, sudut Pan dan sudut kecondongan. Sebagai contoh:
sudo python3 servoCtrl.py 45 120
Perintah di atas akan meletakkan mekanisme Pan / Tilt dengan 45 darjah dalam "azimuth" (sudut Pan) dan 120 darjah "elevasi" (Tilt Angle). Perhatikan bahawa jika tidak ada parameter yang dimasukkan, lalai adalah kedua-duanya, sudut pan dan condong ditetapkan hingga 90 darjah.
Di bawah ini anda dapat melihat beberapa ujian:
Fail servoCtrl.py boleh dimuat turun dari GitHub saya.
Langkah 10: Ujian Gelung Pelayan
Sekarang mari kita buat Skrip Python untuk menguji servis servo secara automatik:
dari waktu tidur import
import 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) # grey ==> PAN def setServoAngle (servo, angle): assert angle> = 30 and angle <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = sudut / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) tidur (0.3) pwm.stop () if _name_ == '_main_': for i in range (30, 160, 15): setServoAngle (pan, i) setServoAngle (tilt, i) untuk i in julat (150, 30, -15): setServoAngle (pan, i) setServoAngle (tilt, i) setServoAngle (pan, 100) setServoAngle (tilt, 90) GPIO.cleanup ()
Program ini akan menjalankan gelung secara automatik dari 30 hingga 150 darjah di kedua sudut.
Di bawah hasilnya:
Saya menghubungkan osiloskop hanya untuk menggambarkan teori PWM seperti yang dijelaskan sebelumnya.
Kod di atas, servoTest.py boleh dimuat turun dari GitHub saya.
Langkah 11: Kesimpulannya
Seperti biasa, saya harap projek ini dapat membantu orang lain memasuki dunia elektronik yang menarik!
Untuk keterangan dan kod akhir, sila kunjungi simpanan GitHub saya: RPi-Pan-Tilt-Servo-Control
Untuk lebih banyak projek, sila lawati blog saya: MJRoBot.org
Di bawah sekilas tutorial seterusnya:
Saludos dari selatan dunia!
Jumpa anda dalam arahan saya seterusnya!
Terima kasih, Marcelo
Disyorkan:
Arduino Multi Light Controller: 7 Langkah (dengan Gambar)
Arduino Multi Light Controller: Rakan sekerja dan artis Jim Hobbs merancang untuk membina pemasangan bebas untuk pameran yang disusunnya. Pemasangan ini akan terdiri daripada 8 rak yang membentuk bentuk parabola. Setiap 8 rak mempunyai 10 mentol lampu
ALAT PENGUKURAN MULTI-FUNGSI DIGITAL: 21 Langkah (dengan Gambar)
ALAT PENGUKURAN MULTI-FUNGSI DIGITAL: Hai semua. Saya selalu mahukan peranti yang dapat membantu saya meratakan tempat tidur pencetak 3D saya dan beberapa peranti lain yang akan membantu saya mendapatkan panjang permukaan melengkung sehingga saya dapat dengan mudah memotong panjang pelekat yang betul hingga
Brightness Control PWM Based LED Control Menggunakan Push Button, Raspberry Pi dan Scratch: 8 Langkah (dengan Gambar)
Brightness Control PWM Based LED Control Menggunakan Push Button, Raspberry Pi dan Scratch: Saya cuba mencari cara untuk menerangkan bagaimana PWM bekerja kepada pelajar saya, jadi saya menetapkan tugas untuk mengawal kecerahan LED menggunakan 2 butang tekan - satu butang meningkatkan kecerahan LED dan yang lain meredupkannya. Untuk progra
Dok Pengecas Perisian Lego Multi, Tablet Telefon: 15 Langkah (dengan Gambar)
Lego Multi Device Charge Dock, Tablet Telefon: bina dok cas lego anda sendiri
Lampu LED Serial Menggunakan LED Multi Warna: 3 Langkah (dengan Gambar)
Lampu LED Serial Menggunakan LED Multi Warna: Lampu LED Serial tidak begitu mahal tetapi jika anda seorang pencinta DIY (seorang Hobi) seperti saya, maka anda boleh membuat LED bersiri anda sendiri dan lebih murah daripada lampu yang terdapat di pasaran. Jadi, Hari ini saya akan membuat lampu LED Serial saya sendiri yang berjalan pada 5 Vol