2013년 12월 29일 일요일

지금 관심 중..

현재 진행 중

http://en.wikipedia.org/wiki/G%C3%B6del,_Escher,_Bach 괴델 에셔 바흐 (괴델 원문은 너무 난해 해서 돌아가는 길 선택.. )
http://jlsystem.sourceforge.net/ 린덴마이어 시스템
http://www.contextfreeart.org/  컨텍스트 프리
음색 (Timbre) - 도미솔 화음 - 하모닉스,옥타브, 세번째 옥타브에서 하모닉 주파수 불일치..
갈루아 (Galois)

2013년 12월 5일 목요일

왜 수학에 관심을 가져야 하는가 - 구글 검색의 비밀

미래에 어떤 직업을 꿈꾸고 있는가?
세상에는 셀 수도 없이 많은 직업이 존재하고 또 그것을 위한 준비 과정도 다양하다. 그래도 가장 공통분모가 큰 것을 찾는다면 아마 수학이지 않을까 싶다. 최근 미국 금융가에 수학자, 통계물리학자가 스카웃되어 돈을 번다는 기사들 많이 보았을 것이다(사실 사회적으로 이 현상이 바람직하냐 안하냐는 논란이 많다). 뿐만아니라 구글의 탄생 배경에 "구글 페이지 랭크 알고리즘"이라는 것이 있다. 또 페이스북이나, 다른것들은 어떤가. 속을 들여다 보면 "그래프이론"이라는 수학의 한부분이 주축을 이루고 있다. 그리고 우리가 매일 인터넷으로 결재하고 인증하고 하는 부분들.. 사실을 "정수"를 다루는 학문에서 출발한 암호학이 들어 있다. 그외 셀 수도 없이....

오늘은 그 유명한 "구글 페이지 랭크 알고리즘"을 쉽게 살펴보자. 우선 구글에서  "구글 페이지 랭크 알고리즘" 검색어를 입력하면 첫번째로 나오는 페이지에서 그 내용을 설명하고 있다.(놀랍다. 이래서 구글 검색이 영향력 있는거 아니겠는가?)  http://sungmooncho.com/2012/08/26/pagerank/
왜 이 페이지가 처음으로 보일까? 물론 그페이지를 자세히 읽어보면 내용을 알 수 있겠지만 좀더 쉬운 예제로 살펴 보자

일단 요새는 휴대폰에 친한 친구들 연락처 다들 저장하고 있을것이다. 그걸로 인기도를 측정해보자. 간단하게 A,B,C,D 네 친구가 있다. 각자 휴대폰에

사람    저장연락처
====    ==========
A:       C
B:       A,C,D
C:       A,D
D:       A,B

가 되어 있다면 누가 가장 인기 있다고 볼 수 있을까? A가 갯수가 가장 많으니 A? 글쎄다 구글 계산법에 의하면

나의 인기도
= (1-d)
+ d*(내번호를 저장하고 있는 친구1의 인기도)/(친구1이 저장하고 있는 전화번호 개수)
+ d*(............................친구2의 .........)/(친구2가  ............)
+ d*(............................친구3의 .........)/(친구3이  ............)  
+ ........


즉 나의 인기도는

  • 나의 전화번호를 저장하고 있는 친구들의 수.
  • 또 그 친구들 각자의 인기도
  • 그리고 그 친구들이 각각 저장하고 있는 전화번호 개수
  • 등에 의해 결정된다..

여기서 d는 좀 특수한 수자인데.. 일단 0.85 라고 알고가자..

다소 이야기가 복잡한데 모르니 위의 예를 직접가지고 풀어보자. 각각의 인기도를 a,b,c,d 라 하면

a = (1-0.85) + 0.85 * (b/3 + c/2 + d/2)  (A의 전화번로를 B,C,D 가 가지고 있음)
b = (1-0.85) + 0.85 * (d/2)                  (B의 전화번호는 D 만가지고 있음)
c = (1-0.85) + 0.85 * (a/1+b/3)
d = (1-0.85) + 0.85 * (b/3 + c/2)

이리 정리되면 한결 보기 편해졌다. 이제 행열을 배웠다면 이것을 어떻게 쉽게 풀지 알것이다.



대충 엑셀에서 이식을 풀어보니 (MINVERSE, MMULT 이용하면 됨)



나온다.  결과를 보면 오히려 C 의 인기도가 높다. 이유는 비교적 인기높은 A의 주소록을  독점하고 있는데서 온다.
사실 인터넷 페이지수는 셀수도 없이 많은데 저련 행렬을 만들고 계산할 수 있는가? 현대의 기술로 충분히 가능하고 또 그렇게 하고 있다. 좋은 수학적 알고리즘이 있고 또 하드웨어도 충분히 빠른 그런 세상인 것이다. 물론 구글이 저 알고리즘만 적용하는건 아니다. (추측이자 당연하다고 믿지만) 지리적으로 어디인지, 접속 IP 주소는 어디인지, 과거에 이 IP에서는 어떤 검색을 자주했는지,... 등 모든 데이터를 종합하여 검색 결과를 보여준다. 어쩌면 나에대해 오히려 나 자신보다 잘 알고 있을지도 모른다..


2013년 12월 3일 화요일

수학자 이야기를 좀 들려주려 했는데..

이미 인터넷은 -좀 식상한 얘기지만-내가 제어할 수 있는 범위 밖에있다. "무엇을 안다"는 것 보다 "어디가면 찾을 수 있나" 가 더 현실적이다. 새로운 것을 만드는것 보다 여기저기 흩어져 있는 정보를 어떻게 역어 내느냐 도 중요한 일이 되었다.
원래는 여기서 수학자 이야기를 들려주고 싶었는데 이미 여기 저기 좋은 글들이 너무 많다. 그중에 대표적인 곳으로 국가수리과학연구소가 운영하는 사이트 http://junior.nims.re.kr/index.html 를 추천한다. 몇몇 수학자들의 일생을 볼 수 있다. 이 카테고리를 어떤 컨텐츠로 채울건지는 좀 더 고민해야 겠다.

2013년 12월 1일 일요일

왜 미-파 시-도 는 반음이냐.. 4:5:6 비율의 작품

첫글이다. 예전 공부할 때 실험실에 음향학을하는 친구들이 있었다. 음악이 주파와 밀접한 관계인것 머리로는 알겠는데.. 아직도 귀는 막귀다.. 그것이 도대체 무엇이길래..ㅜㅜ
현재 우리가 노래하는 도레미파솔라시도는 피타고라스라는 수학자에서 기인한다. (물론 이후에 바하라는 자가 대대적인 개편을 했지만..) 주말에 인터넷 여기저기 돌아다니는데 대부분  음악중심으로 서술되어 있어 그냥 바벼운 수학 중심으로 도레미파솔라시도를 살펴 보겠다.
피타고라스가 어느날 대장간 옆을 지나가는데 굉장히 좋은 화음이 들린다. 분석해 보니 주파수비가 2:3 일때 좋은 화음이 들리는걸 알았다. 도-솔 화음이다. 솔은 낮은도-높은도 의 중간음이다. 여기서 더 나가 그 중간음 2 : 2.5 : 3 즉 4 : 5 :6 도 훌륭한 화음을 만드는것을 발견한다.
여기서 잠깐 태클: 그 당시에는 주파수 개념이 없었음이 당연하다. 어찌 측정할 방법도 없고. 다만 쇠막대 길이가 2배가 되면 저음이지만 비슷한 소리가 나는걸 알았고 (이걸 옥타브라고 현재도 부른다). 그 사이에 적절한 음이 있어 조화를 이루는걸 알았는데.. 사실 주파수는 쇠막대 길이에 반비례한다. 따라서 쇠막대 길이의 역수비 즉 (1/2):(1/3) 길이비가 좋은 화음을 만들었음을 알았을 것이다..
그렇다 우리는 두 가지 정보만으로 음계를 만들어 보겠다
  • 주파수 2배나 1/2배는 같은 가족이다 (옥타브)
  • 좋은 화음은 4:5:6 이다
이것을 근거로 한 옥타브 안에 음계를 만들어 보자. 4:5:6을 현재에서 낮은쪽, 높음쪽 양쪽으로 다시 그 비율을 가지는 쌍을 만든다. 즉
Image
위에서 처럼 (4:5:6) 비율 3개를 연결 시키면 16, 20, ...., 54 까지 7개의 숫자를 얻는다.  이제 한 옥타브에 집어 넣기위해 (24~ 48) 그것을 2를 곱하거나 2로 나눈다. (한 옥타브는 같은 가족이라고 했다) 그려면 24~48 사이에 있는 7개의 주파수가 나올 것이다. 이제 그것을 크기 순으로 다시 정렬한다.
20130826013405
그 숫자들이 곧 도레미파솔라시인 것이다. 여기서 잠시 눈여겨 볼것이 있다. "레"는 "도"보다 9/8 만큼 크다. 사실 온음이 다 같은차이는 아니고 9/8, 또는 10/9 다 (물론 바하가 창시한 현재 음계는 두개가 같다. 아주 이상한 숫자 만큼..) 그런데 미-파, 시-도 사이는 16/15 로 좀 작다. 반음이다. 정확히 말하면 "반"음은 아니다. 이것들은 나중에 바하라는 사람이 평균율 이라는 이름으로 재정비 된다. 정확히 반음, 정확히 온음을 지키는 음계로..각 반음의 비율은 정확히 2^(1/12) = 1.05946..... 만큼.  수학의 로그라는것을 좀 알아야 한다.  공부해라 이것들아..

PS: 실로폰을 직접만들고 싶다면.. 주파수는 길이에 반비례한다는 것도 참고..

2013년 11월 28일 목요일

수학이야기 시리즈를 시작하며,,

언제부터인가 취미로 수학사 및 수학자들 이야기를 읽으면서 한번은 정리해야 겠다고 생각은 했었는데 쉽지가 않았다. 이차 저차 친구들이 아이들용 이야기수학 부탁도 있고해서 전문가는 아니지만 틈틈히 시간나는데로 정리해 보려고 한다.
나 자신은 직접적인 수학전공자는 아니지만 전공상 수학 주변을 어슬렁 거렸기에 일부 영역은 구경꾼 정도는 된다.
모든것이 그렇듯 직업이 되면 힘든 법이다. 야구장에 야구하러 가는 선수도 있고, 또 그들이 경기하는걸 보러가는 관중도 있다. 철저하게 관중의 입장에서 가벼운 글로 간다. 오류가 많을텐데 과감한 지적 바란다.

2013년 8월 27일 화요일

고민 - 라즈베리파이

좌:아두이노 우:라즈베리파이

라즈베리파이로 이것저것 해 보다가 이게 참 고민이된다. 철저히 논다는 관점에서 보자면 일단

장점

  • 이더넷 포트가 있다. 아두이노는 인터넷 하려면 추가 비용이 들어간다.
  • 주변기기 확장을 위한 USB 호스트 기능. 와이파이나 블루투스 연결....
단점
  • 프로세서가 더 빠른거 같지만 실은 개발환경에서만 본다면 더 느리다. 아두이노는 일반 PC에서 개발이 이루어지고 라즈베리파이는 자체 OS 위에서 개발하기 때문에
  • 키보드, 마우스, 모니터(TV) 필요: 어찌되었건 처음 설정할때는 필요하다. 인터넷을 연결하고 셋업을 마치면 원격으로 제어는 할 수 있지만. 이 또한 답답하다. 프로그램 몇개 띄우면 프로세서 100% 게이지 자주 본다. 결국은 ssh를 통한 텍스트 기반의 콘솔창연결이 그나마 나은데... 여기까지 오면 전문가용 아닌가 싶다.
그외
  • 아두이노는 나올때 부터 활용도가 거의 정해진 반면, 라즈베리파이는 특별히 정해진 용도가 없다. 역으로 보면 그만큼 많다는 것이다. 개발 툴도 그 용도에 따라 엄청나게 많고. 많은게 좋을 수도 있지만 그만큼 혼란스럽기도 하다.
  • OS를 올리고 순수하게 소프트웨어적인 장난도 많이하는데... 그럴거면 차라리 스마트폰으로 노는게 더 재미있어 보인다. 물론 영역이 좀 다르긴 하지만..
결론
  • 초보자라면 라즈베리파이는 비추다. 어느정도 리눅스좀 만져보고 오는게 속 편할 것이다. 
  • 어느정도 아는 어른들의 지도가 필요해 보인다.
  • 진정 뼛속까지 공돌이가 되고 싶다면.. 이건 물건임이 분명하다.
그런데 영국 어린이들은 다 개발자? 커뮤니티 들어가면 초딩들이 머 했다고 자주 올라오는데..

그 답을 찾으면 갈길이 좀 명확해 지겠다..

어디까지나 아이들과 같이 놀자고 시작한 일이니깐...

2013년 8월 22일 목요일

Scratch for Arduino - S4A

오늘은 일전에 소개 했던 Scratch 4 Arduino (S4A) 에 대한 이야기다.

일단 Scratch 가 무엇인가. 위키에 따르면 MIT 미디어 랩의 "평생유치원 그룹" (Lifelong Kindergarten Group) 에서 2003년 내놓은 교육용 프로그래밍 언어이다. 이름에서 알 수 있듯 유치원 생도 즐기는 놀이다. 현재는 Web 기반으로 운영되는 듯하고  공유 및 토론이 활발하다.

여기에 기반을 두고 아두이노 용으로 수정한게 S4A 되시것다. 이것은 Citilab 이라는 유럽의 기업 (기관?) 인지 홈페이지 가보니 카탈로니아어로 되어 있다. 결정적으로 오늘 현재 이것을 개발한 팀의 홈페이지는 죽어 있고 얼마전부터 계속 그런걸 보니 더이상 유지는 안하는 모양이다. 겨우 그들의 흔적은 다른 곳에서 찾을수 있었다. 바로 Sourceforge.net 에서

http://sourceforge.net/projects/s4a/files/?source=dlp

에가면 4개의 파일이 있는데 첫번째 것 (pde 확장자)이 스케치 파일이고 나머지는 OS에 따른 개발 IDE이다.  우선 pde 파일을 받고 이것을 아두이노에 컴파일 하여 업로드 한다. 최신버전 IDE 에서는 아마 컴파일 에러가 날것이다. 아마 이부분에서 에러가 날것인데..

  Serial.print( B10000000
                 | ((sensor & B1111)<<3 i="">
                 | ((value>>7) & B111),
                BYTE);
  Serial.print( value & B1111111, BYTE);

이것을 다음과 같이 바꾸면 될것이다.

  Serial.write( B10000000
                 | ((sensor & B1111)<<3 font="">
                 | ((value>>7) & B111));
  Serial.write( value & B1111111);

업로드가 끝나면 아두이노 IDE를 종료한다. 안그러면 나중에 S4A 에서 통신포트가 충돌한다는 메시지를 볼것이다. 이제 S4A IDE를 다운받아 설치한다. 그리고 프로그램을 실행하면 자동으로 아두이노를 찾을것이다. (아두이노 Duemilanove 모델 기반이나 UNO 모델에서도 작동한다. 다른 모델을 테스트 안해서 잘 모르겠다).




개발환경은 이리 생겼다. Appinventor 에서 했듯이 조각들을 끌어다가 맞추고 살짝 변경만 해주면 된다. 테스트 용으로



깃발을 클릭하면 내장된 13번핀의 LED를 켜고있다가 스페이스키를 누르면 2초간 끄는 프로그램이다. 그외 여러가지 조각들이 있으니 테스트해 보길 바라고

결정적으로 이게 쉽긴한데 치명적인 약점이 있다. S4A 가 스케치 (프로그램)을 심는 도구가 아니라 단순히 아두이노와 PC의 직렬통신에 의해 작동한다는 것. (아까 아두이노에 심은 프로그램이 양방향 신호을 분석하고 이에 맞는 대응을 해주는 것이다.) 그러므로 아두이노 단독으로는 아무것도 못하고. 무선연결도 안되니 움직이는 장난감은 포기하는것이 좋을듯..

그냥 Scratch의 다른 기능 (주로 게임 디자인) 사용시 무대효과 만드는 정도 라면 너무 과소 평가인가?  그래도 이정도 쉬운것에 대한 가치는 인정해 주어야 한다.

아마이것이 아두이노의 마지막글이 될듯 싶다. 레오나르도 보드가 약간 끌리는데 그놈은 HID 입력장치로 쓸수가 있다. 마우스나 키보드 같은거.. 만약 하게되면 추가로 올리겠다.

또다른 이유는 바로 이놈 때문


라즈베리파이 (RaspberryPi). 미국에서 발매 첫날 완판되었다는 그놈. 영국 태생이라 그런지 영국 아동들의 커뮤니티가 제법 크다. 아두이노와 양대산맥을 이루고 있는 놈. 둘의 교집합이 많으나 다른 면도 많다. 일단 이놈은 빠르고, 그냥 PC 본체로 보면 되겠다. OS도 올릴 수 있고..  이미지처리 쪽은 아두이노의 한계가 있는데 이놈은 된다.

2013년 8월 21일 수요일

C# 을 이용하여 PC-아두이노 통신

날도 덥고...
이번편은 짧게 간다. 그리고 약간 공돌이 맛이 들어간다.

대세는 모바일이고 스마트폰이긴 한데.. 그래도 간혹 PC와 연동해서 작업을 좀 해야 될때가 있다. 여러가지 루트가 있지만 오늘은 그냥 아두이노를 USB 포트에 꼽으면 기본으로 작동하는 시리얼 통신을 이용하기로하고 개발툴도 오랜 벗(?)인 마이크로 소프트사의 C#을 이용해 보겠다.

사실 스마트폰과 아두이노간의 유선연결도 가능하다. 구글의 ADK 를 이용하거나 아니면 OTG 케이블 사서 일반 아두이노와 스마트폰 연결 시키면 되는데... 
일단 구글 ADK 표준 Kit는 비싸고 개발 IDE도 어렵다..(AppInventor 에 연결할수 있는 블럭이 없다) 차라리 아두이노에 블루투스 모듈이 기본 옵션으로 장착되어있는 모델이 나오는게 좋을듯도 보이는데. 그러면 또 부품 조립하면서 이해하는 맛이 떨어지기도 하고.. 아뭏든 스마트폰과 아두이노의 유선 연결 방식은 매력이 많이 떨어진다.


1. 일단 아두이노 스케치

/* 
Arduino and C# communication
*/
void setup()  
{                
  pinMode(13, OUTPUT);
  Serial.begin(9600);  
}

void loop()                    
{
  if(Serial.available())
  {
    int c = Serial.read();
    if (c == '1')
    {    
      digitalWrite(13,HIGH);
    }
    else if (c == '0')
    {
      digitalWrite(13,LOW);
    }
  }
}

별 다른거 없다. 일단 컴파일하고 업로드 한다.



2. PC 프로그램

이것도 초간단 버전으로 간다. 일단 Windows Form 기반이다. 버튼 2개를 만들어 적당한 이름주고 .. 반드시 serialPort 컴포넌트도 넣는다..



그리고 소스에디터 화면으로 넘어와서..

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM6"; //실제 연결된 포트 확인해서
            serialPort1.BaudRate = 9600;
            serialPort1.Open();            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Button ON
            serialPort1.Write("1");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Button OFF
            serialPort1.Write("0");
        }
    }
}

이리 정리해주고 실행해 본다. 





아두이노에서 신호를 받아 PC에서 분석을 해야할 일이 우리 공돌이들한테는 더 많을지 모르겠는데..  그건 각자 알아서 하시고...

그리고 아두이노 여러모델 중 어떤걸 선택할지 고민하시는분.. 여기 사이트 강추..
기술적인 내용도 많고..

2013년 8월 11일 일요일

앱인벤터로 나만의 리모컨을 만들어 본다

(쓰는 중간에 쭉 이 글을 보니 좀 어렵게 보인다. 사실 내용은 어렵지 않은건데.. 미안하지만 인내심을 가지고 읽어 주길 바란다.)

이전 글에 이미 이클립스 환경에서 리모컨을 만드는걸 소개 했었다. 사실 처음부터 코딩한거는 아니고 인터넷에 공개된 소스를 살짝 바꾼 정도 였다. 이번에는 같은 기능을 하는 리모컨을 앱인벤터를 이용해 만들어 보기로 한다. 우선 들어가기 전에, 앱인벤터의 한계가 있다.

  • 버튼 이벤트는 click 과 longclick 두개 밖에 없다. 계속 누르고 있는 상태라든가 더블클릭이라던가 등등 이런걸 구현 못한다. 무엇보다 버튼을 누르고 있는상태에서 계속 신호를 전달을 할 이벤트가 없다는게 아쉽다.
  • 그외 여러가지 고급 기능인데.....
그래도 어딘가 공짜에 쉽다는데 이 정도는 감수하고 그런 범위에서 만들어 본다. 우선 



앱인벤터를 열고 새로운 프로젝트를 만든다. 이름은 알아서 주고.. 위와 같이 

  • ListPicker 1개 (블루투스 연결)
  • 버튼 컴포넌트 3개 (블루투스 끊기, 전진, 후진)
  • 예비용 Label 1개
  • 블루투스 클라이언트 컴포넌트: BluetoothClient
  • 기울기(자이로) 센서: OrientationSensor  
  • 그리고 Screen 1의 속성을로 가서 "ScreenOrientation" 을 꼭 Portrait 로 해준다. 나중에 폰을 마구 기울일 때 화면이 세로-가로  자동 전환을 방지 하기 위해서..
를 추가한다. 그리고 버튼은 전번 편에 했던것 처럼 적당한 크기로 늘려준다. "블루투스 연결"은 버튼이 아니고 "리스트피커" 임을 다시한번 상기하라..

블럭에디터를 열기 전에 우선 작전을 짜자. 앞에서 말한 버튼은 클릭 이벤트만 있으니 잘하면 옜날 오락실에 있는 올림픽 게임처럼 버튼을 번개같은 속도로 눌러주어야만 차가 전진하는 상황이 올 수도 있다. 메인신호 생성은 버튼은 안되겠다. 그렇담 남은건 기울기센서인데.. 다행히

센서 값이 변하면 발생하는 이벤트가 있다. 여기서 roll 값이 좌우 변화 값이다. (참고로 pitch는 전후, azimuth는 동서남북 방위각). 기울이기만 하면 실행된다는 얘기다. 여기에 전진/후진 정보를 더하면 되겠다. 아무래도 클릭 이벤트 보다는


GotFocus, LostFocus 이벤트를 이용하는게 낳아 보인다. 그리고 무엇보다 중요한 "지금 가진것과 앞으로 얻어야하는 것" 사이의 관계 설정


앗.. 얻어야 할게 더 많다. 이 말은 먼가 더 필요하다는 말인데.. 이게 다 버튼이 눌러진 상태에 대한 이벤트가 없어서다. 할수 없다. 얻을것 중에 3개를 포기하던지.. 가진것을 늘리던지 해야지... 이왕이면 가진걸 늘리도록 한다. 이전 이클립스 버전에는 없는 "pitch" 정보를 이용하면 간단하게 9개 조합의 신호가 만들어 지겠다. (좌우 기울임은 Roll, 전후 기울임은 Pitch 라고 한다). 그럼 전/후 버튼은 필요 없는데?? 그렇다 과감히 지우자. 그래도 허전히니 하나정도 남겨서 긴급버튼으로 쓰자.. 어떠한 상황에서도 누르면 자동차가 서는 것으로... 
일단 블록에디터를 닫자. 그리고 후진 버튼은 지우고 전진 버튼은 이름을 바꿔준다. 


비상정지 버튼은 나중에 블록에디터에서 비장정지해제 와 토글 버튼으로 쓰기로 하다. 블록에디터를 다시 열고 
  • 기울기 센서의 중앙값 (평평한 것으로 인정 하는 범위)를 정하자. 일단 15도 이내면 평평한 것으로 하자. 나중에 테스트 해보고 이 값은 조절하면 된다.
이제
  • 전후: -1, 0, 1
  • 좌우: -1, 0, 1
에서 총 9가지의 신호를 만들어 낼수 있는데.. 이것을 어떤 방식으로 차에 전달하나.. (-1,1) 같이 2개의 신호 조합 그대로?? 아니면 9가지 모두에 대해 각각 구분할 수 있는 1에서 9까지의 숫자를 할당? 당연히 후자.. 근데 그 할당하는 방법을 조금만 신경쓰면 더 쉽다.. 일단 컴퓨터는 (-)값을 별로 안좋아 하니 이렇게 해보자...
  • 전후 신호: 평평=0,  전진=1, 후진=2
  • 좌우 신호: 평평=0,  좌로=4, 우로=8
윗줄 아랫줄 더해보면 합이 0에서 10 까지 나오고 3,7 만 빠져 있다. 만약에 합이 5라면 (1,4) 경우밖에 없다. 다른 것도 해보면 마찬가지.. 즉 일대일 함수가 나오는 거다.. 이제 각각의 기울기 신호를 더해서 보내기만 하면 받는 쪽에서 쉽게 해독이 가능하다.. 조금더 수고스럽겠지만 이합에 다시 33을 더하자.. ASCII 코드라는게 있는데.. 33번부터가 사람이 알아볼수 있는 문자다. 33번은 ! (느낌표). 이리하면 나중에 프로그래밍 도중에도 쉽게 잘되고 있는지 확인할 수 있다.


일단 앱이 시작되면 스마트폰에 블루투스로 페어링된 장치의 리스트를 준비한다. 앱을 실행시키기 전에 미리 페어링 해 놓아야 한다는 점이 이전 버전과 다르다. 그리고 이 리스트피커 컴포넌트에는 클릭 이벤트가 없다. 대신 AfterPicking 이라는 이벤트가 있는데 "장치를 선택하면..." 이라는 뜻이니 보통 버튼의 클릭 이벤트로 보면 되겠다. 


위와 같이 선택이 된 장치를 연결 시켜 준다. 그리고 바로 끊기 기능를 만든다. 이런 절차는 습관을 들이는게 좋다. 열고-닫고, 연결-해제,....



여기서 재미있는 것 발견.. 지금 까지 하다보면 블록들의 모양이나 색깔에서 어떤 힌트를 얻을 수 있는데.. 블럭 왼쪽 끝이 튀어나오는 건 결과 값이 있으니 그것과 같이 사용하라는 거고, 오목한 부분은 연결해서 입력으로 사용할 값이 있다는 것이다. 그런데 BluetoothClient1.Connect 블록을 보면 왼쪽이 튀어나오고 동시에 오른쪽이 오목하다. 입력이 필요하고 결과 값도 연결해서 사용하라는 거다. 한편 초록색 블럭은 왼쪽에 뛰어나온 블럭들을 사용할 수 없게 되어있다. 제대로 쓰려면 연결에 성공했는지 실패 했는지 구분해서 쓰라는 얘기인데... 그런건 나중에 하기로하고... Built-in 의 Definition 메뉴에 가보면 이름없는 블록이 있다.. 그건 결과 값에 상관없이 실행하라는 얘긴데 우리는 우선 그걸 쓰기로 한다. 그래서 위의 모양이 나왔다..

본격적인 구조를 짜기 전에 변수 2개를 만들자..

  • 하나는 비상정지 버튼을 토글키로 활용하기 위해 현재 값을 저장
  • 다른 하나는 실제로 블루투스로 전달할 값을 위해
"Built-in" - "Definition" 가면 def Variable 블럭이 보이는데 그걸 끌어다 놓으면된다. 그리고 습관적으로 초기값을 넣어준다. 즉 emstop 에 false 를 rcvalue에 0을 일단 지정한다.


이렇게 하고 "My Blocks" - "My Definition" 에 가보면 방금 생성한 변수 (전역) 및 자동으로 생성된 변수 들이 보이고 그것들에 대한 활용 가능한 블록도 보일 것이다.



비상 정지 버튼 토글키 만들기 

우선 쉬운 비상 정지 버튼 토글키를 만든다. 버튼 클릭을 활용한다. 한번 누르면 비상정지, 다시 누르면 해제..... 반복키다. 
  • 버튼이 눌리면 우선 현재 상태를 바꾼다.
  • 바꾼 현재 상태에 대한 버튼 글자를 바꾼다
  • 즉 바뀐 값(현재 값) 이 비상사태 (emstop = true) 이면 다음 입력은 비상 해제가 되어야 하므로 "Release..." 를 화면에 뿌리고.. 현재가 false라면 다음 입력은 비상이 되어야 하므로 "EM STOP" 를 뿌린다. 한글이 제대로 지원이 안되서 영어로
  • 그리고 not 블록이 보이는데 생각한대로 현재값을 true-false 사이에서 바꾸는 역할을 하는 블록이다.


기울기 센서값을 읽어들여 블루투스로 송신하기

이것도 사전 작전을 짜자
  • (+)(-) 15도 이내는 평평, 그 외 값은 전/후, 좌/우 에 할당한다.
  • 전/후: Pitch 값이다. 폰을 세로로 놓고 정상적으로 볼때 폰의 상단을 아래로 내리는 방향이 (+) 값이다
  • 좌/우: Roll 값이다. 왼쪽을 내리는게 (+) 값이다.
  • 센서값 변화 이벤트가 발생하면 우선 전/후 값으로 rcvalue를  으로 만들고 , 좌우 값은 그것에 더하기로 한다. 마지막으로 33을 더해준다.
  • 그 값을 emstop 이 false 때 블루투스로 보내준다 (비상이 아닐 경우)



위와 같은 메인 블록이 완성됬다. 사실 보기엔 좀 어지러운 느낌이 든다. 이직 if-elseif 중첩 블록이 한가지 경우 밖에 지원을 못해서 보기에도 한눈에 들어오지 않는다. 이런건 언어 문제와 함께 우선 개선 되었으면 한다.

이제 완성이 되었으니 스마트폰으로 옮겨보자.  DropBox를 이용해 보기로한다. 우선 앱인벤터가 실행되고 있는 웹브라우저로 와서 "Package to Phone" - "Download to this Computer"를 선택하면 apk 파일로 다운이 될것이다. 그것을 Dropbox 로 옮기고, 이제 스마트폰에 가서 Dropbox의 그 파일을 터치하면 앱이 설치되고 실행이 될것이다.

이제 본격적으로 테스트 해보자. 아 뿔사 자동차가 분해되고 없다. 아두이노를 다른곳에 쓴다고 분해 해 놓고 !! 그래도 다른 방법이 있다. 그냥 PC 나 노트북의 블루투스를 이용해서 들어오는 신호만 보면 되는거지 머... 시리얼 포트를 통해 들어오는 신호를 화면에 뿌려주는 프로그램 찾아 보면 많다. 윈도우용으로 "SerialPort Listner" 를 추천. 소스도 있으니 구경도 한번 하시고.. (개인적으론 이런 소스까지 공개된걸 좋아한다. 바이러스로 부터 많이 안심이 되기도 하고..)

http://www.codeproject.com/Articles/75770/Basic-serial-port-listening-application



블루투스 페어링 하고 테스트 해보니 대충 작동은 하는것으로 보인다. 느낌표 (!) 부터 시작되는 문자들이 화면에 찍히는걸 보니..

여기까지 따라해 보았다면 프로그램에 작동은 하되 고쳐야 할 것 많이 있는걸 화면에서 스스로 보게 될 것이다. 앱 시작하자 뜨는 경고창 등 .... 그것들은 숙제다. 각자 스스로 고쳐보길 바란다. (참고로 블루투스가 연결도 안되었는데.. 기울기 센서에서 신호를 보내니 경고가 뜨는 것이다..)

따라하기 좋은 지침서가 있는데, 저작권이 어찌되는지 불문명하지만 어쨌든 저자의 홈페이지에 있는 링크 소개하면서 마친다.

http://cs.usfca.edu/~wolber/appinventor/appinv_0331.pdf



ps: 숙제에 대한 정답은 다음 편에 올릴려다가.. 너무 짜증나는 에러라.. 일단 이것부터 고치자.. 아래 그림을 참고하여 고쳐보길 바란다. 나머지 소소한 사항은 진짜 숙제다..


ps2: 전체 프로그램




2013년 7월 27일 토요일

AppInventor 그리고 음성인식 명령

2013. 11. 5 추가: 오프라인 버전으로 소스포지에 AiLiveComplete 가 있네요.  http://sourceforge.net/projects/ailivecomplete/


날씨도 더워지고 주말엔 게을러 지고... 진행이 더디다. 그래도 천천히 진도 나간다.. 오늘은 안드로이드 폰에서 음성인식 기능으로 장난을 좀 치려고 한다.

머시여.. 안드로이드도 벅찬디.. 음성인식이라고?? 

자고로 그놈의 생각의 벽이란. 평생 동안 자신을 규명하기 위해 이리저리 쌓아올린 사고 체계가 어느 날 보니 스스로를 안에 가두는 견고한 벽이라는 생각이 들 때가 있다. 얘기가 또 새려고 한다.. 거두 절미하고 일단 AppInventor로 시작해보자. 나도 처음 사용하는 것이니 완벽하지는 않겠지만, 그래도 사상 최초로 앱을 만드는 동시에 블로깅 질을 해본다는데 의미를 둔다.

일단 appinventor.mit.edu 접속 해서 개발 환경을 꾸민다. http://appinventor.mit.edu/explore/setup-mit-app-inventor.html 참조 .  나는 USB를 통한 안드로이드 연결 방식을 선택하고 설치하였다. 당연히 인터넷은 연결되어 있어야 하고.. 구글 계정도 필요하다.. 일단 모든게 그렇듯 시작전에 둘러 보기를 한다. (불행히도 영어라 애들이 초반부터 좀 달아나게 생겼다..)



이리 저리 둘러 보고 나서.. 본격 적으로 시작해보자. 일단 구글 계정으로 로그인하면 첫페이지가 나오는데 My Project - New 를 눌러 새로운 프로젝트 명을 만든다. (나는 Moon01)

그러면 다음과 같이 Screen1 이라는 컴포넌트가 자동으로 생성되고 제법 스마트폰 화면 같은게 나온다.. 오늘은 여기에 음성 명령을 받아서 받은 색깔로 화면을 칠해 보는 간단한 장난을 해보려 한다.

일단 Basic - Button  과 Other stuff - SpeechRecognizer  를 추가한다. 드래그 엔드 드롭으로 실행 가능하다.


이리하면 스크린에 보이는 버튼과 보이지 않는 음성인식 컴포넌드가 생성된다. 버튼의 속성들을 잘 둘러보기 바란다. 나중에 저 버튼의 Background Color를 음성을 통에 바꿀거니.. 그리고 버튼의 크기도 조절가능한데.. 크게 보기 위해 맨 마지막에 있는 Width 를 Fill parent,  Height 를 200 pixels 정도로 바꾼다. 그리고 머라고 말하는지 그대로 출력해줄 Label 컴포넌트도 추가.. 그리고 Save 눌러 저장 하고 이제 대망의...

  • 안드로이드 (내껀 넥서스7 OS ver 4.2.2)를 USB에 연결하고. 당연한 얘기지만 안드로이드 기기는 개발자 모드 허용해 놔야 함.. 
  • 우측 상단 Open the Blocks Editor를 클릭



경고창이 뜨고 확인- 다운로드후-클릭하면 자바가 실행되면서 블락 에디터 화면 등장. 여기서 디바이스 연결을 시도 했으나 실패 !!!


이게 먼일인가 하고 다시 앱벤터 홈페이지에 가서 설치 가이드를 꼼꼼이 본다. 이런 젠장 os ver 4.2.2 이후로는 새론운 adb.exe 를 이용해야 한단다.  http://appinventor.mit.edu/explore/content/setup-device-usb.html
새로운 파일로 바꾸고 나니 비로소 연결이 된다. 이때 안드로이드 기기에서도 메시지 창이 뜨니 확인 눌러준다.
이 그림에는 Label 컴포넌트가 빠져있는데 대세에 상관없으므로 패스
음성인식율이 좋지않아 나중에 확인 목적으로 Label을 추가 함. 


항상 그렇듯 이거저거 마구 눌러 본다. 그러다보니 My Blocks 에 아까 만들어논 컴포넌트와 이것으로 무언가 할 수 있는 조각들이 보인다. 이게 중요하다. 천천히 바라고보 무엇을 하는건지 어떻게 하는건지 생각해볼 필요가 있다. 그래도 안되면 아까 홈페이지에 가서 여러가지 예제도 보고 또 바라본다. 이건 어쩔수 없다 무한루프다 될때까지.. 조각들의 기능을 모르고는 작전을 못짠다. 또 다 알고 있다치더라도 적절한 전략을 구사하지 않으면 원하는 기능에 도달 못한다. 그건 모든 프로그래밍 언어가 같다. 자기가 원하는 기능에 대한 논리에 오류가 없어야 하고 또 현실적으로 그것을 구현할 언어도 알아야 한다. 

그리고 나서 우리가 해야할 것에 대한 구체적 작전을 짠다. 이건 레고 블럭과 흡사하다
  • 버튼을 누르면 음성을 받아들인다
  • 음성인식이 끝나면 버튼의 백그라운드 색을 바꾼다

조각들의 기능을 모르고는 작전을 못짠다. 또 다 알고 있다치더라도 적절한 전략을 구사하지 않으면 원하는 기능에 도달 못한다. 그건 모든 프로그래밍 언어가 같다. 자기가 원하는 기능에 대한 논리에 오류가 없어야 하고 또 현실적으로 그것을 구현할 언어도 알아야 한다. 

My Blocks 와 Built-In 메뉴를 왔다 갔다 하면서 조각을  조립해 본다.



여기서 문제가 발생... 한국어 음성 지원을 하기 때문에 왠만한 발음은 한국어 우선으로 인식되기 쉽다(실제로 삽질은 많이 함). 그런데 블락 입력은 한글를 지원 안하니... 그래도 미친척하고 노트패드에서 글자를 쳐서 강제로 복사-붙여 넣기 해보았다.. 위 그림의 네모난 글자는  "빨강", "파랑" 이다.

완성되면 여기서도 Save를 눌러주고 브라우저 개발창으로 돌아와서 block editor 열기 메뉴 옆에 있는 "Package for Phone - Download to Connected Phone" 을 눌러 폰으로 프로그램을 전송하고 즐기기...




영상에서 보다 시피 아직은 음성인식에 아쉬움이 있다. (노랑은 코드에 안심어 논거니 당연히 안되고..ㅎㅎ)  "파랑"을 "사랑"으로 인식하기도 한다. 그러니 영어 발음은 오죽하겠는가? 그래도 이 정도의 범위에서 여러가지 재미있게 이용할 수 있는 방법은 많아 보인다.

ps1:
글 올리고 몇 가지 추가로 살펴보니 굳이 스마트폰을 직접 연결 안하고도 테스트가 가능해 보인다. Package for Phone 메뉴에서 "PC로 다운로드" 하면 apk로 저장되는데.. 그걸 dropbox 등에 올려서 설치하는게 훨씬 수월하다. 친구들과 공유도 가능하고..



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