2013년 6월 19일 수요일

더 낮게 더 쉽게.. Scratch & AppInventor




얼마전 정부에서 초딩 코딩 교육 발언으로 왁자지껄해 진적이 있다. 개인적으로 머 별 감흥은 없다. 해도 그만 안해도 그만... 다소 부정적인 이유인데는 나름 이번 놀이를 하면서 느낀게 있기 때문이다. 아이들에게 필요한건 놀이지 기교가 아니다. 어떤 행위가 다음 스텝을 위한 준비 과정에 불과하다면 성인들을 그것을 견딜만한 능력과 연륜이 있지만 애들은 아니다. 무조건 현재가 즐겁지 않으면 바로 아웃이다. 어느덧 애들은 친구들 만나러 놀러 나가고 나만 홀로 돋보기 쓰고 납땜하는 모습을 발견한다.

그렇다고 여기서 물러설순 없다. 또 구글링... 대단한 놈을 찾았다. 바로

ScratchApp Inventor

둘다 MIT에 서버를 두고있다. 앞에 것은 pc 용 뒤에것은 스마트폰(안드로이드)용 개발 도구다. 둘은 거의 이란성 쌍둥이다. 사용법이 거의 같다고 보면된다. 다만 각 기기에 맞는 특별한 기능만 일부 다를뿐. 이런 걸 일석이조, 원샷투킬, 도랑치고.... 등등..



요리 생겼다. 대충 매뉴얼 없이도 이것저것 해보면서 익혀가다가 나중에 매뉴얼 읽으면 되시것다.일단 급하게 그래픽 기반의 개발툴을 찾는 신입 너드가 있어 오늘은 소개만 하기로하고..

참 정작 중요한 점..  Scratch 이게 pc 용이라 아두이노에 프로그램이 직접 안된다.. 다행히
S4A (Scratch for Arduino) 라는 놈이 여기에 숨어 있다..

http://seaside.citilab.eu/scratch/arduino


사족: 사실 scratch 때문에 아두이노에서 라즈베리파이로 갈아탈까 고민하던중 S4A를 발견했다. 아직 검증은 못했고... 그래도 라즈베리파이용 스크래치는 검증이되었고.. App Inventor 또한 대단한 물건이다.. 긴말 필요없다 일단 써보면 안다


추신: 아참 공돌이들의 사랑을 듬뿍 받고 있는 LabView. 여기에도 아두이노 Toolkit 모듈 공짜로 제공합니다.

https://decibel.ni.com/content/groups/labview-interface-for-arduino

<http://www.adafruit.com/blog/2011/07/01/labview-interface-for-arduino/>

이왕 나온김에.. Matlab 과도 연동 모듈도 있어요 (이건 놀이라기보다 노동에 가깝기 때문에 언급안하려 했는데 !!)
http://www.mathworks.co.kr/hardware-support/arduino-simulink.html

2013년 6월 16일 일요일

ATMEGA 128 and Wiring


ATMEGA 128! 오늘은 이 놈 얘기다.

원래 아들과 함께하는 놀이로 시작했는데 이놈 때문에 어려워서 좀 흥미를 잃은 눈치다. 그래도 기록으로 남기기위해서 시작해 본다.

우연히 주운 물건 (알고보니 칩이 타서 버린거였음 다행히 친절한 아저씨? 의 도움으로 공짜로 칩을 교환했음). 아마도 싸고 사용할 수 있는 I/O 가 많아 공돌이들의 많은 사랑을 받고 있나보다 (어디까지나 추측이다. 이런 종류의 물건들이 머하는건지 최근에야 알았으니깐). 기능에 비해 가격도 저렴하다. http://www.eleparts.co.kr/EPX33Y3V 참고하시고.. (이 사이트와 이해관계 있어서 링크건건 아니다. 핀번호 및 기능은 간단히 참고 하기에 좋다)

이 놈은 보시다시피 최소한의 기능만 가지고 있다. 우선 프로그램을 어떻게 집어 넣지? 부터 고민해 보자. PC 에서 프로그램을 어찌저찌하여 0-1 로 이루어진 데이터를 저기에 넣어야 무언가라도 할텐데..  우선 왕초보가 구글링하여 data sheet 를 찾아본다.


회로도 및 기능들이 설명되어 있는데 당췌 머가먼지 모르겠다. 일단 아 그렇구나 하고 다시 삽질을 시작한다. 다행히 "AVR ISP" 라는 키워드를 건져 겨우 시작을 해본다. 저 그림 오른쪽 상단에 핀 6개가 힌트 였다. 시리얼 통신 방식이 UART, SPI, ... 여러가지 있는것도 처음 알았다. 더 자세한건 지루하니 과감히 생략.. 그래도 이건 한번 볼 필요가 있다. 


AVR 계열에서는 SPI 통신을 이용해 프로그래밍 하는 방법에 대한 얘기인데 그것을 In-System Programming (ISP) 라고 부른다. 우연하게도 통신방식 SPI (Serial Peripheral Interface) 와 매우 헷갈리는 이름이다. (원문 매뉴얼에서 퍼오긴 했는데.. 꼭 궁금한 분만 읽어 보시고..)

For In-System Programming, the programmer is connected to the target using as few
wires as possible. To program any AVR microcontroller in any target system, a simple
Six-wire interface is used to connect the programmer to the target PCB. Figure 1
below shows the connections needed.
The Serial Peripheral Interface (SPI) consists of three wires: Serial ClocK (SCK), Master
In – Slave Out (MISO) and Master Out – Slave In (MOSI). When programming the
AVR, the In-System Programmer always operate as the Master, and the target system
always operate as the Slave.
The In-System Programmer (Master) provides the clock for the communication on the
SCK Line. Each pulse on the SCK Line transfers one bit from the Programmer (Master)
to the Target (Slave) on the Master Out – Slave In (MOSI) line. Simultaneously,
each pulse on the SCK Line transfers one bit from the target (Slave) to the Programmer
(Master) on the Master In – Slave Out (MISO) line.

요약: 통신에  4개의 포트가 사용됨. 



그러나 불친절 하게도 핀 배열을 알 수 없다. 일일이 멀티미터로 찍어서 확인한다. 머 다들 알겠지만 디지털 멀티미터에서 SHORT (연결) 가 되면 '삐' 소리나는 기능이 있다. 그걸 이용하면 되겠다. 

여기까진 되었는데, PC 에서 어떻게 SPI 연결을 하지? 불행히도 돈을 들여야 한다. AVR ISP라는 장치로 .. 단 구매할때 주의 해야할건 어떤 장치는 AVR 보드에 별도의 전원을 공급해야하는것도 있다. 아뭏든 아래 그림과 같은 장치를 구(걸?) 했다. USB에 연결해서 ISP 프로그램을 업로드 하는 장치..




여기까지 하드웨어는 다 준비가 되었는데.. 무엇으로 어떻게 해야지? 다행히 AVR 칩제조사에서 Atmel Stduio (http://www.atmel.com/microsite/atmel_studio6/) 를 무료로 제공한다. MS VisualStduio 와 거의 유사한 인터페이스를 제공한다. 모든 게임이 끝난것 같은데.. 아뿔싸..


<출처: http://www.pololu.com >


소스를 보니 공돌이 냄새 흠씬 풍긴다. C언어 책에서나 보았던 쉬프트 연산자 (<<) 도 보이고. 가지고 놀자는데 이런 고급 연산자를 쓸 수는 없는일.. 조금더 검색해 보니

Wiring (http://wiring.org.co/) 이라는게 있다.
아두이노도 여기에서 출발했다고 하니 이 동네의 큰형님 격인데.. 지금은 시장을 동생한테 거의 뺏기고...  아뭏든 다시한번 비즈니스라는게 오묘하다는 생각이 든다.. 다행히  wrinng 이 지원하는 보드중에 "Wring mini" 제품이 있는데 이게 ATMEGA 128 칩을 사용한다. 일단 프로그램을 다운받고 우선 bootloder 부터 설치한다. 당연히 장비는 AVR ISP 장치로 한다.




성공적으로 부트로더를 심은 후 드디어 간단한 LED 회로를 꾸민 후 깜빡이는 스케치를 만드어 업로드 해본다. 문법은 아두이노와 동일하다. 깜빡이는 LED를 볼 수 있을 것이다.


2013년 4월 23일 화요일

3. 완성하면서.. 그리고

새 정권 들어서 유독 "창조"라는 말이 많다. 창조경제, 미래창조과학부, ...
창조, 창의 물론 중요한 말이다. 어릴때 부터 들어 왔던 말인데 지금까지도 여러 말이 나오는걸 역으로 생각해 보면 그 만큼 어렵다는 얘기다.

어떻게 하면 창의적인 사고를 할 수 있을까.. 여러 가지 이론이 난무하고 심지어 그것으로 밥벌이 하는 부류들도 있는 걸 보면 대세는 맞는것 같은데.. 아뭏튼 한가지 확실한건 어떤 틀에 집어 넣기만 하면 출구에서 짜잔~~하고 창의적 인간으로 바뀌는 그런 틀은 과거에도, 지금도, 앞으로도 나올 수 없다. 그러나 오늘도 책상머리의 관료들은 근엄한 표정을 지으며 부하 직원들에게 창의적 아이디어를 생산하라고 다그친다.


창의성 하면 역시 우리 조커님을 빼 놓을 수 없다. (개인적으로 히스레저를 볼 수 없다는게 너무 안타깝다). 역사에 길이남을 명언. 

" ...I just do things. The Mob has plans. The cops have plans. Gordon's got plans. You know, they're schemers. Schemers trying to control their little worlds. I'm not a schemer..."

오늘은 50%까지 창조하고, 내일은 25% 더하고... 벽에 계획도 붙여 놓고 진척 상황 빨간 막대그래프로 그려가면서 관리한다고 나오는 것이 아니다. 밤을 새도 토끼눈만 획득하기도 하고, 어쩌다 갑자기 완성되기도 한다. 물론 일이란게 영감도 필요하고 그것을 완성하는데 상당부분 막노동(육체적이건 정신적이건) 이 필요하다. 그렇다고 막도동 단계를 창의적이라고 할 순 없다. 2대의 탈출 유람선을 상대로 행한 실험... 너무나 창의적이지 않았던가??

"CHAOS!!" 혼돈 또는 무질서. 그분은 무질서 속에서 가치를 찾는 법을 알고 계셨다. 돈더미를 불태우면서 그의 목적이 행위 그 자체였음을 다시한번 증명한다. 과정을 즐길 뿐 어떤 목적이나 목표는 필요 없다. 배트맨이 현재의 모순을 조금 개선하려  시도 했다면 조커님은 판 자체를 깨지 않으면 불가능 하다고 보았던 것이다. (지금 도덕을 얘기하는게 아니라 창의성 얘기를 하는 중...). 자기들이 딛고 있는 판을 자기 스스로 깰 수 있어야 하는데.. 솔직히 말하면 기대감 제로..

얘기가 잠시 딴데로 흘렀다. 우리의 자동차를 완성하자. 전편들에 이미 핵심 사항이 언급이 되어 있으므로 다 생략하고, 다만.. 그래도 허전하니 최종 아두이노 스케치 ..

#include <SoftwareSeria.h>

SoftwareSerial BTserial(2,3);

int a = 0;
int E1 = 6;
int M1 = 7;
int E2 = 5;
int M2 = 4;

int GO = 255 ;
int STOP = 0 ;
void setup(){
  BTserial.begin(9600);
  pinMode(M1,OUTPUT);
  pinMode(M2,OUTPUT);
  pinMode(E1,OUTPUT);
  pinMode(E2,OUTPUT);
}

void loop(){
  a = BTserial.read();
  switch (a){
    case 0:
     digitalWrite(M1,LOW);
     digitalWrite(M2,LOW);
     analogWrite(E1,STOP);
     analogWrite(E2,STOP);
     delay(100);
     break;
    case 4:
     digitalWrite(M1,LOW);
     digitalWrite(M2,HIGH);
     analogWrite(E1,GO);
     analogWrite(E2,GO);
     delay(100);
     break;
    case 8:
     digitalWrite(M1,HIGH);
     digitalWrite(M2,LOW);
     analogWrite(E1,GO);
     analogWrite(E2,GO);
     delay(100);
     break;
    case 16:
     digitalWrite(M1,LOW);
     digitalWrite(M2,LOW);
     analogWrite(E1,GO);
     analogWrite(E2,GO);
     delay(100);
     break;
    case 20:
     digitalWrite(M1,LOW);
     digitalWrite(M2,LOW);
     analogWrite(E1,GO);
     analogWrite(E2,STOP);
     delay(100);
     break;
    case 24:
     digitalWrite(M1,LOW);
     digitalWrite(M2,LOW);
     analogWrite(E1,STOP);
     analogWrite(E2,GO);
     delay(100);
     break;
    case 32:
     digitalWrite(M1,HIGH);
     digitalWrite(M2,HIGH);
     analogWrite(E1,GO);
     analogWrite(E2,GO);
     delay(100);
     break;
  }
}
     
리모컨(스마트폰)에서 만드는 신호는 버튼으로 전, 후 그리고 자이로(기울기)에서 좌,우 이것들의 조합이 블루투스를 통해 아두이노로 전달된다. 아두이노에서는 단순히 그 신호들에 대한 switch-case 를 만들어 양쪽 모터만 구동하면 된다. 이리하여..

   
충돌테스트를 여유있게  통과할 만큼의 튼튼한 조립 과정을 거쳐 드디어 최종 필드 테스트를 하게된다. (테스트 드라이버 선정에 신중을 기했다. 미모와 지성을 갖춘 분으로.. 바쁜 일정 중에서내복 차림으로 출연하는 성의까지 보이셨다..^_^)


(좌우 모터 성능 조정 등등.... 손봐야 할게 많지만 일단 움직이므로 패스..)


후기

1. 사실 모든게 심심해 하는 아들 선물이었는데, 자동차 같이 만들고 나서는 시큰둥하다. 오히려 초딩 딸래미가 더 신기해한다. 인터넷에 레고로 캔디자판기를 만든 동영상보고 자기도 만들어 보겠다고 설계도까지 그려왔다. 물론 모터, 센서, 아두이노는 그 설계도에 없다. 그래도 그 열정이면 충분하다.

2. 정보수집하러 들어간 네이버카페.. 공돌이 냄새 풀풀난다. 아두이노 IDE는 초보용이고 AVR stduio 를 써야 한다는 둥.. 학교 프로젝트 질문이 많다. 아직도 "가지고 논다는 것보다 해야만 하는 것" 에 대한 글들이 대부분이다. 나 조차도 크게 다르진 않다. 다음 작품 구상을 하는데 잘 떠오르지 않는다..  오히려 그런면에서 초딩 딸래미가 더 낳다. 무엇이 될지 모르지만 다음 작품은 딸의 제안을 따르겠다.

2013년 4월 17일 수요일

2.1 <단상> 아이폰 과 OPEN Biz

우선 페이스북에 올렸던 글 복사해 온다.

네Xx 특정 카페에 가입 했다. 취미로 하는 놀이에 대한 정보를 얻고 공유하기 위해서다. 그런데 운영이 참 특이하다. 등급 별로 접근 할 수 있는 정보를 제한한다. 아마 많은. 카페들이 비슷할 것이다. 가까스로 신입생 자격에서 1학년으로 승급하고 게시물들을 읽어본다 머 외국어로 검색하는것 보다 질이 떨어지면 떨어졌지 낫다고 보기 힘들다. 
이놈의 땅에선 알량한 지식으로도 권력을 만든다. 취미생활 하자고 만든 인터넷 카페도 1 학년이니 6학년이니 등급을 매기고 권한을 제한한다. 웃긴건 엑세스 권한을 얻고 보면 별 내용도 없다. 그리고 더 웃긴건 그런 문화에 대한 반감이 별로 없다는 것이다. 
OPEN!! 최근에 새삼 느끼는 힘이다. 철저한 공개를 통해서 당장의 이익을 추구하기보다는 생태계 규모를 키우고 그런 가운데서 비즈니스를 일궈가는 모델을 본다. 하드웨어든 소프트웨어든 카피가 가능하다. 아니 오히려 카피를 권장한다. 
유저가 늘어나면 무슨일이든 생기게 마련이다.


그리고 또 하나... 아두이노 창업자인 마시모 반지의 TED강의.

 "대단한 것을 만들기 위해 다른 사람들의 허락를 받을 필요는 없다."




갈수록 아쉬움이 커가는 아이폰 그리고 애플

한 때 아이폰이 아니면 스마트폰으로 보이지 았던 시절이 있었고. 아직도 아이폰을 가지고 있기다. 또 맥을 사기는 좀 그렇고해서 OS X만 사서 VMWare로 돌리고, 거기에 Xcode 개발툴을 깔아서 놀아도 보았다.. 그런데

  • 첫 번째 문제:  내걸 내가 가지고 노는데 연 10만원에 해당하는 개발자 등록을 해야만 한다는 것.. 머 내가 장사하자는것도 아닌데..
  • 다음 문제: 개발자 등록하고, 리모트 컨트롤 프로그램을 아이폰에 심어도 정작 쓸 수가 없다. 애플의 폐쇄적인 블루투스 인증 정책 때문에.. 애플 기기와 블루투스 연결할라면 애플로 부터 칩인증을 받아야 한다는데 그게 또 복잡한 모양이다. 영세한 업체에서 중국으로 날아가서 어쩌고 저쩌고....
  • 이왕 말 나온김에.. OS X 아주 좋다. VMWare로 돌려도 잘 돌고 iCloud로 잘 연결된다. 그런데 어느날 잘 되던 iMessage가 작동이 안된다. 하드웨어에 대한 추가 인증을 하는 모양이다.  근데 "카톡", "마이피플",.. 수도 없이 쏟아지는 비슷한 공짜 서비스가 있는데 굳이 인증을 강화할 필요가 있었나? 
사용자 입장에서 아이폰 분명히 아직 최강자로 보인다. 화질, UI, 디자인, ...  그러나 아마추어 공돌이들의 장난감이 되기엔 너무 많이 부족하다. 어쩔 수 없이 넥서스7로 놀고 있다.

눈도 노안이 시작되는지 침침해지고 또 스마트폰을 바꿀때가 되었는데.. 그래도 아이폰인가? 고민이 좀 된다.

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를 이용하는 것도 좋은 방법이다. 그도 아니면 직접 폰에 심어가면서 개발 해도 된다. 설마 초보인데 휴대폰 날리기야 하겠는가? 또 날리면 어떤가 그런 삽질 좀 하면서 배울 각오는 해야지.. 

1.1 <외도> 득템 그리고 지름신

잠시 딴짓거리 하느라 연재가 지연되고 있습니다.
일이 바빠서..... 는 핑계고..
사실 다 만들어서 시운전도 끝낸 상태인데. 글로 적는게 늦어지고 있습니다.

범인이 두개 있는데.. 하나는 바로 아두이노의 mpu와 같은 AVR 계열의 ATMEGA128 보드. 누가 버린걸 주운 걸 다시 얻었다. 같은 AVR칩이니 아두이노와 호환되지 않을까 하는 생각에 구글링 시작.. 오랜 삽질 끝에 칩이 타버린걸 알았고.. 그래도 그 과정에서 avr stduio, wiring 같은 개발 도구들을 알게 되었다. 그리고 좋은 스승을 만나 덤으로 내공도 전수 받고 각종 잡템 (커넥터, 점퍼, 어래이핀 등)들도 얻게 되는 행운을 가져다 주었다.

AVR ATMEGA128 사무실 직원이 어디서 주워와서 건네주었다


그리고 또 하나.. 문제의 라즈베리파이 (RaspberryPi). 미국에서 25, 35불에 불티나게 팔렸다는 바로 그 미니 PC. 한국 쇼핑몰에선 5만 2천원. 일단 지르고 여러가지 간을 보고 있다. I/O 핀도 있고, OS도 올릴 수 있고, 속도도 아두이노와는 급이 좀 다른 놈이다. 여러가지 용도를 생각하고 있는데 일단 xbmc 깔아서 멀티미디어 서버로 좀 써볼라고 한다.

왼쪽이 Arduino UNO 오른쪽이 RaspberryPi

나중에 이 두놈 사용기도 올려 보도록 한다. 물론 시간이 될 때 ^_^

2013년 4월 6일 토요일

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

벚꽃을 기대한 주말이지만 비바람이 친다.
즐기기도 전에 다 지게 생겼다.

일단 약속대로 블루투스 자동차를 만들어 본다. 장애물은 세가지 정도

  • 아두이노에서 블루투스를 사용하기
  • 모터 제어
  • 스마트폰에서 리모컨 프로그래밍

일단 전체 작전도



위에 말한 세 가지 영역 모두 초보다. 그래도 시작해 본다. 우선 준비물 챙기기


왼쪽부터 아두이노 UNO, 블루투스 슬레이브 UART, 모터드라이버 쉴드, 그리고 최신형 페라리, 각종 점퍼 및 핀어레이 (왼쪽상단 우정 출연한 저분은 만국 공용의 길이 측정자, 그리고 아쉽게도 카메라빨 못받으신 납땜기, 니퍼, 스트리퍼,...) 그리고 무엇보다 중요한 고무밴드.. 어떠한 충돌에도 안전을 보장할 것이다..

블루투스는 슬레이브로 사야한다. 그냥 서버역할을 하니 마스터겠지 하고 생각했는데.. 슬레이브가 맞다. 그리고 또 이상한 단어 UART.. 깊게가면 재미 없다. 그냥 이건 비동기식 시리얼 통신이고 무엇보다 동기식보다 싸고 보편적이라는 것 정도만 알고 넘어간다. 자세한건 구글링..

일단 말로만 때워도 되는것 부터 시작...


모터제어 (PWM: Pulse Width Modulation 제어)

이것은 자동차를 정회전, 역회전, 회전 속도 바꾸기 등등 때문에 필요한 것이다. 항상 그렇지만 새로운 단어는 거창하게 들리는 동시에 귀에 거슬린다. 알고 보면 간단한 내용인데..
회전 방향 바꾸는 거는 생각만으로도 쉽다. 그냥 0 또는 1 걸어서 구분만 시켜주면 받는놈이 어찌 할테니.. 문제는 속도 제어다. 디지털은 0,1 만 있어서 0.34 같은 중간값이 필요한데 어찌할까? 여기서 나온게 PWM 제어이다. 일단 위키 http://en.wikipedia.org/wiki/Pulse-width_modulation 를 링크는 거는데.. 너무 전문적인 설명이고..

예를들면 10초 단위로 신호를 보내는데

1초 5V - 9초 0V -1초 5V - 9초 0V - ....  와
5초 5V - 5초 0V -5초 5V - 9초 0V - ....

는 어떤 차이가 있을건 당연하다.. 그런 차이를 응용하는게 PWM 방식이다.
아두이노는 그런방식으로 아날로그 (analog) 신호를 만들어 낸다. analogRead, analogWrite 함수가 그것이다.  (사실 매뉴얼 보면 아날로그 포트, 디지털 포트를 구별해 놓았는데.. 모든 포트에서 pwm을 지원하기는 하는것 같다. 다만 지정된 핀은 별도 회로에서 pwm을 지원해서 mpu에 부담을 덜 주는 것인지... 그것은 차차 확인해 봐야 겠다)

여기서 질문
"그냥 아두이노 신호를 모터에 직접 넣으면 되지 왜 드라이버쉴드가 필요해요 ?"
여러가지 이유가 있겠지만 큰 두가지 이유

  • 아두이노 출력은 5V가 한계다. 만약 12V로 구동되는 자동차 모터라면 직접 쓸 수 없다는 얘기다. 
  • 또 한가지 중요한 건, 설령 모터가 5V로 구동 된다 하더라도 문제는 전류다. 여러번 나온 얘기지만 모터는 "파워" 도구이다. 반면 아두이노 출력은 모두 시그널이다. 이걸로 직접 모터를 구동하다가는 과전류가 흘러 아두이노 보드 타버릴 수도 있고, 설사 방지 회로가 있더라도 모터는 전류 부족으로 제대로 구동되지 않는다.  그냥 아두이노 출력은 LED 켜기정도? 자세한건 아두이노 매뉴얼에 허용 출력이 나와 있을것이다..
아두이노 호환 드라이버들이 많이 나온다. 엄밀하게 말하면 호환이라고 하기엔 좀 어색하다. 그냥 아두이노 핀배치에 일치하는 모터드라이버로 별도의 점퍼선이 필요치 않은 보드 정도가 좀더 맞는 말일 것이다. 그런 것들을 "쉴드"라고 부른다. 모터드리이버 말고도 이더넷, Wi-Fi 등 종류가 많다.. 딱 필요한 기능만 있는 부품 보다는 당연히 비싸다.

모터 드라이버 쉴드를 등에 업은 아두이노

어쨋건 큰맘먹고 드라이버는 아두이노쉴드 중 하나를 구매.. 그것도 나중을 생각해서 2A 짜리로.. 당연히 바퀴 두개를 별도로 제어하려면 출력은 2개가 있어야 한다. PLL 제어 기능까지 있다는데.. 일단 머리아프니 패스.. 어짜피 사용할 계획도 없고..

별도의 회로 연결은 필요없다. 4개핀은 아두이노와의 통신에 사용하고, 나머지 핀은 그대로 아두이노에 연결시켜 주는 통로 역할을 한다. 4개 핀은 반드시 기억해 두었다가 모터제어 프로그래밍에 쓰고.. 그 나머지 안쓰는 핀 중에 적당한놈 골라서 나중에 블루투스에 쓰면 된다.

아두이노-드라이버-모터의 연결을 마쳤으면 이제 아두이노IDE 로 가서..

//4,5,6,7번은 모터쉴드에 예약되었습니다
int E1 = 6; // motor1 속도
int M1 = 7; // motor1 전.후진 
int E2 = 5; // motor 2 속도
int M2 = 4; // motor 2 전.후진

void setup(){
  pinMode(M1,OUTPUT);
  pinMode(M2,OUTPUT);
  pinMode(E1,OUTPUT);
  pinMode(E2,OUTPUT);
}

void loop(){
     digitalWrite(M1,LOW); //방향 
     digitalWrite(M2,LOW); //방향
     analogWrite(E1,255); // 0-255
     analogWrite(E2,255); // 0-255
}


더 이상 무슨 설명이 필요한가.. 코드에 이미 설명이 다 되어있고.. 이게 소스 전부다.. 양쪽바퀴 모두 가장 빠르게 전진하라는 내용이다. 물론 나중에 리모컨 신호를 받아서 적절한  처리를 해 주는 작업을 할 것이다... 참고로 아두이노 PWM (analog) 출력은 0-255 사이의 값으로 조정한다.. 255면 계속 모터에 최대 전원을 준다는 얘기다.  참고로 analogRead 도 있는데 그것은 0-1024 값을 쓰니 혼돈하지 말것..

쓰다보니 길어졌다. 다음 블루투스 연결로 이어진다..