고급 예제

다양한 도구들을 가지고 마음껏 응용해보세요.

(3)안드로이드x아두이노 블루투스 통신- 서보모터 제어

2015-03-20 10:19:41

개요

 

* 이 컨텐츠를 보시기 전에 안드로이드와 아두이노 간의 블루투스 통신 기초를 보고 오시기 바랍니다.

 

안드로이드와 아두이노 간의 블루투스 통신 기초에서 아두이노 블루투스 모듈을 이용하여 안드로이드와 블루투스 통신을 해보았습니다. 이제부터 간단한 예제들을 통해서 아두이노의 각 부품들을 제어해 보겠습니다.

 

지난번 컨텐츠에서는 아두이노에 3색 LED를 연결하여 안드로이드에서 3가지 색을 각각 제어하는 예제를 실습해 보았습니다. 이번 컨텐츠에서는 아두이노에 서보모터를 연결하여 안드로이드의 기울기 센서와 버튼을 통해 제어해보는 예제를 실습해 보겠습니다.

 

 

미리보기 동영상

 

 

 

부품 목록

 

NO 부품명 수량 상세설명
1 오렌지 보드 1  
2 블루투스 모듈 1 HC-05
3 서보 모터 1 SG90
4 브레드보드 1  
5 점퍼케이블 9  

 

부품명 오렌지 보드 블루투스 모듈 서보 모터 브레드보드 점퍼케이블
파트

 

 

 

하드웨어 Making

 

회로도

 

브레드보드 레이아웃

 

 

 

소프트웨어 Coding

 

#include  // 블루투스 통신을 위한 SoftwareSerial 라이브러리를 불러온다.
#include   // 서보모터를 이용하기 위한 Servo 라이브러리를 불러온다.

SoftwareSerial BTSerial(2, 3); // SoftwareSerial(RX, TX)
byte buffer[1024]; // 데이터 수신 버퍼
int bufferPosition; // 버퍼에 기록할 위치

Servo servo;

int motorAngle = 0;
int servoVal = 0;
int servoAngle = 90;

void setup () {
  servo.attach(9);

  BTSerial.begin(9600);
  Serial.begin(9600);
  bufferPosition = 0;
}

void loop () {
  if (BTSerial.available()) {
    byte data = BTSerial.read();
    buffer[bufferPosition++] = data; 

    Serial.println(data);


    switch(data){      
    case 'w':
      angleSet(0);
      break;

    case 'e':
      angleSet(1);
      break;

    case 'j':
      angleWrite(0);
      break;

    case 'i':
      angleWrite(45);
      break;

    case 'k':
      angleWrite(90);
      break;

    case 'o':
      angleWrite(135);
      break;

    case 'l':
      angleWrite(180);
      break;

    case '\n':
      bufferPosition = 0;
      break;
    }
  }
}

void angleSet(boolean flag){ // 안드로이드 기울기값을 통해 서보모터를 제어하는 함수
  if(buffer[0] != 10){
    if (bufferPosition == 4) {
      motorAngle = (buffer[0]-48)*100 + (buffer[1]-48)*10 + (buffer[2]-48);
    } 
    else if (bufferPosition == 3) {
      motorAngle = (buffer[0]-48)*10 + (buffer[1]-48);
    } 
    else if (bufferPosition == 2) {
      motorAngle = buffer[0] - 48;
    }

    if(flag){
      motorAngle *= -1;
    }

    Serial.print("motorAngle = ");
    Serial.println(motorAngle);

    motorAngle = map(motorAngle, 150, -150, 30, 150);
    servo.write(motorAngle);
  }
}

void angleWrite(int angle){  // 버튼을 통해 서보모터를 제어하는 함수
  servo.write(angle); 
}

 

 

소프트웨어 설명

 

아두이노에 블루투스 모듈을 연결하고 안드로이드에서 블루투스 페어링 하는 방법은 이전 컨텐츠 '안드로이드와 아두이노 간의 블루투스 통신 기초 - 1. LED불 깜박이기' 에서 소프트웨어 설명을 보시기 바랍니다.

 

안드로이드에서 블루투스 모듈과 페어링 하시고, 안드로이드 어플(BT_Servo.apk)을 받으셔서 설치 / 실행 하신 후 블루투스 연결까지 하시면 밑의 사진과 같이 화면이 나옵니다.

 

0, 45, 90, 135, 180 버튼은 서보모터를 각각 해당하는 숫자 만큼 움직이는 버튼이고, 밑의 SensorMode 버튼은 스마트폰의 기울기 센서를 이용한 서보모터 각도 제어를 On / OFF 하는 버튼입니다.

 

 

 

    switch(data){      
    case 'w':
      angleSet(0);
      break;

    case 'e':
      angleSet(1);
      break;

    case 'j':
      angleWrite(0);
      break;

    case 'i':
      angleWrite(45);
      break;

    case 'k':
      angleWrite(90);
      break;

    case 'o':
      angleWrite(135);
      break;

    case 'l':
      angleWrite(180);
      break;

    case '\n':
      bufferPosition = 0;
      break;
    }

 

Switch~case문을 이용하여 안드로이드에서 보낸 명령에 맞는 동작을 하는 코드입니다. j, i, k, o, l 이 5개 명령은 어플에 각도 버튼 5개에 해당하는 명령이고, w, e 는 기울기 센서를 사용할 경우 오른쪽, 왼쪽에 해당하는 명령입니다.

 

각도 버튼에 해당하는 명령어들은 해당 각도에 맞게 이동하도록 write해주시면 되고, 기울기 센서를 이용하실 경우 이전 컨텐츠 블루투스를 이용하여 3색 LED를 제어하는 것을 보시고 안드로이드에서 보낸 숫자를 확인하는 방법을 참고하시면 됩니다.

 

이 컨텐츠를 응용하여 아두이노의 다른 부품을 제어하실 경우 기울기 센서를 이용할 경우 w(오른쪽), e(왼쪽) 값이 들어가고, 버튼을 이용할 경우 j, i, k, o, l 을 사용하니(왼쪽부터) 코드를 참고 하셔서 문자값(명령어)를 이용하여 제어하시면 됩니다.

(안드로이드 어플을 수정하실 수 있으셔서 어플에 대한 코드가 필요하신 분은 댓글로 문의 남기시면 직접 보내드립니다.)

* 다음 컨텐츠에서는 아두이노에 모터쉴드와 DC모터를 연결하여 안드로이드에서 방향 + 속도를 제어해 보겠습니다.

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

블루투스모듈 ,서보모터, 아두이노, 오렌지보드