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관련 디자인 룰 파일도 제공한다.
주문 방법은 다음에 자세히 다루도록 해야 겠다.