2013년 4월 16일 화요일

2. 휴대폰으로 자동차를 운전하자 (2)

이번 편에는 아두이노에 블루투스 모듈을 달아서 시험해 보려한다. 앞글에도 말했듯 일단 블루투스 모듈을 "슬레이브" 모듈로 구한다. 물론 후에 다른 용도로 쓸 계획이 있다면 양방향 통신이 가능한 것으로 준비해 두어도 좋다. 가격도 다양한데.. 일단 인터넷으로 제일 저렴한 13,000원 짜리 하나 샀다. (택배비가 아깝다..)

택배비 얘기 나온김에.. 머 당연한 이야기지만 계획을 잘 짜서 한꺼번에 주문하는게 좋다. 처음 시작하니 당연히 키트가 좋다. 그중에 부족한것만 추가로 주문하면 될것이다.

  • 브레드보드 (일명 빵판)
  • 인두기 및 납 (거의 필수)
  • 점퍼선 세트 (다양한 길이로)
  • 센서류 (모션, 온도, 압력 등 가지고 놀거,... 별로 비싸지 않다 !!)
등은 강력히 추천한다.



블루투스 모듈에는 친절히 핀마다 이름을 적어 놓았다. 저중에 RXD, TXD 를 아누이노 적당한 핀에 연결하고 (0,1 번핀은 비추, 아두이노를  USB연결시 시리얼 통신으로 사용된다.) VCC, GND 를 맞게 연결해 준다. 나머지 핀들은 그대로 두어도 된다.

이렇게 연결하고 나면 테스트를 해봐야 하는데... 일단 어짜피 나중에 하게 될거니 바로 안드로이드 프로그래밍으로 넘어 가겠다. 안드로이드 하면 자바, 이클립스 등등이 대표 단어로 떠오르는데 사실 다른 툴도 많다. (개인적으론 c#에 익숙해서인지 Xarmarin 이 끌리지만..)유저라든지 인터넷 자료가 많은 관계로 자바+이클립스 를 써본다. 일단 개발환경 설치부터 (윈도우 기준이다)

기억 나는데로 쓰기는 하는데 혹시 빠진 내용이 있을지 모르겠다. 이 연재가 안드로이드 개발 강의는 아님을 감안하시고.. 그쪽 방면은 구글링 하면 훨씬 좋은 자료들 많다. 그리고 결정적으로 "난 안드로이드 개발에 관심없어" 하는 분들도 기회는 있다. 구글플레이에서 "BluCar" 를 찾아서 설치하면 된다. 그래도 한번쯤은 따라해보기를 추천한다. 되던지 말던지 간에.. 실패에서 얻는 지식이 더 많은 법이다.

1. JDK 를 다운받아 설치한다. (Java Platform (JDK) 7u17)

2. 이클립스를 다운 받고 적절한 위치에 압축을 푼다 (별도 설치과정은 없다, Eclipse IDE for Java Developers)

3. 최초 이클립스를 실행하고 "Help" 메뉴 - Eclipse Marketplace.. 를 클릭. Find 창에 Android 를 입력하고 엔터.. 그러면 "Android Development Tools for Eclipse"    가 보일것이다. 그것을 설치한다.. 이클립스를 재시작 하면 이제 상단 "Window" 메뉴에서   "Android SDK Manager" 가 보일것이다. 거기서 적당한 패키지를 찾아 추가로 설치한다. (본인은 넥서스7을 가진관계로.. Tools, API Level 17, 리스트 맨 아래에 있는 HAXM-에뮬레이터가속 을 지원한다고 하나 역시 느리다-을 설치했다.

4. 이제 폰에서 리모컨으로 사용할 프로그램에 대한 소스를 다운 받고 적당한 곳에 압축을 푼다. 

5. 압축을 풀면 폴더가 생기는데 MS Visual studio 에 익숙해 있다면 *.sln 이나 *.csproj 같은 파일이 없는것에 이상해 한다. 그냥 이클립스에서는 파일-import 메뉴를 이용해 해당 폴더를 선택하면 된다.

6. 이제 소스를 아주 간단히 살표본다. 다시 말하지만 안드로이드 개발이 목표가 아니니 때문에 딱 필요한 곳만 쪽집게 식으로 살펴본다. 본인도 자바는 처음 대한다. 우선 Package Explorer 에서 딱 두 군데
res-layout
src

을 본다. 앱의 우선 화면이 어떻게 되어있는지 감을 잡기 위해 res-layout-main.xml 을 클릭하면

Graphical Layout 과 xml 뷰를 번갈아 가번서 볼수 있다

각 버튼을 우클릭 하면 각 버튼들에 대한 id 를 확인할 수 있다. 그것 까지만 확인하고 src 쪽으로 가본다. 자바파일이 2개 있는데.. 하나는 메인일거고 하나는 블루투스 찾아서 연결하는데 사용하는것임이 분면해 보인다. 그것 말고 생각할게 또 있나??
blu_car.java 소스를 살펴본다.  오마이갓 !!!
말그대로 깨알같은 소스코드.. 블루투스 연결하고 신호 몇개 보내려할 뿐인데...
그래도 당황하지 말자. 아까 외워둔 버튼 id가 등불이 되어 줄것이다. 그것들이 어디서 어떻게 나타나는지 죽 따라 내려가본다.. 발견..

.....
         // Finds buttons in .xml layout file
         led_button = (Button) findViewById(R.id.led_button);
         forward_button = (Button) findViewById(R.id.forward_button);
.......

대충 보아하니 xml에 있는 버튼을 가져와서 자바변수로 활용하는 것 같다.. 또 따라 내려가본다.

.....
       // Drive forward
         forward_button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if ((event.getAction() == MotionEvent.ACTION_DOWN) | (event.getAction() == MotionEvent.ACTION_MOVE)) {
forward_button.setPressed(true);
AttinyOut = (byte) (AttinyOut | 16);
write(AttinyOut);
return true;

.....


MS에서 이벤트라고 불리우는것 그것이 보인다. setOnTouchListener. 터치를 기다려서 어떤 행동을 취한다 이런거겠지.. 나중에 필요하면 이부분을 수정하면 되겠구나..이 정도로 이해하고..
이상 소스 해독을 다 마쳤다. 머 나머지는 별로 중요치 않다. 그렇고 그런 기계들끼리하는 얘기겠지 하고 넘어간다.

7. 그래도 이왕 소스를 사용중이니 건드리는게 제맛이다. 우리차에는 없는 헤드라이트 기능을 빼버리고 그자리에 메시지를 보낼 수 있게 Text Fields 와 Send 버튼을 추가하고 소스를 건드려 본다..

         // message send : moon
         send_button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
String smsg = msgView.getText().toString() ;
byte[] msglines = smsg.getBytes();
for (byte ch: msglines) write(ch);
msgView.setText("");
return true;
}
 });         



8. 이제 모든것이 끝났다. 에뮬레이터에는 앱이 업로드 되도 실행은 안될것이다. 블루투스 땜시. 직접 태블릿이나 폰에 심어본다. 어려울것 없다. 그냥 폰을 USB에 연결하고. 이클립스에서 Run As -> Android Application 을 실행하면 저절로 폰을 찾고 앱을 업로드 할 것이다. 단 이때 폰은 USB 디버깅 모드가 체크 되어있어야 한다. 폰의 설정에 가서 확인해 보시라.

(사실 안드로이드 부분은 많은 부분이 생략 되었다. 일일이 다 쓰기엔 길기도 하거니와.. 정확히 설명할 자신도 없을 뿐 더러 그게 목적도 아니기 때문이다. 안되면 천천히 구글링을 통해 해결하길 바란다.)

자동차를 운전하기 전에 이제 블루투스 통신을 테스트 해본다.
회로를 연결하고 아두이노를 PC와 연결한 후 아두이노 IDE를 열고 스케치

다시한번 느끼는거지만 블루투스 연결 진짜 쉽다. 위에 안드로이도 쪽과 비교해보라..


새로운 SoftwareSerial 이라는게 보이는데.. 이건 아두이도를 PC에 USB로 연결하면 0,1 포트를 디폴트로 사용하는 그냥 Serial과 충돌을 막기위해 0,1을 제외한 포트와 연결 시켜야 한다.
컴파일하고 업로드.. 휴대폰을 켜서 블루투스를 검색한다. 아마 우리장치를 찾으면 PIN을 물어볼텐데 대부분의 모듈이 "1234" 로 출시된다. 간혹 "0000"도 있으니 둘다 테스트 해보시라. 휴대폰 버튼을 터치하거나.. 메시지를 보내본다.. 다행히 아두이노 IDE에서 COM 포트 모니터링을 할 수 있으니 어떤 신호들이 오는지 쉽게 확인할 수 있다.. 

이제 99% 까지 왔다..
다음편엔 완성 및 시운전...

PS: 참고로 ADT로 깔은 에뮬레이터.. 속도 장난아니게 느리다.. 조금이라도 빠른것을 원한다면 Virtualbox를 이용하는 것도 좋은 방법이다. 그도 아니면 직접 폰에 심어가면서 개발 해도 된다. 설마 초보인데 휴대폰 날리기야 하겠는가? 또 날리면 어떤가 그런 삽질 좀 하면서 배울 각오는 해야지.. 

댓글 없음: