Mục lục:
- Bước 1: Hội đồng quản trị - Hóa đơn nguyên vật liệu
- Bước 2: Cách hoạt động của PWM
- Bước 3: Cài đặt Hw
- Bước 4: Hiệu chuẩn Servos
- Bước 5: Tạo tập lệnh Python
- Bước 6: Cơ chế Pan-Tilt
- Bước 7: Cơ chế Pan-Tilt - Cấu tạo cơ học
- Bước 8: Lắp ráp Pan / Tilt điện
- Bước 9: Tập lệnh Python
- Bước 10: Kiểm tra vòng lặp của máy chủ
- Bước 11: Kết luận
Video: Điều khiển đa Servo Pan-Tilt: 11 bước (có Hình ảnh)
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:35
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:
Bước 1: Hội đồng quản trị - Hóa đơn nguyên vật liệu
Phần chính:
- Raspberry Pi V3 - US $ 32,00
- 5 Megapixel 1080p Sensor 1080p Mô-đun video máy ảnh mini OV5647 - US $ 13,00
- TowerPro SG90 9G 180 độ Micro Servo (2 X) - US $ 4,00
- Nền tảng máy ảnh xoay / nghiêng mini Giá đỡ máy ảnh chống rung w / 2 Servos (*) - US $ 8,00
- Điện trở 1K ohm (2X) - Tùy chọn
- 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:
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ụ:
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
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
Đ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
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
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:
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
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
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 đủ.
- Tắt số Pi của bạn.
- Thực hiện tất cả các kết nối điện.
- Kiểm tra kỹ nó.
- Bật Pi của bạn trước.
- 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:
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.
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
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:
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:
Treo tường cho IPad làm bảng điều khiển tự động hóa tại nhà, sử dụng nam châm điều khiển Servo để kích hoạt màn hình: 4 bước (có hình ảnh)
Giá treo tường cho iPad làm Bảng điều khiển tự động hóa tại nhà, Sử dụng Nam châm điều khiển Servo để Kích hoạt màn hình: Gần đây, tôi đã dành khá nhiều thời gian để tự động hóa mọi thứ trong và xung quanh nhà mình. Tôi đang sử dụng Domoticz làm ứng dụng Tự động hóa tại nhà của mình, hãy xem www.domoticz.com để biết thêm chi tiết. Trong tìm kiếm của tôi cho một ứng dụng bảng điều khiển hiển thị tất cả thông tin Domoticz
Ô tô được điều khiển từ xa - Được điều khiển bằng Bộ điều khiển Xbox 360 không dây: 5 bước
Ô tô được điều khiển từ xa - Được điều khiển bằng Bộ điều khiển Xbox 360 không dây: Đây là các hướng dẫn để tạo ô tô được điều khiển từ xa của riêng bạn, được điều khiển bằng bộ điều khiển Xbox 360 không dây
ESP8266 RGB LED STRIP Điều khiển WIFI - NODEMCU làm điều khiển từ xa hồng ngoại cho dải đèn Led được điều khiển qua Wi-Fi - Điều khiển điện thoại thông minh RGB LED STRIP: 4 bước
ESP8266 RGB LED STRIP Điều khiển WIFI | NODEMCU làm điều khiển từ xa hồng ngoại cho dải đèn Led được điều khiển qua Wi-Fi | Điều khiển bằng điện thoại thông minh RGB LED STRIP: Xin chào các bạn trong hướng dẫn này, chúng ta sẽ học cách sử dụng gật đầu hoặc esp8266 làm điều khiển từ xa IR để điều khiển dải LED RGB và Nodemcu sẽ được điều khiển bằng điện thoại thông minh qua wifi. Vì vậy, về cơ bản bạn có thể điều khiển DÂY CHUYỀN LED RGB bằng điện thoại thông minh của mình
Tự làm bộ điều khiển bay điều khiển đa hệ điều khiển Arduino: 7 bước (có hình ảnh)
Tự làm bộ điều khiển máy bay đa năng điều khiển Arduino: Dự án này là tạo ra một bảng logic máy bay không người lái đa năng linh hoạt nhưng tùy chỉnh dựa trên Arduino và Multiwii
Điều khiển các thiết bị điện của bạn bằng Điều khiển từ xa Tv (Điều khiển từ xa) với Màn hình nhiệt độ và độ ẩm: 9 bước
Điều khiển thiết bị điện của bạn bằng Điều khiển từ xa Tv (Điều khiển từ xa) Có Hiển thị nhiệt độ và độ ẩm: xin chào, tôi là Abhay và đây là blog đầu tiên của tôi về Các thiết bị điện và hôm nay tôi sẽ hướng dẫn bạn cách điều khiển các thiết bị điện bằng điều khiển từ xa bằng cách xây dựng cái này dự án đơn giản. cảm ơn atl lab đã hỗ trợ và cung cấp tài liệu