2012년 11월 26일 월요일

Project > [MWOSDGPSShield] FPV 보드 설계

전에 설계한 MWNanoXBeeShield 보드와 연결되어 FPV를 할 수 있도록 만들었습니다.
OSD 회로는 mobiDrone OSD 회로를 참조하였습니다. 

A/V 송신기는 아래 링크의 5.8G 200mW 송신기를 연결할 수 있도록 하였습니다.
http://www.goodluckbuy.com/5-8g-200mw-wireless-av-transmitter-module5-8g-video-av-receiver-set-for-fpv-system.html

전에 글에서 말한 파워보드의 전원으로 송신기와 MPU 전원을 각각 사용합니다. 

GPS를 연결할 수 있는 공간이 있고 전류센서를 연결해서 사용할 수 있는 포트도 마련되어 있습니다.
물론 OSD에서 지원해줘야 화면에 나타나겠죠.

채널 설정은 보드 뒤에도 써놓긴 했는데, 간단히 말씀드리면 아래와 같습니다.
딥 스위치로 아래와 같이 설정하면 될 것 같습니다.

Channel selection
CH15865MHz
CH25845MHz
CH35825MHz
CH45805MHz
CH55785MHz
CH65765MHz
CH75745MHz
CH85725MHz




(Channel 1)Ch1 pin + Ch2 pin + Ch3 pin connect to ground
(Channel 2)Ch2 pin + Ch3 pin connect to ground
(Channel 3)Ch1 pin + Ch3 pin connect to ground
(Channel 4)Ch1 pin + Ch2 pin connect to ground
(Channel 5)Ch3 pin connect to ground
(Channel 6)Ch2 pin connect to ground
(Channel 7)Ch1 pin connect to ground
(Channel 8)no connect to ground DEFAULT




Project > [MWNanoXBeeShield] 멀티위 보드설계

Arduino Nano v3.0 보드를 장착하여 멀티위 콥터를 만들어 볼 수 있는 보드를 설계해 봤습니다. ( 참고로 MW는 MultiWii 의 약자입니다. ^^ )
요즘 Nano 보드 가격이 많이 내렸더군요. 나노 보드에는 USB 연결포트가 있어서 바로 프로그램을 올릴 수 도 있으니 편하겠죠.
그리고 여유 공간에는 XBee 를 꼽아서 사용할 수 있는 포트도 추가하였습니다.
활용도가 높아 지겠지요.
기본 장착센서는 MPU6050 칩입니다. 요새 멀티위에서 많이 사용하는 자이로 + 가속도 센서 통합형 칩이죠. 지자계나 고도계는 센서 보드 연결 포트를 마련해 두었습니다.

http://www.goodluckbuy.com/hmc5883l-bmp085-pressure-sensor-module-for-mwc-flight-control-board-.html

위에 링크에 나오는 센서 보드를 바로 연결할 수 있게 핀배열이 되어 있습니다. 여기서 고도계 센서는 BMP085 칩입니다.
그래서 MS5611 칩도 테스트 해보고 싶어서 이건 따로 센서보드를 만들어서 테스트해 볼 생각입니다.

다음에 소개할 FPV용 보드하고도 유기적으로 연결이 되도록 핀구성이 되어 있습니다.

그리고 MWPowerShield라고 명명한 파워보드는 ESC를 연결할때 배선을 최대한 적게하고
MicroCopter를 만들 생각을 한거라 위 아래로 프레임 다리를 잡아 주는 목적도 합니다. ^^
ESC는 BEC이 대부분 내장되어 있더군요.
그것을 최대한 활용할 수 있도록 파워보드에서 전원을 전부 각각 분리해 놨습니다.
그래서 예를 들자면 V1은 멀티위 전원용으로 V2는 RC 수신기 전원용으로 V3는 FPV MPU용으로 V4는 A/V 송신기용입니다.





2012년 7월 24일 화요일

ATmega168/328 아두이노 핀 맵핑

참조 : http://arduino.cc/en/Hacking/PinMapping168

ATmega168/328 을 직접 부트로더를 올려서 작업하려면 아두이노에서 보여지는 Analog 핀, Digital 핀이 어느 핀인지 많이 헤깔릴 경우가 있다.게다가 패키지 형태마다 핀번호가 틀리므로 추가로 32TQFP 패캐지 핀번호도 올려 본다.

ATmega8 pin mapping : http://arduino.cc/en/Hacking/PinMapping
ATmega2560 pin mapping : http://arduino.cc/en/Hacking/PinMapping2560



2012년 6월 29일 금요일

브레드 보드위에 아두이노 꾸미기

http://arduino.cc/en/Main/Standalone

위에 링크 설명대로 따라 하면 되는데 뒷부분에 부트로더를 ISP 프로그래머를 사용하는데 아두이노를 하는 분들은 ISP 프로그래머가 없는 경우가 많을 것이다. 그리고 브레드 보드에 연결할 변환보드도 귀하기 힘들다. 그래서 본 블로그의 아두이노에서 부트로더 굽기라는 내용을 참조하여 아두이노로 ISP기능을 구현하여 부트로더를 구우면 될 것이다.

아래 동영상은 Blink 예제를 올려 업로딩해 본 영상이다.


2012년 6월 18일 월요일

arduino로 부트로더 굽기

Arduino Duemilanove 보드를 가지고 있으면 아래 링크의 방법대로 하면 바로 부트 로더를 구을 수 있다고 한다.
http://arduino.cc/en/Tutorial/ArduinoToBreadboard

하지만 Arduino Uno 보드를 가진 사람은 Uno 보드의 auto reset 기능때문에 이 방법대로 할 수 없다고 한다.
Uno 보드에서 부트로더를 굽는 방법은 http://arduino.cc/en/Tutorial/ArduinoISP 에 따라 하면 되는데 먼저 arduino  메뉴의 File > Examples > ArduinoISP 스케치를 업로드한다.
그 후에 만약 외부클럭 없이 브레드 보드 상에 ATmega328/168 칩만 놓고 작업할려면 (16MHz의 외부클럭을 사용하면 메뉴의 Tools > Boards 메뉴에서 "Arduino Duemilanove or Nano w/ ATmega328" 를 선택한다.) 


http://arduino.cc/en/uploads/Tutorial/breadboard.zip 를 받아서 압축을 풀면 boards.txt 파일이 있는데 그 내용을 복사해서 arduino-1.0\hardware\arduino\boards.txt 파일(윈도우의 경우)의 제일 뒤에 첨부한다. 절대 파일에 덮어 쓰면 안된다. 그럼 아래와 같이 Tools > Boards 메뉴에 추가된다. 이제 "ATmega328 on a breadboard (8 MHz internal clock)" 를 선택한다.

그리고 위에 링크 설명처럼 Uno보드의 auto reset 기능을 막기 위해 reset 과 ground 사이에   10uF 캐패시터를 연결해 주던지, reset과 5V 사이에 120 ohm를 연결해준다.
직접 연결하면 회로가 망가질 수 있으니 주의해야 한다. 120 ohm보다 조금 커도 상관은 없는 듯 하다. auto reset 기능이 정지되었는지 확인하는 방법은 Serial Monitor를 열어 놓아 serial port를 사용하면 부트로더가 실행되지 않을 것이다.

그리고 이제 마지막으로 Programmer > Arduino as ISP 를 선택한 후 Burn Bootloader 명령을 실행한다.
참고로 ATmega328p(저전력 설계된 칩)가 아니라 ATmega328 칩에 위와 같이 진행하면

Expected signature for ATMEGA328P is 1E 95 0F Double check chip, or use -F to override this ... 


위와 같은 메세지가 나타나며 작업이 진행이 안될 것이다. 스케치 IDE에서 ATmega328p만 인식을 하기 때문인데 이때는 arduino-1.0-windows\arduino-1.0\hardware\tools\avr\etc\avrdude.conf 파일에서
# ATmega328P 부분의

signature = 0x1e 0x95 0x0F; -> signature = 0x1e 0x95 0x14;


위와 같이 잠시 바꿔 놓고 스케치 IDE를 재실행하면 부트로더를 구울수 있다. 작업 완료 후에는 원상 복귀시켜놔야 한다.

이제 부트로더가 구워졌으면 이 칩에 USB-to-serial 변환기로 작업이 가능할 것이다.

2012년 6월 8일 금요일

Gerber 파일 Merge (Panelize) 하기

참고 사이트 : http://www.instructables.com/id/Panelizing-PCBs-for-Seeed-Using-Eagle-Free-Light/#step1

PCB 주문을 할때 비용 절감을 위해서 PCB 기판에 같은 보드를 여러개 동시에 배치하는 것을 미쿡에서는 Panelizing이라고 한다.
전에 PCB Layout 시간에도 다루었지만 Seeed Studio에서도 서브 보드를 5개까지 허용한다. 대신 너무 아쉬운 점은 자르는 것은 각자의 몫이라는 것이다. PCB를 자를수 있는 밴드 쏘우를 또 구해야 할 판이다. 비용 좀 더 받고 잘라 주면 좋을 텐데...
하여튼 Eagle CAD Light 버전에는 복사기능이 막혀 있어, 이 작업을 도와주는 GerbMerge 라는 프로그램이 있다.  이게 Python 어플이라 먼저 아래와 같은 어플이 설치가 되어 있어야 한다.
Python 은 3.x 도 있는데 혹시 몰라서 2.7 버전을 설치했다.
Seeed Studio는 전체 패널의 아웃라인을 요구해서 GerbMerge 를 패치할 필요가 있단다. gerberge-patched github repo 여기서 zip 파일을 다운받아서 gerbmerge 폴더를  C:\Python<version>\Lib\site-packages\gerbmerge (윈도우일 경우) 폴더에 덮어 쓴다. 전에 작업한 FT232-Breakout 보드를 merge 해 볼 것이다. CAM 작업으로 생성한 7개파일을 C:\Python<version>\FT232-Breakout-v10 폴더를 만들어 복사해 온다.

<board>.GTO - top silkscreen
<board>.GTS - top soldermask
<board>.GTL - top copper
<board>.GBO - bottom silkscreen
<board>.GBS - bottom soldermask
<board>.GBL - bottom copper
<board>.TXT - Excellon drill file.

그리고 config 파일과, layout 파일을 만든다.

panel.cfg 파일내용
#------------------------------------------------------------------------------------------------------------

[DEFAULT]
# I always use the local directory to contain all input gerbers, config files, and output files
projdir = FT232-Breakout-v10
# MergeOut is the prefix of the output files.
MergeOut = merge2

[Options]
# CutlineLayers will determine where the subboard markings are, which will help in separating them.  These are the accentuated lines between the two instances of the board in the image below.
CutLineLayers = *topsilkscreen,*bottomsilkscreen

CropMarkLayers = *topsilkscreen,*bottomsilkscreen

# OutlineLayers is used by the patched gerbmerge, it defines which layers the entire panel outline will be drawn on.  Seeed requires this on all layers.
OutlineLayers = *toplayer,*bottomlayer,*topsilkscreen,*bottomsilkscreen,*topsoldermask,*bottomsoldermask

FabricationDrawingFile = %(mergeout)s.fab

ExcellonLeadingZeros = 0

OutlineLayerFile = %(mergeout)s.oln

ScoringFile = %(mergeout)s.sco

# here you can specify the maximum dimensions allowed by the Seeed PCB service you ordered (in inches).
# gerbmerge will warn you if your final panel (based on your layout) exceeds these dimensions.
PanelWidth = 3.93
PanelHeight = 1.965

# comment out the margins or set them to zero if you want the maximum amount of useable area on your panel.
#LeftMargin   = 0.1
#RightMargin  = 0.1
#TopMargin    = 0.1
#BottomMargin = 0.1

# spacing determines how much space between the panels.  I found 0.0625 to be plenty of space for a band-saw blade, I may reduce it a hair in the next run.
XSpacing = 0.0625
YSpacing = 0.0625

CutLineWidth = 0.01

CropMarkWidth = 0.01

AllowMissingLayers = 1

DrillClusterTolerance = 0.002

MinimumFeatureSize = *topsilkscreen,0.008,*bottomsilkscreen,0.008

# if you define the merge output files to be in the filename scheme that Seeed requires, you won't have to rename them by hand later.
[MergeOutputFiles]
Prefix = %(mergeout)s

*TopLayer=%(prefix)s.GTL
*BottomLayer=%(prefix)s.GBL
*TopSilkscreen=%(prefix)s.GTO
*BottomSilkscreen=%(prefix)s.GBO
*TopSoldermask=%(prefix)s.GTS
*BottomSoldermask=%(prefix)s.GBS
Drills=%(prefix)s.TXT
BoardOutline=%(prefix)s.bor
ToolList = toollist.%(prefix)s.drl
Placement = placement.%(prefix)s.txt

# Job configuration - for each different sub-board, define a section like follows with the subboard name (used in the layout file) and the gerbers comprising that job.
[FT232-Breakout-v10]

Prefix=%(projdir)s/FT232-Breakout-v10

# List all the layers that participate in this job. Required layers are Drills
# and BoardOutline and have no '*' at the beginning.  Optional layers have
# names chosen by you and begin with '*'. You should choose consistent layer
# names across all jobs.
*TopLayer=%(prefix)s.GTL
*BottomLayer=%(prefix)s.GBL
*TopSilkscreen=%(prefix)s.GTO
*BottomSilkscreen=%(prefix)s.GBO
*TopSoldermask=%(prefix)s.GTS
*BottomSoldermask=%(prefix)s.GBS
Drills=%(prefix)s.TXT
BoardOutline=%(prefix)s.BOR
#-----------------------------------------------------------------------------------------------------------------

panel.layout 파일내용
칼럼 추가시 콤마없이 엔터치고 추가하면 된다.
#-----------------------------------------------------------------------------------------------------------------

Row {
  Col {
    FT232-Breakout-v10
  }
  Col {
    FT232-Breakout-v10
  }
}  
#-----------------------------------------------------------------------------------------------------------------


10cm x 5cm 크기에 merge 한다고 가정하고 작업을 했다. 근데 여기서 헤맨 부분은 bor 파일이 필요한데 
Seeed_Gerber_Generater_v0r95_DrillAlign.cam 파일로 gerber 파일을 생성해 봐도 bor 파일은 없다는 거다. 그런데 이 파일이 보드 아웃라인 파일이여서 GBO 파일이 아웃라인만 나타내므로 이걸 복사해서 bor 파일로 만들어서 작업해보니 merge가 되었다. 아래와 같이 실행하면 된다.

C:\Python<version>>python.exe C:\Python<version>\Lib\site-packages\gerbmerge\gerbmerge.py panel.cfg panel.layout

layout이 잘못 설정되면 패널 사이즈를 초과했다는 메세지를 표시한다.

정상적으로 merge가 되면 아래와 같이 나타난다. 
Windows 7 운영체제에서는 설치파일은 관리자권한으로 설치하고 cmd.exe 파일도 관리자권한으로 실행해야 에러가 나지 않는다.

생성된 파일을 Gerbv로 열어서 확인해 봤다.

이상이 없으면 Seeed Studio의 Fusion PCB Service에 신청하면 될 것 같다.

2012년 6월 3일 일요일

Eagle 3D로 회로 보드 Preview 하기

Eagle CAD로 만든 PCB Layout 파일로 3D 랜더링하여 보드 상태를 3D로 미리 확인 할 수 있는 방법이 있다. 잘 설명되어 있는 사이트는 아래와 같다.
http://www.societyofrobots.com/electronics_Eagle3D_tutorial.shtml

#준비물
1.Eagle 3d 설치 : http://developer.berlios.de/projects/eagle3d/
여기서 eagle3d- img 파일이 어디에 쓰는 건지 헤깔렸는데 나중에 알고 보니 맞는 부품명이 없어서 3D로 표시가 안되는 부품을 이 이미지 파일에서 찾아서 부품명을 추가할때 사용한다. 여기서 부품명을 추가하는 작업은 좀 복잡해서 생략하기로 한다. 하는 방법은 위에 링크에 나와 있다.
2.POV-Ray 설치 : http://www.povray.org/
스크립트로 3D을 할 수 있는 엔진으로 Eagle 3d에서 만든 *.pov 파일을 3D 이미지로 보여준다.

위에 파일을 모두 설치했으면 Eagle CAD의 Board 화면에서 File > Run 으로 eagle3d를 설치한 폴더(C:\Program Files\eagle3d\ulp)에서  3d50.ulp 파일을 연다. 그러면 설정 창이 뜨는데 거기서 pov 파일 생성 경로를 설정하고 create POV-File 버튼을 누른다.

POV-Ray를 실행후 open 메뉴로 생성된 pov 파일을 연다. 그리고 이것이 중요한데 Tools > Edit master POVRAY.INI 으로 ealge3d가 설치된 폴더의 povray 폴더를 라이브러리 경로에 추가하는 것이다. 그래야 제대로 렌더링이 된다. 제일 마지막 줄에 Library_Path="C:\Program Files\Eagle3D\povray" 를 추가하고 저장한다. 
참고로 Ini 메뉴를 실행하여 Section 항목에서No AA가 아닌 AA로 선택하면 렌더링 시간은 더 걸리지만 좀더 이미지가 선명하게 보인다.

이제 Run 메뉴를 실행하면 IC의 Logo를 표시할지 소켓을 표시할지 등을 물어 보고 없는 부품은 표시되지 않는다는 메세지가 뜬후 OK를 누르면 랜더링된 이미지를 표시한다.
전에 만든 Breakout 보드는 Sparkfun 라이브러리를 사용해서 거의다 표시를 못하고 있다. 그러면 일일이 부품을 추가해 주거나 원래 Eagle CAD에서 제공하는 부품으로 변경하면 표시가능한데 귀찮아서 ^^;; 이렇게 하는 방법을 아는 것에서 마무리 할까 한다.

Eagle CAD : PCB Layout

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

이제 전에 만든 회로도로 PCB를 만들어 보자.  이 단계는 보드상에 부품을 배치하고 보드파일을 만들어 PCB 제조업체에 보내는 것이다.
먼저 작업전에 vector 폰트를 활성화 시킨다. Control Panel 화면의 Options>User interface>Always vector font를 체크한다.
여기서 보기 편하게 배경색을 검정색으로 변경할 수 있다.

왼쪽 메뉴는 Schematic 화면하고 비슷하지만 추가된 것들이 몇개 있다.

부품들을 Group 하여 마우스 우클릭하여 Move 시켜 아웃라인 안에 넣는다.
부품이 만약 이 아웃라인을 벗어나서 놓여 지면 아래와 같은 에러창이 뜬다.
Freeware 버전이라 이 크기 이상으로 작업 할 수 없는 것이다.

부품명이 표시가 안되어 어떤 부품이 어떤 부품인지 구분이 안간다.
그럼 먼저 부품명을 볼수 있도록 설정한다. 메뉴 > View > Display/hide layers...를 선택하면
아래와 같은 창이 뜨는데 여기서 25~28까지가 위, 아래 보드의 부품명과 부품값을 표시한다. 부품값까지 표시하면 복잡하니 27번은 클릭해서 꺼놓아도 좋다.

F10을 누른 후 각 코너를 클릭하여 아웃라인을 1.5x1.0인치로 변경한다.
부품마다 있는 십자표시를 클릭하여 이동시킨다.(Move : 단축키 F7) 마우스 우클릭하여 회전할 필요가 있으면 회전시킨다.

그런데 회로상에서는 구별이 잘 안가서 막 놓다 보니 부품을 틀리게 놓아서 다시 왼쪽 메뉴의 Replace로  부품을 바꿨다. Replace 창도 Add 창과 같이 생겼는데.. 방식도 똑같다. 검색하여 오른쪽에 부품배치 모양을 보고 고르면 된다. 그리고 나서 Layout상의 부품을 선택하면 부품이 바뀐다. 전에 뭣도 모르고 튜토리얼 보면서 막 따라 하면서 글도 같이 쓰다보니 좀 개판이였다. SMD와 LEAD 부품이 서로 섞여 있다니.. ㅎㅎㅎ


JP1의 커넥터상에 VCC/GND/TX/RX를 Text 명령으로 입력한다. 위치는 21 tPlace 로 선택한다. 실크스크린에 표시될 것이다. 그리고 글자 크기가 크다면 Change 명령의 Size에서 크기를 선택하고 글자를 선택하면 크기가 변경이 된다.

디자인 오류가 없는지 Drc 명령으로 디자인 룰 체크를 한다. Seeed Studio에서 디자인 룰을 제공하니 그 파일(Fusion_eagle_rule_v1.1.dru)을 로딩하여 체크해 본다.

이상이 없으면 Auto 명령으로 autorouter를 한다. 이때 Autorouter Setup 창에서 Routing Grid 값을 기본값으로 해도 되지만 복잡한 회로일때 잘 안될 경우가 있다. 그럴때 8 mil 정도로 한다. 참고로 Seeed Studio 의 최소값은 6 mil 이다. 그럼 대부분 다 그려준다. 만약 몇개 못 그려준 것은 Route와 Ripup 명령으로 직접 그린다.

Auto 명령으로 그린 것이 마음에 들지않아 처음부터 다시 그리고자 한다면 왼쪽 메뉴의 Ripup 명령으론 안된다. 상단 command 입력란에 Ripup; 이라고 입력하면 경고창이 뜨고 확인 버튼을 누르면 다시 처음 상태로 되돌아 간다.

만약 부품명을 표시하고자 할때 부품명의 위치가 적당하지 않으면 Schematic 화면과 마찬가지로 Smash 명령으로 수정할 수 있다. 이제 모두 제대로 만들어 졌다면, 상단 메뉴바의 CAM 을 선택하여 Gerber 파일을 생성해 보자.
그러면 CAM Processor 창이 열리는데 여기서 File > Open > Job 하여 Seeed Studio에서 제공한 cam 파일(Seeed_Gerber_Generater_v0r95_DrillAlign.cam)을 연다. DrillsHoles탭은 EXCELLON 포맷으로, Slot drills/holes 탭등 나머지 탭은 GERBER_RS274X 포맷으로 설정이 될 것이다.
이제 Process_Job 버튼을 누르면 파일들이 생성된다.

생성된 Gerber 파일들을 체크해 봐야 하는데 Sparkfun.com에서는 Viewplot를 사용했는데, 여기선 오픈소스 프로그램인 Gerbv를 사용해 보도록 하겠다.
File > Open layer(s) 로 각각의 Layer를 연다. Seeed Studio에 보낼때 필요한 파일은 아래와 같다. 그러니 TXT 파일을 제외한 6개 Layer를 열어서 확인해 본다.

  • <pbname>.GTL  (top layer)
  • <pcbname>.GBL (bottom layer)
  • <pcbname>.GTS (solder stop mask top)
  • <pcbname>.GBS (solder stop mask bottom)
  • <pcbname>.GTO (silk top)
  • <pcbname>.GBO (silk bottom)
  • <pcbname>.TXT (drill sizes and positions)


Seeedstudio.com에서 Fusion PCB Service를 주문하고 나면 주문번호가 매겨져서 메일이 온다. 그 주문번호를 PCB상의 실크스크린에 적어 놓으면 작업하기 수월하단다.
그런 후에 pcb@seeedstudio.com에 위에 7개 파일을 압축하여 첨부해서 보내면 검토후 진행한다는 메일이 온다. 참고로 파일명은 D(your order number)_(Your PCB size).zip 으로 한다.
PCB 내에 공간을 활용하여 서브 보드를 최대 5개까지 넣을 수 있다. 서브 보드 구분은 홀이나 슬롯이 아닌 실크스크린상에 표시해야 되고 자르는 것은 사용자 몫이다. 절약도 좋은데 PCB 받아서 자르는 것도 일이 될 것 같다. 하여튼 Gerber파일 Merge하는 방법은 다음에 다뤄 보겠다.

가격정책이나 디자인 스펙같은 자세한 사항은 해당 페이지를 확인해 보기 바란다. 디자인룰 캠파일도 여기에 있다.

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/ -> 아두이노 공식 디스트리뷰터란다.