Copyright (C) 커널연구회 (www.kernel.bz)문서작업: 정재준(rgbi3307 골뱅이 nate.com)문서위치 메인(출처): http://www.kernel.bz/SmartPrince아래 내용은 누구나 사용할 수 있습니다.단, 저자정보는 지우지 말고 공유하시고 출처를 기입해 주시기 바랍니다. 이번장은 아두이노에 SmartPrince을 연결하여 응용하는 방법에 대해서 설명한다. 아두이노는 개발환경이 쉬워서 센서와 모터와 같은 장치들을 간단하게 제어할 수 있다. 하지만 아두이노 단독으로 좋은 응용을 하기에는 부족한 점이 많다. 그래서 아두이노는 여러가지 장치들을 연결하여 활용하는 것이 일반적이다. 아두이노에는 여러가지 장치들을 연결하기 위해서 확장핀들을 제공하는데, 이것에 잘 호환이 되는 센서, 모터, 카메라, 사운드, 무선통신과 같은 I/O 장치들을 연결하여 잘 응용하면 쉽게 작품물을 만들 수 있다. 커널연구회의 SmartPrince 모듈들은 아두이노 확장핀에 잘 연결되도록 설계하여 만들었다. 아래부터 SmartPrince 모듈들을 아두이노에 어떻게 연결하여 응용하는지 자세히 설명한다. 아두이노 개발환경(IDE) 설치아두이노는 보통 윈도우 PC에 연결하여 개발하고 개발환경이 쉽고 간편하다. 먼저 아래 웹사이트에서 개발환경(IDE) 설치 프로그램을 다운로드 한다. IDE 설치 프로그램: http://www.arduino.org/software#ide사용 설명서: http://labs.arduino.org/Arduino%20IDE 그리고 아두이노 보드를 윈도우 USB포트에 연결하면 다음과 같이 자동으로 시리얼 포트가 설정된다. 아두이노 보드를 PC에 연결 윈도우 장치 관리자의 시리얼 포트에서 아두이노 연결 확인 위와 같이 확인되면, 위에서 다운로드한 개발환경(IDE) 설치 실행파일(arduino-1.7.8.org-windows.exe)을 실행한다. 아래와 같이 설치가 진행된다. 위의 설치가 100% 진행되면, 다음과 같이 장치 드라이버 설치를 위한 확인창이 나타난다. 다음 버턴을 클릭하여 팝업창이 나타나면, 설치 버턴을 클릭하여 설치진행한다. 몇가지 설치 확인 창이 나타나면 설치를 눌러서 설치한다. 마침 버턴을 클릭하면,다음과 같이 Atmel USB Driver 패키지가 설치된다. 이 작업은 다소 시간이 소요된다. Close 버턴을 눌러서 설치를 마무리 한다. 위와 같이 설치가 마무리 되면 개발환경(IDE)는 윈도우의 아래 경로에 실행파일이 설치된다. "C:\Program Files (x86)\Arduino\arduino.exe" 윈도우 바탕화면에도 이 프로그램 실행 아이콘이 생성 되므로 이것을 더블 클릭하여 실행한다. 다음과 같이 스프래시 화면이 나타나면서 실행된다. 실행이 되면 다음과 같이 “도구” 메뉴로 들어가서 아두이노 보드 모델명을 선택한다. 아두이노 보드 종류는 시장에 상당히 많으므로 자기가 실습하는 보드 모델명을 확인하여 선택하도록 한다.아두이노 보드 종류에 대해서는 인터넷에 많은 정보들이 있으므로 검색정보를 활용해도 많은 도움이 된다. 아두이노+SmartCamera아두이노에 똑똑한왕자의 SmartCamera 모듈을 연결하여 응용하는 방법을 설명한다. SmartCamera 모듈은 카메라 영상의 움직임을 5가지 방향(상, 하, 좌, 우, 중앙)으로 추적하는 기능을 가지고 있다. 좀더 자세한 내용은 7장을 확인해 주기 바란다. SmartCamera 모듈에 전원을 인가하면, 아래와 같이 카메라로 물체 움직임을 추적하여 그 결과를 외부 확장핀에 High 신호로 출력한다. SmartCamera 물체 이동 추적 결과출력 SmartCamera 보드의 외부확장연결 16개 핀들중에서 다음과 같이 5개핀에 결과를 출력한다. 이러한 SmartCamera모듈의 출력을 아두이노에서 읽어오는 방법에 대해서 알아 보도록 하자. 먼저, 아래와 같이 SmartCamera 모듈에 있는 아두이노 연결핀들의 용법부터 확인한다. SmartCamera 아두이노 호환 헤더핀 회로도 위의 헤더핀들 중에서 PD5, PD7, PD8, PE1, PE2은 입력용으로 사용하고 PA6, PA5, PA4, PA3, PA1은 출력용으로 다음과 같이 연결하여 사용한다. SmartCamera 아두이노 연결핀 테이블 예를들면, SmartCamera의 왼쪽에서 물체가 감지되면 GPIO1에 High 신호가 출력되고 이 신호는 PD7으로 연결하여 아두이노에 입력된다. 아두이노에서 이 신호를 읽어서 PA1에 연결한 LED를 On한다. SmartCamera의 하단에서 물체가 감지되면 GPIO4에 High 신호가 출력되고 이 신호는 PE2으로 연결하여 아두이노에 입력된다. 아두이노에서 이 신호를 읽어서 PA5에 연결한 LED를 On한다. 아래 사진은 지금까지 설명한 내용을 테스트하기 위해서 SmartCamera와 아두이노를 서로 연결한 것을 보여주는 것이다. 아두이노 상단에 SmartCamera 모듈을 장착하면 된다. 아두이노와 SmartCamera 카메라 연결 사진 아래 사진은 아두이노 상단에 SmartCamera 모듈을 장착한 것을 측면에서 찍은 것이다. 아두이노와 SmartCamera 카메라 연결 사진(측면) 아래는 위의 내용을 아두이노에서 테스트 하기 위한 소스이다. 아두이노 소스 코드 //Arduino Pin Number for Inputint GPIO1 = 6;int GPIO2 = 7;int GPIO3 = 8;int GPIO4 = 9;int GPIO5 = 4;//Arduino Pin Number for outputint LED1 = A5;int LED2 = A3;int LED3 = A2;int LED4 = A1;int LED5 = A0; void setup(){ pinMode(GPIO1, INPUT); // sets the digital GPIO1 as input pinMode(GPIO2, INPUT); // sets the digital GPIO2 as input pinMode(GPIO3, INPUT); // sets the digital GPIO3 as input pinMode(GPIO4, INPUT); // sets the digital GPIO4 as input pinMode(GPIO5, INPUT); // sets the digital GPIO5 as input pinMode(LED1, OUTPUT); // sets the digital LED1 as output pinMode(LED2, OUTPUT); // sets the digital LED2 as output pinMode(LED3, OUTPUT); // sets the digital LED3 as output pinMode(LED4, OUTPUT); // sets the digital LED4 as output pinMode(LED5, OUTPUT); // sets the digital LED5 as output} void loop(){ int left, right, top, bottom, center; left = digitalRead(GPIO1); // read the input pin GPIO1 digitalWrite(LED1, left); right = digitalRead(GPIO2); // read the input pin GPIO2 digitalWrite(LED2, right); top = digitalRead(GPIO3); // read the input pin GPIO3 digitalWrite(LED3, top); bottom = digitalRead(GPIO4); // read the input pin GPIO4 digitalWrite(LED4, bottom); center = digitalRead(GPIO5); // read the input pin GPIO5 digitalWrite(LED5, center);} 위의 소스를 컴파일하여 아두이노로 전송하여 실행하면, SmartCamera에서 물체가 감지될 때 마다 아두이노에 연결한 LED가 점등된다. 물체가 왼쪽에서 감지되면 LED1(아두이노 A5핀)에 High가 출력되어 점등된다.물체가 오른쪽에서 감지되면 LED2(아두이노 A3핀)에 High가 출력되어 점등된다.물체가 상단부에서 감지되면 LED3(아두이노 A2핀)에 High가 출력되어 점등된다.물체가 하단부에서 감지되면 LED4(아두이노 A1핀)에 High가 출력되어 점등된다.물체가 중앙에서 감지되면 LED5(아두이노 A0핀)에 High가 출력되어 점등된다. 아두이노에서 SmartCamera의 물체 위치 데이터를 가지고 왔으므로 이것으로 모터를 제어할 수 있다. 이 내용은 다음절부터 설명된다. 아두이노+SmartCamera+SmartMotor아두이노에 똑똑한왕자의 SmartCamera와 SmartMotor를 연결하여 카메라 물체 움직임에 따라서 모터를 제어해 보도록 하자. 모터는 시중에서 쉽게 구할 수 있는 5V 전압에서 동작하는 소형 DC 모터를 아래 사진처럼 똑똑한왕자의 SmartMotor 모듈에 연결한다. DC 모터가 소형인 경우 1개당 보통 100mA의 전류가 소모되고 4개를 연결하면 400mA의 전류가 필요하게 된다. 이 정도이면 5V USB전원으로 충분히 동작 시킬 수 있으나 500mA가 넘어가면 동작이 않될 수도 있다. 이런 경우를 대비하여 5V, 1A이상의 외부 어댑터가 있으면 좋다. 5V 전원은 반드시 SmartMotor 보드에 연결하도록 한다. SmartMotor 모듈에 대한 좀더 자세한 내용은 이미 기술한 6장을 참고해 주기 바란다. SmartMotor 모듈에 5V DC모터 연결 SmartCamera에서 물체를 왼쪽에서 감지하면 모터1을 회전하고 오른쪽에서 감지하면 모터2를 회전하고 상단부에서 감지하면 모터3을 회전하고 하단부에서 감지하면 모터4를 회전하도록 아두이노에서 소스를 코딩하도록 하자. 먼저 아두이노에 SmartMotor 모듈을 먼저 연결하고, SmartCamera는 SmartMotor위에 적층으로 연결한다. 아래 사진은 이렇게 연결한 모습을 보여주는 것이다. 5V 전원은 반드시 SmartMotor 보드에 연결하도록 한다. 아두이노+SmartCamera+SmartMotor 연결 사진 SmartCamera는 앞서서 실습한 물체 위치 검출 결과를 출력하는 헤더핀을 그대로 사용한다. SmartMotor 모듈과 연결관계는 아래의 핀맵 테이블을 참고한다. 소스는 다음과 같은 흐름으로 아두이노에서 코딩한다. SmartCamera 물체 움직임 감지 --> 물체 위치값(GPIO값) 읽음 --> SmartMotor 제어명령 보냄 SmartCamera에서 물체 움직임이 감지되면 IRQ_CAMERA 신호가 High가 된다. 이때 아두이노에서 GPIO1, 2, 3, 4, 5 값(물체 위치값)을 읽은후, 모터를 제어하기 위해서 IRQ_MOTOR 신호(High)를 SmartMotor 모듈에 보내고 시리얼 TX 라인을 통해서 모터 방향 제어용 AT 명령어를 보낸다. 연결 핀 맵 핀맵 테이블 위의 핀맵 테이블을 참고하여 아두이노에서 소스를 코딩하면 다음과 같다. 아두이노 소스 #include <SoftwareSerial.h> SoftwareSerial UART1(2, 3); //2:RX, 3:TX int IRQ_MOTOR = 10; //Interrupt pin to Motorint IRQ_CAMERA = A4; //Interrupt pin from Camera //Arduino Pin Number for Inputint GPIO1 = 6;int GPIO2 = 7;int GPIO3 = 8;int GPIO4 = 9;int GPIO5 = 4;//Arduino Pin Number for outputint LED1 = A5;int LED2 = A3;int LED3 = A2;int LED4 = A1;int LED5 = A0; void setup(){ pinMode(GPIO1, INPUT); // sets the digital GPIO1 as input pinMode(GPIO2, INPUT); // sets the digital GPIO2 as input pinMode(GPIO3, INPUT); // sets the digital GPIO3 as input pinMode(GPIO4, INPUT); // sets the digital GPIO4 as input pinMode(GPIO5, INPUT); // sets the digital GPIO5 as input pinMode(LED1, OUTPUT); // sets the digital LED1 as output pinMode(LED2, OUTPUT); // sets the digital LED2 as output pinMode(LED3, OUTPUT); // sets the digital LED3 as output pinMode(LED4, OUTPUT); // sets the digital LED4 as output pinMode(LED5, OUTPUT); // sets the digital LED5 as output pinMode(IRQ_MOTOR, OUTPUT); // sets the output for interrupt pinMode(IRQ_CAMERA, INPUT); // sets the input for interrupt UART1.begin(115200); // UART1 setup to 115200bps} void motor_stop(int motor){ char buf[20]; digitalWrite(IRQ_MOTOR, 0); sprintf(buf, "AT+MSTP=%d\r\n", motor); //Motor Stop digitalWrite(IRQ_MOTOR, 1); //Interrupt to Motor UART1.write(buf); delay(100); //0.1 seconds delay} void motor_start(int motor){ char buf[20]; digitalWrite(IRQ_MOTOR, 0); sprintf(buf, "AT+MOTR=%d,4\r\n", motor); //Motor Start(speed=4) digitalWrite(IRQ_MOTOR, 1); //Interrupt to Motor UART1.write(buf); delay(100); //0.1 seconds delay} void loop(){ int value, motor; value = digitalRead(IRQ_CAMERA); // read the input pin IRQ_CAMERA if (value > 0) //object detect from camera { value = digitalRead(GPIO1); // read the input pin GPIO1(Left) //digitalWrite(LED1, value); if (value > 0) motor = 1; value = digitalRead(GPIO2); // read the input pin GPIO2(Right) //digitalWrite(LED2, value); if (value > 0) motor = 2; value = digitalRead(GPIO3); // read the input pin GPIO3(Top) //digitalWrite(LED3, value); if (value > 0) motor = 3; value = digitalRead(GPIO4); // read the input pin GPIO4(Bottom) //digitalWrite(LED4, value); if (value > 0) motor = 4; value = digitalRead(GPIO5); // read the input pin GPIO5(Center) //digitalWrite(LED5, value); if (value > 0) motor = 5; //motor_stop(motor); motor_start(motor); delay(100); //0.1 seconds delay motor_stop(motor); } }