Copyright (C) 커널연구회 (www.kernel.bz)문서작업: 정재준(rgbi3307 골뱅이 nate.com)문서위치 메인(출처): http://www.kernel.bz/SmartPrince아래 내용은 누구나 사용할 수 있습니다.단, 저자정보는 지우지 말고 공유하시고 출처를 기입해 주시기 바랍니다. 커널연구회에서 설계하여 제작한 SmartPrince 카메라 Pan/Tilt 모듈의 외형은 아래 사진과 같다. 이 모듈의 모델명은 B07_SmartPrince_Camera_PanTilt이다. 이 모듈은 라즈베리파이 40핀 I/O핀에 장착할 수 있고 아두이노 헤더핀과도 호환된다. Cortex-M0(STM32F0) MCU가 내장되어 있어 모듈 독립적으로 카메라을 상하 좌우 Pan/Tilt 제어할 수 있다. 카메라는 라즈베리파이와 호환된다. 제품판매 링크:https://www.kernel.bz/product/sp_camera_pan_tilt B07 SmartPrince_Camera_PanTilt 모듈 외형 하드웨어 제원 및 기능먼저, B07_SmartPrince_Camera_PanTilt 모듈의 하드웨어 제원 및 기능에 대해서 알아보도록 하자. 아래 사진은 이 모듈의 제원을 부품 위치별로 설명하는 것이다. B07_SmartPrince_Camera_PanTilt 제원 설명 SmartPrince_Camera_PanTilt 모듈 제원 및 기능요약 모듈 크기는 가로 65mm, 세로 70mm, 높이 105mm Cortex-M0(STM32F0) MCU 내장 라즈베리파이 호환 카메라 사용 카메라 상하좌우 Pan/Tit 제어(회전 속도 및 각도 제어 가능) 라즈베리파이 40핀 I/O 호환, 아두이노 확장핀 호환 시리얼 명령으로 모듈 단독 동작 가능 아래 그림은 SmartPrince_Camera_PanTilt 모듈에 있는 DC 모터 제어용 SmartMotor 보드의 연결선을 설명하는 것이다.아래 그림에서 Motor 3번은 카메라 Tilt(상하 회전)을 제어하고 Motor 4번은 카메라 Pan(좌우 회전)을 제어한다. SmartPrince_Camera_PanTilt 모듈에서는 Motor 3번과 4번만을 사용한다. 모터 제어용 보드(SmartMotor) 윈도우 PC에서 테스트 방법SmartPrince_Camera_PanTilt 모듈에 있는 마이크로 USB to Serial 포트를 윈도우가 설치되어 있는 PC에 연결한다. USB연결선을 PC에 장착만 하면, USB로부터 5V 전원이 공급되므로 SmartPrince_Camera_PanTilt 모듈 하나는 충분히 동작된다. USB to Serial 포트 연결 SmartPrince_Camera_PanTilt 모듈을 USB에 연결후, 윈도우의 장치 관리자를 확인해 보면 아래와 같이 SmartPrince_Camera_PanTilt의 시리얼 장치가 자동 인식된다. 커널연구회는 SmartPrince_Camera_PanTilt 모듈에 USB 시리얼(UART) 장치로 Silicon Labs사의 CP2102 IC를 사용했다. 이 장치는 PC에 기본적으로 드라이버가 설치되어 있으므로 별도로 드라이버를 설치하지 않아도 자동으로 인식된다. PC의 장치관리자에서 USB 시리얼(UART) 통신 장치의 포트 번호를 확인한다. 위의 그림에서는 COM4 포트이다. (포트 번호는 PC마다 달라질 수 있다.) PC에서 시리얼 터미널 프로그램을 실행한다. 윈도우 시리얼 터미널이나 Putty, SecureCRT등 사용하기 편한 시리얼 터미널 프로그램을 실행하면 된다. 실행한 시리얼 터미널 프로그램의 시리얼 통신 설정(옵션) 메뉴에서 시리얼 옵션들을 다음과 같이 설정한다. 시리얼 통신 옵션 설정 시리얼 Baud rate는 115200, Data bits는 8, Parity는 None, Stop bits는 1로 설정하고, Flow control는 모두 체크하지 않는다. 위와 같이 시리얼통신 옵션들을 설정한후, SmartPrince_Camera_PanTilt 보드의 리셋 버턴을 한번 눌러주면 시리얼 터미널 화면에 아래와 같은 메시지들이 출력되면서 동작을 시작한다. 부팅 로그 메시지 user_uart_init(USART1): [OK]user_uart_init(USART2): [OK]user_timer6_init(): [OK]user_timer7_init(): [OK]user_pwm_init(): [OK]user_i2c_init(I2C1): [OK](c)www.kernel.bz B06_SmartMotor_V03 Started 시리얼 터미널에 키보드로부터 AT? 라고 명령을 입력하면 다음과 같은 AT 명령어 사용법(도움말)이 출력된다. 이 명령어들의 자세한 사용법은 다음절부터 자세히 설명한다. AT 명령어 도움말 AT?-------- Module Version -----------------------------------------B06_SmartMotor_V03 (c)www.kernel.bz -------- DC Motor Control Command ----------------------------------AT+MOTR=n,s,c Motor(n:1=Motor1, 2=Motor2, 3=Motor3, 4=Motor4, 5=ALL) Speed(s:0=10, 1=20, 2=30, 3=40, 4=50, 5=60, 6=70, 7=80, 8=90, 9=100) Count(c:Motor Running Time Counter)AT+MDTR=n,s,d,c Motor(n:1=Motor1, 2=Motor2, 3=Motor3, 4=Motor4, 5=ALL) Speed(s:0=10, 1=20, 2=30, 3=40, 4=50, 5=60, 6=70, 7=80, 8=90, 9=100) Direction(d:0=CCW, 1=CW) Count(c:Motor Running Time Counter)AT+MDIR=n,d Motor(n:1=Motor1, 2=Motor2, 3=Motor3, 4=Motor4, 5=ALL) Direction(d:0=CCW, 1=CW)AT+MSTP=n STOP(n:1=Motor1, 2=Motor2, 3=Motor3, 4=Motor4, 5=ALL) -------- STEP Motor Control Command ----------------------------------AT+STEP=c,d,s Stepping Motor(c:cw/ccw, d:degree, s:speed) CW/CCW(c:0=CW, 1:CCW) Degree(d:0=20,1=40,2=60,3=80,4=100,5=120,6=140,7=160,8=180,9=200) Speed(s:0=10, 1=20, 2=30, 3=40, 4=50, 5=60, 6=70, 7=80, 8=90, 9=100) OK 리눅스 PC에서 테스트 방법SmartPrince_Camera_PanTilt 모듈에 있는 마이크로 USB 포트를 리눅스가 설치되어 있는 PC에 연결한다. USB연결선을 PC에 장착만 하면, USB로부터 5V 전원이 공급되므로 SmartPrince_Camera_PanTilt 모듈 하나는 충분히 동작된다. 위와 같이 연결했다면, 리눅스 터미널에서 다음과 같은 리눅스 명령어를 입력하여 SmartPrince_Camera_PanTilt 모듈의 USB 시리얼통신 장치가 연결되었는지 확인한다. (별도로 설정하지 않아도 자동으로 연결된다) $ dmesg | grep tty[ 0.000000] console [tty0] enabled[ 247.957798] usb 2-2: cp210x converter now attached to ttyUSB0 아래 명령어로 SmartPrince_Camera_PanTilt 모듈의 USB 시리얼 장치가 /dev/ttyUSB0 노드에 연결되어 있음을 확인할 수 있다. $ ll /dev/ttyUSB*crw-rw---- 1 root dialout 188, 0 Mar 31 18:44 /dev/ttyUSB0 이제, 리눅스 명령창에서 시리얼 터미널 프로그램을 실행한다. 리눅스에서는 minicom을 시리얼 터미널 프로그램으로 많이 사용한다. 이 프로그램이 설치되어 있지 않다면, 다음과 같이 설치한다. $ sudo apt-get install minicom 이제 minicom을 다음과 같이 실행한다. (루트 권한으로 실행) $ sudo minicom 실행 메시지가 다음과 같이 화면에 출력된다. Welcome to minicom 2.6.1 OPTIONS: I18n Port /dev/ttyUSB0 Press CTRL-A Z for help on special keys 시리얼통신 포트가 위와 같이 /dev/ttyUSB0로 설정되어 있지 않고, 통신 속도(baud rate)도 115200으로 설정되어 있지 않다면, 키보드에서 Ctrl-A를 누른후 O 키를 눌러서 다음과 같이 옵션 설정 메뉴로 진입한다. +-----[configuration]-------+ | Filenames and paths | | File transfer protocols | | Serial port setup | | Modem and dialing | | Screen and keyboard | | Save setup as dfl | | Save setup as.. | | Exit | +-------------------------------+ 화살표를 아래로 눌러서 세번째 메뉴인 Serial port setup을 선택한후 엔터하면 아래와 같이 설정 옵션 메뉴가 나타난다. +-----------------------------------------------------------------------+ | A - Serial Device : /dev/ttyUSB0 | | B - Lockfile Location : /var/lock | | C - Callin Program : | | D - Callout Program : | | E - Bps/Par/Bits : 115200 8N1 | | F - Hardware Flow Control : No | | G - Software Flow Control : No | | | | Change which setting? | +-----------------------------------------------------------------------+ 화면에 나타난 옵션들을 위와 같이 맞추어 준다. 그런다음 다시 상위 메뉴로 돌아가서 Save Setup as dfl 메뉴를 엔터하여 설정내용을 저장하고 Exit하여 빠져 나온다. +-----[configuration]------+ | Filenames and paths | | File transfer protocols | | Serial port setup | | Modem and dialing | | Screen and keyboard | | Save setup as dfl | | Save setup as.. | | Exit | +-------------------------------+ 위와 같이 시리얼통신 옵션들을 설정한후, SmartPrince_Camera_PanTilt 보드의 리셋 버턴을 한번 눌러주면 minicom 시리얼 터미널 화면에 아래와 같은 메시지들이 출력되면서 동작을 시작한다. 부팅 로그 메시지 user_uart_init(USART1): [OK]user_uart_init(USART2): [OK]user_timer6_init(): [OK]user_timer7_init(): [OK]user_pwm_init(): [OK]user_i2c_init(I2C1): [OK](c)www.kernel.bz B06_SmartMotor_V03 Started 시리얼 터미널에 키보드로부터 AT? 라고 명령을 입력하면 다음과 같은 AT 명령어 사용법(도움말)이 출력된다. 이 명령어들의 자세한 사용법은 아래부터 설명한다. AT 명령어 사용법SmartPrince_Camera_PanTilt 모듈과 PC간에 USB 시리얼 라인이 연결되고 옵션들이 정상적으로 설정되었다면 AT 명령어들을 사용하여 SmartPrince_Camera_PanTilt 모듈에 프로그램되어 있는 펌웨어 기능들을 동작시킬 수 있다. (혹시 동작하지 않는다면 앞의 연결과정을 다시한번 점검해 주기 바란다) 참고로, AT 명령어들은 소문자/대문자 구분없이 입력하면 되고, SmartPrince_Camera_PanTilt 모듈 내부에서는 모두 대문자로 변환하여 동작된다. 시리얼 터미널 창에서 키보드로부터 AT? 을 입력하고 엔터하면 다음과 같은 도움말이 화면에 출력된다. AT 명령어 도움말 AT?-------- Module Version -----------------------------------------B06_SmartMotor_V03 (c)www.kernel.bz -------- DC Motor Control Command ----------------------------------AT+MOTR=n,s,c Motor(n:1=Motor1, 2=Motor2, 3=Motor3, 4=Motor4, 5=ALL) Speed(s:0=10, 1=20, 2=30, 3=40, 4=50, 5=60, 6=70, 7=80, 8=90, 9=100) Count(c:Motor Running Time Counter)AT+MDTR=n,s,d,c Motor(n:1=Motor1, 2=Motor2, 3=Motor3, 4=Motor4, 5=ALL) Speed(s:0=10, 1=20, 2=30, 3=40, 4=50, 5=60, 6=70, 7=80, 8=90, 9=100) Direction(d:0=CCW, 1=CW) Count(c:Motor Running Time Counter)AT+MDIR=n,d Motor(n:1=Motor1, 2=Motor2, 3=Motor3, 4=Motor4, 5=ALL) Direction(d:0=CCW, 1=CW)AT+MSTP=n STOP(n:1=Motor1, 2=Motor2, 3=Motor3, 4=Motor4, 5=ALL) -------- STEP Motor Control Command ----------------------------------AT+STEP=c,d,s Stepping Motor(c:cw/ccw, d:degree, s:speed) CW/CCW(c:0=CW, 1:CCW) Degree(d:0=20,1=40,2=60,3=80,4=100,5=120,6=140,7=160,8=180,9=200) Speed(s:0=10, 1=20, 2=30, 3=40, 4=50, 5=60, 6=70, 7=80, 8=90, 9=100) OK 시리얼 터미널에 위의 명령어들을 입력한후 엔터하여 해당 기능을 실행한다. AT 명령어 요약 설명 AT+MOTR=n,s,c위의 명령은 모터 회전 속도와 회전량(각도)을 제어 한다. AT+MDTR=n,s,d,c위의 명령으로는 모터의 회전 속도와 회전량(각도) 방향을 제어 한다. AT+MDIR=n,d위의 명령은 모터의 회전 방향만 설정한다. AT+MSTP=n위의 명령은 모터의 회전을 중지한다. AT명령의 = 다음에 전달하는 옵션들(n, s, d, c)의 의미는 다음과 같다. SmartPrince_Camera_PanTilt 모듈은 카메라 상하(Tilt) 좌우(Pan)를 제어하므로 Motor 3번과 Motor 4번만 제어한다. n이 3이면 카메라 상하(Tilt)를 제어하는 Motor 3번이 선택된다. n이 4이면 카메라 좌우(Pan)를 제어하는 Motor 4번이 선택된다. 모터 회전 속도는 s에 1을 전달하면 10% 빠르기로 회전하고 2을 전달하면 20%, 3을 전달하면 30% 이렇게 해서 9을 전달하면 90% 빠르기로 회전 한다. 모터 회전 방향은 d에 0을 전달하면 시계 반대방향(CCW)으로 회전하고 d에 1을 전달하면 시계 방향(CW)으로 회전 한다. 모터 회전량(각도)은 c에 두자리 숫자를 전달하여 제어한다. c값에 비례하여 모터 회전량이 제어 된다. SmartPrince_Camera_PanTilt 모듈은 위의 명령어들 중에서 AT+MDTR=n,s,d,c 명령으로 모두 제어된다.(n,s,d,c가 모두 전달 되므로 편리하다) 다른 명령어들은 명령마다 옵션을 각각 전달해야 하므로 번거럽다. 예를 들면, AT+MDTR=3,7,1,20 위의 명령은 n에 3이 전달되고 s에 7, d에 1, c에 20이 전달되어 실행된다. 모터는 Motor 3번 상하(Tilt)가 선택되고 속도(s)는 70%, 회전방향(d)는 시계방향(CW)으로 20 정도의 회전량으로 회전한다. AT+MDTR=3,7,0,20 위의 명령은 n에 3이 전달되고 s에 7, d에 0, c에 20이 전달되어 실행된다. 모터는 Motor 3번 상하(Tilt)가 선택되고 속도(s)는 70%, 회전방향(d)는 시계 반대방향(CCW)으로 20 정도의 회전량으로 회전한다. AT+MDTR=3,9,1,10 위의 명령은 n에 3이 전달되고 s에 9, d에 1, c에 10이 전달되어 실행된다. 모터는 Motor 3번 상하(Tilt)가 선택되고 속도(s)는 90%, 회전방향(d)는 시계방향(CW)으로 10 정도의 회전량으로 회전한다. AT+MDTR=4,6,1,30 위의 명령은 n에 4가 전달되고 s에 6, d에 1, c에 30이 전달되어 실행된다. 모터는 Motor 4번 좌우(Pan)가 선택되고 속도(s)는 60%, 회전방향(d)는 시계방향(CW)으로 30 정도의 회전량으로 회전한다. AT+MDTR=4,9,0,40 위의 명령은 n에 4가 전달되고 s에 9, d에 0, c에 40이 전달되어 실행된다. 모터는 Motor 4번 좌우(Pan)가 선택되고 속도(s)는 90%, 회전방향(d)는 시계 반대방향(CCW)으로 40 정도의 회전량으로 회전한다. 라즈베리파이와 연결 응용SmartPrince_Camera_PanTilt 모듈은 라즈베리파이 40핀 I/O핀에 연결하여 임베디드 환경에서 카메라 Pan/Tilt에 응용할 수 있다. 아래 그림은 라즈페리파이와 연결하는 부품들이다. 라즈베리파이 연결 부품들 위의 부품들중에서 라즈페리파이는 SmartPrince_Camera_PanTilt에 포함되어 있지 않으므로 별도로 구매해야 한다. 나머지 부품들은 SmartPrince_Camera_PanTilt에 조립되어 있다. 라즈베리파이 40핀 I/O 연결 핀맵 SmartPrince_Camera_PanTilt 모듈은 라즈베리파이 40핀 I/O 핀들중에서 시리얼과 I2C 인터페이스를 사용하여 제어 된다.위의 인터페이스들은 다음과 같이 SmartPrince_Camera_PanTilt 모듈의 아두이노 호환 핀맵에 연결된다. SmartPrince_Camera_PanTilt 아두이노 호환 핀맵 SmartPrince_Camera_PanTilt 모듈을 제어하는 소스는 아래의 커널연구회 github에 공개되어 있다.소스 링크:https://github.com/kernel-bz/SmartPrince_Camera_PanTilt제품 판매 링크:https://www.kernel.bz/product/sp_camera_pan_tilt 동영상 시연