Bài 9: Điều khiển Servo SG90 qua Terminal

Trong các dự án về robot như spider bot, otto robot, radar... bộ phận được sử dụng nhiều nhất đó chính là servo. Servo thường được dùng làm khớp nối giữa các bộ phận cơ thể robot giúp robot có thể chuyển động. Làm sao điều khiển được Servo với Raspberry Pi? Nào hãy cúng tớ đi vào bài viết đẻ tìm hiểu nhé!


Kiến thức cần có

Servo SG90

Động cơ Servo là loại động cơ đặc biệt, khác với các động cơ thông thường khác có điện là chạy liên tục. Servo là động cơ được điều khiển (bằng xung PPM) có thể quay từ 0 đến 180 độ. Các động cơ Servo được chế tạo ra với các mục đích khác nhau sẽ có cấu tạo khác nhau. Như loại nhẹ và lực kéo yếu thì dùng cho máy bay, hoặc radar nhỏ. Còn các loại kéo nặng có thể kéo được các vật lớn. Ở bài này, chúng ta sẽ sử dụng loại MicroServo 9G (SG90) điều khiển bằng biến trở vì giá thành không cao và phù hợp không dùng tải lớn. Bên trong Servo có một mạch để điều khiển cho đến khi servo quay đến độ được truyền tới.

Ở bài viết này, chúng ta sẽ dùng Raspberry Pi điều khiển Servo bằng cách nhập số độ muốn servo quay tới thông qua Terminal.

Chuẩn bị

  • Raspberry Pi
  • Máy tính
  • Servo SG90

Lắp mạch

Lập trình

Các bạn vào Terminal hoặc IDE để nhập code sau

Và terminal để chạy code nào!

  • sudo python3 .py

Kết quả

Giải thích

  • DutyCycle=Angle/18+2

Theo datasheet, servo thường được sử dụng 0 độ là 1ms xung, 90 độ là 1.5ms xung và 180 độ là 2ms xung. Nhưng trên thực tế, chúng ta sẽ gặp nhiều vấn đề về mặt sai số cũng như là do phần cứng. Thế nên, ta cần phải dùng linear equation để tìm ra một phương trình tuyến tính giữa DutyCycle theo Angle.

Đầu tiên ta cần xác định hai điểm là DutyCycle tại 0 độ và tại 180 độ. Theo nhưng mình đo, thì DutyCycle sẽ là 2 và 12. Dựa vào 2 điểm (0,2) và (180,12) chúng ta có thể lập một phương trình DutyCycle = Angle / 18 + 2 một cách đơn giản nhất

  • p = IO.PWM(servo,50)

Khai báo dạng xuất xung PWM với 50Hz tại chân của servo (GPIO18)

  • p.start(2)

Bắt đầu xung tại chu kì xung = 2

  • p.ChangeDutyCycle(DutyCycle)

Thay đổi chu kì xung = DutyCycle

  • Angle = int(input("What angle do you want? (0-180) "))

Đọc giá trị Angle và biến đổi thành dạng số nguyên

*Lưu ý: Python3 khi đọc vào ở dạng String cần phải dùng int(var) để chuyển thành dạng số nguyên

Chúc các bạn may mắn và thành công

- Đỗ Vương Phúc - FPO