초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

엔트리 x 오렌지보드-스위치-서보모터 제어

2015-11-19 15:20:57

개요

 

1) 서보모터란 무엇인가?

서보 (Servo)의 어원은 라틴어의 Servue로서 노예라는 의미를 가지고 있으며목표치에 대한 위치방위자세 등의 제어가 자동화되어 있는 장치 이름에 붙여지곤 합니다.

이와 같이 서보모터는 모터와 기어박스 그리고 제어회로로 구성되어있어특정 위치로 이동하거나특정한 수치(속도 등)만큼 가동시킬 때, 모터로 부터의 피드백을 통해 정확하게 제어할 수 있는 구조를 갖추고 있는 모터로 자동화 생산 시스템로봇장난감가전제품 등 광범위하게 쓰이고 있습니다.



 

2) 서보모터 사용방법

서보 모터는 일반 모터와 달리 회전 반경이 정해져 있습니다종류에 따라 다르지만 일반적으로 약 0~270도 범위의 회전각을 가집니다.

서보모터에는 3개의 단자가 있습니다검은색(또는 갈색), 붉은색황색(또는 주황색흰색)이며 붉은색 선은 +전원검은색 선은 -전원에 연결되어 서보모터에 전기를 공급하는 역할을 하며노란색 선은 서보모터의 동작을 제어하는 신호선입니다

서보모터의 회전 각도는 아래 그림과 같이 PWM (펄스폭변조방식으로 제어합니다.
 

 

 

 

부품 목록

NO

부품명

수량

상세설명

1

오렌지 보드

1

 

2

서보모터

1

SG90

3

스위치

1

 

4

브레드 보드

1

 

5

점퍼 케이블

7

 

부품명

오렌지 보드

서보모터

스위치

브레드 보드

점퍼 케이블

파트

 

 

 

 

하드웨어 making

 

브레드 보드

1. 오렌지보드의 5V핀을 브레드보드의 +버스에 연결합니다.

2. 오렌지보드의 GND핀을 브레드보드의 -버스에 연결합니다.

3. 서보 모터의 검은색(또는 갈색) 단자를 -버스에 연결합니다. 

4. 서보 모터의 붉은색 단자를 +버스에 연결합니다.

5. 서보 모터의 노란색(또는 흰색, 황색) 단자를 오렌지보드의 3번핀에 연결합니다. 

6. 스위치(버튼)의 한쪽 다리에 10KΩ 저항과 오렌지보드의 5번핀을 연결합니다.

7. 스위치(버튼)의 나머지 단자를 +버스에 연결합니다. 

8. 10KΩ 저항의 나머지 단자를 -버스에 연결합니다.

 

 

 

전자 회로도

 

 

엔트리 coding

오렌지보드에서 서보 모터로 보내줄 펄스 신호를 만들기 위해 아래와 같은 벌스 블럭을 활용해야 합니다. 

 

.

 

펄스 블럭은 오렌지보드 3번핀으로 펄스 신호를 만들어 주는 기능을 합니다. 

0부터 255까지의 값으로 펄스를 조절할 수 있습니다.  

0으로 갈수록 5V(켜짐, ON), GND(꺼짐, OFF)의 반복이 적어 작은 주파수를 가지게 되고, 255로 갈수록 5V(켜짐, ON), GND(꺼짐, OFF)의 반복이 많아 큰 주파수를 가지게 됩니다.

 

스위치(버튼)을 사용해 서보 모터를 제어하는 엔트리 코딩입니다. 

디지털 5번에 연결된 버튼은 풀 다운(pull-down)으로 연결되었기 때문에 버튼이 안 눌러겼을 때 0(false), 눌러졌을 때 1(true)의 값을 갖습니다.

 

 

coding 1

 

디짙털 5번 센서값(버튼)이 참(버튼이 눌림)이라면 서보 모터에 10hz의 펄스 신호를 보내고, 

거짓(버튼이 눌리지 않음)이라면 서보 모터에 245hz의 펄스 신호를 보내게 됩니다.

// 서보모터의 쉽게 제어하기 위하여 라이브러리를 추가합니다.
#include <Servo.h>

//서보 모터를 사용하기 위한 Servo 객체를 생성합니다.
Servo myServo;
//버튼을 5번핀에 연결합니다. 
int button = 5; 

void setup() {
        pinMode(button, INPUT);
        myServo.attach(3);
}

void loop() {
        // 만약 버튼이 눌러졌다면
        if (digitalRead(button)) { 
                // 0도로 이동합니다.
                myServo.write(0); 
        }
        //만약 버튼이 눌러지지 않았다면
        else { 
                // 180도로 이동합니다.
                myServo.write(180); 
        }
}

 


<서보 모터 제어하기 소스>

 

 

coding 2

 

버튼을 사용해 조금 더 재밌게 서보 모터를 제어해 봅시다.

서보 모터의 각도에 해당하는 변수, angle을 만들어 줍니다. 

디지털 5번 센서값(버튼)이 참(버튼이 눌림)이라면 angle 값에 10울 더해줍니다. 

만약 angle의 값이 253보다 커지면 angle의 값은 1로 초기화 됩니다.

즉 버튼을 누르고 있는 동안은 서보모터가 180도 쪽으로 움직이게 되며, 180도에 다다르면 다시 0도로 돌아가게 됩니다. 

 

// 서보모터의 쉽게 제어하기 위하여 라이브러리를 추가합니다.
#include <Servo.h>

// 서보 모터 제어를 위한 Servo 객체를 생성합니다.
Servo myservo; 
// 버튼을 5번핀에 연결합니다.
int button = 5; 

//서보 모터의 각도에 해당하는 변수를 선언해주고, 값을 초기화 시켜줍니다.
int angle = 0; 
int limit = 180; 

void setup() {
        pinMode(button,INPUT);
        //myservo 객체 초기화
        myservo.attach(3); 
}

void loop() {
        //만약 버튼이 눌러졌다면
        if (digitalRead(button)) {
                //각도를 10씩 증가해줍니다. 각도가 180이상이 되었다면 0으로 초기화합니다.
                angle = (angle + 10) % limit; 
                //angle 각도만큼 이동합니다.
                myservo.write(angle); 
                delay(100);
        }
}

 

<스위치로 서보 모터 제어하기 소스>

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

엔트리, 서보모터, 스위치, 아두이노, 오렌지보드

번개 2016-02-05 22:01:29

코팅의 첫줄이 "#include"이 아니고 "#include " 이어야 작동합니다.

kocoafab 2016-02-11 13:12:37

@번개 감사합니다. 수정 되었습니다.

최조영 2016-08-02 20:40:56

서보의 탓일까요? 245이동 중에 서보가 매우 떨림이 심하고 180도 까지 이동하지도 못합니다.
물론 아두이노 텍스트 코딩으로는 매우 잘 동작하네요. 서보 라이브러리를 활용하기에 좀 더 명확히 움직이는 군요.
엔트리에서도 좀 더 정확하고 부드럽게 서보의 움직임을 나타낼 수는 없을까요?
S4A나 snap, 엠블럭 등에는 서보값을 조절하는 블럭이 따로 있습니다만.. 엔트리에서는 따로 하드웨어 연결시에만 그 하드웨어에서 서보를 지원할 경우만 탭이 보여서 아쉽습니다.

kocoafab 2019-01-08 10:49:35

@최조영
엔트리에서 정확한 서보 움직임을 제어하기 위해 오렌지보드 연결시 서보모터 블럭을 새로 만들었습니다!!

그외에도 자잘하게 잘 안되던 기능들을 수정한 블럭들을 추가하였으니 확인해보세요.