[프로젝트-OpenBraille_1] 서보 모터 드라이버(PCA9685)를 아두이노로 제어해보기
회로 사진
개념적 회로
실제 사용
회로 설명
서보모터 제어를 위해 구성된 회로 입니다.
첫번 째 "개념적" 회로를 기반으로, "실제 사용" 회로를 구성하였습니다.
(TIP - 여러분들은 프로젝트를 시작 하기전 : 사용할 제품의 가장 기초가 되는 몇개의 예제를 확인하세요!)
우선 아두이노 우노는 자체적으로 pwm 핀을 6개 가지고 있습니다.(아래 사진)
(PWM이란? 모터의 회전 속도, 빛의 세기 등을 결정하는 Pulse 폭과 Duty 비를 컨트롤 사용하기위해 설계된 핀입니다.)
보통 하나의 pwm 핀으로 하나의 servo 모터를를 컨트롤 하기위해 사용됩니다.
(하나의 pwm 핀에 여러 대의 모터를 연결하면 같은 pwm 신호를 받기 때문에 모두 동일한 동작만 수행됩니다. 이는 일반적이지 않기 때문 보통이라는 표현을 썼습니다.)
아두이노 우노는 pwm 핀이 총 6개니까, 6개의 모터를 개별적으로 컨트롤 가능합니다.
(TIP - esp32는 모든 핀에 pwm 기능이 내장되어 있습니다.그럼 처음부터 ESP32를 쓰면 되는것 아닌가 라고 생각하실 수 있겠네요. 하지만 PAC9685를 쓰는 다른 이유가 있습니다.)
PCA9685는 이렇게 생겼습니다.
하나당 서보모터 최대 16개를 컨트롤 할 수 있습니다. 보통 이것을 16채널 서보 모터 제어 드라이버 라고 합니다.
장점으로는 아두이노의 단 두개의 핀으로 서보모터를 안정적으로 96개까지 컨트롤이 가능해집니다. (이론상 992개 까지 사용가능)
i2c통신과 pwm 채널 드라이버를 이용한 원리입니다. 결과적으로 pca9685는 아두이노 pwm핀 16개의 역할을 대신 합니다.
다음은 SMPS에대해서 설명하겠습니다. 이렇게 생겼습니다. (아래사진)
SMPS는 서보모터의 전원 공급을 담당합니다.
우리가 전자기기를 충전할때 조그만한 어댑터를 연결하는데, 그것과 역할이 똑같습니다.
다만, 그것보다 좀더 큰 전기 출력을 감당 위한 장치일 뿐입니다.
이것은 220V를 저희 SG90에 맞는 5V로 낮춰주면 최대 10A까지 출력을 냅니다.
SMPS를 왜 사용할까요?
서보모터가 1개가 움직일 때와 다르게, 16개의 서보모터가 동시에 움직일 경우에 순간적으로 16배의 더 많은 에너지가 필요해집니다.
아두이노에는 자체적인 5v를 전원 공급핀이 있습니다.
이것을 이용해서 서보모터에 전원을 공급하 경우 서보모터 최대 1~2개 정도 감당 가능합니다.
그런데! 사실 그것은 권장되지 않는 방법이니다.
서보모터라는 것은 저희가 아는 다른 센서보다 전력소보가 크고, 장기간 사용할 경우 아두이노에 전기적 영향을 줘서, 보드를 망가뜨릴 위험이 발생합니다.
따라서 서보모터를 사용하는 제일 좋은 방법은 아두이노는 서보모터를 컨트롤만 하고(pwm), 전기공급은 smps나 배터리 혹은 5V USB 전원 장치등 외부에서 주는 것입니다.
서보모터는 SIGNAL 핀과 Power 핀이 따로 있습니다. (아래사진)
따라서 저희는 아두이노 우노에 signal 핀에 신호만 전달해주고, 전원은 외부에서 주는 smps를 활용한 형태의 회로를 완성한 것입니다.
소프트웨어 소개
난이도 : 2/5
소프트웨어로 모터를 제어하는 방법 또한 아주 간단합니다.
pwm.setPWM(servoNum,0,Angle) 함수 하나만을 사용합니다.
servoNum에 서보 모터를 지정하고, Angle 변수를 사용해서 원하는 각도를 설정 가능합니다.
코드 소개
먼저 pca9856을 컨트롤 하기위해 예제코드 라이브러리인 adafruit_pwmservodriver.h 를 다운받아야합니다.
아두이노 ide - include library - manager libraries 에 들억갑니다. (아래사진)
여기에
adafruint pwm
을 복사 붙여넣기 하시고, 첫번째 adafruit pwm servo driver livbrary를 다운로드 받습니다.
라이브러리 다운로드에 성공한 뒤 새프로젝트를 여시고, 아래 코드를 복사 붙여넣기 해줍니다.
#include <Wire.h> //i2c 통신 라이브러리
#include <Adafruit_PWMServoDriver.h> //서보 드라이브 라이브러리
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
void setup() {
Serial.begin(9600);
pwm.begin();
pwm.setOscillatorFrequency(27000000);
pwm.setPWMFreq(60);
delay(10);
}
void loop() {
// Drive each servo one at a time using setPWM()
if(Serial.available()){
int degree = Serial.parseInt(); // 0~180
if(degree >= 0 && degree <= 180)
{
int pul = map(degree,0,180,150,600);
for(int i=0; i<2; i++)
{
pwm.setPWM(i,0,pul);
// delay(200);
}
}
Serial.println(degree);
}
}
코드를 아두이노 보드에 업로드한 뒤에, 시리얼 모니터를 엽니다.
시리얼 모니터에 원하는 모터 각도를 입력합니다. ()
그럼원하는 각도로 모터가 움직입니다.
작동 영상
모터 부족으로 서보 모터 11개 제어 (pca9865하나당 16채널 제어가능)
업그레이드 : 원운동 --> 직선운동
https://www.youtube.com/watch?v=gHtV4RT6fSo