[30호]6족 보행 로봇 ‘벅벅이’
6족 보행 로봇 ‘벅벅이’
글 | 고려대학교 과학기술대학 제어계측공학과 류예슬
심 사 평
싱크웍스 시연동영상으로 볼때 작품의 완성도가 높았고, 학생 수준에서 구할 수 있는 재료들을 잘 사용해서 만든 것 같다. 작품을 만들면서 많은 공부가 되었을 것 같다.
JK전자 유선 조이스틱으로 조정하여 단순히 보행만 하는 기능 이외에 보행을 하면서 할 수 있는 부가적인 기능이 추가되었으면 더 좋았을 것 같다. 예를 들면 사람이 갈수 없는 곳을 탐사하여 영상을 전송하는 기능이나, 물건을 집어서 옮기는 기능 등이 된다면 조금 더 실용성이 높아질 것이다. 어쨌든 여러 사람이 아닌 혼자서 기구부 제작과 소프트웨어 개발까지 했다는 것은 쉬운 일은 아니었을 것이다. 마음이 맞는 좋은 파트너와 코웍을 하면 조금 더 실용성이 높은 작품이 나올것 같다.
뉴티씨 매우 잘만든 6족로봇 작품으로 판단된다. 다만, 빠른 이동은 좀 어려운 점이 약간 아쉽다. 미끄러움을 방지하기 위하여, 끝부분에 고무 같은 재질을 사용한 점도 좋은 점으로 착안하였다. 좀 더 잘 만든다면, 구조로봇 같은 형태로도 만들어질 수 있을 것으로 생각되며, 계단 등도 다른 작품처럼 올라갈 수 있을 것으로 생각된다. 기술적인 난이도는 매우 높지도 낮지도 않지만, 전체적인 작품의 완성도가 높은 것으로 판단되며, 기구적인 부분에서도 창의적인 아이디어로 재료 선택 등에서도 무게도 줄이고 잘 만든 것 같다. 향후, 학습하면서 좋은 작품을 만들 수 있을 것으로 기대한다.
작품 개요
■ 프로젝트 개발 동기
최근 산업 현장 외에도 일상생활에서 사람을 도와줄 수 있는 로봇의 필요성이 높아지고 있다. 이러한 요구를 충족시키기 위한 로봇에 있어 이동의 기능은 필수적인 기술이 되었다. 특히 6족 로봇은 오프로드에서도 바퀴로 이동하는 모바일로봇 또는 다른 종류의 보행 로봇보다 안정된 보행을 할 수 있다는 장점을 가졌고, 또한 전쟁, 행성탐사, 무너진 건물 속의 인명탐사 등에 활용 될 수 있다.
하드웨어 및 소프트웨어에 열정이 있는 사람들의 모임인 과 내 학술소모임 다가치(KUCIRA)에서 학술제를 목표로 보행로봇을 프로젝트로 기획하던 중, 보행 로봇에 대한 정보를 수렴한 결과 위와 같은 장점을 가진 6족 로봇이 가장 적절하다 생각되어 개발하게 되었다.
■ 프로젝트 구현 목표
· 6족 로봇의 보행 메카니즘과 구조 이해 (전진, 후진, 회전)
· Atmega 128 (MCU) 이해 및 AVR 프로그래밍 이해
· 서보모터의 이해 [fast pwm제어]
· 2축 조이스틱(가변저항)을 이용한 유선제어 [AD Convertor]
■ 제목의 의미
이 프로젝트의 가장 큰 특징은 로봇의 다리가 6개라는 점이다. 이 점을 감안하여 6개의 다리를 가진 곤충과 관련된 이름을 지어주려고 하였는데, 첫 프로젝트인 느낌을 살리기 위해 ‘bug’의 ‘벅’을 한국식으로 바꾸어 ‘벅벅이’라 이름을 붙여주게 되었다.
작품 설명
■ 주요 동작 및 특징
‘벅벅이’의 주요 동작은 보행이다. 로봇의 다리는 6개이고 각 다리 당 2개의 관절을 가진 12관절 구조이다. 몸통과 가까운 모터를 ‘위 관절’이라 하고 바닥과 가까운 모터를 ‘아래 관절’이라고 칭하면, 위 관절은 가고자 하는 방향결정에 중요한 역할을 한다. 아래 관절은 위 관절이 이동을 할 때에는 발을 바닥에서 들어주고 이동을 마친 후에는 바닥으로 발을 찍어주어 바닥의 마찰을 이용하여 이동하게 해주는 역할을 한다.
구현한 보행의 종류는 크게 세 가지이다. 전진, 후진, 좌/우로의 회전이다. 그리고 정육각형 형태의 프레임을 가졌기 때문에 앞뒤 구분이 필요하였다. 이를 위해 led를 삽입하였고 앞뒤 구분의 역할과 동시에 동작에 따라 led가 다른 알고리즘을 수행하게 하였다. 마지막으로 2축 조이스틱을 이용하여 조이스틱의 기울기(위치)에 따라 ‘벅벅이’를 제어하였다.
1. 전진/후진
위 사진처럼 다리의 번호를 1번부터 6번까지로 표현하였다. 위 관절의 모터를 먼저 얘기하면 2번과 6번, 3번, 1번과 5번, 4번 이렇게 각각의 세트를 4개의 MCU PORT에 연결하였다. 아래 관절은 2, 3, 6번 그리고 1, 4, 5번 다리가 또 다른 2개의 PORT에 연결하였다. 이렇게 연결한 이유는 6족 로봇의 보행 매카니즘과 관련이 있다. 동영상으로 시연영상을 보면 바로 파악하기는 어려우나 자세히 보면 모터의 동작 순서는 다음과 같다.
위 관절의 1번+5번 모터를 A, 4번 모터를 B, 2번+6번 모터를 C, 3번 모터를 D라 하고, 아래 관절의 1번+4번+5번 모터를 E, 2번+3번+6번 모터를 F라 하자. 정지 상태에서 위 관절의 모든 모터는 각도를 0˚부터 180˚범위에서 90˚이고, 아래 관절의 모든 모터는 40˚인 상태이다.(위 오른쪽 사진 참고) 전진을 위한 과정은 다음과 같다.
1) 먼저 전진을 위해서는 E모터를 90˚로 해준다. 이것은 먼저 이동할 다리를 움직일 수 있도록 발을 바닥에서 해체시켜주는 것이다. (모터의 RESET(정지)상태는 ABCD모터는 모두 90˚ 이고, EF모터는 모두 40˚이다.)
2) A모터는 110˚, B모터는 75˚가 동시에 되도록 한다.
3) E번 모터를 40˚로 한다. 이것은 발을 바닥으로 내려주는 역할을 한다.
4) F모터를 90˚로 하여 반대편 다리를 든다. (위 관절의 한 세트라도 방향 제어를 할 경우에는 다른 반대쪽 아래 관절의 다리는 들려있어야 한다.)
5) A모터를 70˚B모터는 110˚가 동시에 되도록 한다. 아래 관절의 모터로 인해 발이 바닥에 닿아 있는 상태이기 때문에 마찰에 의하여 로봇이 앞으로 움직이게 된다.
6) 위와 같은 원리로 C모터는 70˚, D모터는 110˚가 동시에 되도록 한다.
7) F모터를 40˚로, E모터를 90˚로 한다.
8) C모터는 110˚, D모터는 80˚가 동시에 되도록 한다. 마찬가지로 F모터로 인해 마찰에 의하여 로봇이 전진하게 된다.
위 과정의 알고리즘은 다음과 같다. 실제 코딩(모터의 분류)은 A, B, C, D, E, F가 아닌 숫자로 되어있지만 위에 그렇게 표현하였기 때문에 바꿔 첨부하였다. Motor(int x, int y)함수는 x번 모터를 y˚만큼 각도변환 시키는 함수이다. delay를 얼마만큼 주는지에 따라 보행 속도가 결정된다.
*후진은 전진과 방향만 반대일 뿐 보행 원리는 같다.
void GOBACK()
{
PORTA=0X00;
Motor(E,90); //들고(1번다리)
delay_ms(230);
Motor(A,110);
Motor(B,75); // 1번다리 회전
delay_ms(230);
Motor(E,40); //1번다리 내리고
delay_ms(230);
Motor(f,90); // 2번다리 들고
delay_ms(230);
Motor(A,70);
Motor(B, 110); //1번다리 반회전
delay_ms(230);
Motor(C,70);
Motor(D,110); // 2번다리 회전
delay_ms(230);
Motor(F,40); //2번다리 내리고
delay_ms(230);
Motor(E,90); //1번다리 들고
delay_ms(230);
Motor(C,110);
Motor(D,80); //2번다리 반회전
}
2. 좌/우 회전
좌/우 회전의 매카니즘 이해는 전진/후진보다 훨씬 쉽다. 간단하게 말하면 다리를 반으로 나누어 회전하고자하는 방향으로 회전을 시켜주면 된다. 내가 구현한 알고리즘은 회전시킬 다리의 아래 관절을 들고 그 다리를 회전시키고 나머지 반의 다리들도 앞과 같이 해주면 된다. 아래 관절을 이용해 발을 드는 동작과 위 관절을 이용해 다리를 회전시키는 동작 사이의 시간을 줄여줄수록 모션을 좀 더 부드럽게 제어할 수 있다.
아래는 실제 알고리즘이다. 중간에 들어간 read_adc()에 대한 조건문은 뒤에서 조이스틱 파트에서 설명하기로 한다.
//좌우
if(read_adc(1)>900 //오른쪽으로 회전
{
PORTA=0xf0;
Motor(1,90); //들고(1번다리)
delay_ms(100);
Motor(3,110);
Motor(4,110); //1번다리 회전
delay_ms(200);
Motor(1,40); //1번다리 내리고
delay_ms(200);
if(read_adc(1)>=300 && read_adc(1)<=700)
STOP();
else if(read_adc(1)>900)
{
Motor(2,90); // 2번다리 들고
delay_ms(100);
Motor(3,90);
Motor(4,90); //1번다리 반회전
delay_ms(200);
Motor(5,110);
Motor(6,110); // 2번다리 회전
delay_ms(100);
Motor(2,40); //2번다리 내리고
delay_ms(200);
if (read_adc(1)>=300 && read_adc(1)<=700)
STOP();
else if(read_adc(1)>900)
{
Motor(1,90); //1번다리 들고
delay_ms(100);
Motor(5,90);
Motor(6,90); //2번다리 반회전
}
3. 동작에 따른 LED
알고리즘 상의 ‘벅벅이’의 보행종류는 앞서 말했듯이 전진, 후진, 회전으로 나눠진다. 원한다면 각 동작에 다른 led제어구문을 삽입할 수 있다. 나는 로봇의 정지 상태와 동작 상태만을 구분하기 위해 정지 상태에는 8개의 LED가 방향을 바꾸어 가며 순차점등을 하도록 하였고, 동작 상태에서는 눈과 같다는 인상을 심어주기 위해 양 끝 LED만 켜지게 하였다. (이것은 ‘눈’을 연상시키게 함이다.) 실제 알고리즘은 다음과 같다.
정지상태의 LED 동작
좀 더 정확한 초 계산을 위해 타이머 normal 모드를 통해 LED를 제어하였다.
Void STOP()
{
if(i<8)
{
if(cnt1>1)
{
PORTA=~(RLED<<i);
i++;
cnt1=0;
}
}
else if(i==8)
{
if(j<8)
{
if(cnt1>1)
{
PORTA=~(LLED>>j);
j++;
cnt1=0;
}
}
else i++;
}
else
{
i=0;
j=0;
}
동작상태의 LED 동작
양 끝 LED를 계속 키고 있는 상태를 코딩하는 것은 쉽다. 내가 구성한 회로의 LED의 PORT가 아닌 쪽이 Vcc와 연결되어 있기 때문에 LED와 연결된 PORT의 출력레지스터 설정을 한 후, LOW신호를 흘려주면 그 부분의 LED는 불이 들어오게 된다.
우선 사용한 2축 조이스틱은 두 개의 가변저항으로 만들어진 컨트롤러이다. 먼저 한 축은 보행의 전진, 후진을 제어하고, 나머지 한 축은 좌/우로의 회전을 제어한다. 여기서 사용되는 AVR의 기능은 ADC라는 기능이다.
ADC란 ‘Analog Digital Convertor’라는 줄임말로 아날로그 신호를 디지털로, 혹은 디지털 신호를 아날로그 신호로 바꿔주는 기능이다. 여기서 내가 사용한 것은 아날로그 신호를 디지털 신호로 바꿔준 기능이다. 2축 조이스틱의 방향을 바꿔줄 때마다 가변저항의 값이 변한다. 이것이 바로 아날로그 신호이다. 이런 아날로그 신호를 MCU에 전달해주고 그 신호 값에 따라 코딩한 알고리즘이 구현된다. 이것이 아날로그신호가 디지털 신호로 바뀌는 과정이다. 로봇의 각 모션에 따른 알고리즘은 길기 때문에 위에서 잠깐 봤던 회전 알고리즘에서 설명을 하도록 하겠다.
ADC를 사용하기 위해서는 먼저 그것에 대한 초기 레지스터 설정을 해주어야 한다. 레지스터 설정은 Code Vision의 Wizard (사용하고자 하는 기능의 툴을 제공)을 사용하였다.
레지스터 설정은 간단하게 넘어가고, 아날로그 신호를 디지털 신호로 어떤 식으로 변환하는지에 대해서 살펴보자. 밑의 사진은 ‘좌/우 회전’ 동작에서도 봤던 알고리즘이다. 중간 중간에 read_adc(1)의 값에 따른 조건문이 삽입되어 있다. 이것이 바로 가변저항 즉, 아날로그 신호를 디지털 신호로 변환시킨 값이다.
가변저항의 값에 따라 read_adc(1)의 값이 어떻게 변하는지는 보통 통신을 통해서 정확한 값을 확인한다. 하지만 정확한 값을 받아야 하는 센서를 사용하는 것이 아니고 내가 원하는 지점에서부터 작동하기만 하면 되기 때문에 처음 테스트는 read_adc(1)의 값에 따라 LED를 통해 확인했고 그 값을 토대로 알고리즘을 작성할 수 있었다.
조이스틱을 오른쪽으로 기울였을 때 내가 원하는 위치에서의 adc값은 900이었다. 그 이상일 때 회전하는 알고리즘을 넣어주었고 다시 조이스틱이 가운데로 돌아왔을 때는 정지하는 내용도 중간 중간에 넣어 있다.
//좌우
if(read_adc(1)>900 //오른쪽으로 회전
{
PORTA=0xf0;
Motor(1,90); //들고(1번다리)
delay_ms(100);
Motor(3,110);
Motor(4,110); //1번다리 회전
delay_ms(200);
Motor(1,40); //1번다리 내리고
delay_ms(200);
if(read_adc(1)>=300 && read_adc(1)<=700)
STOP();
else if(read_adc(1)>900)
{
Motor(2,90); // 2번다리 들고
delay_ms(100);
Motor(3,90);
Motor(4,90); //1번다리 반회전
delay_ms(200);
Motor(5,110);
Motor(6,110); // 2번다리 회전
delay_ms(100);
Motor(2,40); //2번다리 내리고
delay_ms(200);
if (read_adc(1)>=300 && read_adc(1)<=700)
STOP();
else if(read_adc(1)>900)
{
Motor(1,90); //1번다리 들고
delay_ms(100);
Motor(5,90);
Motor(6,90); //2번다리 반회전
}
다른 동작들도 아래와 같은 방식의 알고리즘으로 되어있다.
■ 전체 시스템 구성
1. 6족 보행 로봇을 만들기 위한 최소 관절(모터)의 개수 파악
6족 로봇으로 보행하기 위해서는 위의 매커니즘을 이해하면 알 수 있듯이 최소 다리 당 2개 즉, 12개가 필요함을 파악했다.
2. 서보모터 각도 제어
서보모터의 각도를 제어하기 위해서는 모터구동의 원리를 이해할 필요가 있었다. 서보모터는 모터에 흘려주는 Pulse의 주기에 따라 각도가 제어된다. Pulse를 변형시켜주기 위해 타이머의 ‘Fast pwm’기능을 사용하였고, 프레임 제작 전 원하는 각도를 넣었을 때 그 각도가 되도록 하는 실습을 하였다.
3. 프레임 제작 계획
사용하기로 한 모터의 토크는 3kg.cm은 그리 좋은 스펙은 아니다. 그러나 사람들이 만든 여러 블로그를 참고하여 프레임의 무게를 최소화할 수 있다면 문제가 될 부분은 아니었다. 그리하여 가장 프레임의 재료는 100% 포맥스로 정하였다.
4. 보행 매카니즘 파악
모터의 각도제어를 실습하였고, 프레임이 완성된 후 6족 로봇의 보행 매카니즘을 파악하였다. 목표는 전진/후진/좌우로 회전이었기 때문에 제어방법을 가장 효율적으로 하고자 공통된 모터는 묶어 제어하기로 결정하였다.
5. MCU 선정 / 회로구성
MCU는 쓰고자 하는 기능들(I/O, Interrupt, ADC, Timer)을 쓸 수 있는 ‘Atmega128’을 선정하였다. 회로에서는 가장 중요한 전원부는 ‘LM2576’이라는 레귤레이터를 사용하여 구성하였다. 처음에는 ‘LM7805’로 전원부를 구성했었는데, 두 레귤레이터 모두 출력전압을 5V로 바꿔준다는 특징은 같으나 output의 전류에서 차이가 있었다. 7805는 1A까지만 전류가 흐르지만 2576은 3A까지 흐를 수 있는 스펙을 갖고 있다. 그런 이유로 전원부는 시행착오를 거쳐 다시 제작하였다. 전류 값이 중요한 이유는 모터가 병렬로 연결되어 있어 전류가 조금이라도 부족하면 작동이 되지 않기 때문이다.
6. 조이스틱의 원리이해
ADC를 이용하여 조이스틱의 방향에 따라 원하는 대로 제어하는 원리에 대하여 이해하였고 그것을 LED로 먼저 확인한 후, 모터에도 적용시켜 구현할 수 있었다.
■ 개발환경
- MCU : Atmega 128
- 개발 언어 : C
- Tool : AVR Studio 및 Code Vision AVR
단계별 제작 과정
■ 프레임 제작
1. 제작 전 구상도
2. 제작 과정
1. 재료 구매 (포맥스) | 2. 몸체 제작 (정 6각형 구조) |
3. 몸체+모터 제작 | 4. 위 관절 제작 |
5. 아래관절 제작 | 6. 발 제작 (충분한 마찰을 주기 위함) |
7. 프레임 전체 완성 |
■ 하드웨어 제어부 제작
전원부 |
모터부 |
스위치 |
LED |
■ 컨트롤러 제작
조이스틱 |
조이스틱(납땜) | 조이스틱과 모드 선택 스위치 |
■ 소스코드
모터의 각도 제어함수
I/O 레지스터 설정
Interrupt 레지스터 설정
Timer 레지스터 설정
ADC 레지스터 설정
GOSTR() 함수 : 전진
GOBACK() 함수 : 후진
STOP() 함수 : 정지
[30호]XR-Duino, XBOT Aduino Kit 출시
XR-Duino, XBOT Aduino Kit 출시
XR-Duino는 Arduino Uno와 100% 호환되며 추가로 블루투스 무선 카메라와 통합된 신개념 아두이노 호환 보드이다. 블루투스 연결을 통한 JPEG 압축 영상 무선 송신과 아날로그 센서신호 6채널(MIC 센서포함) ADC신호 및 아두이노 데이터 무선 전송이 가능하다. 송수신은 블루투스 시리얼 통신을 통해 원격 제어가 가능하다. 아두이노 Uno와 100% 호환되는 아두이노 호환 보드이며, 블루투스 연결을 통해 스케치 유무선 다운로드가 가능하다. 블루투스 V2.0을 지원하며, Class2로 유효거리 10~20M를 제공한다.
XR-Duino 제품 특징
· 해상도 : 160×120 고정(Fixed)
· 속도 : 3~5프레임/Sec
· 8bit ADC x 6CH, Digital Input x 9CH
· 속도 : 3~5샘플/Sec (JPEG 이미지와 동기화되어 전송됨)
· 통신 속도(Baud Rate) : 115200 BPS 고정 (Fixed)
· 로봇전용 서보(Dynamixel AX시리즈 등)를 위한 전용 포트 제공
· 블루투스 장치가 장착된 PC, 노트북에서 아두이노 개발 환경을 무선으로 사용
· 통신 속도 : 115200 bps
· 안드로이드 (이클립스 Java 예제)
· 윈도우 PC (비주얼스투디오 C++, C# 예제)
함께 출시된 아두이노 I/O 센서 통합 실습키트 (XBOT Aduino Kit)는 기존 아두이노 UNO와 호환이 가능한 제품으로, 직접 센서 제작 및 보드 실습이 가능한 확장 모듈로서, LCD, 7Segment 등 디지털 입출력 모듈과 가변 저항, IR 센서등 아날로그 입력 모듈 그리고 아두이노 미니보드 등의 부품들로 구성되어 있다. USBSerial 보드를 연결하여 다운로드가 가능하며 아두이노 미니보드를 부착해 실습키트 구성만으로도 편리하게 디지털 및 아날로그 포트를 이용한 센서 및 모터 등을 제어할 수 있다. 또한 쉽게 따라 할 수 있도록 예제 자료를 제공한다.
XBOT Arduino Kit 특징
· LCD, FND, 가변 저항, IR 센서, tact 스위치, 모터 드라이브, 아두이노
· 미니보드 등 다양한 부품·보드 구성
· 아두이노 Uno 100% 호환
· IO쉴드에 아두이노 미니보드를 부착하여 USBSerial 보드를 연결해 다운로드 및 제어 가능
· 브레드보드 없이 센서 모듈을 연결하여 실습 가능
· 다양한 아두이노 예제 자료 지원
TEL. 070-8244-4810
http://cafe.naver.com/xbot
[30호]손으로 그리는 3D펜 프린터 3Doodler V2.0 출시
손으로 그리는 3D펜 프린터 3Doodler V2.0 출시
2014년 손으로 그리는 3D펜 3Doodler라는 제품으로 주목을 받았던 WobbleWorks사에서 후속 모델인 손으로 그리는 3D펜 프린터 3Doodler V2.0을 출시했다.
이전 모델과 비교했을 때 제품의 스펙 면에선 비슷하지만 제품의 크기가 작아져 사용자가 한 손으로 쉽게 잡고서 프린팅을 할 수 있고, 제품의 무게 또한 가벼워져서 휴대가 간편하다. 그리고 펜으로 3D 프린팅을 하는 과정에선 소음이 줄어서 제품 프린팅에 좀 더 집중할 수 있도록 만들어졌다.
한층 더 업그레이드 된 ‘손으로 그리는 3D 펜 3Doodler V2.0’ 제품 출시를 맞이하여 여러가지 이벤트가 진행중이며, 제품의 사양은 디바이스마트 홈페이지를 통해 확인 가능하다.
3Doodler V2.O 특징
· 주원료: ABS, PLA 플라스틱
· 사용대상 : 종이 또는 바닥 면
[30호]감시자동차
감시자동차
글 | 광운대학교 유혜준, 김태현
심사평
싱크웍스 어디선가 많이 보아왔던 작품인 것 같다. 따라서 창의성에는 높은 점수를 줄수 없지만 첨부된 동영상으로 볼때 완성도가 있어 보인다. 작품을 만들면서 좋은 공부가 되었을 것 같다.
JK전자 감시카메라 기능과 센서들을 활용해서 로봇이 위치한 공간의 여러가지 데이터 수집과 함께 로봇 근처의 움직임을 파악하여 침입 탐지까지 가능하도록 발전시키면 괜찮을 것 같음. 아두이노를 활용한 모터제어, 리눅스를 활용한 스트리밍 전송, PC와 안드로이드 APP까지 다양한 분야의 기술들이 접목되어 있는 작품이다.
뉴티씨 좀 더 튼튼하게 제작하면, 사람이 쉽게 접근할 수 없는 곳에 이 차량을 투입하여 접근시켜서 근접 촬영을 하여, 보다 내부 상황을 정확하게 판단하거나 할 수 있을 것 같다. 매우 재미있는 기술로 보이며, 라즈베리파이나 아두이노의 좋은 응용으로 보인다. 좀 더 생각하여, 무엇을 할 수 있겠는지 등도 판단해 보면 보다 좋은 작품으로 문서화 되었을 것 같다. 또한, 기술 구현 쪽도 좀 더 자세히 남겼었다면 하는 아쉬움도 남는다.
개요
■ 개요
개인 사생활 보호에서부터 공공기관의 보안에서 감시카메라는 널리 이용된다. 최근 급증하고 있는 범죄에서도 감시카메라의 역할이 중요하게 대두된다. 이런 감시카메라는 범죄예방, 출입자 확인 등과 같은 기본적인 분야에서 사용되며 분실물 탐색이나 미아확인, 대테러방지 등 그 응용분야가 점차 확대되고 있다. 기존의 감시카메라는 한 장소에 고정되어있으며 감시할 수 있는 영역이 제한적이다. 하지만 감시카메라를 움직일 수 있는 로봇위에서 동작시킬 수 있으며 원거리에서도 조작 및 감시가 가능하다면 좋을 것이라 생각하여 이 프로젝트를 진행하게 되었다.
집 밖에서도 집안의 상황을 파악할 수 있는 로봇을 평소 제작해보고 싶었다. 이 로봇의 이름은 감시자동차로써 스마트폰 혹은 컴퓨터로 원거리에서 로봇이 있는 장소를 실시간으로 볼 수 있으며, 조종이 가능하다.
감시자동차는 단순한 영상스트리밍 기능을 이용한 감시뿐만 아니라 사용자가 모터를 조작하여 동적으로 감시자동차가 있는 환경을 파악할 수 있다.
■ 기대방안
추후 온습도센서를 부착하여 집안의 환경데이터를 수집할 수 있으며, 카메라를 활용하여 특정 상황을 인식 후 사용자에게 알림을 할 수 있다. 또한 스피커를 부착하여 집안의 사람들에게 음성출력도 추후 해보고 싶다. 감시자동차는 드라이브 레코더(교통사고 발생 전후의 차량주행정보와 운전자 운전상태 화상 및 차량 데이터를 기록하여 사고의 발생원인을 정확하게 분석 할 수 있는 시스템)라는 시스템에도 활용될 수 있다.
작품설명
■ 주요 동작 및 특징
1. 스마트폰 외의 기기에서 감시자동차를 조종한다.
스마트폰의 WIFI 네트워크가 연결이 되었을 경우 감시자동차 조종이 가능하다. 노트북에서 명령코드를 라즈베리파이에게 보내고 라즈베리파이가 아두이노에게 명령코드를 보내 모터를 동작시킨다. 라즈베리파이 안에 TCP 서버와 Serial 통신모듈을 병렬로 동작하도록 구현하였다. 조종을 하기위해서 스마트폰과 컴퓨터에 TCP/IP 클라이언트를 구현을 하였다.
스마트폰 어플리케이션의 실행 모습 |
위의 십자가 모양의 버튼을 누를 경우 DC모터를 동작시키며, 양 쪽의 버튼은 카메라의 서보모터를 제어하게 된다.
2. VLC를 활용한 영상 스트리밍
VLC라는 스트리밍 상용 소프트웨어를 사용했다. 컴퓨터에서 스트리밍영상을 보기 위하여 VLC 외부라이브러리를 활용하여 플레이어 프로그램을 제작하였으며 , 안드로이드 스마트폰의 경우 내부 스트리밍 라이브러리를 활용하여 제작하였다. 초당 프레임은 25프레임으로 끊기지 않고 자연스러운 동영상을 볼 수 있다.
3. 어디서든지 인터넷만 되면 조종 및 영상보기 가능
라즈베리파이에 WIFI 동글이를 붙여서 공유기의 WIFI를 잡을 수 있게 하였고 공유기의 DMZ 설정으로 라즈베리파이에 누구나 조종 및 영상을 볼 수 있도록 하였다.
4. 아두이노 내부소스 수정
아두이노의 Serial 통신은 Main Loop의 딜레이가 있을 경우 즉각적으로 반응하지 못한다. 즉 움직이는 명령을 보냈는데 바로 동작하지 않는다는 것이다. 즉각적인 반응을 하기 위해서 내부 Core 소스를 분석 및 수정하였다. 아두이노 내부 USART RX INTERRUPT를 수정하였다. 인터럽트 내부에 사용자 함수를 넣어서 내가 원하는 동작이 즉각적으로 반응할 수 있도록 수정하였다.
5. DC모터, Servo모터 제어
DC모터의 경우 제어하기 위해 L298을 이용하여 모터드라이버를 제작하였으며 정, 역방향, PWM을 활용하여 속도 조절도 가능하도록 구현 하였다.
Servo모터의 경우 아두이노 라이브러리를 활용하였으며 내부적으로는 특정 PWM에 따라 각도 값을 조절이 가능하다.
■ 전체 시스템 구성
전체 시스템 구조도는 다음과 같다.
스마트폰과 컴퓨터로부터 특정 명령 패킷이 공유기를 통하여 라즈베리파이로 전송된다. 이와 같이 구성한 이유는 라즈베리파이에 랜선을 꽂으면 휴대성 및 이동성에 문제가 생기므로 공유기를 활용하였으며 공유기의 DMZ기능을 활용하여 라즈베리파이를 서버로 활용하였다. 사용자로부터 명령패킷을 받은 라즈베리파이는 아두이노로 명령 패킷을 보내며 아두이노는 받은 명령패킷을 파악하여 모터를 제어하게 된다. 위의 시스템을 구성하기 위하여 라즈베리파이 내부의 TCP/IP 서버, Serial 통신을 병렬로 동작하도록 구현하였다.
■ 개발 환경
사용 언어 : JAVA ,C, C++
플랫폼 : Linux(Raspbian), Window, Android, Arduino
■ 발전 계획
첨부된 동영상을 보면 영상 스트리밍의 경우 실제 상황보다 5초에서 10초 정도 지연된 영상이다. 이는 VLC라는 상용소프트웨어와 공개된 라이브러리를 사용했음에도 나타나는 문제점으로 추후 직접 영상 스트리밍을 구현하도록 한다. 스트리밍 외의 감시자동차를 조종의 경우에는 어디에서든지 지연없이 조종이 가능하다.
카톡에서 메시지가 올 경우 Notification으로 사용자가 확인할 수 있다. 이를 Push 기능이라 한다. 추후 Google Cloud Message 기능을 이용하여 카톡과 같은 Push 기능을 구현하겠다. 이 기능은 로봇이 특정 이상 상황을 파악했을 경우 스마트폰에 PUSH 알람을 발생 시킬 수 있다.
기타
■ 소스코드
■ 감시자동차 모터제어 소스 ■
USART RX INTERRUPT 내부에 사용자 함수를 등록 시켜 특정 값을 받았을 때 특정 변수를 바꿔주었다. 실질적인 제어는 Loop함수에서 실행된다.
void setup()
{
Serial.begin(9600);
Serial1.begin(115200);
attachUsart(1,uartInt);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void uartInt()
{
//Serial.println(“int”);
Serial.print(“Receive :”);
Serial.println(C_Rx);
switch(C_Rx)
{
case ‘D’://LEFT
dir=1;
break;
case ‘E’://UP
dir=2;
break;
case ‘F’://DOWB
dir=3;
break;
case ‘G’://RIGHT
dir=4;
break;
case ‘H’:
if(pos>10)
pos–;
if(pos==10)
pos=10;
myservo.write(pos);
break;
case ‘I’:
if(pos<170)
pos++;
if(pos==170)
pos=170;
myservo.write(pos);
break;
}
C_Rx=0;
}
■ 감시자동차 모터제어 소스 ■
실질적인 제어를 하는 Loop 함수 dir변수에 따라서 DC모터 or Survo 모터를 제어하게 된다.
void loop()
{
switch(dir)
{
case 0:
break;
case 1:
Serial.println(“this is 1”);
digitalWrite(34,LOW);
digitalWrite(35,HIGH);
digitalWrite(36,HIGH);
digitalWrite(37,LOW);
analogWrite(2,150);
analogWrite(3,150);
break;
case 2:
Serial.println(“this is 2”);
digitalWrite(34,HIGH);
digitalWrite(35,LOW);
digitalWrite(36,HIGH);
digitalWrite(37,LOW);
analogWrite(2,150);
analogWrite(3,150);
break;
case 3:
Serial.println(“this is 3”);
digitalWrite(34,LOW);
digitalWrite(35,HIGH);
digitalWrite(36,LOW);
digitalWrite(37,HIGH);
analogWrite(2,150);
analogWrite(3,150);
break;
case 4:
Serial.println(“this is 4”);
digitalWrite(34,HIGH);
digitalWrite(35,LOW);
digitalWrite(36,LOW);
digitalWrite(37,HIGH);
analogWrite(2,150);
analogWrite(3,150);
break;
}
dir=0;
delay(100);
analogWrite(2,0);
analogWrite(3,0);
}
■ 라즈베리파이 TCP 서버 및 Serial 통신 구현 ■
클라이언트로부터 받은 명령패킷을 Serial로 보낸다. 그 중에서 TCP/IP 설정 및 에러가 났을 경우(연결이 끊겼을 경우) 다시 클라이언트를 받을 수 있는 상태로 만든다.
state=pthread_create(&t_id,NULL,thread_function,NULL);
TCP/IP 서버 설정
serv_sock=socket(PF_INET, SOCK_STREAM, 0);
if(serv_sock == -1)
error_handling(“socket() error”);
optlen=sizeof(option);
option=1;
setsockopt(serv_sock,SOL_SOCKET,SO_REUSEADDR,&option,sizeof(option));
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(atoi(argv[1]));
//TCP/IP 서버 내부 에러 처리 소스
while(1)
{
printf(“heyoo\n”);
clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
if(clnt_sock==-1)
error_handling(“accept() error”);
else
printf(“accept success\n”);
while(1)
{
//sleep(3);
printf(“breakout\n”);
str_len=read(clnt_sock, message, BUFSIZE);
printf(“ERROR0 : %d, %s,%d\n”,errno , strerror(errno),str_len);
if(errno==0)
{
errno00++;
if(str_len==0)
{
close(clnt_sock);
printf(“close sock\n”);
break;
errno00=0;
}
}
if(errno==104)
{
close(clnt_sock);
printf(“close sock\n”);
break;
}
………..
■ 작품사진
[그림 1] 라즈베리파이와 카메라 | |
[그림 2] ROVER5와 제어부 실험 | |
[그림 3] 로버5의 하드웨어 구성 | |
[그림 4]영상 스트리밍 화면 | |
[그림 5]작동 화면 |
[30호]국제 모션 컨트롤 전시회
2015 국제 모션컨트롤러 전시회
국내 제조현장에서의 제조설비 및 시스템 구축과 운영을 위한 기초 핵심 기술인 모션 컨트롤 및 엔지니어링을 위한 전시회인 MotionControl Show 2015가 2015년 4월 22일 (수)부터 4월 24일 (금)까지 킨텍스에서 개최되었다.
글 | 이용동 bluelyd@ntrex.co.kr
주 전시 대상 품목은 서보모터, 스테핑모터, 리니어모터, AC드라이브, 모션컨트롤러, 기어모터, UPS 등의 모션제어 분야와, 베어링, 기어, 레일, 기어박스, 커플링 등의 모션 메카니즘 분야, 그리고 릴레이, 근접센서, 압력조절기, 포토센서, 스위치, 안전관리용품 등의 센서 및 주변기기 분야로 크게 나뉘어져 있다.
비교적 한산한 입구의 모습에 약간의 실망감과 함께, 조금은 미약한 전시회가 되지나 않을까 하는 걱정마저 들었지만, 혹시나 하는 마음에 설레이는 마음을 풀어놓지는 않고 있었다. 입구에서 만날 수 있었던 부스 배치도를 통하여, 총 약 50개의 업체가 참가하였음을 알 수 있었고, 몇 몇 큰 부스를 사용하는 업체들이 가장 앞장서서 배치되어 가장 많은 고객들의 눈길을 사로잡고 있었다.
한산한 모습의 입구와는 달리, 위에서 바라본 전시회장 내부의 모습은 밖에서 생각한 것과는 다르게 아주 밝고 가득 들어차 있었으며, 학생들과 여러 업체의 관계자들을 많이 마주칠 수 있었다.
앞쪽에서 가장 큰 부스를 차지하고 있던 산요전기(SanyoDenki)의 모습이 가장 먼저 눈에 들어온다. 주로 냉각팬, 쿨링팬 등의 제품으로 알려져 있었지만, 이날 전시회에서는 다양한 라인업의 제품을 소개하고 있었다.
방수팬, 냉각팬 뿐만 아니라, 방수 방진 모터를 선보였는데, 실제로 물과 먼지에 노출시켜 제품의 성능 및 기능에 대한 시연을 적극적으로 실시하였다. 해당 부스 앞에 대부분의 사람들이 잠깐씩이나마 머물렀다가 가는 데에는 이런 극한 상황에의 노출을 통한 적극적인 시연이 한 몫을 한 것으로 보인다. 또한 DC팬모터, AC팬모터, UPS 등의 다양한 제품을 선보였다.
하지만 이 날 전시장에서 가장 뜨거웠던 반응을 보인 것은 바로 다양한 이벤트를 개최한 일본 로봇제조 전문업체, Sankyo의 부스였다.
다트 던지기, 레이싱 게임 등의 다양한 이벤트를 개최하여 많은 사람들이 몰려들도록 유도하였고, 이벤트 중간 중간에 업체에 대한 PR도 곁들이면서 이목을 끌었다. 실질적으로는 유인하는 데는 성공하였지만, 개인적으로 어떤 제품이 기억에 남는가라는 질문을 던졌을 때, 어떤 것이 있었는지에 대한 기억은 선명하지 않았다. 그래서 이벤트가 너무 화려하면, 본연의 목적은 가려지게 되는 것은 아닐까?하는 생각도 해보게 되었다.
국내 대기업의 한 계열사인 LS메카피온의 일체형 서보 EtherCAT. 모터 드라이브 일체형 서보를 로봇에 적용하여 그동안 로봇 현장에서 어려움을 겪었던 작업의 효율성을 실현하였다고 한다.
동력전달장치 전문업체 미키풀리 코리아에서는 대부분의 제품 라인업을 선보였다. 특히 이 전시회에서 풀리를 전문으로 전시/시연하는 업체는 미키풀리 코리아가 유일했다고 볼 수 있을 만큼 기억에 강렬하게 남는다. 전자 클러치 브레이크, 플렉시블 커플링 등의 다양한 카테고리의 제품을 만나볼 수 있는 기회가 되었다. 특히 다른 부스와는 달리 블랙/레드의 강렬한 조화가 눈에 띈다.
앞선 오토메이션월드에서도 볼 수 있었던 파스텍에서는 델타형 로봇을 선보였다. 빠르고 정교한 움직임을 선보인다는 델타형 로봇은, 3D프린터의 모습과 많이 닮아있었다. Ezi-Servo 와 EtherCAT, Ezi-Robo 등의 다양한 제품 라인업들이 통일성 있는 모습으로 자리하고 있었다.
이 전시회에는 삼성이나 두산과 같은 굴지의 대기업들도 참여하는 등, 인지도나 참여 기업의 면면에서나, 매년 개최되는 이 ‘모션 컨트롤쇼’가 이름 있고 영향력 있는 전시회임을 어느 정도 알 수 있었다.
또한 이번 2015 국제 모션 컨트롤 전시회는 그 동안 구축된 자동화 서버 및 제조 장치들을 독립적으로 운영하는데 그치지 않고 생산 제품의 특성에 적합하게 자동화 기기간의 동작을 상호 유연하게 구축해 나갈 수 있게 하고 제조 장치의 고정도 고 기능화를 위한 기초 핵심 기술인 Motion Control 및 Motion Engineering을 위한 정보 및 최신 기술을 소개하여 향후의 발전 방향을 제시하는 데 큰 의의가 있었다.