Isi kandungan:

Pan-Tilt Multi Servo Control: 11 Langkah (dengan Gambar)
Pan-Tilt Multi Servo Control: 11 Langkah (dengan Gambar)

Video: Pan-Tilt Multi Servo Control: 11 Langkah (dengan Gambar)

Video: Pan-Tilt Multi Servo Control: 11 Langkah (dengan Gambar)
Video: Multiple Servo Motor Control with Joystick and Arduino 2024, Julai
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

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:

Imej
Imej

Langkah 1: BoM - Bil Bahan

Bahagian utama:

  1. Raspberry Pi V3 - US $ 32.00
  2. Modul Video Kamera Mini Sensor OV5647 5 Megapiksel 1080p - US $ 13.00
  3. TowerPro SG90 9G 180 darjah Mikro Servo (2 X) - US $ 4.00
  4. Mini Pan / Tilt Camera Platform Anti-Getaran Kamera Mount dengan 2 Servos (*) - US $ 8.00
  5. Perintang 1K ohm (2X) - Pilihan
  6. 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:

Imej
Imej

Kita boleh menggunakan tahap voltan "rata-rata" ini untuk mengawal kecerahan LED misalnya:

Imej
Imej

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

Memasang Hw
Memasang Hw
Memasang Hw
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

Penentukuran Servos
Penentukuran Servos
Penentukuran Servos
Penentukuran Servos
Penentukuran Servos
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

Membuat Skrip Python
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

Mekanisme Pan-Tilt
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:

Imej
Imej

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

Mekanisme Pan-Tilt - Pembinaan Mekanikal
Mekanisme Pan-Tilt - Pembinaan Mekanikal
Mekanisme Pan-Tilt - Pembinaan Mekanikal
Mekanisme Pan-Tilt - Pembinaan Mekanikal
Mekanisme Pan-Tilt - Pembinaan Mekanikal
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

Pemasangan Pan / Tilt Elektrik
Pemasangan Pan / Tilt Elektrik
Pemasangan Pan / Tilt Elektrik
Pemasangan Pan / Tilt Elektrik
Pemasangan Pan / Tilt Elektrik
Pemasangan Pan / Tilt Elektrik
Pemasangan Pan / Tilt Elektrik
Pemasangan Pan / Tilt Elektrik

Setelah mekanisme Pan / Tilt anda dipasang, ikuti foto untuk sambungan elektrik sepenuhnya.

  1. Matikan Pi anda.
  2. Lakukan semua sambungan elektrik.
  3. Periksa semula.
  4. Hidupkan Pi anda terlebih dahulu.
  5. 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:

Imej
Imej

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.

Imej
Imej

Kod di atas, servoTest.py boleh dimuat turun dari GitHub saya.

Langkah 11: Kesimpulannya

Kesimpulannya
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:

Imej
Imej

Saludos dari selatan dunia!

Jumpa anda dalam arahan saya seterusnya!

Terima kasih, Marcelo

Disyorkan: