프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

스마트 폰 거치대 컨트롤러 [PART 1]

2015-07-13 12:05:21

안녕하세요 Sabo 입니다.

요즘 아이디어가 샘솟아 프로젝트 위주로 콘텐츠를 작성하고 있는데요, 그동안 제 콘텐츠에 대한 피드백으로

실용성이 없거나 너무 따라하기 어렵다는 얘기를 많이 들었습니다...ㅠ_ㅠ 그래서 오늘은 대중적으로?! 누구나

한 번쯤 생각해 보았을 법한 주제를 가지고 왔습니다.

 

 

 

 

 

<개요>

 

저는 개인적으로 악기연주를 취미로 하고 있는데요, 자세교정 및 모니터링을 위해 스마트 폰으로 연주 영상을

촬영하는 일이 종종 있습니다. 하지만 혼자 있을 때 스마트폰을 세워두고 각도를 맞추는 등의 작업이 생각보다

까다롭고 힘들었습니다. '편하게 각도를 제어할 수 있는 거치대가 있으면 어떨 까?" 하는 생각에  이 프로젝트를

진행하게 되었습니다.

 

 

이미 시판되고있는 거치대 제품들은 다양한 종류와 독특한 기능들이 있지만, 제 경험상 전자적으로 각도를 제어하는

거치대는 본 적이 없었습니다. 따라서 이번에 만들어 볼 거치대는 기존의 스마트 폰 거치대를 개조?!하여 조이스틱으로

각도를 제어 할 수 있도록 하겠습니다.

 

 

 

 

<필요한 사전 지식>

 

아주 간단한 원리로 만들지만 초보자 분들은 해당 튜토리얼을 꼭! 참고해 주시기 바랍니다.

- 서보모터 제어하기

- 조이스틱 사용하기

 

 

 

<필요한 부품>

 
NO PART QTY ETC
1 Orange Board 1  
2 Servo Motor 2  
3 Joy Stick 1  
4 Bread Board 1  
5 Smartphone cradle 1  

 

 

Orange Board Servo Motor Joy Stick Bread Board Smartphone Cradle

 

 

 

<동영상 미리보기>

 

 

 

<프로젝트 사진>

 

 

 

기구부 외형입니다. 외형이라고 해도 단지 서보모터와 스마트폰 거치대를 각각 수직으로 붙이면 완성입니다.

하단의 서보모터는 (상단의 서보모터와 거치대)를 수평 방향으로 회전 시켜주고, 상단의 서보모터는 (거치대)의

기울기를 조절해 줍니다. 다만 별도의 기구가 없이 서보모터를 붙였기 때문에 스마트 폰을 올려두게 되면 무게로 인해

기울거나 떨어져 나갈 수 있습니다. 강하게 접착시켜주셔야 합니다!

 

 

전자파트 부분입니다. 조이스틱 한가지만 사용되기 때문에 단순한 회로로 연결이 완성됩니다.

(사진에 나타난 다른 모듈과 점퍼 케이블은 무시하셔도 됩니다.)

 

<하드웨어 메이킹>

 

 

 

 

말씀 드린대로 아주 단순한 구조의 회로 입니다. 다만 서보모터에 외부전원을 넣지 않고 사용하기 위해서는

오렌지보드에 USB 전원이 아닌 어댑터 전원을 인가해 주어야 정상적으로 동작합니다.

 

 

<아두이노 코드>

 

#include <servo.h>

Servo Motor_H;     // 하단 서보모터 정의
Servo Motor_V;     // 상단 서보모터 정의

int H = 0;
int V = 0;
int posx = 90;     // 하단 서보모터 각도 초기값
int posy = 90;     // 상단 서보모터 각도 초기값

void setup() 
{
  Serial.begin(9600);
  Motor_H.attach(5);   // 하단 서보모터 5번핀 연결
  Motor_V.attach(6);   // 상단 서보모터 6번핀 연결
  Motor_H.write(90);   // 하단 서보모터 최초 각도 90도
  Motor_V.write(90);   // 상단 서보모터 최초 각도 90도
}

void loop() 
{
  int x, y, sumx, sumy;
  int i, j;

  sumx = 0;
  sumy = 0;

  for(i=0;i<20;i++)       // 조이스틱의 아날로그 값을 20번 추출하여 평균값을 내어줍니다(오차 감소)
  {
    x = analogRead(A0);   // x 변수에 조이스틱 x축 값 저장
    y = analogRead(A1);   // y 변수에 조이스틱 y축 값 저장
    sumx += x;            // sumx에 x 값 누적
    sumy += y;            // sumy에 y 값 누적
  }
  x = sumx / 20;          // sumx를 20으로 나눈 값(평균값)을 x 변수에 저장
  y = sumy / 20;          // sumy를 20으로 나눈 값(평균값)을 y 변수에 저장
  
  if(x <410)              // 조이스틱이 x축 오른쪽으로 움직일 때  
  {
    if(posx<180){posx++;} // x축 각도 오른쪽으로 증가
    else if(posx == 180){}// 서보모터 각도가 180일 경우 동작 안함(최대 각도 180도)
  }
  else if(x > 500)        // 조이스틱이 x축 왼쪽으로 움직일 때
  { 
   if(posx>0){posx--;}    // x축 각도 왼쪽으로 증가
   else if(posx = 0){}    // 서보모터 각도가 0도일 경우 동작 안함(최소 각도 0도)
  }
  if(y < 470)             // 조이스틱이 y축 위쪽으로 움직일 때
  {
    if(posy<180){posy++;} // y축 각도 위쪽으로 증가
    else if(posy==180){}  // 서보모터 각도가 180일 경우 동작 안함
  }
  else if(y > 540)        // 조이스틱이 y축 아래쪽으로 움직일 때
  {
    if(posy>0){posy--;}   // y축 각도 아래쪽으로 증가
    else if(posy==0){}    // 서보모터 각도가 0일 경우 동작 안함
  }

  // 위 에서 계산된 각도 값을 각 상단, 하단 서보모터에 입력  
  Motor_H.write(posx);    
  Motor_V.write(posy);

  // 모니터링 목적의 씨리얼 출력함수
  Serial.print(x);
  Serial.print(" ");
  Serial.println(y);
  delay(10);
}

 

SaBo

서보모터, 조이스틱, 카메라, 각도제어