코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-08-08 17:21:00
* 이 컨텐츠를 보시기 전에 안드로이드와 아두이노 간의 블루투스 통신 기초를 보고 오시기 바랍니다.
이전 컨텐츠에서 아두이노 블루투스 쉴드를 연결 하여 안드로이드와 블루투스 통신을 해보았습니다. 그것을 응용하여 안드로이드로 각각의 부품을 제어해 봅시다.
(여기서는 피에조 부저 모듈(KY-006), LED(red, yellow, green), 서보모터(SG90)를 사용하였습니다.)
NO | 부품명 | 수량 | 상세설명 |
1 | 아두이노 우노 R3 | 1 | 아두이노 |
2 | 블루투스 모듈(HC-05) | 1 | 블루투스 |
3 | 피에조 버저 모듈(KY-006) | 1 | 피에조 |
4 | 서보 모터(SG90) | 1 | 서보 모터 |
5 | Green LED | 1 | LED |
6 | Yellow LED | 1 | LED |
7 | Red LED | 1 | LED |
8 | 330Ω 저항 | 3 | 저항 |
9 | 점퍼케이블 | 17 | 점퍼케이블 |
10 | 브레드 보드 | 1 | 브레드보드 |
부품명 | 아두이노 우노 R3 | 블루투스 모듈(HC-05) | Red LED | Yellow LED | Green LED |
파트 | x1 | x1 | x1 | x1 | x1 |
부품명 | 피에조 버저 모듈(KY-006) | 서보 모터(SG90) | 330Ω 저항 | 점퍼케이블 | 브레드보드 |
파트 | x1 | x1 | x3 | x17 | x1 |
#include // 블루투스 통신을 위한 SoftwareSerial 라이브러리를 불러온다. #include //서보 라이브러리를 불러온다. SoftwareSerial BTSerial(2, 3); // SoftwareSerial(RX, TX) byte buffer[1024]; // 데이터 수신 버퍼 int bufferPosition; // 버퍼에 기록할 위치 Servo myservo; // 서보를 제어할 서보 오브젝트를 만듭니다. int buzzer = 8 ; // 피에조 보저와 연결된 핀번호 int redLed = A0; int yellowLed = A1; int greenLed = A2; // 각각의 LED와 연결된 핀번호 int redState = 0; int yellowState = 0; int greenState = 0; int piezoState = 128; int servoState = 0; // 각 부품을 제어하기 위한 상태 값(이 값을 조절하는 걸로 부품을 제어한다.) void setup (){ pinMode(redLed, OUTPUT); pinMode(yellowLed, OUTPUT); pinMode(greenLed, OUTPUT); pinMode (buzzer, OUTPUT) ; // LED와 피에조 부저를 출력모드로 설정 myservo.attach(9); // 서보모터를 9번 핀에 연결 analogWrite(buzzer, 255); // 피에조 부저를 끈 상태로 시작 BTSerial.begin(9600); Serial.begin(9600); bufferPosition = 0; // 버퍼 초기화 } void loop (){ if (BTSerial.available()){ // 블루투스로 데이터 수신 byte data = BTSerial.read(); Serial.write(data); // 수신된 데이터 시리얼 모니터로 출력 buffer[bufferPosition++] = data; // 안드로이드 프로그래밍시 1(red버튼), 2(yellow버튼), 3(green버튼), 4(up버튼), 5(down버튼), 6(right버튼), 7(left버튼)으로 정함 // 각각 버튼 눌렀을시 그 버튼에 맞는 숫자(char형)가 전송 된다/ // 이제부터 나오는 if문은 if(data == '1'){ // red 버튼을 눌렀을 경우 if(redState == 0){ // red LED가 꺼져 있을 경우 digitalWrite(redLed, HIGH); // red LED의 불을 킴 redState = 1; // red LED의 상태를 켜진 상태로 세팅 delay(150); } else{ // red LED가 켜져 있을 경우 digitalWrite(redLed, LOW); // red LED를 끈다. redState = 0; // red LED의 상태를 꺼진 상태로 세팅 delay(150); } } if(data == '2'){ // yellow 버튼을 눌렀을 경우 if(yellowState == 0){ // yellow LED가 꺼져있을 경우 digitalWrite(yellowLed, HIGH); // yellow LED의 불을 킨다. yellowState = 1; // yellow LED의 상태를 켜진 상태로 세팅 delay(150); } else{ // yellow LED가 꺼져 있을 경우 digitalWrite(yellowLed, LOW); // yellow LED를 끈다. yellowState = 0; // yellow LED의 상태를 꺼진 상태로 세팅 delay(150); } } if(data == '3'){ // green 버튼을 눌렀을 경우 if(greenState == 0){ // green LED가 꺼져있는 경우 digitalWrite(greenLed, HIGH); // green LED의 불을 킨다. greenState = 1; // green LED의 상태를 켜진 상태로 세팅 delay(150); } else{ // green LED가 꺼져 있을 경우 digitalWrite(greenLed, LOW); // green LED의 불을 끈다 greenState = 0; // green LED의 상태를 꺼진 상태로 세팅 delay(150); } } if(data == '4'){ // up 버튼을 눌렀을 경우 analogWrite(buzzer, 0); // 피에조 부저의 소리를 킨다. delay(150); } if(data == '5'){ // down 버튼을 눌렀을 경우 analogWrite(buzzer, 255); // 피에조 부저의 소리를 끈다. delay(150); } if(data == '6'){ // right 버튼을 눌렀을 경우 if(servoState <= 150){ // 서보모터의 각도가 150이하일 경우 servoState += 30; myservo.write(servoState); // 서보모터의 각도를 30도 늘려 준다. delay(150); } } if(data == '7'){ // left 버튼을 눌렀을 경우 if(servoState >= 30){ // 서보모터의 각도가 30도 이상일 경우 servoState -= 30; myservo.write(servoState); // 서보모터의 각도를 30도 줄여 준다. delay(150); } } } }
* 이 코드는 스케치를 사용하여 작성 / 업로드 합니다. 스케치에 대한 사용법은 링크를 참고하시기 바랍니다.
우선 아두이노를 제어할 안드로이드 어플(BT_Button.apk)을 받으신 후, 실행 하면 밑에 그림(왼쪽)처럼 화면이 나옵니다.
맞는 블루투스 장치와 연결을 하게 되면 오른쪽 그림처럼 화면이 넘어가게 됩니다.
맨위에 3개의 버튼은 각각의 LED를 제어하고, 밑에 상하 2개의 버튼은(Up, Down) 피에조 부저 제어, 양옆 2개의 버튼은(Right, Left) 서보 모터를 제어합니다.
(맞지 않는 블루투스 장치를 연결 했거나, 취소를 눌렀을 시는 어플이 그냥 꺼집니다.)
#include // 블루투스 통신을 위한 SoftwareSerial 라이브러리를 불러온다. #include //서보 라이브러리를 불러온다.
블루투스 통신과, 서보모터 제어를 하기 위해서는 위의 두 라이브러리(SoftwareSerial, Servo) 가 필요합니다.
SoftwareSerial BTSerial(2, 3); // SoftwareSerial(RX, TX) byte buffer[1024]; // 데이터 수신 버퍼 int bufferPosition; // 버퍼에 기록할 위치
통신을 하기 위한 블루투스 모듈이 연결된 핀 번호와, 안드로이드로 부터 받은 데이터를 저장할 버퍼를 설정해 줍니다.
Servo myservo; // 서보를 제어할 서보 오브젝트를 만듭니다. int buzzer = 8 ; // 피에조 보저와 연결된 핀번호 int redLed = A0; int yellowLed = A1; int greenLed = A2; // 각각의 LED와 연결된 핀번호 int redState = 0; int yellowState = 0; int greenState = 0; int piezoState = 128; int servoState = 0; // 각 부품을 제어하기 위한 상태 값(이 값을 조절하는 걸로 부품을 제어한다.)
각각 부품들이 연결된 핀번호를 설정하고, 부품들을 제어하기 위한 상태값을 만듭니다.
if (BTSerial.available()){ // 블루투스로 데이터 수신 byte data = BTSerial.read(); Serial.write(data); // 수신된 데이터 시리얼 모니터로 출력 buffer[bufferPosition++] = data;
안드로이드와 블루투스 통신이 가능하면, 안드로이드에서 보낸 데이터를 받아서 배열에 저장해 두고, 출력해 줍니다.
// 안드로이드 프로그래밍시 1(red버튼), 2(yellow버튼), 3(green버튼), 4(up버튼), 5(down버튼), 6(right버튼), 7(left버튼)으로 정함 // 각각 버튼 눌렀을시 그 버튼에 맞는 숫자(char형)가 전송 된다/ // 이제부터 나오는 if문은 if(data == '1'){ // red 버튼을 눌렀을 경우 if(redState == 0){ // red LED가 꺼져 있을 경우 digitalWrite(redLed, HIGH); // red LED의 불을 킴 redState = 1; // red LED의 상태를 켜진 상태로 세팅 delay(150); } else{ // red LED가 켜져 있을 경우 digitalWrite(redLed, LOW); // red LED를 끈다. redState = 0; // red LED의 상태를 꺼진 상태로 세팅 delay(150); } } if(data == '2'){ // yellow 버튼을 눌렀을 경우 if(yellowState == 0){ // yellow LED가 꺼져있을 경우 digitalWrite(yellowLed, HIGH); // yellow LED의 불을 킨다. yellowState = 1; // yellow LED의 상태를 켜진 상태로 세팅 delay(150); } else{ // yellow LED가 꺼져 있을 경우 digitalWrite(yellowLed, LOW); // yellow LED를 끈다. yellowState = 0; // yellow LED의 상태를 꺼진 상태로 세팅 delay(150); } } if(data == '3'){ // green 버튼을 눌렀을 경우 if(greenState == 0){ // green LED가 꺼져있는 경우 digitalWrite(greenLed, HIGH); // green LED의 불을 킨다. greenState = 1; // green LED의 상태를 켜진 상태로 세팅 delay(150); } else{ // green LED가 꺼져 있을 경우 digitalWrite(greenLed, LOW); // green LED의 불을 끈다 greenState = 0; // green LED의 상태를 꺼진 상태로 세팅 delay(150); } }
안드로이드에서 보내주는 데이터는 1~7번 까지 입니다. 각 숫자에 맞는 부품을 찾은 후 그에 맞는 제어를 해줍니다.
(순서 : 데이터를 가지고 부품을 찾는다 --> 해당 부품의 상태를 확인한다 --> 그 상태에 맞는 동작을 한다.)
1~3번 버튼은 LED 제어를 합니다.(1번 red, 2번 yellow, 3번 green) 각 LED의 상태를 보고 켜져있는 상태면 끄고(HIGH -> LOW), 꺼져있는 상태면 키게 됩니다.(LOW -> HIGH) 그리고 LED의 상태를 맞는 상태로 바꿔줍니다.
if(data == '4'){ // up 버튼을 눌렀을 경우 analogWrite(buzzer, 0); // 피에조 부저의 소리를 킨다. delay(150); } if(data == '5'){ // down 버튼을 눌렀을 경우 analogWrite(buzzer, 255); // 피에조 부저의 소리를 끈다. delay(150); }
4, 5번 버튼은 피에조 부저 모듈 제어를 합니다.(4번은 소리 키기(Up), 5번은 소리 끄기(Down)), 자신에게 맞는 데이터가 오면 analogWrite()를 이용하여 소리를 키거나 끕니다.
(피에조에 대해서는 여기를 참고하세요)
if(data == '6'){ // right 버튼을 눌렀을 경우 if(servoState <= 150){ // 서보모터의 각도가 150이하일 경우 servoState += 30; myservo.write(servoState); // 서보모터의 각도를 30도 늘려 준다. delay(150); } } if(data == '7'){ // left 버튼을 눌렀을 경우 if(servoState >= 30){ // 서보모터의 각도가 30도 이상일 경우 servoState -= 30; myservo.write(servoState); // 서보모터의 각도를 30도 줄여 준다. delay(150); } }
6, 7번 버튼은 서보 모터 제어를 합니다.(6번 키는 Right, 7번키는 Left). Right 키를 누르게 되면 각도를 30도 늘려 주고, Left키를 누르게 되면 각도를 30도 낮춰 줍니다.
(서보모터는 0~180도 까지만 가능 하기 때문에, Right키를 눌를 경우는 150도 이하만 , Left키를 눌를때는 30도 이상만 가능 하도록 해줍니다.)
kocoafabeditor
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!