티스토리 뷰

매...매일쓰려고 했지만 어제 하루 걸러버렸다.


블루투스때문에 삽질하느라...ㅋㅋㅋㅋㅋㅋㅋㅋ



어제 스텝모터와 서보모터를 주문했다.


그래서 블루투스 모듈로 LED 제어하기를 해보기 위해 어제부터 도전했다.


난 안드로이드 앱까지 만들어서 하고싶었는데,


LED를 제어해주는 안드로이드 오픈소스는 찾기가 힘들었다.


열심히 구글링 한 결과, 다행히도 하나를 찾을 수 있었다.


내가 참고한 안드로이드 코드는



http://solderer.tv/data-transfer-between-android-and-arduino-via-bluetooth/


여기를 참고했다!



먼저 동작 동영상부터,




보이다시피, 안드로이드 앱에서 빨강, 초록, 주황 버튼을 누르면 차례로 빨강, 초록, 주황 버튼이 켜지고,


파도타기버튼은 차례로 LED가 한번씩 켜졌다 꺼지게 한다.



회로에서 푸시 버튼을 누르면 안드로이드 앱의 배경색이 바뀐다.


안드로이드 코드를 살짝만 손대면, 배경색 바뀌는거 대신 얼마든지 다른걸로 바꿀수 있다.


제일 간단하게 하려고 배경색을 바꾸어보았다 ㅋㅋㅋㅋ




먼저, 아두이노 회로




뭐가 되게 복잡한데,


led는 연결했던것 처럼 짧은쪽은 GND, 긴쪽은 저항을 거쳐서 아두이노 보드 핀에 연결해주면 된다.


나는 13, 12, 11번 핀을 사용하였다.


또 버튼도 이전에 했던것 처럼, 한쪽은 GND, 다른쪽은 저항을 거쳐서 Vcc (5V)에 연결해주면 풀업저항으로 연결되었음을 알수있다.



새로운 것이 블루투스 모듈인데, 블루투스 모듈에는 아마 뒷면을 보면 각각 pin을 어디 연결해야 하는 지 적혀있을 것이다.


Gnd와 Vcc는 위와 똑같이 연결해주고 Txd를 2번, Rxd는 3번 핀에 연결해준다.

 



연결이 잘 되었다면, 아두이노와 연결했을때 블루투스 모듈의 LED가 반짝거릴것이다.






코드가 길긴 하지만 뭐 그렇게 어렵진 않다.


먼저 블루투스를 사용하기 위해


#include<SoftwareSerial.h>를 포함해준다.


SoftwareSerial library를 사용하겠다는 뜻이다.


SoftwareSerial을 BTSerial이라고 선언하고, 블루투스 모듈의 Txd와 Rxd를 2번 3번에 연결하였으므로 BTSerial 선언시에 적어준다.


기본 블루투스 모듈의 Baudrate는 9600이다. 별다르게 바꿀일은 없으므로 그대로 9600으로 둔다.


버튼과 LED는 앞에 했던 방식대로 setup해준다.


loop함수 내에서는 크게 두부분으로 나뉜다.



Button이 눌려졌을 경우와, BTSerial이 available할 경우.


Button이 눌려졌을 때는 안드로이드 화면 전환을 위해


BTSerial.println()함수를 이용해서 데이터를 블루투스 모듈로 보낸다.


블루투스 모듈은 그 데이터를 안드로이드로 전달 해 줄 것이다.


데이터에 의미가 있는것이 아니므로 그냥 간단하게 "a"를 보내보았다.



BTSerial이 available할 경우는, 안드로이드에서 데이터가 보내진 경우다.


그 받아온 데이터가 1, 2, 3, 0이냐에 따라 코드가 달라지는데,


먼저 1일때는 제일 왼쪽 13번 핀에 연결된 led를 켜준다.


2일때는 12번핀에 연결된 led를 켜준다.


3일때는 11번핀에 연결된 led를 켜준다.


마지막으로 0이 전달되었을 때는 13번핀에 연결된 led부터 하나씩 차례로 끄고 켜진다.



길긴 하지만, 썩 복잡한 코드는 아니다.










다음으로는 안드로이드 코드인데,


안드로이드 코드는 너무 길고 그래서 필요한 부분만 얘기하겠다.


코드 풀버전은 혹시나....누가...가지고싶으면...댓글남겨주시면....보내드릴께욥....(쭈굴)




제일! 중요한것은 안드로이드 앱 menifest에


<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />

를 추가해주어야한다...!!!




그리고 이제 앱부분을 보면


layout은 알아서 이쁘게 잘 꾸미시면 되고, java코드만 보겠다.




제일 중요한부분!!!!!!!!!!!


이거때문에 내가 어제 계속 삽질했다ㅠㅠㅠ




앱이 거창한것이 아니기때문에, 자동으로 페어링된 기기의 MAC주소를 받아 올 수 없다.


구현한다면 할수있겠지만 새로운 액티비티도 추가해야하고 약간 복잡하다.



난 단지 LED 켜고 끄는것만 하고 싶으니까, 내 HC06모듈의 MAC주소를 알아서 저기 고쳐줘야한다.


그렇다면, 내 HC06모듈의 MAC주소를 어떻게 아느냐...


아무도 안알려주더라ㅠㅠㅠㅠ



안드로이드 마켓에서 MAC주소를 찾아주는 어플을 찾을 수가 있다.


많이 있는데, 간단하게 찾을 수 있는건


Bluetooth Address Finder


앱을 쓰면 지금 주위에 있는 블루투스 기기의 MAC 주소를 알려준다.


그렇게 알게된 MAC주소로 코드를 고쳐주면 된다.



case RECIEVE_MESSAGE:                                                  
                        byte[] readBuf = (byte[]) msg.obj;
                        String strIncom = new String(readBuf, 0, msg.arg1);               
                        sb.append(strIncom);                                               
                        int endOfLineIndex = sb.indexOf("\r\n");                           
                        if (endOfLineIndex > 0) {                                           
                            String sbprint = sb.substring(0, endOfLineIndex);               
                            sb.delete(0, sb.length());                                      
                            if(flag%4==3){
                                rlayout.setBackgroundColor(Color.rgb(255, 255, 255));
                            }
                            else if(flag%4==1){
                                rlayout.setBackgroundColor(Color.rgb(255, 0, 0));
                            }
                            else if(flag%4==2){
                                rlayout.setBackgroundColor(Color.rgb(0, 255, 0));
                            }
                            else if(flag%4==0){
                                rlayout.setBackgroundColor(Color.rgb(0, 0, 255));
                            }
                            flag++;


이부분은 블루투스로부터 데이터를 받았을때 동작 부분이다.


받은 데이터는 sb에 저장되고, sb에 저장되고, sb에서 sbprint로 대입되고 sb의 내용은 지워진다.


 endOfLineIndex>0일때라는 말은, endOfLine의 위치가 0이 아니라는 얘기다. 즉 하나 이상의 글자가 들어왔다는 의미이므로


이때가 데이터가 들어왔다는 의미이다.


그래서, flag 변수를 주어 ++하면서


flag의 mod 값이 1, 2, 3, 0이냐에 따라 배경화면을 흰색, 파랑, 빨강, 초록으로 바꾸어보았다.




btnLed1.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                mConnectedThread.write("1");   
            }
        });
        btnLed2.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                mConnectedThread.write("2");  
            }
        });
        btnLed3.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                mConnectedThread.write("3"); 
            }
        });
        btnpado.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                mConnectedThread.write("0");  
            }
        });


그리고 이부분은 앱에서 블루투스 모듈로 데이터를 보내는 부분이다.


첫번째 버튼이 눌러지면 1을 보내고(빨간 불이 켜지고)


두번째 버튼이 눌러지면 2를 보내고(초록 불이 켜지고)


세번째 버튼이 눌러지면 3을 보내고(주황 불이 켜지고)


네번재 버튼이 눌러지면 0을 보낸다(한번씩 껐다 켜진다)





이렇게만 추가해주면 간단하게 앱을 구현할 수 있다. ><



bluetooth.ino


아두이노 코드는 이렇고,


안드로이드는 주소값을 고쳐야하기 때문에 apk파일은 의미가 없다.


필요하다면, 댓글 달아주시면 소스코드를 보내드리겠습니다.






혹시 안드로이드 코딩하기 힘들면, 마켓에 '아두이노 블루투스'라고 검색만 해보면 나오는 앱들이 많다.


그렇지만 뭐 이걸 실제로 해봐야 다음에 아두이노랑 통신하는 좀더 복잡한 앱도 만들수 있을거 같아서 만들게 되었다.



흐......



내일 학과 프로그래밍 대회 나가는데... 뭔가 너무 여유 부리는 느낌이다.


내일 아마 주문했던 모터가 올거같으니까, 모터를 가지고 놀던지 프로그래밍 대회 문제를 다시 곱씹여봐야겠다.








+)


댓글은 자꾸 달리는데 제가 빨리빨리 메일을 못보내 드리는거 같아서



https://github.com/ujink/Android-HC06-Arduino



링크로 가셔서 오른쪽 Clone or Download 누르신 후에


Download ZIP 누르시면 다운 가능합니다



간단한 앱이라 페어링을 앱 자체에서 해주지 않아요


사용하시는 모듈의 MAC 주소를 알아 낸 후에, 안드로이드 프로젝트 내부 자바 코드의 address 변수를 수정해주셔야 합니다!



혹시 궁금한거 있으시면 댓글로 남겨주세용

댓글