2012년 5월 31일 목요일

모스 부호(Morse Code) 발생기

영화에서 보면 구조신호를 꼭 모스 부호로 보내는데..
정작 모스 부호가 어떻게 생겼는지 몰랐다가
최근에 K5 자동차 광고에 나오는 음이 K5의 모스 부호라는 걸 알고
다시 궁금증을 가지게 되었다.
그리고 SOS 정도 알아 두면 도움이 되지 않을까 하는 생각도... ㅎㅎ
아두이노 관련 샘플을 찾다 보니
모스 부호가 라이브러리로 만들어져 있는게 몇개 있었는데..
그 중에서도 코드가 직관적인게 있어서 사용해 봤는데.. 좋아~

출처 : http://www.scribd.com/doc/88533779/Arduino-Generateur-Code-Morse-A-Quick-Start-Guide

위에 링크에서 찾아서 라이브러리 파일로 만드는데 이상하게 엔터가 제대로 안되어 있고 코드가 다 붙어 있어서 정리하는데 좀 귀찮았다.

//telegraph.h


#ifndef __TELEGRAPH_H__

#define __TELEGRAPH_H__

class Telegraph {

public:

 Telegraph(const int output_pin, const int dit_length);

 void send_message(const char* message);

private:

 void dit();

 void dah();

 void output_code(const char* code);

 void output_symbol(const int length);

 int _output_pin;

 int _dit_length;

 int _dah_length;

};

#endif


//telegraph.cpp


#include <ctype.h>

//arduino 1.0에서는 #include "WProgram.h"을 이렇게 바꿔줘야 컴파일 에러가 안남

#if defined(ARDUINO) && ARDUINO >= 100  

#include "Arduino.h"

#else  

#include "WProgram.h"  

#include <pins_arduino.h>

#endif

#include <telegraph.h>



char* LETTERS[] = {  

".-","-...","-.-.","-..",".",// A-E  

"..-.","--.","....","..",".---",// F-J 

"-.-",".-..","--","-.","---",// K-O  

".--.","--.-",".-.","...","-",// P-T  

"..-","...-",".--","-..-","-.--",// U-Y 

"--.."// Z

};

char* DIGITS[] = {  

"-----",".----","..---","...--",// 0-3  

"....-",".....","-....","--...",// 4-7 

"---..","----."// 8-9

};



Telegraph::Telegraph(const int output_pin, const int dit_length)

{  

_output_pin = output_pin; 

_dit_length = dit_length;  

_dah_length = dit_length*3;  

pinMode(_output_pin, OUTPUT);

}



void Telegraph::output_code(const char* code)

{  

for (int i = 0; i < strlen(code); i++)  

{             

if (code[i] == '.')   

dit();       

else   

dah(); 

}

}



void Telegraph::dit()

{  

Serial.print(".");  

output_symbol(_dit_length);

}



void Telegraph::dah()

{ 

Serial.print("-");  

output_symbol(_dah_length);

}



void Telegraph::output_symbol(const int length)

{ 

digitalWrite(_output_pin, HIGH);  

delay(length);  

digitalWrite(_output_pin, LOW);

}



void Telegraph::send_message(const char* message)

{  

for (int i = 0; i < strlen(message); i++)  

{   

const char current_char = toupper(message[i]);    

if(isalpha(current_char))    

{     

output_code(LETTERS[current_char - 'A']);     

delay(_dah_length);    

}    

else if(isdigit(current_char))    

{     

output_code(DIGITS[current_char - '0']);     

delay(_dah_length);    

}    

else if(current_char == ' ')    

{     

Serial.print(" ");     

delay(_dit_length * 7);    

}  

}        

Serial.println();

}





이걸 arduino-1.0-windows\arduino-1.0\libraries 폴더에 Telegraph 라는 폴더를 만들어서 넣어 놓는다.


#include "telegraph.h"



const unsigned int OUTPUT_PIN = 13;

const unsigned int DIT_LENGTH = 200;



Telegraph telegraph(OUTPUT_PIN, DIT_LENGTH);



void setup()

{}



void loop()

{

telegraph.send_message("SOS");

delay(5000);

}



13번 핀에 LED가 있는 보드는 SOS 신호에 맞게 반짝이는걸 볼 수 있을 것이다.
스피커를 연결하면 소리를 들을 수 있으니 더 확실할 듯..

또 다른 예제로 모스부호 발생기이다.


#include "telegraph.h"



const unsigned int OUTPUT_PIN = 13;

const unsigned int DIT_LENGTH = 200;

const unsigned int MAX_MESSAGE_LEN = 128;

const unsigned int BAUD_RATE = 9600;

const int LINE_FEED = 13;



char message_text[MAX_MESSAGE_LEN];

int index = 0;



Telegraph telegraph(OUTPUT_PIN, DIT_LENGTH);



void setup()

{

Serial.begin(BAUD_RATE);

}



void loop()

{

if (Serial.available() > 0)

{

 int current_char = Serial.read();

 if (current_char == LINE_FEED || index == MAX_MESSAGE_LEN - 1)

 {

   message_text[index] = 0;

   index = 0;

   telegraph.send_message(message_text);

 }

 else

 {

   message_text[index++] = current_char;

 }

 }

 }


Serial Monitor에서 문자를 보내면 그걸 아두이노 보드에서 모스부호로 표시해 준다.


2012년 5월 18일 금요일

Eagle CAD : Schematics

http://www.sparkfun.com/tutorials/108

sparkfun.com의 tutorial를 따로해 보기로 했다.
먼저 준비할게 네가지가 있는데

첫째, Eagle CAD는 설치했으니 패스하고

둘째, SparkFun Eagle Library 를 다운 받아서 Eagle\lbr 디렉토리에 압축 풀어서 넣으란다.

셋째, Eagle keyboard shortcuts 을 다운 받아서 Eagle\scr 디렉토리에 파일을 넣으면 된다.
        이때 주의할 점은 scr 확장자가 바이러스가 많이 쓰는 확장자라 txt로 바꿔서 내용을  
        확인후 집어 넣으란다.

넷째, CAM file 을 다운 받아서 Eagle\cam 디렉토리에 파일을 넣는데 이건 PCB 제조 업체에 보낼 gerber 파일 생성에 영향을 준다.( 사실 CAM 파일은 PCB 제조업체에따라 변경이 필요하다. 제조업체에서 자기에 맞게 파일을 제공하기도 한다.)

이제 Schematics 사용법을 배우기 위해 간단한 브레크아웃 보드를 만들어 보고자 한다.
Eagle CAD를 실행하면 Control Panel이라는 화면이 뜬다.
Control Panel 의 File>New>Project 에서 프로젝트를 FT232-Breakout 라는 이름으로 새로 만든다.

이 만들어진 폴더에서 마우스 우클릭하여 New>Schematic 를 선택하면 Schematic 편집화면이 열린다. 여기서 왼쪽 아이콘 중에서 ADD 를 선택하여 부품 ADD창이 뜬다.
여기서 부품명으로 검색해서 추가하면 된다. 만약에 검색이 안되면 Library 마다 일일이 찾아야 할 경우도 있다. 주의할 점은 오른쪽 아래 Drop 버튼은 누르지 말아야 한다. 이건 그 라이브러리를 사용하지 않겠다는 의미이다. 나중에 Control Panel에서 다시 Use를 선택하여 사용 가능하게 할 수는 있다.


이 창에서 OK를 누르면 Schematic 편집화면에 부품이 나타날 것이다.  클릭할때마다 부품이 계속 생기니 중단하고 싶으면 Esc키를 누른다.

이제 나머지 부품들을 같은 방법으로 추가한다. 부품 위치에 맞게 적당히 회전시킨다.
그리고, 먼저 저장을 한다.
쨔쨘~ 너무 많이 진행되었나? ㅎㅎ 반복적인 부분이고 간단해서 무리가 없을 듯 해서 넘어간다.

콘덴서나 코일은 SparkFun-Passives.lbr에 있고, USB는 SparkFun-Connectors.lbr에 있고, VCC, GND는 SparkFun-Aesthetics.lbr에 있다.
그리고, 4핀 커넥터는 당연히 SparkFun-Connectors.lbr에 있다.

여기서 주의할 점은 FT232RL의 1번핀인 TXD와 4핀 커넥터와 연결을 시켜야 하는데 화면을 가로 질러 일일이 Wire를 그려 줄 필요는 없다. 아래 이미지에서 보이듯 Net (단축키 F9)을 선택해서 Wire 그리는 것과 똑같이 선을 조금만 그려준다. 그리고, Label (단축키 Alt+F9)을 선택해서 그린 Net를 선택하면 이미지처럼 N$4와 같은 디폴트 이름이 나타난다.
이것을 Name (단축키 F4)을 선택해서 이름을 TX로 변경한다. 똑같이 5번핀도 작업하고 RX로 이름을 변경한다.
아래 4핀 커넥터도 같은 방법으로 작업을 하면 해당 이름으로 연결된다는 메세지창이 뜨는데 확인하며 진행한다.

상단 메뉴바의 Board 아이콘을 선택하면 아래 이미지와 같이 나타난다. 이젠 PCB 레이아웃을 할 차례이다.


참고로 Schematic 편집화면의 왼쪽 메뉴에 대한 설명을 첨부한다. 귀찮아서 만들지 않고 sparkfun.com에 있는 이미지이다. 옛날 버전이지만 맨아래 2개 아이콘만 없고 똑같다.

Smash는 부품이름/값의 위치를 변경할 수 있다. Smash를 선택하고 부품을 선택하면 부품이름과 값에 십자(+) 표시가 나타나는데 거기서 마우스 우클릭하면 여러 팝업 메뉴가 나타나는데 거기서 Rotate를 선택하면 회전시킬 수 있다. 위에 이미지에 코일 L1 부품이름을 Smash로 회전시켜야 하는데 안했네. ㅎㅎ

2012년 5월 17일 목요일

Eagle CAD 설치 및 실행

아두이노관련 프로젝트를 할때 아두이노의 특징은 쉴드로 만들어서 모듈화 하려면 PCB도 만들 필요가 있을 것 같고 그러면 PCB를 만들수 있는 툴도 알아야 하기에 아두이노관련 프로젝트에서 주로 쓰는 Eagle CAD를 써보기로 했다.
파일 용량도 작고 기능제한이 있는 프리 버전도 충분히 쓸만한 기능을 제공한다.

#Eagle CAD 다운로드
아래의 링크에서 받으면 되고 현재 버전이 v6.2까지 나와 있다.
Window, Linux, Mac 모두 지원한다. 완전 조으다~ ^^
http://www.cadsoftusa.com/download-eagle/?language=en

#Freeware 제한사항
-. 보드 영역은 100 x 80mm(3.9 x 3.2인치)이다. 바깥에 부품을 놓을 수 없다.
    참고로 아두이노 우노 보드 크기가 2.7 x 2.1인치이다. 그러므로 문제없다.
-. 2 signal layers(Top과 Bottom)만 된다.
-. Schematic은 sheet 1개로만 구성될 수 있다.
-. 다른 프로젝트와 합치는 걸 지원하지 않는다.


#설치
Next를 계속 누르면 되고 마지막에 "Run as Freeware"를 선택하고 진행하면 된다.


#실행
처음 실행하면 먼저 디렉토리없으니 만들지 물어본다. 물론 "Yes"라고 하면 된다.

#PCB 제작 서비스업체
-. Fusion PCB Service 라고 해외인데 10개가 기본인데 $9.90 부터 시작한다.
무지싸고 $50 이상주문하면 배송도 꽁짜다.
http://www.seeedstudio.com/depot/fusion-pcb-service-p-835.html?cPath=185
Gerber 파일을 생성할 수 있는 Eagle CAD관련 디자인 룰 파일도 제공한다.
주문 방법은 다음에 자세히 다루도록 해야 겠다. 

2012년 5월 3일 목요일

아두이노 코딩 기초

1. 기본 구조는 setup() 함수와 loop() 함수 각각 하나로 구성되어 있다.

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly: 
  
}


2. setup 함수는 pin 설정을 하는 곳이고, loop 함수는 반복될 로직이 들어가는 곳이다.


3. 문법은 C언어에 충실한 것 같다. 기본적인 함수는 http://arduino.cc/en/Reference/HomePage 여기를 참조하고 특이하면서 자주 쓰는 함수를 보면..
    pinMode(pin, mode) : pin - 핀번호, mode - INPUT 또는 OUTPUT 으로 setup함수안에 설정
  digitalWrite(pin, value) : pin - 핀번호, valude - HIGH 또는 LOW로 loop함수안에서 사용
  digitalRead(pin) : pin - 핀번호로 loop함수안에서 사용


예제)

int ledPin = 13; // LED connected to digital pin 13
int inPin = 7;   // pushbutton connected to digital pin 7
int val = 0;     // variable to store the read value

void setup()
{
  pinMode(ledPin, OUTPUT);      // sets the digital pin 13 as output
  pinMode(inPin, INPUT);      // sets the digital pin 7 as input
}

void loop()
{
  val = digitalRead(inPin);   // read the input pin
  digitalWrite(ledPin, val);    // sets the LED to the button's value
}

아두이노 보드 체크

1. 먼저 개발툴을 다운 받는다. http://arduino.cc/en/Main/Software
    특히 윈도우 버전은 컴퓨터에 보드 연결하기전에 개발툴에 드라이버가 있으니 먼저 다운받을 필요가 있다. 다른 버전은 자동 인식한단다.

2. 보드를 컴퓨터 USB에 연결하면 보드를 인식하여 드라이버를 설치하라는 메세지가 뜰 것이다. 그때 먼저 압축을 풀어논 폴더에서 ...\arduino-1.0\drivers 를 지정하면 설치가 된다.

3. 이제 인식이 되었으면 제어판> 관리도구> 컴퓨터 관리 > 장치관리자 > 포트에 추가된 COMX 가 있을 것이다. (Windows XP 기준)

4. arduino.exe 를 실행한다. 아주 심플한 개발 IDE 화면이 뜰 것이다. 거기서 테스트할 간단한 예제를 연다. File > Example > 1.Basics > Blink. LED를 깜빡 거리게 하는 단순한 프로그램이다.

5. 보드를 선택한다. Tools > Board > Arduino Uno. 처음 설치했으면 선택되어 있을 수 있다.

6. 시리얼 포트를 선택한다. 전에 제어판에서 확인한 포트를 선택한다. 내경우엔 COM7이였지만 각자 틀릴수 있다. 하여튼 COM3 보다 큰 수일 것이다.

7. 이제 프로그램을 업로드해보자. 아이콘상에서 바로 선택할 수 있다. 그럼 잠시후 아래 상태바에 "Done uploading"이 표시될 것이다. 13번과 GND에 LED를 꽂아 보면 깜빡거리는 것을 확인 할 수 있다.

정말 심플하다. 그래서 아두이노를 비전공자들도 쉽게 쓰나 보다.

2012년 5월 1일 화요일

아두이노 관련 자료 조사


# 관련 사이트
-. http://cafe.naver.com/mpucafe : 운영자가 실력자면서 엄청 열성적이다. 공구도 자주해서 아두이노 보드와 관련 모듈을 싸게 살 수 있다. 아두이노외 다른 것도 다루는 카페
-. http://cafe.naver.com/arduinostory : 아두이노관련 카페
-. http://www.sparkfun.com/ : 외국사이트, 프로젝트 정보도 많음
-. http://arduino.cc/ : 아두이노 공식사이트, 개발툴은 여기서..
-. http://www.cadsoftusa.com/ : eagle CAD 사이트, PCB 관련 작업시 필요함, 무료버전도 충분히 쓸수 있다고 함
-. http://fritzing.org/ : 회로도를 그려서 문서화할때 편함, PCB도 만들수 있고 오픈소스임
-. http://www.povray.org/download/ : eagle CAD + 3D로 부품배치를 3D로 형상화하여 미리 확인가능
-, http://seaside.citilab.eu/scratch/downloads : arduino + scratch 로 그래픽적으로 코딩할 수 있는 환경

# 아두이노 보드 판매
아트로봇 : http://artrobot.co.kr/ -> 연구소 블로그를 운영하여 활용방법도 공유한다.
디바이스마트 : http://devicemart.co.kr -> 부품 판매하는 곳
IC뱅큐 : http://www.icbank.com/ -> PCB 제작 서비스도 제공한다.
엘레파츠 : http://www.eleparts.co.kr -> 부품이 제일 많이 있는듯 하다.
AVRTOOLS : http://avrtools.co.kr/
MAKEZONE : http://www.makezone.co.kr/ -> 아두이노 관련 보드 판매
플러그하우스 : http://plughouse.co.kr/shop/ -> 아두이노 공식 디스트리뷰터란다.