아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

많은 메이커 분들은 한 번쯤 아두이노로 RC카 프로젝트를 진행해 보았을 것입니다. 아이엠어메이커에서도 레고와 브릭보드로 RC카를 직접 제작하였고 전문 RC용 무선송수신기가 아닌 블루투스와 스마트폰으로 조종할 수 있도록 만들었습니다.

아두이노 RC카 앱 제작

이번 프로젝트는 아두이노 RC카 제작이 아닌 RC카 제어용 앱을 앱 인벤터로 제작하는 과정입니다.

앱은 조이패드 형태의 인터페이스로 구현하였으며 블루투스로 RC카와 연결하여 제어할 수 있도록 하였습니다.

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

1. 목표

1) 앱 인벤터의 기본적인 사용방법 익히기
2) 캔버스(Canvas)와 이미지 스프라이트(ImageSprite) 컴포넌트 사용하기
3) 아두이노 RC카 제어에 필요한 기능 추가하기

2. 준비물

품목비고
웹 접속이 가능한 PC 구글 크롬 설치 필요, 인터넷 익스플로러 사용 불가
구글 계정 구글 계정 필수
블루투스 인터페이스 앱 프로젝트 다운로드
안드로이드 스마트폰 스마트폰 화면을 PC에서 볼 수 있는 툴 권장
브릭보드를 사용한 RC카(브릭봇) 브릭보드 익스텐션 사용*

3. 구현 및 동작

디자이너 에디터

1) 블루투스 인터페이스 앱 가져오기

스마트폰의 블루투스 통신 기능을 이용해 아두이노 RC카를 제어합니다. 따라서 앱 인벤터에서 블루투스 연결을 위한 작업을 해야 하며 사전에 제작한 블루투스 연결용 앱 프로젝트를 기반으로 제어 기능을 추가하도록 합니다. 또는 직접 블루투스 연결을 위해 블록을 작성할 수 도 있습니다.

블루투스 연결 기능 구현은 다음 동영상을 참고합니다.

2) 화면을 가로로 볼 수 있도록 스크린 수정하기

스크린 컴포넌트 속성에서 ‘스크린 방향’ 속성을 ‘가로’로 변경합니다. 기타 아이콘, 버튼의 위치와 레이아웃을 수정합니다.

수정된 프로젝트 파일은 커뮤니티 공유 게시판에서 다운로드할 수 있습니다.

다운로드

3) 캔버스(Canvas) 추가

‘그리기 & 애니메이션’ 팔레트에 캔버스와 이미지 스프라이트 컴포넌트가 있습니다.

이미지 스프라이트를 자유롭게 배치하기 위해 스크린에 캔버스 컴포넌트를 배치합니다. 이는 스마트폰 화면 위에 그림을 그리기 위해 도화지를 한 장 올려놓은 것과 같은 개념입니다.

캔버스의 높이나 너비는 부모에 맞출 경우 이미지 스프라이트의 배치를 결정하기가 어려워 화면에 나타낼 수 있는 크기로 설정하고 실제 화면에서 캔버스의 배치를 확인합니다.

이번 프로젝트에서는 캔버스의 크기를 높이 250, 너비 550 으로 설정합니다. 물론 사용하는 스마트폰마다 조금에 차이는 있습니다.

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

4) 이미지 스프라이트(ImageSprite) 추가

이미지 스프라이트를 앱 인벤터에서 추가하기 전에 캔버스의 크기를 기준의 이미지 스프라이트에 사용될 버튼 이미지를 미리 배치하여 각각의 좌표를 계산합니다.

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

여기서 방향키 이미지의 크기는 가로세로 70으로 하였으며 두 개의 기능 버튼은 가로세로 75로 설정하고 배치할 좌표를 계산합니다.

그런 후 앱 인벤터에서 각각의 이미지 스프라이트 속성을 설정하며 버튼 이미지의 배치를 완료합니다.

5) 소리 컴포넌트 추가

스마트폰은 물리 버튼이 아니기에 화면을 보고 터치를 해야 합니다. RC카를 제어하다 보면 스마트폰 화면을 볼 수 없는 경우가 많아 터치 여부를 확인할 수 없는 경우가 발생합니다. 이를 조금이나마 해결하기 위해 터치를 했을 경우 진동으로 터치 유무를 알 수 있게 합니다. 소리 컴포넌트에는 일정 시간 동안 진동을 할 수 있는 블록이 포함되어 있습니다.

또한 버튼의 진동 시간을 다르게 하여 버튼의 종류 파악할 수 있도록 합니다.

6) 브릭보드 익스텐션 추가

이번 프로젝트에 아두이노  RC카는 브릭보드로 제작한 브릭봇을 사용했습니다. 따라서 브릭보드의 모듈을 앱 인벤터에서 쉽게 제어할 수 있도록 브릭보드 익스텐션을 추가합니다.

브릭보드 익스텐션 사용방법은 ‘앱 인벤터 튜토리얼’에서 확인할 수 있습니다.

블록 에디터

1) 앱 초기화시 블루투스에 연결되지 않으면 이미지 스프라이트(버튼 이미지)를 비활성화 시켜 불필요한 동작을 차단합니다.

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

2) 각 이미지 스프라이트(버튼 이미지)의 ‘터치 업, 다운’ 블록을 사용하여 아두이노 RC카의 제어 기능을 추가합니다. 이 프로젝트에서는 터치 즉시 기능이 동작되도록 터치 다운 블록에 브릭봇을 제어하는 기능을 추가합니다.

전체 블록은 다음과 같습니다(블루투스 인터페이스 관련 블록은 제외)

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

각 이미지 스프라이트의 이벤트 블록에 다양한 제어기능을 추가하여 RC카를 제어할 수 있습니다.

4. 동작영상

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

IAMAMAKER의 저작물인 이 저작물은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

[오늘의 타겟] 블루투스 통신 모듈

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

RXD : 데이터 수신을 하는 핀

TXD : 데이터 송신을 하는 핀

출처 : https://m.blog.naver.com/boilmint7/221900933326

[실습 1] 아두이노(시리얼 통신) 과 스마트폰(블루트스 터미널) 간 데이터 송수신

- 회로 구성

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

춯처 : https://m.blog.naver.com/sisosw/221518483163

- 스마트폰 준비 

블루투스 모듈에서 빨간불이 깜빡이나요?

 -> 블루투스 연결을 기다리고 있다는 뜻이에요.

 * 스마트폰 설정에서 HC-06 이란 블루투스 모듈을 먼저 연결해 줍시다.

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

* 블루투스 터미널 설치

 -> 블루투스 신호를 송수신 할수 있는 [블루투스 터미널] 이란 어플리케이션을 설치해주어야 합니다.

 [ 안드로이드 ]

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

1. 플레이스토어에서 [블루투스 터미널] 라고 검색해 보시고 아무거나 다운 받아주세요. 거의다 비슷해요.

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

2. 어플을 설치 한뒤 열어보세요.

  왼쪽 위에 3줄 짜리 설정 창이 보이나요? 클릭해 주세요.

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi
아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

HC-06 블루투스 연결 -> 블루투스 모듈이 깜빡이다가 빨간불이 그냥 쭉 들어오면 연결완료

- 프로그래밍 코드

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

- 시리얼 모니터로 통신 확인

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

[실습 2] 아두이노(시리얼 통신) 과 스마트폰(블루트스 터미널) 간 데이터 송수신

- 아두이노 회로도

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

출처 : https://codingrun.com/114#content

- 안드로이드 블루투스 어플리케이션 제작

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

-> 제작 방법은 아래  url 내용을 쭉 따라가면 된다.

https://m.blog.naver.com/godlife1203/221359724037

[앱인벤터] 아두이노 LED 제어 앱

1. 아두이노 블루투스 설정 가. 블루투스 회로 구성 나. 아두이노와 블루투스간 통신 프로그램 업로드 다. ...

blog.naver.com

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

- 코드 : 초록색 led 블루투스 통신을 통해 껐다 켰다하는 코드

#include <SoftwareSerial.h>    //블루투스 시리얼 통신 라이브러리 추가
SoftwareSerial BTSerial(2, 3); //블루투스 설정 BTSerial(Tx, Rx)

int Green = 5;
int Yellow = 7;
int Red = 9;    //led 핀 설정

void setup() {
  BTSerial.begin(9600); //블루투스 통신 시작
  pinMode(Green, OUTPUT);
  pinMode(Yellow, OUTPUT);
  pinMode(Red, OUTPUT); 
}

void loop() {
  if(BTSerial.available())        //값이 들어오면
  {
    char bt;                     //제어할 변수 bt선언
    bt = BTSerial.read();        //들어온 값을 bt에 저장
    if(bt == '0')                //bt가 a면
      digitalWrite(Green, HIGH); //초록불 ON
    if(bt == '1')
      digitalWrite(Green, LOW);
  }
}

[추가 과제]

- 안드로이드 어플과 아두이노 프로그래밍 코드를 수정하여 led 3가지 색을 껐다켰다 할수 있도록 변경하시오.

- 아두이노 회로는 그대로 사용.

[도전과제] 아래 자료를 참고하여. 블루투스 통신을 통해  dc 모터 전진 후진 좌회전, 우회전을 제어 하시오.

- 회로

아두이노 블루투스 어플 만들기 - adu-ino beullutuseu eopeul mandeulgi

- 참고 코드

#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출
//모터 PIN 설정
#define LEFT_A1 7 //왼쪽 바퀴
#define LEFT_B1 8 //왼쪽 바퀴
#define RIGHT_A2 4 //오른쪽 바퀴
#define RIGHT_B2 2 //오른쪽 바퀴
const int ENA = 6;
const int IN1 = 8;
const int IN2 = 7;
const int IN3 = 2;
const int IN4 = 4;
const int ENB = 3;

//블루투스 PIN 설정
#define BLUE_TX 12 //블루투스 TX
#define BLUE_RX 13 //블루투스 RX
SoftwareSerial mySerial(BLUE_TX, BLUE_RX);  //시리얼 통신을 위한 객체선언
char value; //블루투스에서 받는 값
void setup() {
  Serial.begin(9600);   //시리얼모니터
  mySerial.begin(9600); //블루투스 시리얼 개방
  pinMode(LEFT_A1, OUTPUT);
  pinMode(RIGHT_A2, OUTPUT);
  pinMode(LEFT_B1, OUTPUT);
  pinMode(RIGHT_B2, OUTPUT);
  Serial.println("Arduino Bluetooth Car is ready to start");
}
void loop() {
  while(mySerial.available())  //mySerial에 전송된 값이 있으면
  {
     value = mySerial.read(); //전송값 읽음
     Serial.print(value);
     if(value == 'l'){            //좌회전(강)
       Serial.println("left");
       left();
     }else if(value == 'r'){      //우회전(강)
        // 직접 코딩하시오...
        
     }else if(value == 'f'){      //전진
       Serial.println("forward");
       forward();
     }else if(value == 'b'){      //후진
        // 직접 코딩하시오...
        
     }else if(value == 'w'){      //우회전(약)
       Serial.println("slow right");
       sRight();
     }else if(value == 'q'){      //좌회전(약)
       Serial.println("slow left");
       sLeft();     
     }else if(value == 'c'){      //우회전(뒷)
       Serial.println("back right");
       bRight();
     }else if(value == 'z'){      //좌회전(뒷)
       Serial.println("back left");
       bLeft();
     }else if(value == 's'){      //정지
        // 직접 코딩하시오...
        
     }
  }
}
// 자동차 움직임 정의 Function 들
void forward(){
  digitalWrite(LEFT_A1, HIGH);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, HIGH);
  digitalWrite(RIGHT_B2, LOW);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void backward(){
  // 직접 코딩하시오...
}
void left(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, HIGH);
  digitalWrite(RIGHT_A2, HIGH);
  digitalWrite(RIGHT_B2, LOW);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void right(){
 // 직접 코딩하시오...
}
void sLeft(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, HIGH);
  digitalWrite(RIGHT_B2, LOW);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void bLeft(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, HIGH);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void sRight(){
  digitalWrite(LEFT_A1, HIGH);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, LOW);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void bRight(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, HIGH);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, LOW);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}

void stop(){
 // 직접 코딩하시오...
}

끝.