Daftar Isi:

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

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

Video: Kontrol Multi Servo Pan-Tilt: 11 Langkah (dengan Gambar)
Video: Pan Tilt Control using Servos for ESP32 Cam | WiFi Security Camera 2024, Juli
Anonim
Kontrol Multi Servo Pan-Tilt
Kontrol Multi Servo Pan-Tilt

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:

Gambar
Gambar

Langkah 1: BoM - Bill of Material

Bagian utama:

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

Gambar
Gambar

Kita dapat menggunakan level tegangan "rata-rata" ini untuk mengontrol kecerahan LED misalnya:

Gambar
Gambar

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

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

Kalibrasi Servo
Kalibrasi Servo
Kalibrasi Servo
Kalibrasi Servo
Kalibrasi Servo
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

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

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

Gambar
Gambar

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

Mekanisme Pan-Tilt - Konstruksi Mekanik
Mekanisme Pan-Tilt - Konstruksi Mekanik
Mekanisme Pan-Tilt - Konstruksi Mekanik
Mekanisme Pan-Tilt - Konstruksi Mekanik
Mekanisme Pan-Tilt - Konstruksi Mekanik
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

Rakitan Pan / Miring Listrik
Rakitan Pan / Miring Listrik
Rakitan Pan / Miring Listrik
Rakitan Pan / Miring Listrik
Rakitan Pan / Miring Listrik
Rakitan Pan / Miring Listrik
Rakitan Pan / Miring Listrik
Rakitan Pan / Miring Listrik

Setelah mekanisme Pan/Tilt Anda terpasang, ikuti foto untuk sambungan listrik penuh.

  1. Matikan Pi Anda.
  2. Lakukan semua sambungan listrik.
  3. Periksa kembali.
  4. Nyalakan Pi Anda terlebih dahulu.
  5. 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:

Gambar
Gambar

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.

Gambar
Gambar

Kode di atas, servoTest.py dapat diunduh dari GitHub saya.

Langkah 11: Kesimpulan

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

Gambar
Gambar

Saludos dari selatan dunia!

Sampai jumpa di instruksi saya berikutnya!

Terima kasih, Marcelo

Direkomendasikan: