[28호] ICT 융합 프로젝트 – 재난 대비 및 인명 구조 무인 로봇
2014 ICT 융합 프로젝트 공모전
재난 대비 및 인명 구조 무인 로봇
(Disaster Preparedness and Life Saving Unmanned Robots)
글 | 광운대학교 한재승, 이경재, 김석현, 이강민
심 사 평
싱크웍스 로봇이 주행을 하지 않고 팔만 근거리에서 스마트폰을 이용하여 제어 가능한 작품인 것 같다. 인명 구조 로봇의 핵심 중 하나는 좋지 않은 환경에서 무선 통신을 잘 해서 로봇이 제어 가능하게 끔 하는 것이고 또한 로봇이 좋지 않은 환경에서 주행을 잘 할 수 있는 능력이 있어야 하는 것이다. 그 다음에 로봇 팔등의 제어가 필요할 것 같다.
JK전자 로봇의 팔과 기구부 설계도 잘 되어있고 구현된 작품의 성능도 최신의 ARM Processor를 이용하여 카메라 영상의 무선 전송까지 실제 구조 로봇이 갖추어야 할 기능들이 많이 구현되어 있다. 구조와 재난 복구를 위해 사람이 할 수 없는 일들을 로봇이 대체할 날이 머지 않은 것 같다. 여러 회사와 정부가 이러한 로봇 개발을 위해서 많은 연구와 투자가 이루어 지고 있는 것으로 알고 있다. 장래에 재난대비 인명구조 및 복구를 위한 무인 로봇 개발의 시작이 되는 작품으로 보이고 아주 잘 구현하였다.
뉴티씨 로봇의 제어를 실질적으로 구현하는 기술의 완성도 면에서 매우 높은 점수를 주었으며, 보고서의 경우에도 대체로 잘 작성되었다. 하지만 실질적으로 구현 시 로봇팔에 사용된 모터의 힘이 부족하여, 현재의 구조로는 팔의 쳐짐이 발생하여 정확한 위치 도달이 어려울 수 있을 것으로 생각된다. 동영상 링크에 있는 CNC로봇의 구조는 모터를 하나 더 보조하여 힘을 보태주고 있는 구조로, 또한, 다른 팔에 달린 모터들과 서로 약간 지지되는 구조로, 상호 보완되어 큰 문제 없을 것으로 보이지만, 현재 재난 구조 로봇에 장착된 부분은 그 중 하나를 떼서 만든 것으로 구조 변경이 좀 필요할 것 같다. 무엇을 들거나 작업할 때에도, 힘이 무척 부족할 것이다. 모터를 상위 버전으로 변경하는 것도 좋은 해결방향이 될 것이다. 하지만 근본적인 문제 해결을 위하여 팔에 쇼바와 같은 약간 기계적인 구조를 추가하여 주는 것도 좋겠다. 대략적인 구현조차도 쉽지 않은 기술을 구현하여 높은 점수를 받았으나 동작 동영상이 있었다면, 더 좋은 점수를 줄 수 있었을 것으로 생각된다. 동작 동영상이 다른 로봇의 것으로 보아 만들다 만 것으로 보여져서, 작품 완성도 점수는 낮게 주었다.
1. 작품 개요
현대 사회는 각종 첨단 산업의 발전과 기술의 발전으로 거대한 기계화, 대형화, 집중화 사회를 이루었으며, 생활 편리를 위한 전기와 유류가스, 원자력 등의 수요가 기하급수적으로 증가하였다. 이에 따라 화재나 재난 발생 시 유독가스 및 폭발 위험성으로 사람에 의한 화재 진압이 빠르게 진행되지 못하게 되며, 이로 인한 사회적, 경제적, 산업적 손실은 막대하다. 따라서 사람의 접근이 힘든 화재나 재난 발생 시 신속하고 효율적인 대응을 위해 우리 사회는 무인 로봇의 필요성을 느끼게 되었으며, 이러한 사회의 흐름에 따라 ICT 기술을 접목한 ‘재난 대비 및 인명 구조 무인 로봇’을 만들게 되었다.
2. 작품 설명
1. 주요 동작 및 특징
재난 대비 및 인명 구조 무인 로봇의 주요 특징으로는 두 개의 로봇 팔, 무한궤도 바퀴 및 실시간 영상 전송과 무선통신 제어이다.
로봇 팔은 네 개의 다이나믹 셀을 로봇 팔의 각 관절에 위치시켜 사람의 팔과 유사하게 혹은 0°~300°로 관절이 돌아가는 등 사람 팔 이상으로 움직일 수 있도록 설계하였다. 또 정밀한 작업을 할 수 있도록 팔 끝에 로봇 손을 달았다. 이러한 두 개의 로봇 팔로 인해 재난 발생 시 사고 현장에서 장애물을 치우거나 기계 장치를 조작할 수 있으며, 사람을 구조할 수도 있다. 또 하나의 주요 동작은 무한궤도 바퀴를 이용한 움직임으로, 지면에 닿는 면이 넓으므로 요철이 심한 도로나 진흙 바닥에서도 자유로이 달릴 수 있고, 모터의 회전 방향을 조정해 방향 전환을 자유로이 할 수도 있으며 재난 상황에서도 바닥의 장애물을 넘어 갈 수 있다는 것이 특징이다. 또 재난 대비 및 인명 구조 무인 로봇에 달린 USB WEB CAM을 통해 익스플로러가 열리는 컴퓨터나 스마트폰 등과 같은 기기로 실시간 영상을 받아 볼 수 있다. 이 모든 동작은 주변기기와의 호환성이 좋고, 다양한 오픈소스를 가지고 있으며, 실시간 소스코드 수정이 가능하고 하위 디바이스 제어가 간편한 운영체제인 리눅스를 이용해 와이파이와 블루투스로 무선 제어 하는 것이 특징이다.
① 로봇 팔
첫 번째 사진은 로봇팔의 가장 기본적인 위치(=원점 좌표)이며, 두 번째 사진은 각각 X, Y, Z로 100mm 만큼 이동한 모습이다. 세 번째 사진은 정면에서 본 사진이다.
로봇 팔에 달린 로봇 손의 모습으로, 각각 최대한 잡았을 때와 최대한 벌렸을 때의 모습이다.
② 무한궤도 바퀴
무한궤도 바퀴의 모습으로 좌측과 우측에서 본 모습이다.
바퀴에 연결된 DC모터의 회전 방향을 조절해 로봇의 이동 방향 조절이 가능하다.
③ WEB CAM을 이용한 실시간 영상 전송
USB WEB CAM을 통해 본 영상을 컴퓨터와 스마트폰으로 받아 보는 사진이다. 첫 번째 사진은 WEB CAM의 외형 모습 사진이며 두 번째 사진은 스마트폰으로 영상을 받아 보는 사진, 세 번째 사진은 컴퓨터에서 인터넷 익스플로러를 통하여 스트리밍된 영상을 보는 사진, 네 번째 사진은 두 가지를 동시에 확인하는 실시간 영상 모습 사진이다.
④ 무선 WIFI를 이용한 SECURE SHELL 제어
먼저 리눅스 시스템에 SSH를 사용하여 접근, 외부 SHELL에서 리눅스를 구동하면서 만들어 놓은 C코드를 컴파일(GCC)을 통하여 보드에 구동할 수 있도록 만들어 놓고, 이후 Key 파일과 Blue 파일 통하여 입력된 데이터를 분석하여 하위 프로세서 M3로 명령어를 전달해준다. CD 커맨드는 폴더 이동이며 ./커맨드로 파일을 구동한다. Key 파일을 구동할 경우 SSH로 입력되는 키보드의 입력을 받아서 M3로 명령을 내려준다. Blue의 경우 USB 블루투스로 전송된 신호를 읽어 들여 입력을 분석하여 어떤 입력인지 분석, M3의 명령어로 전송해준다.
2. 전체 시스템 구성
1) 구동부
① 로봇 팔
로봇 팔 제어 시 관절부 각도조절에 어려움이 있어 현실에서 가장 많이 사용되는 XYZ좌표계를 사용하였다. XYZ를 각 팔 관절에 세타 1,2,3으로 바꾼다고 생각했을 때 수식을 유도하는 과정을 간략하게 설명하겠다. 먼저 원점을 (0,0,0)으로 가정하고 이때의 우리가 원하는 팔 끝의 위치를 X’ Y’ Z’ 이라고 한다. 로봇팔의 길이는 L0로 가정하고, 팔 끝의 위치에서 지면으로 수선의 발을 내린 후 (Z’), 원점과 이은 선분은
이다.
원점에서 팔 끝까지의 길이는
이다. 로봇팔의 길이가 같아 팔의 관절부 각도는 2*(90o – Θ)이고 지면과 팔과의 각도 Θ + Θ0 = arccos(r/2L0) + arctan(Z’/ρ) 이다.
로봇 팔에 사용된 AX-12 다이나믹 셀로서 위의 사진과 같이 연속적으로 결선하여 사용하였다.
② 무한궤도 바퀴
무한궤도 바퀴는 각 축이 DC모터에 연결되어 있고, DC 모터는 MOSFET H-Bridge에 연결된 구조이다. MOSFET H-Bridge 회로는 두 번째 사진과 같이 구성되어 있다. H-Bridge는 양 끝단에 있는 AB CD에 1 0 또는 0 1 신호를 주어서 모터의 회전 방향을 제어하는 것이다. 각 모터에 회전 방향을 제어해 로봇의 이동방향을 전 방향 움직일 수 있게 설계하였다.
2) 제어부
[ 제어시스템의 전체적인 구성도 ] |
먼저 최상위 시스템 프로세서로는 삼성에서 만든 Exynos4412 프리미엄 ARM cortex-a9 시리즈를 사용하였고 오드로이드사에서 제작된 Odroid-U3보드를 사용하여 Exynos4412 위에 Linux 우분투 시스템을 Operating System으로 올려서 각종 디바이스 추가 및 제거, 파일시스템 조작, 오픈소스 응용, 자율적인 통신, 다양한 방법의 접근 가능, 업데이트의 편의성을 늘렸다. Linux를 선택한 이유는 각종 디바이스의 활용이 매우 편리하여 Linux를 선택하였다. 또한 이 시스템에서 USB포트를 활용하여 WIFI, BLUETOOTH, SERIAL, WEBCAM을 하위 디바이스로 사용하였다.
먼저 USB WIFI를 사용하여 WIFI 망에 접속하여 SSH(Secure Shell)방식으로 외부의 다른 컴퓨터에서도 쉽게 원격 접근 및 제어를 가능하게 하였다. USB로 연결된 WEB CAM에서 영상데이터를 받아 Http타입으로 변환하여 WIFI 망으로 스트리밍을 수행함으로서 사용자가 멀리 떨어진 상태에서도 관찰하면서 각종 로봇 팔 및 궤도 모터 제어가 가능하다.
FFMPEG 프로그램을 사용하여 WEB CAM을 WIFI로 스트리밍 하였고, VNC 프로그램을 사용하여 현재 리눅스 상에서의 GUI 화면을 다른 컴퓨터에서 VNC 뷰어를 사용하여 제어할 수 있다.
[ VCN 서버와 VCN 뷰어를 통한 네트워크 개념도 및 프로그램 이미지 ] |
[ VCN 뷰어를 통해서 본 Exynos 상에서의 리눅스 GUI 환경, FFSERVER와 FFMPEG 오픈 소스 프로그램을 사용하여 WEB CAM을 STREAMING 하는 모습 ] |
[ 메인 프로세서인 EXYNOS와 M3 프로세서의 모습 ] |
하지만 이 보드의 아쉬운 점으로는 제작회사에서 Odroid-U3를 제작 시 입출력 포트를 배제하고 만들었기 때문에 따로 입출력 포트를 추가해야하는 번거로움이 있다. 그렇기 때문에 USB SERIAL 통신을 통해서 하위의 프로세서를 하나 더 연결하였으며, 이 하위 프로세서가 입출력 제어를 수행하도록 하였다. 또 신호누락을 방지하기 위해 새로운 통신 프로토콜을 정하였다. Exynos를 사용하여 ARM Cortex-M3 프로세서로 데이터를 송신 후 프로토콜을 검증하고 명령어를 수행한다. 이 때 명령어는 Instruction_Set이라는 하나의 약속된 명령어 세트를 만들고 이것에 의해서 하위 M3 프로세서에서 입출력 제어를 수행하게 된다. 이 입출력으로 MOSFET H-Bridge구성을 통한 DC모터 제어와 로봇팔의 위치 제어를 수행한다.
[ 블루투스 모듈의 이미지와 스마트폰 조이스틱 어플리케이션의 실행 이미지 ] |
USB블루투스 모듈로 스마트폰의 블루투스와 연결하고 조이스틱 어플리케이션을 사용하여 데이터를 전송하고 이를 Exynos측에서 수신하여 필요로 하는 디바이스로 다시 전송해주게 된다.
[ 로봇제어를 위한 컴퓨터와 스마트폰의 조작키 이미지 ] |
빨간색은 로봇팔의 Y, Z 축을 조이스틱과 같이 제어할 수 있게 하였다.
초록색은 로봇팔의 X 축을 버튼 타입으로 제어할 수 있게 하였다.
노란색은 로봇팔의 손목 부분의 관절 꺾임 정도를 제어할 수 있게 하였다.
파란색은 로봇팔의 손을 잡거나 풀 수 있도록 제어 할 수 있다.
주황색은 오른쪽과 왼쪽 바퀴를 전진 방향으로 제어하는 것이다.
보라색은 오른쪽과 왼쪽 바퀴를 후진 방향으로 제어하는 것이다.
[ 리눅스 상에서의 블루투스 동작 개념도 ] |
블루투스 조이스틱 앱을 동작하여 앱 상에서의 스위치를 누를 때, 누르는 순간과 띄는 순간에 데이터 신호를 블루투스로 보내주게 된다. 이를 다중 키 입력으로 사용하기 위하여 SSH상에서 블루투스의 프로그램을 실행하면 1개의 프로세서가 생성되고 그 안에서 각각 2개의 Thread를 생성하여 하나의 Thread는 USB블루투스로부터 들어오는 데이터를 수신하고 검사하여 어떠한 입력이 들어왔는지 판별 후 공유 변수에 어떤 키가 들어왔는지를 기록해놓는다. 그리고 또 다른 하나의 Thread에서는 공유자원을 일정 시간을 주기로 검사하여 키가 눌린 상태를 파악하고 하위프로세서로 지정된 명령어를 보내주게 된다.
이렇게 하여서 사용자는 블루투스의 여러 가지 키를 동시에 누를 수 있으며, 키가 계속 눌린 상태에도 판단하여 동작하게 된다.
3 개발 환경(개발 언어, Tool, 사용시스템 등)
① 개발언어
ARM-CORTEX M3 : C언어
EXYNOS 리눅스 : C언어
② Tool
윈도우 프로그램 : IAR Embedded workbench, VNC-viewer, PuTTY, Tera term, Chrome, stm flash loader, ultiboard,
리눅스 프로그램 : ffserver, ffmpeg, x11vnc, Xfce, GCC, Vim, openSSH, minicom
3. 단계별 제작 과정
1. 회로 부분
PCB 디자인 프로그램을 사용하여 가상으로 설계 후 애칭을 통하여 회로 기판 제작 후 납땜 및 결선
2. 무한궤도 바퀴 부분
기어와 레일로 인한 기본적인 구상과 전산볼트를 필요한 길이로 재단하여 레일 축으로 사용
포맥스와 베어링을 추가하여 기본 뼈대 구성과 완성된 바퀴모습.
ㄱ자모양의 고정자와 커플링을 결합시킨 DC모터와 최종적으로 완성된 바퀴와 DC모터
3. 몸체 부분
알루미늄 프로파일을 이용한 기본 몸체 골격 (왼쪽: 레일 고정부, 오른쪽: 상판포맥스 고정부)
포맥스로 제작한 팔 결합부 모습 및 몸체와 결합한 모습
4. 로봇 팔 부분
로봇 팔에 사용될 AX-12모터와 포맥스를 사용한 기본 틀 구성
축이 되는 모터와 기본 팔 골격 구성
5. 최종 완성 모습
재난 대비 및 인명 구조 무인 로봇 (Disaster Preparedness and Life Saving Unmanned Robots) 소스코드
5. 참고문헌
· ARM Cortex-M3 시스템 프로그래밍
· Advanced Programming in the UNIX Environment
· ARM system developer’s Guide
· 코드로 읽는 리눅스 디바이스 드라이버
· 열혈강의 C
[28호]ICT 융합 공모전 – 모든 온열기에 범용적으로 연결할 수 있는 추가적인 안전장치
ICT 융합 프로젝트 공모전 입선작
모든 온열기에 범용적으로 연결할 수 있는 추가적인 안전장치
심 사 평
싱크웍스 실험 결과가 있었으면 좋았을 뻔했다. 결과를 알 수 없었으므로 완성도를 평가하기 어렵다.
JK전자 보고서를 읽으면서 지금까지 온열기에 왜 이런 장치가 없었나 하는 생각을 하게 되었다. 구현 방법이 어려운 것은 아니지만 작은 아이디어로 실제 제품에도 쉽게 바로 적용도 가능할 것 같은 생각이 들어서 창의성과 실용성에 높은 점수를 주고 싶다.
뉴티씨 온풍기와 같은 온열기로 인한 화재사고로 사망하거나 다치는 것 또는 재산을 잃는 사람들의 수가 해마다 많이 있다. 조금 따뜻해 보려고 쓰던 것이 부주의하게 사용하여 문제가 많이 생기는 경우인데, 이러한 점의 일부분을 개선하여 안전을 높이는 좋은 시도인 것 같다. 온풍기 회사에서 이러한 내용을 참조하여 온풍기의 기능 개선하여 판매한다면, 좋은 반향을 불러일으킬 것 같다. 다만, 거리나 설정 온도 등이 얼마가 되어야 하는지는 실내인지, 실외인지 현지의 상황마다 많이 다를 것으로 예상된다. 따라서, 설정 옵션을 두어 간편 설정, 사용자 세부설정 등과 같이 설정할 수 있도록 하는 것도 중요하리라 생각된다. 이러한 부분이 좀 더 고려되었으면 하는 아쉬움이 있으나, 전체적으로 학생의 입장에서 매우 잘 만든 작품이라 생각된다.
펌테크 실용성이 돋보이는 아이디어 작품입니다. 창의성과 작품 구성상의 난이도는 높지 않으나 아이디어에는 높은 점수를 주고 싶습니다.
1. 작품 개요
온열기 ( 열풍기, 온풍기, 스탠드식 난로 등)는 생각보다 열이 높아서, 춥다고 가까이 있거나, 책상이나 의자 앞에 놓게 되면 화재의 위험 및 화상의 위험이 있다. 실제로 우리 학교에서도 온열기 때문에 화재사고가 날 뻔 하거나 화상을 입은 경우가 적지 않다. 그래서 생각한 것이 모든 온열기에 좀 더 실용적인 안전장치가 있었으면 좋겠다는 것에서 생각해 낸 것이 바로 범용적인 안전장치인 것이다.
이는 온열장치마다 기본적으로 안전장치가 달려있다고는 하지만, 온열기구 자체의 열을 측정하여 적정거리를 그 때 그 때 산출하여 그 이상 접근 시에 경고 메세지를 보낸다거나, 전원을 꺼버리는 온열장치는 찾기 힘들다. 그래서 우리는 간단하게 탈·부착을 할 수 있고, 내열성도 고려하며, 모든 온열 기구에 사용할 수 있는 범용적이면서 저렴한 장치를 제작하게 되었다.
2. 작품 설명
1. 주요 동작 및 특징
주요 동작으로는 맨 처음 온도센서가 켜지고, 온도를 읽어내어 어느 정도의 거리가 안전한지 계산한다. 이는 실시간으로 이루어지며, 사용자가 열의 세기를 조절함에 따라 안전 거리도 달라질 수 있을 것이란 점에 착안하였다. 그 다음, 초음파 센서를 부착하였다. 초음파 센서는 MCU의 Time Interrupts를 사용하여 매 시간마다 앞에 물체가 있는지 없는지 알아본다. 만약 초음파센서에 물체가 감지되면, 자동으로 MCU의 interrupts 가 실행되고, Beep 소리를 내는 함수를 실행하게 되며, 위험 거리 내로 접근할 경우 일정 시간 이후, AC 콘센트와 연결된 차단회로 (릴레이 스위치)가 작동하여 전력을 차단한다. 만약 위험거리까지 접근하였다가 다시 벗어나게 되면, 회로 차단 알고리즘은 종료가 되며 다시 정상적인 작동을 하게 된다.
2. 전체 시스템 구성
(1) 초음파센서
여러 초음파 센서가 있었지만, 우선 시스템에서 요구하는 사양은 1~2미터 사이까지만 측정할 수 있으면 충분하였고, 모듈을 온열 기구에서 열이 나오는 부분이 아닌 부분에 부착을 하는 것이기 때문에 작동 허용범위가 80도 안팎이어야 했으며, 가격을 고려하여 HC- SR04 모델을 채택하였다. 이 초음파 센서는 각각의 입출력 포트를 MCU의 Timer Interrupt Port에 연결하였다.
(2) 온도센서
온도 역시 열이 나오는 곳에 놓긴 하지만, 공중에 놓는 형식이라 작동 허용 범위가 80도 안팎인 것이 필요하였고, 가격 면에서 저렴한 것을 고르다가, LM35라는 제품을 쓰게 되었다. 이는 ADC를 써야하는 부품으로, MCU의 ADC Port에 연결을 하였다.
(3) 스피커
사용자에게 위험을 알리기 위한 용도로, 간단한 부저음을 요하고, MCU의 GPIO에서 나오는 전압이 3V인 것을 감안하고, 가격 면에서 고려하였을 때, BTM-0327을 쓰게 되었다.
(4) 차단회로 (릴레이 스위치)
릴레이 스위치는 가격 면으로 따져봤을 때, JS1 5V (입력 전압 5V, 스위칭 전압 220V도 되는 소자)로 선택하였다.
(5) MCU
MCU는 우리의 시스템에서 요구하는 사항으로, 저전력, 저렴, 뛰어난 퍼포먼스를 지녀야 한다. 그래서 택한 것이 바로 MSP430G2553을 채택하였다. 이 MCU는 한국에선 잘 알려지지 않은 MCU라 프로그래밍이나 구조 자체가 매우 생소하지만, 요구하는 성능을 만족하기 때문에 사용하게 되었다. 그러나 우리는 MCU에 프로그래밍을 해야하기 때문에, Msp430g2553이달려있는 Launch Pad의 에뮬레이터, 다운로더를 같이 썼다.
(6) LCD + 가변저항
LCD는 원래는 없어도 되는 것이지만, 어떠한 정보 값을 받는지 직접 눈으로 확인하기 위해 구매하였다. 캐릭터 LCD로 만들었으며, 가격이 가장 저렴한 MC1602-13을 구매하였다. LCD 밝기 조절을 위한 가변저항은 Hongxing H3362P Series를 썼다.
3. 개발환경
(1) CCS ( Code Composer Studio v5)
이는 Ti에서 만드는 MCU를 프로그래밍 하여 MCU에 다운로드 할 수 있게끔 만든 Tool이다. 기본적으로 각 모델마다 특화된 레지스터 및 코드를 제공하고, 예제코드까지 바로 볼 수 있는 매우 특이한 툴이다. 게다가 이 툴은 기본적으로 타겟 보드를 각 MCU의 Launch Pad 로 삼고 있는데, 이 보드엔 기존의 PIC 같은 경우는 다운로더만 있어서 실질적으로 디버깅할 때 에뮬레이터가 따로 필요한 상황이 많았다. 하지만 Ti에서 제공하는 개발 보드엔 매우 저렴한 에뮬레이터가 기본적으로 달려있기 때문에 이 Tool을 이용하여 실시간 디버깅을 할 수 있다. 심지어는 MCU의 어떤 레지스터에 어떤 값이 들어가는지 Memory Browser 라는 기능까지 있다. 개발 언어로는 C를 사용하며, USB에 타겟 보드를 연결하여 다운로드, 디버깅을 할 수 있게끔 만들어 놓았다.
4. 단계별 제작 과정
위 사진은 MSP430G2553으로 제작한 보드에 한꺼번에 다 꽂을 수 있게 만든 기판이다.
① 초음파 센서를 온열기구 위에 부착하기 위하여 핀으로 빼서 쓸 수 있게끔 하였다.
② 온도센서 역시 온열기구 앞에 위치하게끔 해야 하기 때문에 핀으로 만들었다.
③ 스피커는 보드 위에 직접 부착을 하였다. 소리가 생각보다 크기 때문에 바로 붙였다.
④ LCD는 핀이 총 16개이지만, MCU의 GPIO 개수가 한정적이기 때문에, 8비트 (핀 8개)로 LCD에 띄우고자 하는 내용을 보내는 방법을 쓰지 않고, 4비트씩 나눠서 보내는 방식을 채택하여, 실질적으로 MCU에 꽂히는 핀 개수는 5개 (EN 까지 포함)이다. GND와 VCC는 별도로 붙였다.
⑤ 릴레이 스위치 역시 선을 길게 하여 콘센트에 연결해야 했기에 핀으로 꼽는 방식을 채택하였다.
⑥ 5V전압 공급은 배터리 홀더 혹은 다른 전원 장치를 쓸 수 있게끔 핀으로 꼽는 방식을 채택하였다.
⑦ MSP430G2553 보드를 직접 제작하였다. Launch Pad의 에뮬레이터를 쓰기 위해 SBW 포트를 만들었고, 후에 무선통신으로 제어를 할 수 있게끔 UART 포트도 만들어놓았다.
5. 소스코드
Main.c
float temp;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P2DIR = 0xFF;
lcdinit();
initsona();
readsona();
}
Sona.h
#ifndef SONA_H_
#define SONA_H_
#include <msp430.h>
#include “lcd16.h”
#define P1_ECHO BIT1
#define P1_TRIGGER BIT0
#define P1_LED0 BIT2
#define P1_LED1 BIT3
#define P1_LED2 BIT4
#define P1_LED3 BIT5
#define P1_BUZZER BIT6
#define TH0 5000 /* Distance */
#define TH1 4000
#define TH2 3000
#define TH3 2000
#define TH4 1000
#define TH5 500
void initsona(void);
void readsona(void);
#endif /* SONA_H_ */
Sona.c
#include <msp430.h>
#include “lcd16.h”
#include “temp.h”
#include “sona.h”
unsigned int j;
unsigned int measure = 0;
unsigned int measure_1 = 0;
float temp;
void initsona(void) {
//포트 설정을 해줌
P1DIR |= BIT0 +BIT6 + BIT7;
P1SEL |= BIT1;
P1OUT |= 0×00;
BCSCTL1 |= CALBC1_1MHZ;
DCOCTL |= CALDCO_1MHZ;
BCSCTL2 &= ~SELS;
BCSCTL2 |= DIVS0;
TACCTL0 |= CM_3 + SCS + CCIS_0 + CAP + CCIE;
TACTL |= TASSEL_2 + MC_2 + ID_0;
_BIS_SR(GIE);// general interrupt enable
}
void readsona(void) {
while (1) {
long i;
temp = readtemp();
P1OUT |= P1_TRIGGER;
for (i = 0; i < 3; i++)
;
P1OUT &= ~P1_TRIGGER;
for (i = 0; i < 8000; i++)
;
}
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TimerA0(void) {
long i;
if ((P1IN & P1_ECHO)> 0){
measure_1 = TACCR0;
TACCTL0 |= CM_3;
} else {
measure = TACCR0 – measure_1;
TACCR0 = 0;
P1OUT &= ~(BIT0 + BIT1);
if (measure > TH0) {
gotoXy(0, 0);
prints(“safe”);
j=0;
} else if (measure > TH1) {
gotoXy(0, 0);
prints(“safe”);
j=0;
} else if (measure > TH2) {
j++;
if(j>50000&&temp>100&&temp<150)
{
gotoXy(0, 0);
prints(“Too close”);
P1OUT |= (BIT7+BIT6);
> TH3) {
j++;
if(j>48000&&temp>=150&&temp<170)
{
gotoXy(0, 0);
prints(“Too close”);
P1OUT |= (BIT7+BIT6);
}
}
else if (measure > TH4) {
j++;
if(j>46000&&temp>=170)
{
gotoXy(0, 0);
prints(“Too close”);
P1OUT |= (BIT7+BIT6);
}
}
for (i = 0; i < 8000; i++)
;
}
TACTL &= ~TAIFG;
P1OUT &= ~(BIT7+BIT6);
}
#pragma vector= ADC10_VECTOR ; // interrupt vector
__interrupt void ADC10(void) {
gotoXy(0, 1);
integerToLcd(temp);
}
Temp.h
#ifndef TEMP_H_
#define TEMP_H_
#include <msp430.h>
#include “lcd16.h”
float readtemp(void);
#endif
Temp.c
#include “temp.h”
#include “lcd16.h”
float temp;
float readtemp(void) {
ADC10CTL0 |= ADC10SHT_2 + ADC10ON + ADC10IE; //
ADC10ON, interrupt enabled
ADC10CTL1 = INCH_4; // input A1
ADC10AE0 |= BIT4; // PA.1 ADC option
select
ADC10CTL0 |= ENC + ADC10SC; // Sampling and
conversion start
temp = (ADC10MEM * 3.7 / 1023.0) * 100;
ADC10CTL0 &= ~ADC10ON;
return temp;
}
LCD.h
#ifndef LCD16_H_
#define LCD16_H_
#include <msp430.h>
#define LCD_OUT P2OUT
#define LCD_DIR P2DIR
#define EN BIT5
#define RS BIT4
#define EN_1 (P2OUT |= EN)
#define EN_0 (P2OUT &= ~EN)
#define RS_1 (P2OUT |= RS)
#define RS_0 (P2OUT &= ~RS)
void waitlcd(unsigned int x);
void lcdinit(void);
void integerToLcd(int integer);
void lcdData(unsigned char l);
void prints(char *s);
void gotoXy(unsigned char x, unsigned char y);
#endif /* LCD16_H_ */
LCD.c
/*
* lcd16.c
*
* Created on: Dec 1, 2011
* Author: Gaurav www.circuitvalley.com
*/
#include “lcd16.h”
void lcdcmd(unsigned char Data) {
RS_0;
EN_0;
LCD_OUT &= 0×00; //clear all data pin.
LCD_OUT |= ((Data & 0xF0) >> 4);
EN_1;
waitlcd(2);
EN_0;
LCD_OUT &= 0×00; //clear all data pin
LCD_OUT |= (Data & 0x0F); // P1OUT |=BIT
EN_1;
waitlcd(2);
EN_0;
}
void lcdData(unsigned char l) {
RS_1;
EN_0;
LCD_OUT &= 0xF0;
LCD_OUT |= ((l & 0xF0) >> 4);
EN_1;
waitlcd(2);
EN_0;
LCD_OUT &= 0xF0;
LCD_OUT |= (l & 0x0F);
EN_1;
waitlcd(2);
EN_0;
}
void lcdinit(void) {
RS_0;
EN_0;
LCD_OUT = (BIT0 + BIT1);
waitlcd(40);
EN_1;
EN_0;
waitlcd(5);
EN_1;
EN_0;
waitlcd(5);
EN_1;
EN_0;
waitlcd(2);
LCD_OUT = BIT1;
EN_1;
EN_0;
lcdcmd(0×28); // Function set -> set data length 4 bit 2 line
waitlcd(250);
lcdcmd(0x0C); //Display on/off control -> set display on
cursor on blink on
waitlcd(250);
lcdcmd(0×01); // Clear display
waitlcd(250);
lcdcmd(0×06); // Cursor or display shift -> cursor shift
direction
waitlcd(250);
lcdcmd(0×80); //Set DDRAM address -> set ram address
waitlcd(250);
}
void waitlcd(volatile unsigned int x) {
volatile unsigned int i;
for (x; x > 1; x–) {
for (i = 0; i <= 110; i++)
;
}
}
void prints(char *s) {
while (*s) {
lcdData(*s);
s++;
}
}
void gotoXy(unsigned char x, unsigned char y) {
if (x < 40) {
if (y)
x |= 0×40;
x |= 0×80;
lcdcmd(x);
}
}
void integerToLcd(int integer) {
unsigned char thousands, hundreds, tens, ones;
thousands = integer / 1000;
lcdData(thousands + 0×30);
hundreds = ((integer – thousands * 1000) – 1) / 100;
lcdData(hundreds + 0×30);
tens = (integer % 100) / 10;
lcdData(tens + 0×30);
ones = integer % 10;
lcdData(ones + 0×30);
}
[28호]ICT 융합 공모전 – 지능형 계단 청소 로봇
2014 ICT 융합 프로젝트 공모전 입선작
지능형 계단 청소 로봇
글 | 명지대학교 김정훈, 정영진
심사평
싱크웍스 잘 만들어지면 좋은 작품이 되겠으나, 현재까지 완성도를 볼 수 있는 실험 결과가 없다.
JK전자 창의적이고 새로운 생각은 아니지만 2명의 학생이 3개월 동안 기구 설계와 펌웨어 작업을 모두 완료하였다면 보통 이상의 수준을 뛰어넘는 재능과 실력을 가진 것 같다. 작품의 완성도와 구현의 난이도에 높은 점수를 주고 싶다.
뉴티씨 누군가는 청소를 해야하는 계단의 경우, 실제로 많은 업체들이 어렵게 청소를 진행하고 있다. 이를 자동으로 로봇이 할 수 있게 한다면, 매우 좋은 어플리케이션이 되리라 생각한다. 따라서, 매우 훌륭한 시도라고 생각된다. 다만, 현재 구현되어 있는 상태가 로봇의 계단 이동까지만 설계된 것으로 보이며, 이를 앞으로 좀 더 보완하여 청소 부분까지 구현된다면 매우 좋은 어플리케이션이 되리라고 생각된다. 정해진 싸이즈의 계단 외에도 다양한 계단에 대해 일부 대응이 가능할 것으로 생각되지만, 좀 더 작은 싸이즈의 계단에 대한 고려도 필요하리라 생각된다. 청소 부분이 어떻게 될 것인지도 매우 중요한 요소가 아닌가 생각된다. 이 부분에 대한 필요성 말고도 실질적인 솔루션이 소개되었다면 좀 더 좋은 작품이 아닐까 생각되며 다음 작품을 기대해 본다.
펌테크 학생이 만들기에는 하드웨어, 소프트웨어 구성상에 다소 높은 난이도가 예상되지만 그럼에도 불구하고 완성도를 높여 동작되는 데모 가능한 작품만으로도 큰 의미가 있다고 생각합니다.
1. 선정 배경
1. 계단청소 로봇의 필요성
해외 및 국내를 포함하여 최근의 건물들은 점점 고층화 되는 추세에 있다. 그리고 모든 건물은 화재, 지진 등 비상 상황을 대비하거나 편의를 위해 계단을 포함하고 있다.
건물의 높이가 높을수록 계단의 개수도 늘어난다. 건물의 유지 관리를 위해 수 많은 계단을 청소하는 일을 누군가 해야 한다. 수 많은 계단을 사람이 직접 청소하기 위해서는 많은 인력을 필요로 할 뿐만 아니라 계단을 청소하며 발생할 수 있는 위험도 감수해야 한다. 따라서 사람 대신 계단을 청소할 수 있는 로봇 청소기의 필요성은 점점 늘어나고 있다.
옛날에 비해 많은 가정에서는 청소하는 데 필요한 인력을 줄이기 위해 로봇 청소기를 사용하고 있다. 해가 지날수록 로봇 청소기의 수요는 점점 늘어나는 추세에 있다. 하지만 계단을 스스로 청소할 수 있도록 만들어진 로봇은 시중에 출시된 제품이 현재 없는 실정이다.
[그림 1] 연도별 로봇 청소기 시장 전망 | [그림 2] 인력을 통한 계단청소 |
2. 다양한 종류의 계단
[그림 3] 다양한 종류의 계단 |
계단은 다양한 종류가 있으며 그 용도 및 길이도 다양하다. [그림 3]은 목적이 다른 다양한 형태의 계단을 보여 준다. 계단의 용도는 등산, 디자인, 가정, 일반적인 건물 등으로 다양하다. 등산을 위한 계단은 통나무나 나무 판자를 덧대어 사람이 미끄러지지 않고 산을 오를 수 있는 형태로 만들며 디자인을 위한 계단은 실용적인 계단이 아닌 새로운 형태로의 시도와 창의적 설계를 목적으로 하고 있다. 반면, 가정에서 사용하거나 일반적인 건물에서 사용하는 계단은 계단의 형태가 일정하지 않거나 디자인, 창의성을 접목한 설계를 하지 않는다. 실생활에서 사람이 오르내리기 위해 실용적인 형태로 만들며 각 계단은 일정한 형태의 반복으로 만들어져 있다.
본 프로젝트의 아이디어는 고층 빌딩의 계단을 청소하는 데 필요한 인력과 위험, 비용을 줄이기 위함에 있다. 따라서 프로젝트에서 타깃으로 하는 형태의 계단은 디자인이나 등산을 위한 계단이 아닌 일반적인 형태의 고층 빌딩에서 사용하는 계단이다.
2. 개발 목적
1. 계단 유지 관리를 위한 인력의 최소화
[그림 4] 계단청소 업체 |
현대식 건물들은 보통 3~4층 이상으로 지어진 경우가 대다수이며 아파트의 경우에는 최소 10층부터 30층 이상까지 지어진 경우가 많다. 보통 건물을 관리하는 업체가 있는 경우 업체에서 청소를 담당하지만, 그렇지 않은 경우 직접 청소를 하기도 하지만, 양이 많아 모두 청소하기 어렵기 때문에 전문적으로 계단을 청소해주는 업체에 맡기는 경우가 많다. 계단 청소 업체에서는 계단을 청소하기 위해 필요한 세척제, 전문 청소도구를 사용하지만 사람이 모든 칸을 직접 청소해야 하는 것은 다를 바 없다. 하지만, 계단 청소 로봇을 활용할 경우 계단 청소에 드는 인력을 최소화할 수 있다. 항시 청소가 가능하기 때문에 계단이 크게 더러워질 염려가 적으며, 고층 아파트와 같이 계단 및 시설물들을 관리해주는 업체가 있지 않은 경우, 사람을 부르지 않고도 어렵지 않게 청소할 수 있다.
2. 고층 빌딩 계단청소의 안전 보장
[그림 5] 계단 사이 폭이 넓은 계단 |
고층계단을 청소하다 보면 항상 추락, 미끄러짐으로 인한 사고의 위험이 따른다. 계단의 길이가 길거나 계단 한 칸의 높이가 높은 경우 넘어질 때 크게 부상을 당하기 쉬우며 심한 경우 사망에 이를 가능성이 있다. 건물 내 계단의 구조따라 [그림 5]와 같이 계단 사이의 폭이 넓은 경우도 있다. 이를 계단청소 로봇이 대체할 경우 발생할 수 있는 계단 사고를 방지할 수 있다.
3. 기술 동향
1. 로봇 청소기
[그림 6] 기존의 로봇 청소기 |
사람이 직접 바닥을 청소하는 대신 가정이나 사무실에서 로봇청소기를 켜 놓고 있으면 신경 쓰지 않아도 알아서 바닥을 청소해준다. 편의성 때문에 점점 많은 가정이나 사무실에서 로봇청소기를 활용하고 있으며, 국내 뿐만 아니라 해외에서도 많은 인기를 누리고 있다. 이를 증명하듯 많은 업체에서 다양한 기능과 디자인을 탑재한 로봇청소기를 출시하고 있다. 특히 삼성에서는 ‘탱고’라는 이름으로 로봇청소기를 출시해 높은 인기를 끌고 있다.
2. 화재진압용 무인방수 로봇
[그림 7] 화재 진압용 계단 이동 로봇 |
폭발위험이 있거나 방사능과 같은 위험물질이 누출된 곳, 강렬한 복사열 등으로 소방관이 다가가기 어려운 위험한 대형화재 현장이나 길이 막혀 소방차가 들어가기 어려운 곳에서 화재진압 및 인명 검색 활동을 하게 된다. 이 로봇은 중량 160kg에 길이 1250mm, 너비 730mm, 높이 750mm로 한 번 충전으로 120분 이상 운용이 가능하다. 화재현장에서 100m 이상 떨어진 외부에서 무선으로 조종이 가능하며 열 화상카메라 1대를 탑재해 내부의 화점 및 인명 검색에 탁월한 능력을 가지고 있다. 또 최대 사거리 40m의 소방포를 장착하고 있어 원거리의 화재진압에도 활용이 가능하다.
3. 사물 운반용 계단 이동장비
[그림 9] 계단 이동이 가능한 휠체어 |
엘리베이터가 없는 다층 건물에서의 이삿짐, 택배 등 짐을 운반할 때 수월하게 운반할 수 있도록 만들어진 장비이다. 계단을 오르내리기 위해 3개의 바퀴를 사용하고 있다.
4. 휠체어 로봇
거동이 불편한 환자를 위한 휠체어는 많이 있다. 하지만, 휠체어를 사용하면서 부딪히는 문제는 계단을 오르내리기 힘들다는 점이다. 계단에 휠체어용 리프트나 미끄럼틀이 설치되어 있지 않은 경우 휠체어를 타고 계단을 오르거나 내려갈 수 없다. 이러한 경우를 위해 평지에서 이동이 가능하면서 계단을 오르내릴 수 있는 로봇이 만들어졌다.
4. 개발 목표
1. 계단 이동에 쉽고 청소에 효율적인 구조 설계
(1) Shift wheel
상하로 움직일 수 있는 shift wheel을 채택하여 기구부를 다음 계단으로 이동시킬 수 있게 한다.
(2) 회전모터를 이용한 회전 바퀴
90도로 꺾을 수 있는 바퀴를 사용함으로써 로봇청소기가 한 계단을 청소할 수 있도록 이동하며 다시 90도로 꺾어 턴 구간에서 전진할 수 있도록 한다.
2. 계단의 이물질을 제거
(1) 흡입 모듈
기존 로봇 청소기에서 사용하는 흡입 모듈을 사용하여 계단에 있는 이물질을 흡입할 수 있도록 한다.
(2) 적외선 센서
한 계단의 칸 끝에 도달했는지 파악하기 위해 적외선 센서를 사용한다.
3. 계단의 턴 구간 청소
(1) 수직 이동을 위한 초음파센서
바퀴를 이용해 이동하면 조금의 틀어짐이 발생할 경우 로봇청소기의 이동경로가 잘못될 수 있다. 따라서 틀어질 경우를 판단하기 위해 초음파센서를 벽에 쏘아 일정거리를 유지하며 수직으로 이동할 수 있도록 바퀴를 조절한다.
5. 개발 내용
1. 하드웨어
(1) 하드웨어 구성
[그림 10] 로봇구성 |
청소로봇에는 모터구동 바퀴가 장착된 360도 회전이 가능한 4개의 다리를 가지며 같은 쪽의 다리는 서로 충돌하지 않는 구조의 사족로봇형태이다. 각 다리에는 50W급 웜기어 모터가 장착되어 있어 이동시에 강력한 힘을 낼 수 있고, 웜 기어의 특성상 출력측의 힘이 입력측 모터로 힘 전달이 안되기 때문에 효율적인 측면에서 장점이 크다. 로봇의 정면, 측면, 바닥면에 거리측정 센서가 총 8개가 장착되어 있어 지형정보를 쉽게 얻어 올 수 있다.
(2) 프레임
[그림 11] 프레임 |
[그림 12] 구성 부품 |
(3) 마그네틱센서
[그림 13] 마그네틱센서 [그림 14] 자석의 위치 |
현재 로봇의 다리 각도를 알아야 사족보행을 위한 모션을 생성할 수가 있다. 그래서 각 관절에 마그네틱 로터리 엔코더(Magnetic Rotary Encoder)를 각 다리에 설치하였다. 엔코더의 출력형태는 360도를 14bit로 분해하여 디지털 출력을 해주므로 섬세한 위치 피드백이 가능하다.
자석의 위치는 관절기어의 중심에 위치하고 있다. 자석의 크기는 6x6x6mm의 네오디움 자석을 장착하여 자력을 충분히 마그네틱 로터리 엔코더에 전달할 수 있다.
(4) 구동모터 전력전달
[그림 15] 다리회전 |
[그림 16] 원형 동판구조 |
로봇이 평지이동에서는 구동모터를 이용하여 이동한다. 그 이유는 다리를 이용하여 보행하는 것보다 바퀴로 이동하는 것이 흔들림없이 안정적으로 이동이 가능하다. 계단을 이동할 때는 다리를 360도 회전하게 되는데, 이때 구동모터의 전원이 전선으로 연결되어 있을 경우 회전에 의하여 꼬임이 발생하다가 결국은 단선이 된다.
[그림 16]과 같은 원형의 동판을 구성하고 핸드폰의 배터리 연결 단자를 응용하여 전력전달을 하였다. 배터리연결 단자의 도체부분이 탄성이 있어서 지속적인 전력 전달에 적합한 구조로 되어 있다.
6. 소프트웨어
1. 제어알고리즘
펌웨어에서는 [그림16]과 같은 모듈들을 제어하게 된다. 기구부가 한 계단에서 이동하는 동안 하단에 달려 있는 적외선 센서를 통해 주기적으로 계단의 끝에 도달했는지 파악한다. 계단 중에는 한 계단의 끝이 막혀 있는 경우가 있는 반면, 막혀 있지 않은 경우도 있다. 이러한 경우 펌웨어는 적외선 센서를 통해 막혀 있는 부분을 찾는 것이 아닌 바닥이 뚫려 있는 부분을 찾는다. 바닥이 뚫려 있는 부분은 로봇청소기가 청소를 진행할 수 없는 계단의 끝에 해당하기 때문이다. 펌웨어는 로봇 청소기가 턴구간에 올라왔는지 판단할 수 있어야 한다. 계단을 한칸 올라올 때마다 적외선 센서를 이용해 다음 계단이 있는지 판단하여 다음 계단이 없는 경우 턴 구간으로 판단한다. [그림15]는 이러한 펌웨어의 동작을 플로우차트로 보여준다. 턴 구간에서 펌웨어는 다음 층계의 위치를 파악하기 위해 상단에 달려 있는 적외선 센서로 뚫려 있는 공간을 찾으며 해당 위치를 기억해둔 뒤, 턴 구간이 완료된 다음 서보모터를 제어해 찾았던 턴 구간으로 이동한다.
[그림 17] 펌웨어 컨트롤 플로우차트 |
[그림 18] 계단 청소 로봇의 모듈 |
턴 구간을 청소하는 도중에는 주기적으로 초음파 센서를 통해 벽과의 거리를 파악한다. 처음에 측정된 거리에서 벗어나는 경우 거리와 일치시키면서 서보모터를 조절하여 수직 이동을 유지한다. 그리고 초음파센서와 벽 사이의 거리가 0에 가까울 경우 턴 구간을 모두 청소했다고 판단한다.
2. 계단 상승 제어
[그림 19] 계단 등반 |
1. 좌측면의 다리 2개와 우측면의 다리 2개를 로봇의 하단으로 회전하면서 바닥을 딛고 일어난다.
2. 다음 계단으로 올라가기 위해 전방의 다리 1개만 다음 계단에 딛는다. 청소기 로봇은 4개의 다리를 활용하기 때문에 1개의 다리를 들더라도 3개의 다리로 중심을 잡는 것이 가능하다. 남은 3개의 다리로 삼각형의 꼭지점을 만들 수 있으므로, 다음 계단을 오를 때 넘어지지 않을 수 있다.
3. 전방의 남은 1개의 다리를 다음 계단에 딛는다. 다리를 올리는 동안 후방 2개의 다리와 미리 딛은 전방 1개의 다리로 중심을 잡을 수 있다.
4. 4개의 다리 끝의 구동모터를 동작시켜 이동 가능한 부분까지 측정하여 앞으로 이동한다.
5. 전방 2개의 다리를 모두 안쪽으로 접어 바닥을 딛지 않도록 한다. 이때 다음 계단에 올라온 로봇 청소기의 바퀴와 후방 2개의 다리로 중심을 잡을 수 있다.
6. 청소기의 바퀴와 후방 2개 다리의 바퀴로 계단의 폭을 조금 더 이동하여 완전히 다음 계단으로 본체를 이동한다.
7. 후방 2개의 다리를 접어 이동을 완료한다.
8. 층계를 청소하기 위해 청소기 회전을 담당하는 구동모터를 동작시켜 청소기만 90도 회전한다.
9. 흡입모듈을 ON시키고 층계의 끝에 도달할 때까지 적외선 센서를 이용해 점검하면서 한 층계를 청소한다.
10. 층계의 끝에 도달하면 흡입모듈을 OFF시키고 다시 구동모터를 동작시켜 청소기만 90도 회전한다.
3. 14-bit angular position sensor
로봇의 다리를 제어하기 위해서는 현재 다리가 어느 위치에 있는지 판단할 수 있어야 한다. 본 프로젝트에서 로봇의 다리는 360도 회전하기 때문에 다리의 위치를 판단하는 것은 현재 다리의 각도를 판단하는 것과 같다. 0도에서 다리가 움직일 때마다 상대적으로 다리의 위치를 계산하다보면 관성/마찰력에 의해 계산이 틀어질 수 있고 시간이 지나면 높은 오차가 생길 수 있다. 따라서 현재 다리가 위치한 절대각도를 판단해야 할 필요가 있으며, 이를 위해 14-bit angular position sensor를 사용했다. N극과 S극이 서로 붙어있는 자석을 활용해서 센서가 자석의 각도를 얻어낼 수 있으며 해당 센서는 PWM, I2C, SPI통신을 지원한다.
4. Infared sensor
로봇이 벽의 끝에 도달하거나, 한 층계를 청소하다 끝 부분에 도달하거나 혹은 마지막 층계에 도달해서 다음 계단의 유무를 판단하는 경우 활용된다. 한 층계의 끝에 도달할 경우의 판단을 위해 전방의 바닥을 센싱하고 있다가 바닥이 없을 경우 값이 멀어져 끝에 도달했는지 판단한다. 벽의 끝에 도달하는 경우의 판단은 센서의 거리 값이 짧아지는 경우 벽에 도달했는지 판단한다. 마지막 층계에 도달하는 경우는 다음 계단이 없을 땐 로봇의 앞이 비어있으므로 거리 값이 멀어지는 경우 다음 계단이 없는 것으로 판단한다.
5. 로봇 제어를 위해 펌웨어가 사용한 통신
(1) SPI
다리의 절대 각도를 센싱하기 위해 magnetic sensor를 제어하는 데 사용했다. 다리의 각도를 센싱하여 일정 각도에 도달할 경우 다리의 회전을 멈추도록 제어할 수 있다. 개수가 제한적인 핀을 효율적으로 사용하고 많은 주변장치들을 제어하기 위해 SPI를 사용했다. MISO(Master In Slave Out), MOSI(Master Out Slave In), SCK(Clock), NSS(Chip Select) 4개의 핀을 필요로 하며 여기에 다른 주변장치를 더 사용하기 위해서는 NSS1개의 핀만을 더 필요로한다. MISO는 master에서 slave로 데이터를 보내기 위한 용도, MOSI는 slave가 master로 데이터를 보내기 위한 용도, SCK는 데이터를 보내는 타이밍을 맞추기 위한 용도로 사용되며 NSS는많은 주변장치 중 어느 주변장치와 통신할 것인지 선택하기 위한 용도로 사용된다.
(2) PWM
구동모터 드라이버를 제어하는데 사용했다. 펄스의 변화를 통해 모터의 속도를 변화시키며 이 값을 구동모터 드라이버로 전달해준다. 구동모터 드라이버는 1개당 2개의 구동모터를 제어할 수 있으며, 본 프로젝트에서는 로봇의 다리 끝에 달려 있는 바퀴를 제어하고 청소기 본체의 회전을 제어하기 위해 사용된다. 4개의 바퀴를 사용하기 때문에 4개의 PWM 핀과 본체의 회전을 담당할 1개의 PWM핀을 사용했으며, 여기에 추가적으로 구동모터에 방향을 정해주기 위한 5개의 GPIO핀을 사용했다. 펄스 제어와 GPIO를 통해 각각 속도와 바퀴 회전 방향을 지정할 수 있다.
(3) ADC
아날로그 신호를 디지털로 변환하기 위한 용도로 사용되며, 해당 프로젝트에서는 적외선 센서의 값을 읽어오는 데 사용됐다. 여러 적외선 센서가 필요하기 때문에 다수의 ADC 핀을 활용했다. 적외선 센서를 통해 계단의 끝에 도달했는지 혹은 마지막 계단에 도달했는지 판단할 수 있다.
(4) USART
디버깅을 위한 용도, Worm geared 모터를 제어하기 위한 용도로 사용했다. 호스트 PC와 ARM Cortex-M3 보드가 서로 전달하기 위한 용도로 1개의 USART와 Worm geared 모터 드라이버를 제어하기 위해 2개의 USART가 사용되어 총 3개가 사용됐다. Worm geared 모터 드라이버는 미리 정해진 드라이버 명령어를 serial text로 전달해주면 명령어에 지정해 준 속도, 방향, 모터 select 정보에 따라 바퀴를 제어한다. Worm geared 모터 1개당 2개의 모터를 제어할 수 있으며 본 프로젝트에서는 다리의 회전을 제어하는 용도로 2개의 Worm geared 모터가 사용됐다.
(5) GPIO
흡입모듈을 제어하기 위한 용도, PWM와 함께 구동모터에 제어정보를 전달하기 위한 용도로 사용됐다. 구동모터의 회전 방향을 정하기 위해 High/Low를 바꾸어주는 용도로 활용했다. 청소기의 흡입 모듈은 단순히 펄스에 따라 ON/OFF만 지정하면 제어가 가능하기 때문에 흡입모듈을 제어하는 데 사용됐다.
6. GUI
[그림 20] 로봇제어 GUI |
MFC를 통해 로봇을 제어할 수 있는 windows용 어플리케이션을 추가적으로 구현했다. 어플리케이션에서는 로봇으로 시리얼 통신을 통해 메시지를 전달하거나 로봇에서 보내는 출력 메시지를 받아 텍스트 창에 출력할 수 있다. 출력하는 텍스트의 포맷을 ASCII와 HEX로 바꾸어 가면서 출력 가능하다. 로봇을 제어하는 동작을 단계별로 나누어 버튼 클릭을 통해 간단하게 수행시킬 수 있다. 계단을 오르는 과정, 다리를 펴서 일어나는 과정, 다리를 접어 동작을 리셋하는 과정, 바퀴와 다리를 회전하는 과정을 제어할 수 있다. 그리고 현재 로봇 다리의 절대 각도를 어플리케이션에서 확인할 수 있다.
7. 개발 환경
1. Board
ARM Cortex M3
2. Language
C 언어
3. Development Tool
gcc
vim
inventor
8. 역할 분담
김정훈 : 기구부 설계 및 부품 선정 / 기구부 제작
정영진 : 센서 제어 펌웨어 설계 및 구현 / 센서 모듈 제어
9. 개발 부품
번호 | 부품명 | 수량 | 사용목적 |
1 | BLDC감속모터 BL2232 + IG22 (24V) | 4 | 모터 |
2 | 웜기어드 윈도우모터 DWL-UT404122L (LEFT형) | 2 | 모터 |
3 | 웜기어드 윈도우모터 DWL-UT404122R (RIGHT형) | 2 | 모터 |
4 | STM32F103VBT6 | 5 | CPU |
5 | GP2Y0A710K0F | 1 | 센서 |
6 | GP2Y0A41SK0F[케이블포함] | 4 | 센서 |
7 | NT-S-DCDM1210 | 3 | 드라이버 |
8 | NT-VNH20SV1 | 1 | 드라이버 |
9 | NT-BL3V(소형 BLDC드라이버) | 1 | 드라이버 |
10 | OZBV-05A-D2M2 (속도제어형 BLDC모터 드라이버) | 5 | 드라이버 |
11 | 블루투스 임베디드 모듈(FB155BC) | 2 | 통신모듈 |
12 | WGM-6R 01K | 1 | 모터 |
13 | 24V [ 1:1656 ] Micro Worm Gear Motor (WGM370) | 1 | 모터 |
14 | AGAiT EC mini 로봇청소기 | 1 | 청소모듈 |
10. 용어 정리
1. 펌웨어
펌웨어는 일반적으로 롬(ROM)에 저장된 하드웨어를 제어하는 마이크로 프로그램을 의미한다. 프로그램이라는 관점에서는 소프트웨어와 동일하지만 하드웨어와 밀접한 관계를 가지고 있다는 점에서 일반 응용소프트웨어와 구분되어 펌웨어는 소프트웨어와 하드웨어의 특성을 모두 가지고 있다고 할 수 있다.
2. Gadget
일반 PC에서는 Linux가 설치된 PC가 Master이기 때문에 이 기능이 활성화 되어 있지않다. 하지만 임베디드 보드에 올라간 Linux는 PC와 연결 될 때 Client로 동작해야 하기 때문에 USB Gadget을 수정하여 이 Device의 역할을 Slave로 만들어 준다.
3. Device Driver
소프트웨어에서 하드웨어 디바이스 장치를 호출하고 사용하기 위한 추상화 계층을 제공하는 인터페이스로 잘 정의된 내부 프로그래밍 인터페이스에 하드웨어 구성 요소가 응답하게 해준다. 디바이스 드라이버는 실제로 디바이스가 어떻게 동작하는지에 관한 세부 사항을 완전히 숨김으로 완벽하게 추상화된 블랙박스 같이 동작한다.
4. SPI
직렬 주변기기 인터페이스 버스 또는 SPI 버스는 아키텍처 전이중 통신 모드로 동작하는 모토로라 아키텍처에 이름을 딴 동기화 직렬 데이터 연결 표준이다. 장치들은 마스터 슬레이브 모드로 통신하며 여기서 마스터 장치는 데이터 프레임을 초기화한다. 여러 슬레이브 장치들은 개별 슬레이브 셀렉트 라인과 함께 동작할 수 있다.
5. PWM
PWM이란 Pulse Width Modulation의 줄임말로 펄스 폭 변조를 의미한다. 펄스 폭을 전송하고자 하는 신호에 따라 변화시키는 변조 방식을 PWM방식이라 하며, 모터 제어나 전압제어에 많이 사용된다.
6. ADC
아날로그 신호를 디지털 신호로 변환해 주는 장치이다. 일반적으로 빛의 밝기, 온도, 소리의 크기, 압력. 등의 변화를 측정할 때 주로 쓰이며, 이런 자연변화 상태를 전압의 상태로 변환해 주는 센서를 거친 후 AD 컨버터에서 디지털로 바꾸어 주는 과정을 거친다.
11. 참고 문헌
· 두산백과
· Technical Teature / 2005년 3월 호
· http://www.linux-usb.org/gadget/
· http://dsk114.com.ne.kr/hdd/f_system.html
[28호]센서와 제어 인터페이스 보드 출시
센서와 제어 인터페이스 보드 출시
드림스페이스월드에서 센서 통합 인터페이스 보드(DSW-SN-06)와 제어 인터페이스 보드(DSW-DN-08)를 출시했다.
DSW-SN-06은 6개의 센서입력단자와 2채널의 485통신포트, 1채널의 Zigbee 무선통신 채널을 지원 하며 6~ 24V의 입력 전원, 통신케이블 연결 후 별다른 세팅없이 바로 사용이 가능하며 최대 16개의 노드 ID를 가지고 있다.
0~5V, 0~ 20mA의 아날로그 출력을 가지는 다양한 환경 센서들을 입력받아 12비트의 ADC변환 후 485SK 지그비통신을 이용하여 전송하는 고신뢰성 제품이다. 통신방식은 MODBUS 방식으로 설정된 프로토콜을 제공한다. 또한 사용자의 편의성을 고려하여 센서 컨넥터에 연결하기만 하면 사용이 가능하다.
DSW-CN-08은 MODBUS 프로토콜에 의하여 모두 8개의 릴레이를 구동할 수 있으며 2채널의 485통신포트, 1채널의 Zigbee 무선통신 채널을 지원하며 6~ 24V의 입력 전원, 통신 케이블 연결 후 별다른 세팅 없이 바로 사용이 가능하며 최대 16개의 노드 ID를 가지고 있다.
각 릴레이는 5A/250V AC, 5A/ 30V DC의 우수한 구동용량을 가진다. 통신방식은 MODBUS 방식으로 설정된 프로토콜을 제공한다. 10A, 250V/AC 이상의 부하를 출력용 터미널을 통하여 공급되며 각종 모터나 대용량 릴레이 구동에 편리한 제품이다.
DSW-SN-06 구매하러 가기
DSW-DN-08 구매하러 가기
Tel. 042-867-2966
[28호]블루투스 4.0 기반의 통합보드, 블루이노 출시
블루투스 4.0 기반의 통합보드, 블루이노 출시
이노이드에서 출시한 블루이노는 블루투스 4.0 기반의 통합보드로 최근 주목받고 있는 사물인터넷, 웨어러블 디바이스, 아이비콘 제품 개발을 위한 프로토타입 하드웨어 보드이다.
기존의 아두이노의 편한 통합개발환경 툴을 100% 호환하며 기존의 창작물과 SW 소스를 쉽게 활용할 수가 있다. 별도의 프로그램 다운로드 툴이 필요없이 바로 코딩 후 다운로드 가능하다. I/O를 최대 7개를 가지고 있으며, 모든 핀이 Digital I/O, Analog PWM Out, ADC 10bit In으로 다양하게 사용이 가능하다. Bluetooth 4.0 SOC 칩 사용으로 아이폰과 안드로이드 폰과 무선통신을 통한 제어 및 모니터링이 가능하다. 또한 코인배터리를 사용할 수 있게 제작되어 휴대용 제품 개발과 사용에도 편리한 구조로 제작되었다.
블루이노 단품과 패키지형 2가지로 출시되었는데 패키지형의 경우 부저, 온도, DC모터 쉴드 등 총 8가지 종류가 포함되어 있어 여러가지 창작물 제작에 유용하다.
보다 자세한 사항은 디바이스마트 홈페이지에서 확인 가능하다.
■ 제품사양 ■
RF Spec | Bluetooth 4.0 + 2.4Ghz RF |
TX power = +4dbm(10.5mA) | |
RX Sensitivity = -93dBm(13mA) | |
Chip Ant | |
CPU | 16MHz ARM Cortex-M0 |
Flash | 128kb |
RAM | 8kb |
I/O(uea) | Digital I/O |
Analog PWM Out | |
Analog ADC In (10Bit) | |
UART | Serial 38,400bps (Program download) |
I2C , SPI | |
Low Power Current | 50uA under |
Power Save Control Mode | |
SIZE | 25 x 55 x 8 mm |
Operating Volotage | 2.1V~3V |
Ext Power Supply | DC +3.3V, +5.0V |
(Max=80mA Coin battery) | |
(Max=200mA Mini USB) | |
Input Power | micro USB 5V or Battery 3V |
Coin battery | CR2032(3V,240mAh) |
Tel. 070-7487-2332
www.innoide.com