Mục lục:

Điều khiển đa Servo Pan-Tilt: 11 bước (có Hình ảnh)
Điều khiển đa Servo Pan-Tilt: 11 bước (có Hình ảnh)

Video: Điều khiển đa Servo Pan-Tilt: 11 bước (có Hình ảnh)

Video: Điều khiển đa Servo Pan-Tilt: 11 bước (có Hình ảnh)
Video: ESP32 CAM With Pan and Tilt Servo Mount Assembly & Joystick 2024, Tháng bảy
Anonim
Điều khiển đa Servo Pan-Tilt
Điều khiển đa Servo Pan-Tilt

Trong hướng dẫn này, chúng ta sẽ khám phá cách điều khiển nhiều servos bằng Python trên Raspberry Pi. Mục tiêu của chúng tôi sẽ là cơ chế PAN / TILT để định vị máy ảnh (PiCam).

Ở đây bạn có thể thấy dự án cuối cùng của chúng tôi sẽ hoạt động như thế nào:

Kiểm tra vòng điều khiển Servo Control:

Hình ảnh
Hình ảnh

Bước 1: Hội đồng quản trị - Hóa đơn nguyên vật liệu

Phần chính:

  1. Raspberry Pi V3 - US $ 32,00
  2. 5 Megapixel 1080p Sensor 1080p Mô-đun video máy ảnh mini OV5647 - US $ 13,00
  3. TowerPro SG90 9G 180 độ Micro Servo (2 X) - US $ 4,00
  4. Nền tảng máy ảnh xoay / nghiêng mini Giá đỡ máy ảnh chống rung w / 2 Servos (*) - US $ 8,00
  5. Điện trở 1K ohm (2X) - Tùy chọn
  6. Khác: các bộ phận kim loại, dây đeo, v.v. (trong trường hợp bạn sẽ xây dựng cơ chế Pan / Tilt của mình)

(*) bạn có thể mua một nền tảng Pan / Tilt hoàn chỉnh với servos hoặc xây dựng nền tảng của riêng bạn.

Bước 2: Cách hoạt động của PWM

Raspberry Pi không có đầu ra tương tự, nhưng chúng ta có thể mô phỏng điều này bằng cách sử dụng phương pháp PWM (Điều chế độ rộng xung). Những gì chúng tôi sẽ làm là tạo ra một tín hiệu kỹ thuật số với một tần số cố định, nơi chúng tôi sẽ thay đổi độ rộng của kênh xung, những gì sẽ được "dịch" thành mức điện áp đầu ra "trung bình" như hình dưới đây:

Hình ảnh
Hình ảnh

Chúng tôi có thể sử dụng mức điện áp "trung bình" này để điều khiển độ sáng của đèn LED, ví dụ:

Hình ảnh
Hình ảnh

Lưu ý rằng điều quan trọng ở đây không phải là bản thân tần số, mà là "Chu kỳ nhiệm vụ", đó là mối quan hệ giữa thời gian mà xung là "cao" chia cho chu kỳ sóng. Ví dụ: giả sử rằng chúng tôi sẽ tạo tần số xung 50Hz trên một trong các GPIO Raspberry Pi của chúng tôi. Chu kỳ (p) sẽ là nghịch đảo của tần số hoặc 20ms (1 / f). Nếu chúng ta muốn đèn LED của mình sáng "một nửa", chúng ta phải có Chu kỳ hoạt động là 50%, có nghĩa là "xung" sẽ là "Cao" trong 10ms.

Nguyên tắc này sẽ rất quan trọng đối với chúng tôi, để kiểm soát vị trí servo của chúng tôi, khi "Chu kỳ làm việc" sẽ xác định vị trí servo như được hiển thị bên dưới:

Servo

Bước 3: Cài đặt Hw

Cài đặt Hw
Cài đặt Hw
Cài đặt Hw
Cài đặt Hw

Servos sẽ được kết nối với nguồn cung cấp 5V bên ngoài, có chân dữ liệu của chúng (trong trường hợp của tôi là dây màu vàng) kết nối với Raspberry Pi GPIO như bên dưới:

  • GPIO 17 ==> Nghiêng Servo
  • GPIO 27 ==> Pan Servo

Đừng quên kết nối các GND với nhau ==> Raspberry Pi - Servos - Nguồn điện bên ngoài)

Bạn có thể có như một tùy chọn, một điện trở 1K ohm giữa Raspberry Pi GPIO và chân đầu vào dữ liệu Máy chủ. Điều này sẽ bảo vệ RPi của bạn trong trường hợp có sự cố servo.

Bước 4: Hiệu chuẩn Servos

Hiệu chuẩn Servos
Hiệu chuẩn Servos
Hiệu chuẩn Servos
Hiệu chuẩn Servos
Hiệu chuẩn Servos
Hiệu chuẩn Servos

Điều đầu tiên cần làm là xác nhận các đặc điểm chính của servos của bạn. Trong trường hợp của tôi, tôi đang sử dụng Power Pro SG90.

Từ biểu dữ liệu của nó, chúng ta có thể xem xét:

  • Phạm vi: 180o
  • Nguồn cung cấp: 4.8V (5VDC bên ngoài như nguồn điện USB hoạt động tốt)
  • Tần số làm việc: 50Hz (Khoảng thời gian: 20 ms)
  • Độ rộng xung: từ 1ms đến 2ms

Về lý thuyết, servo sẽ nằm trên

  • Vị trí ban đầu (0 độ) khi xung 1ms được áp dụng cho đầu cuối dữ liệu của nó
  • Vị trí trung tính (90 độ) khi xung 1,5 ms được áp dụng cho đầu cuối dữ liệu của nó
  • Vị trí cuối cùng (180 độ) khi xung 2 ms được áp dụng cho đầu cuối dữ liệu của nó

Để lập trình một vị trí servo bằng Python, điều rất quan trọng là phải biết "Chu kỳ nhiệm vụ" tương ứng cho các vị trí trên, hãy thực hiện một số phép tính:

  • Vị trí ban đầu ==> (0 độ) Độ rộng xung ==> 1ms ==> Chu kỳ làm việc = 1ms / 20ms ==> 2.0%
  • Vị trí trung tính (90 độ) Độ rộng xung 1,5 ms ==> Chu kỳ làm việc = 1,5ms / 20ms ==> 7,5%
  • Vị trí cuối cùng (180 độ) Độ rộng xung 2 ms ==> Chu kỳ làm việc = 2ms / 20ms ==> 10%

Vì vậy, Chu kỳ nhiệm vụ nên thay đổi trong khoảng từ 2 đến 10%.

Hãy kiểm tra các servos riêng lẻ. Đối với điều đó, hãy mở thiết bị đầu cuối Raspberry của bạn và khởi chạy trình chỉnh sửa trình bao Python 3 của bạn dưới dạng "sudo" (vì bạn phải là "siêu người dùng" để xử lý với GPIO):

sudo python3

Trên Python Shell

>>

Nhập mô-đun RPI. GPIO và gọi nó là GPIO:

nhập RPi. GPIO dưới dạng GPIO

Xác định sơ đồ đánh số pin bạn muốn sử dụng (BCM hoặc BOARD). Tôi đã thực hiện bài kiểm tra này với BOARD, vì vậy các chân tôi sử dụng là chân vật lý (GPIO 17 = Pin 11 và GPIO 27 Pin 13). Tôi dễ dàng xác định chúng và không mắc lỗi trong quá trình kiểm tra (Trong chương trình cuối cùng, tôi sẽ sử dụng BCM). Chọn một trong những tùy chọn của bạn:

GPIO.setmode (GPIO. BOARD)

Xác định chân servo mà bạn đang sử dụng:

nghiêngPin = 11

Nếu Thay vào đó, bạn đã sử dụng lược đồ BCM, 2 lệnh cuối cùng sẽ được thay thế bằng:

GPIO.setmode (GPIO. BCM)

nghiêngPin = 17

Bây giờ, chúng ta phải chỉ định rằng chân này sẽ là "đầu ra"

GPIO.setup (nghiêngPin, GPIO. OUT)

Và, tần số được tạo ra trên chân này sẽ là bao nhiêu, đối với servo của chúng tôi sẽ là 50Hz:

nghiêng = GPIO. PWM (nghiêngPin, 50)

Bây giờ, hãy bắt đầu tạo tín hiệu PWM trên chân với chu kỳ nhiệm vụ ban đầu (chúng tôi sẽ giữ nó là "0"):

nghiêng = bắt đầu (0)

Bây giờ, bạn có thể nhập các giá trị chu kỳ nhiệm vụ khác nhau, quan sát chuyển động của servo của bạn. Hãy bắt đầu với 2% và xem điều gì sẽ xảy ra (chúng tôi cho rằng servo đi đến "vị trí không"):

nghiêng. ChangeDutyCycle (2)

Trong trường hợp của tôi, servo đã về vị trí 0 nhưng khi tôi thay đổi chu kỳ làm việc thành 3%, tôi quan sát thấy rằng servo vẫn ở vị trí cũ, bắt đầu di chuyển với các chu kỳ làm việc lớn hơn 3%. Vì vậy, 3% là vị trí ban đầu của tôi (o độ). Điều tương tự cũng xảy ra với 10%, servo của tôi đã vượt qua giá trị này, đứng đầu là 13%. Vì vậy, đối với servo cụ thể này, kết quả là:

  • 0 độ ==> chu kỳ nhiệm vụ 3%
  • 90 độ ==> chu kỳ nhiệm vụ 8%
  • 180 độ ==> chu kỳ nhiệm vụ 13%

Sau khi hoàn thành các bài kiểm tra của mình, bạn phải dừng PWM và dọn dẹp các GPIO:

nghiêng = dừng ()

GPIO.cleanup ()

Màn hình in Terminal ở trên hiển thị kết quả cho cả hai servos của tôi (có kết quả tương tự). Phạm vi của bạn có thể khác nhau.

Bước 5: Tạo tập lệnh Python

Tạo tập lệnh Python
Tạo tập lệnh Python

Các lệnh PWM được gửi đến servo của chúng tôi nằm trong "chu kỳ nhiệm vụ" như chúng ta đã thấy ở bước cuối cùng. Nhưng thông thường, chúng ta phải sử dụng "angle" theo độ như một tham số để điều khiển một servo. Vì vậy, chúng ta phải chuyển đổi "góc" là một phép đo tự nhiên hơn đối với chúng ta trong chu kỳ nhiệm vụ có thể hiểu được theo số Pi của chúng ta.

Làm thế nào để làm nó? Rất đơn giản! Chúng tôi biết rằng phạm vi chu kỳ nhiệm vụ tăng từ 3% đến 13% và điều này tương đương với các góc sẽ nằm trong khoảng từ 0 đến 180 độ. Ngoài ra, chúng ta biết rằng các biến thể đó là tuyến tính, vì vậy chúng ta có thể xây dựng một lược đồ tỷ lệ như được hiển thị ở trên. vì vậy, với một góc, chúng ta có thể có một chu kỳ nhiệm vụ tương ứng:

vòng tròn nhiệm vụ = góc / 18 + 3

Giữ công thức này. Chúng tôi sẽ sử dụng nó trong mã tiếp theo.

Hãy tạo một tập lệnh Python để thực hiện các bài kiểm tra. Về cơ bản, chúng tôi sẽ lặp lại những gì chúng tôi đã làm trước đây trên Python Shell:

từ lúc nhập giấc ngủ

nhập RPi. GPIO dưới dạng GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (Sai) 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 ()

Cốt lõi của đoạn mã trên là hàm setServoAngle (servo, angle). Hàm này nhận dưới dạng đối số, số GPIO của servo và giá trị góc tới vị trí của servo. Khi đầu vào của hàm này là "angle", chúng ta phải chuyển đổi nó thành chu kỳ nhiệm vụ theo tỷ lệ phần trăm, sử dụng công thức đã phát triển trước đó.

Khi tập lệnh được thực thi, bạn phải nhập dưới dạng tham số, GPIO servo và góc.

Ví dụ:

sudo python3 angleServoCtrl.py 17 45

Lệnh trên sẽ định vị servo được kết nối trên GPIO 17 với "độ cao" 45 độ. Một lệnh tương tự có thể được sử dụng để điều khiển Pan Servo (vị trí đến 45 độ theo "phương vị"):

sudo python angleServoCtrl.py 27 45

Có thể tải xuống angleServoCtrl.py tệp từ GitHub của tôi

Bước 6: Cơ chế Pan-Tilt

Cơ chế Pan-Tilt
Cơ chế Pan-Tilt

Servo "Pan" sẽ di chuyển "theo chiều ngang" máy ảnh của chúng tôi ("góc phương vị") và servo "Tilt" của chúng tôi sẽ di chuyển nó "theo chiều dọc" (góc nâng).

Hình ảnh dưới đây cho thấy cơ chế Pan / Tilt hoạt động như thế nào:

Hình ảnh
Hình ảnh

Trong quá trình phát triển của chúng tôi, chúng tôi sẽ không đi đến "cực đoan" và chúng tôi sẽ chỉ sử dụng cơ chế Pan / Tilt của chúng tôi từ 30 đến 150 độ. Phạm vi này sẽ đủ để sử dụng với máy ảnh.

Bước 7: Cơ chế Pan-Tilt - Cấu tạo cơ học

Cơ chế Pan-Tilt - Cấu tạo cơ khí
Cơ chế Pan-Tilt - Cấu tạo cơ khí
Cơ chế Pan-Tilt - Cấu tạo cơ khí
Cơ chế Pan-Tilt - Cấu tạo cơ khí
Cơ chế Pan-Tilt - Cấu tạo cơ khí
Cơ chế Pan-Tilt - Cấu tạo cơ khí

Bây giờ, hãy lắp ráp 2 servos của chúng ta thành một cơ chế Pan / Tilt. Bạn có thể làm 2 điều ở đây. Mua cơ chế nền tảng Pan-Tilt như cơ chế được hiển thị ở bước cuối cùng hoặc xây dựng cơ chế của riêng bạn theo nhu cầu của bạn.

Một ví dụ có thể là cái mà tôi đã chế tạo, chỉ buộc chặt các servo này sang một chiếc khác và sử dụng các mảnh kim loại nhỏ từ đồ chơi cũ như trong các bức ảnh ở trên.

Bước 8: Lắp ráp Pan / Tilt điện

Lắp ráp Pan / Tilt điện
Lắp ráp Pan / Tilt điện
Lắp ráp Pan / Tilt điện
Lắp ráp Pan / Tilt điện
Lắp ráp Pan / Tilt điện
Lắp ráp Pan / Tilt điện
Lắp ráp Pan / Tilt điện
Lắp ráp Pan / Tilt điện

Sau khi bạn đã lắp ráp cơ chế Pan / Tilt, hãy làm theo các bức ảnh để biết kết nối điện đầy đủ.

  1. Tắt số Pi của bạn.
  2. Thực hiện tất cả các kết nối điện.
  3. Kiểm tra kỹ nó.
  4. Bật Pi của bạn trước.
  5. Nếu mọi thứ đều ổn, hãy cấp nguồn cho Servos của bạn.

Chúng tôi sẽ không khám phá về hướng dẫn này cách thiết lập máy ảnh, điều này sẽ được giải thích trong hướng dẫn tiếp theo.

Bước 9: Tập lệnh Python

Hãy tạo một Tập lệnh Python để kiểm soát đồng thời cả hai Servos:

từ lúc nhập giấc ngủ

nhập RPi. GPIO dưới dạng GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (Sai) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # gray ==> PAN def setServoAngle (servo, angle): xác nhận góc> = 30 và góc 90 (điểm giữa) ==> 150 setServoAngle (nghiêng, int (sys.argv [2])) # 30 ==> 90 (điểm giữa) ==> 150 GPIO.cleanup ()

Khi tập lệnh được thực thi, bạn phải nhập các tham số, góc quay và góc nghiêng. Ví dụ:

sudo python3 servoCtrl.py 45 120

Lệnh trên sẽ định vị cơ chế Pan / Tilt với 45 độ ở "phương vị" (Pan angle) và 120 độ ở "độ cao" (Tilt Angle). Lưu ý rằng nếu không có thông số nào được nhập, mặc định sẽ là cả hai, góc xoay và nghiêng được thiết lập lên đến 90 độ.

Dưới đây bạn có thể xem một số bài kiểm tra:

Hình ảnh
Hình ảnh

Tệp servoCtrl.py có thể được tải xuống từ GitHub của tôi.

Bước 10: Kiểm tra vòng lặp của máy chủ

Bây giờ chúng ta hãy tạo một Tập lệnh Python để tự động kiểm tra toàn bộ các Servos:

từ lúc nhập giấc ngủ

nhập RPi. GPIO dưới dạng GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (Sai) pan = 27 nghiêng = 17 GPIO.setup (nghiêng, GPIO. OUT) # trắng => TILT GPIO.setup (pan, GPIO. OUT) # gray ==> PAN def setServoAngle (servo, angle): xác nhận góc> = 30 và góc <= 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 phạm vi (150, 30, -15): setServoAngle (xoay, i) setServoAngle (nghiêng, i) setServoAngle (xoay, 100) setServoAngle (nghiêng, 90) GPIO.cleanup ()

Chương trình sẽ thực hiện tự động một vòng lặp từ 30 đến 150 độ ở cả hai góc độ.

Dưới kết quả:

Tôi đã kết nối một máy hiện sóng chỉ để minh họa lý thuyết PWM như đã giải thích trước đây.

Hình ảnh
Hình ảnh

Mã trên, servoTest.py có thể được tải xuống từ GitHub của tôi.

Bước 11: Kết luận

Phần kết luận
Phần kết luận

Như mọi khi, tôi hy vọng dự án này có thể giúp những người khác tìm đường vào thế giới điện tử đầy thú vị!

Để biết chi tiết và mã cuối cùng, vui lòng truy cập kho lưu ký GitHub của tôi: RPi-Pan-Tilt-Servo-Control

Để biết thêm các dự án khác, vui lòng truy cập blog của tôi: MJRoBot.org

Dưới đây là một cái nhìn thoáng qua về hướng dẫn tiếp theo của tôi:

Hình ảnh
Hình ảnh

Saludos từ phía nam của thế giới!

Hẹn gặp bạn trong hướng dẫn tiếp theo của tôi!

Cảm ơn bạn, Marcelo

Đề xuất: