본문 바로가기
라즈베리파이/피코(Pico)

[Pico.04]피코 서보모터 제어

by 긱펀 2024. 12. 25.
반응형

 

<피코(Pico)로 서보모터 제어해보기>

 

피코(Pico) 보드를 이용해 서보모터를 제어할 수 있습니다.

서보모터의 특징을 자세하게 공부하여 코딩을 할 수도 있지만, 우리는 편리하게 서보모터 라이브러리를 사용해서 제어해 보도록 하겠습니다.

 

이 시간에 제어해볼 서보모터는 아래와 같습니다.

SG-90  GeekServo(270) GeekServo(360) GeekServo 2KG(360)
https://vo.la/Mzpmhf https://vo.la/pqbWgB https://vo.la/hyYHJM https://vo.la/oJsfUM

 


[0] 회로 구성하기

여러 가지 서보모터를 한번에 연결해서 전력 문제없이 하려면 브레드보드와 여러 전선 등이 필요합니다. 편리하게 연결하기 위해 저는 아래의 Pico 확장보드(18650 건전지 버전)를 사용했습니다.

 

https://vo.la/IQopjR

 

ELECFREAKS Wukong2040 Breakout Board For Raspberry Pi Pico

Wukong 2040 is a multifunctional Breakout Board designed for Raspberry Pi Pico. In terms of functions, it is equipped with a buzzer, A\B buttons, rainbow lights, motor interface, reset button, etc., to meet the needs of creators for IO programming and peri

shop.elecfreaks.com

 

위 표에 있는 4개의 모터는 아래 그림과 같이 연결했습니다.

 

-핀 0번: SG-90

-핀 1번: GeekServo(270)

-핀 2번: GeekServo(360)

-핀 14번: GeekServo 2KG(360)


 

[1] 서보모터 라이브러리 설치하기

 

서보모터 라이브러리를 다운받아 Thonny를 이용해 Pico보드에 넣어보겠습니다.

아래에 servo.py가 바로 서보모터 라이브러리이니 다운받아 주세요.

servo.py
0.00MB

 

서보모터 라이브러리를 내 컴퓨터에 다운받은 후, Thonny 메뉴에서 파일열기(아래 그림)를 클릭하고 This computer를 눌러서 방금 다운받은 서보모터 라이브러리를 가져옵니다.

 

 

서보모터 라이브러리 이름은 servo.py이므로 이거를 선택해 Thonny로 가져옵니다.

 

 

 

아래 그림과 같이 Thonny에 servo.py 라이브러리가 잘 불러와진 것을 확인할 수 있습니다.

 

 

 

이제 이 라이브러리를 Pico보드에 저장해 주어야 합니다.(왜냐하면 Pico가 서보모터를 작동시키므로)

그래서 File > Save as..를 클릭합니다.

 

 

 

이 서보모터 라이브러리를 저장할 위치를 Raspberry Pi Pico로 선택해 주면 완료 입니다.

 

 


 

[2] 서보모터 라이브러리 살펴보기

서보모터 라이브러리 코드는 매우 복잡합니다. 우리는 필요한 부분만 수정해서 사용하면 됩니다.

그래서 알아야 할 부분은 바로 서보모터의 최소~최대 각도 값입니다.

서보모터 마다 0~180도 짜리, 0~270도 짜리, 0~360도 짜리 로 다양하기 때문에

아래의 서보모터 라이브러리 중 빨간 네모친 부분(min_angle = 최소 각도, max_angle = 최대 각도)값을 적절히 조절해서 사용하면 되겠습니다. 

 

 

 

값을 조절한 다음에는 아래 그림과 같이 save 버튼을 눌러 저장해야 Pico에 정확히 반영됩니다.

 

피코 코드 저장

 


[3] SG-90 서보모터(180도) 제어하기

SG90 모터는 아두이노, 피코 등의 마이크로 컨트롤러에서 대표적으로 많이 사용하는 서보모터 입니다. 움직이는 각도는  0 ~ 180 도입니다. 5V 전압에서 작동되기 때문에 피코의 3.3V 기반에서는 좀 안맞을 수는 있지만 작동이 안되는것은 아니므로 한번 실습해보겠습니다.

서보모터 라이브러리에서 최소값은 0, 최대값은 180으로 해주고 저장합니다.

 

서보모터 코드 외에, 메인 코드를 작성해야 Pico에서 원하는 동작이 됩니다. 그래서 메인코드 창을 만들기 위해 File > New를 누릅니다.

 

 

아래와 같이 <untitled> 새파일이 뜨면 저장버튼(파란 디스켓)을 누릅니다. 그러면 어디에 저장할지 묻는 팝업창이 뜨고 이곳에서 새 파일 저장 위치를 Raspberry Pi Pico로 선택합니다.

 

 

 

main.py로 이름을 적고 OK버튼을 눌러 저장합니다.

 

 

이제 main.py에서 아래와 같이 코드를 작성하고 시작버튼(초록색 화살표)를 눌러 실행해 봅니다.

from servo import Servo
from time import sleep

servo=Servo(pin=0) #서보모터 연결핀 0번

while True:
    servo.move(0) #서보모터 0도
    sleep(1) # 1초 기다리기
    servo.move(90) #서보모터 90도
    sleep(1) # 1초 기다리기
    servo.move(180) # 서보모터 180도 
    sleep(1) # 1초 기다리기

 

 

[동작영상]

SG90 서보모터 피코로 제어

 


[4] GeekServo(270) 모터 제어하기

 

이번에는 GeekServo(270) 서보모터 제어입니다. 이 모터는 0~270도로 움직일 수 있기 때문에 서보모터 라이브러리에서 아래와 같이 0 ~ 270으로 수정하고 저장해 줍니다.

 

 

main.py에서 아래와 같이 서보모터 제어 코드를 작성합니다.

주의할 점은 두번째 서보모터가 1번 핀에 연결되어 있으므로 pin=1로 수정해 주어야 합니다.

이후에 저장한 다음 실행버튼을 눌러줍니다.

from servo import Servo
from time import sleep

servo=Servo(pin=1) #서보모터 연결핀 1번

while True:
    servo.move(0) #서보모터 0도
    sleep(1) # 1초 기다리기
    servo.move(90) #서보모터 90도
    sleep(1) # 1초 기다리기
    servo.move(180) # 서보모터 180도 
    sleep(1) # 1초 기다리기
    servo.move(270) # 서보모터 180도 
    sleep(2) # 2초 기다리기

 

 

[동작 영상]

 

*270 & 360 GeekServo 참고 표

 

(*표 출처: Hiwonder)


[5] GeekServo(360) 모터 제어하기

 

이번에는 GeekServo(360) 서보모터 제어입니다. 이 모터는 0~360도로 움직일 수 있기 때문에 서보모터 라이브러리에서 아래와 같이 0 ~ 360으로 수정하고 저장해 줍니다. -

 

 

main.py에서 아래와 같이 서보모터 제어 코드를 작성합니다.

주의할 점은 두번째 서보모터가 2번 핀에 연결되어 있으므로 pin=2로 수정해 주어야 합니다.

그리고 이 모터는 각도를 정확히 제어하는 서보모터라기 보다는 동작을 DC모터처럼 정방향, 역방향으로 뱅글뱅글 돌기만 하는 모터입니다.그래서 각도값을 여러개 넣어가며 테스트 해봤더니 아래와 같은 결론을 얻었습니다.

 

  • 0도일때 정방향으로 도는 최고 속도
  • 0 => 180도로 갈수록 점점 정방향 회전 속도가 느려진다.
  • 180도가 되면 정지한다
  • 180도에서 360도로 갈수록 역방향으로 돌면서 점점 빨라진다.
  • 결론: 0~180(정방향 최고속도~멈춤), 180~360(멈춤~역방향 최고속도)

 

아래와 같이 코딩을 한 후에 저장한 다음 실행버튼을 눌러줍니다.

from servo import Servo
from time import sleep

servo=Servo(pin=2) #서보모터 연결핀 2번

while True:
    # 정방향 속도 0~180(최고~최저)
    servo.move(0) #정방향 최고속도
    sleep(2)
    servo.move(90) #정방향 중간속도
    sleep(2)
    servo.move(180) #정방향 최저속도(멈춤)
    sleep(2)
    
    # 역방향 속도 180~360(최저~최고)
    # 역방향 180은 멈춘거니까 생략
    servo.move(270) #역방향 중간속도
    sleep(2)
    servo.move(360) #역방향 최고속도
    sleep(2)
    
    servo.move(180) #다시 시작하기 전 멈추기
    sleep(1)

 

 

핀 번호 pin=2로 수정해서 아래와 같이 코딩을 해주고 저장후 실행해 줍니다.

 

 

[동작 영상]

 


[6] GeekServo 2kg (360) 모터 제어하기

 

이번에는 GeekServo 2kg(360) 모터를 제어해 보겠습니다. 이 모터는 서보모터처럼 각도 제어용이라기 보다는 DC 모터처럼 정방향, 역방향 회전만 하는 모터입니다.

그래서 서보모터 라이브러리로는 잘 작동이 안되어, DC 모터 라이브러리를 이용했더니 잘 되었습니다.

 

아래의 dcmotor.py를 다운받아서 Thonny에서 열고 Pico에 저장해주면 됩니다.

dcmotor.py
0.00MB

 

 

위 dcmotor.py를 Thonny에서 오픈한 상태에서, main.py 메인코드를 아래와 같이 작성해 줍니다.

 

from dcmotor import DCMotor
from machine import Pin, PWM
from time import sleep

frequency = 1000

pin1 = Pin(14, Pin.OUT)
pin2 = Pin(15, Pin.OUT)
enable = PWM(Pin(14), frequency)

dc_motor = DCMotor(pin1, pin2, enable)

while True:
    dc_motor.forward(100) # 정방향 100% 최고속도
    sleep(2)
    dc_motor.stop() #모터 정지 
    sleep(2)
    
    dc_motor.forward(25) # 정방향 25% 속도 
    sleep(2)
    dc_motor.stop() #모터 정지 
    sleep(2)
    
    dc_motor.backward(100) # 역방향 100% 최고속도
    sleep(2)
    dc_motor.stop() #모터 정지 
    sleep(2)
    
    dc_motor.backward(75) # 역방향 75% 속도
    sleep(2)
    dc_motor.stop() #모터 정지 
    sleep(2)

 

 

 

이 모터는 정방향의 속도가 0~100으로 조절됩니다. 그런데 역방향에서는 0~100으로 조절되지만 정방향 만큼 정확한 비례관계로 되지 않습니다. 예를 들면 정방향 50 속도보다 역방향의 50속도가 더 느린것을 발견했습니다.

 

 

[동작 영상]

 

피코 360도 모터 제어

 


 

피코(Pico)를 이용한 서보모터 제어 내용은 여기 까지 입니다. 감사합니다!!!

728x90
반응형

댓글