임베디드 보드에서 저항 타입의 센서를 사용하는 방법에 대해 알아보기로 하겠다.


위의 사진은 온 도센서이다. 온도의 변화에 따라 저항값이 달라진다.

센서의 값을 읽으려면 기본적으로 다음과 같은 회로를 사용하면 된다.


위의 그림에 있는 공식과 같이 두개의 저항값에 따라 출력되는 전압이 달라지게 된다.


출력 전압은 위의 예제와 같이 두 저항값의 비율에 따라 결정된다.


위의 그림과 같이 하나의 저항값(R1)은 고정시켜 놓고 다른 저항(R2) 대신 저항 타입의 센서를 연결해 주면 온도의 변화에 따라 저항값이 변하고 결국 출력 전압이 따라 변하게 된다. 이 전압을 A/D 컨버터를 통해 읽어주면 된다.




센서의 온도의 변화에 따른 저항값의 변화표이다. 대략 -20도에서 125도 까지의 온도를 측정하고 싶다면 센서의 저항값은 100Kohm에서 0.33Kohm까지 변하게 된다.
이 센서를 위의 회로에 사용하려면 R1값을 결정해 줘야 한다.


R1의 값을 10 Kohm으로 했을 때 온도의 변화에 따른 출력전압의 변화를 계산한 것이다.


R1의 값을 1 Kohm으로 했을 때 온도의 변화에 따른 출력전압의 변화를 계산한 것이다.


동일한 정도의 온도변화에 대해 전압의 변화가 크고 리니어해야 온도를 읽는데 오차가 작아지고 정확하게 읽을 수 있다.
그러므로 위의 두개의 그래프에서 보듯이 주 사용환경이 -10~70도 사이라면 R1 저항으로 10 Kohm을 사용하는게 좋고 사용환경이 10~120도 사이라면 R1 저항으로 1 Kohm을 사용하는게 좋다.

오차를 최소화해서 정확하게 온도를 읽으려면 전압-온도 형태의 lookup table을 사용하면 되고 그 정도까지 정확할 필요가 없어 간단하게 하려면 저 구간에서는 온도-전압의 변화가 거의 리니어하기 때문에 간단한 수식으로 계산해도 된다.

R1이 1 Kohm인 경우 25도인 경우 전압이 4.545V, 125도인 경우 전압이 1.24V니까 직선의 기울기는 (1.24-4.545)/(125-25) = -0.033이 된다. 이 경우 Vo = -0.033T+5.365 라는 공식이 나오기 때문에 T = (5.365-Vo) / 0.033 이 된다. 즉 A/D컨버터의 전압값을 읽어 저 공식에 집어 넣으면 온도를 구할 수 있게 된다.

* 물론 좀 더 정확하게 하기 위해서는 calibration 과정을 거쳐줘야만 한다.

이 포스팅에서는 온도센서를 예로 들었지만 그 이외에도 환경의 변화에 따라 저항값이 변하는 타입의 센서(CDS photocell 등)는 모두 동일한 방식으로 사용하면 된다.
Posted by nautes

이전 포스트인 Mac OS X에서 시리얼 터미널 프로그램 (Serial Terminal Emulator in Mac OS X에서 이야기했던것처럼 Mac OS X에는 GUI 인터페이스를 사용하는 쓸만한 무료 시리얼 터미널 프로그램이 없었다. (물론 telnet 터미널 프로그램은 상당히 다양하다.)
일반적인 경우는 시리얼 터미널 소프트웨어가 없어도 불편이 없지만 네트웍, 텔레컴 장비를 다루거나 임베디드 환경에서 작업하는 사람들에게 있어서는 시리얼 터미널은 가장 기본적이고 필수불가결한 툴이다.
그런 의미에서 얼마전에 발표된 CoolTerm은 Mac OS X에 있어 가뭄의 단비(?)와 같은 소프트웨어이다.

프 로그램 설명에도 써 있는것처럼 터미널 에뮬레이션 기능은 빠진 간단한 시리얼 포트 터미널 소프트웨어로 시리얼포트로 데이터를 주고 받는걸 주 목적으로 하는 임베디드 환경에서 작업하는 사람들을 주 타켓으로 하고 있다. (사실 임베디드 환경에서 작업하는 사람들에게는 터미널 에뮬레이션 기능(vt100, xterm 등등)은 없어도 관계없다.) 그렇기 때문에 데이터를 텍스트 포맷 뿐 아니고 헥사값으로도 볼 수 있고 시리얼 포트가 여러개 있는 경우 동시에 복수개의 커넥션 연결, 헥사값으로 데이터 전송 등등 임베디드 작업에 유용한 여러가지 기능들을 가지고 있다.

RTS/CTS, DTR/DSR, DCD, RI 등의 핸드쉐이크 핀의 상태를 볼 수 있다.

Options에서 통신 환경을 설정할 수 있다.

Send String에서 텍스트로 뿐 아니고 헥사값을 보낼 수도 있다.


현재 (Version 1.0) Preferences에서는 Viewer의 폰트설정만 변경할 수 있다.
Posted by nautes

일명 Poorman's version으로 구현해 본 아뒤노를 위한 마이크로SD(Transflash) 인터페이스이다.

마이크로SD 소켓을 구입하기도 힘들고 구한다 해도 SMD 타입의 좁은 피치를 가지고 있기 때문에 PCB를 만들지 않으면 신호선을 연결하기가 힘들다.
그래서 찾아낸 방법이 마이크로SD를 구입할 때 같이 껴 주는 MicroSD to SD adapter를 소켓 대용으로 이용하는 것이다.
SD의 경우 9개의 핀이 있지만 SPI모드로 동작하는 경우는 7개 핀만 사용한다. 각 핀의 배치는 다음과 같다. 이 7개의 동박면에 직접 신호선을 땜질하는 것이다.

여기서 주의할 점은 SD는 3.3V 디바이스라는 점이다. Vdd뿐 아니고 다른 핀들도 3.3V레벨의 신호를
사용해야 한다.

MicroSD(Transflash)의 핀 배치는 다음과 같다.


Arduino호환보드중에 전원으로 3.3V를 사용하는 경우는 각 핀을 Arduino SPI에 직접 연결시켜 주면 된다. 하지만 대부분의 Arduino 보드들은 5V를 사용하기 때문에 신호 레벨을 바꿔 줘야만 한다.

위 의 회로를 사용해서 Arduino와 연결해주면 된다. 단 위의 회로에서 왼쪽에 uSD to SD adapter는 라이브러리를 따로 그리기 귀찮아서 그냥 MicroSD 소켓을 사용해 버려서 핀 번호가 좀 다르다. 위의 사진을 보고 같은 이름의 핀을 연결시켜 주면 된다. ^^;;;

회로 부분만 만능기판에 만들어 본 것이다.

최종적으로 MicroSD adapter의 핀에 납땜질을 해서 신호선을 뽑아내어 만능기판 회로에 연결하고 아답터를 접착제나 실리콘을 사용하여 기판의 아래쪽에 붙여주면 된다.

이 렇게 구성하여 arduino에 연결하면 MicroSD를 FAT16으로 포맷하여 파일시스템으로 사용할 수 있게 된다. MicroSD가격이 많이 저렴해 졌기 때문에 아주 적은 비용으로 대용량의 파일시스템을 추가할 수 있기 때문에 장시간의 데이터 로그가 필요한 경우에 매우 유용하게 사용할 수 있다.

Posted by nautes

아래의 사진에 있는 WIZNet의 WIZ810MJ을 사용해서 Arduino를 이더넷에 연결시켜 보았다.

이 모듈에 사용된 WIZNet의 이더넷 컨트롤러 Arduino Ethernet libaray에서 기본 지원하기 때문에 매우 손쉽게 사용할 수 있다. 한국에서는 제조사의 온라인샵인 http://www.ewiznet.co.kr/ 에서 22,866원(그냥 23000원으로 하지 끝에가 866원은 뭔지 모르겠다.)에 구입할 수 있다.

다만 단점은 3.3V전원을 사용한다는 것과 커넥터가 일반적으로 사용하는 2.54mm 피치가 아니고 2mm를 사용하기 때문에 PCB를 뜨지 않으면 일반적으로 구할 수 있는 만능기판에 들어가지가 않는다는 것이다.

이 모듈은 MCU data interface와 SPI인터페이스를 지원해 준다.

SPI인터페이스를 사용하는 경우는 저 핀들중에 아주 일부만 사용하면 되기 때문에 매우 편리하다.

아래의 그림이 핀 배치도인데 저 중에 빨간색으로 표시된 신호만 사용하면 된다. 특히 그 중에 SPI_EN은 SPI 모드를 사용할것이기 때문에 Vcc에 연결해 버리면 되고 리셋만 제외하면 나머지 필요한 신호를 모두 한쪽의 커넥터(JP1)에서 얻을 수 있다. 리셋은 전원이 인가될 때 자동리셋이 되기 때문에 없어도 되긴 하지만 혹시 몰라 조그마한 푸쉬버튼을 연결해 모듈에 접착시켜 버렸다.

그 덕에 집에 가지고 있던 2mm 피치의 14핀 커넥터를 사용해 JP1의 앞쪽만 연결해서 별도의 추가 비용 없이 손쉽게 연결할 수 있었다.

 Arduino WIZ810MJ
 D13 SCLK (7)
 D12 MISO (12)
 D11 MOSI (9)
 D10 SCS (10)

매우 손쉽게 인터넷을 사용할 수 있는데 단점은 DHCP를 기본적으로 지원하지 않기 때문에 IP address를 수동으로 지정해 줘야 하는 것이다.

일단 arduino의 samples중에 ethernet에 속해있는 아무거나 선택해서 다운로드 하고 컴퓨터에서 ping을 날려 보았다.


일단 ip address만 할당되고 나면 arduino에 어떤 프로그램이 실행되는가 관계 없이 모듈이 ping에 대한 응답을 해 준다.


예제중에 WebServer를 실행하고 컴퓨터의 웹 브라우져에서 접속한 화면이다. 이 예제는 arduino의 아날로그 입력을 브라우져에서 볼 수 있게 해 준다.

모듈은 기본적으로 3.3V에서 동작하게 되어 있지만 5V I/O tolerant 하다. 그래서 이번에는 전원도 5V를 넣고 실험을 해 봤는데 별 문제는 없었지만 모듈이 조금 많이 뜨거워 진 것 같아서 3.3V 레귤레이터를 사용해 줘야겠다.

Posted by nautes

이전 포스트에서 arduino에 PD2437을 연결해서 동작시켜 본 걸 확장한 것이다.

윗줄에 4개, 아랫줄에 4개, 총 8개의 PD2437을 사용하여 16x2 디스플레이를 설계하였다. 기본적인 부분은 이전 회로와 차이가 없지만 신호의 팬아웃(fan-out)을 고려하여 74LS245 버퍼를 사용해 주었고 8개의 PD2437중 하나를 선택하기 위해 3-to-8 decoder인 74LS138을 사용하였다.

물론 저렴한 LCD방식의 디스플레이 모듈도 있지만 그에 비해 글자 크기도 크고 백라이트 없이 자체발광을 하기 때문에 어두운 곳에서도 훨씬 더 확실하게 눈에 띈다. 약 2~3미터 정도 거리에서도 표시 된 내용을 쉽게 확인할 수 있다.

Arduino의 PD2~PD12까지 연결을 해 주면 된다. 시리얼 포트를 통해 표시될 문자를 전송하면 되도록 소프트웨어를 작성하였다. 입력받은 문자를 바로 출력하게 되어 있고 '\'를 escape sequence로 사용한다.

 Input
 Description
 \\
\
 \C
 Clear entire display
 \F
 Flash entire display
 \f
 Flash next one character
 \B#
 Brightness control
  0 - 25%
  1 - 50%
  2 - 75%
  3 - 100%
 \G##
 Change cursor location
  ## <= 00~1F
  (00~0F: upper line, 10~1F: lower line)


Posted by nautes

Arduino에서 110/220V 전원을 제어하려면 고전압을 스위칭 해 줄 수 있는 회로가 필요하다. Relay나 SSR(Solid State Relay)를 사용하는 방법도 있지만 아래 회로에서는 Traic을 사용하였다.

고압 전원부를 arduino쪽과 전기적으로 분리하기 위해 opto-coupler인 MOC3021을 사용한다. 전원을 스위칭하기 위해서는 bi-directional triode thyristor인 BT136을 사용한다. 다만 부품샵에는 BT136이 없어 같은 rating의 Motorola MAC218을 사용하였다. 그리고 발열이 있기 때문에 충분한 크기의 방열판을 붙여줘야 한다.


BT136의 특성은 다음과 같다.

----------------

MOC3021 -  $0.89

MAC218 -  $0.79

Heat sink -  $0.69

R (1/4W) -  $0.03 each

C -  $0.08

----------------

물론 기판과 AC 콘센트, AC 리셉터클이 있어야 하지만 그걸 제외한 위의 부품은 약 $2.6정도면 구할 수 있다.

이 경우 최대 240 VAC @ 500 W 까지의 로드를 연결할 수 있다. 더 큰 로드를 구동해야 하는 경우라면 BT136대신 Fairchild의 FKPF12N80 같은 칩을 사용해주면 된다.

아래가 완성된 사진이다.

오른쪽의 커넥터에 arduino의 GND와 디지털 출력 신호를 연결해주면 된다.

기판의 아래쪽이다. 고전압이 흐르는 회로이기 때문에 단선이 발생하지 않고 충분한 전류가 흐를 수 있도록 주의해야 한다.

Arduino의 digital 포트를 pinMode()로 이 회로에 연결한 포트를 출력모드로 설정해 주고 digitalWrite()로 제어해주면 된다.

* 물론 arduino 뿐 아니고 아무 마이크로 프로세서의 digital i/o에 연결해도 사용할 수도 있다.

Posted by nautes

Arduino에 Magtek의 magnetic strip reader를 연결하여 보았다.


현재 가지고 있는 리더기는 TTL 인터페이스를 가지고 있는 single track reader이다. 5핀 커넥터를 가지고 있고 Vcc, GND, Card present, Clock(Strobe), Data 신호를 제공해 준다.


신호 타이밍은 아래와 같다.


Arduino의 D2, D3, D5를 각각 리더기의 Data, Clock, Card present에 연결해 주면 된다.

코드는 다음과 같다.


View source code

카드를 리더기에 긁어주면 아래와 같이 카드의 데이터가 시리얼포트로 출력된다.

문제점은 위의 코드로는 디코딩 루틴이 카드를 정방향인 경우에만 동작하고 반대 방향으로 긁어주는 경우에는 데이터를 정상적으로 디코딩 해 주지 못한다. 역방향인 경우도 정상적으로 디코딩이 가능하도록 코드를 수정 할 예정이다.

Posted by nautes

동네의 부품샵을 구경하다 우연히 구하게 된 부품이다. 저렴한 가격($1.99)때문에 메뉴얼 여부에 관계 없이 일단 구입하여 버렸다. 물론 '구글신'을 믿고 있었기 때문이지만...


부품 명칭은 PD2437로 OSRAM에서 나온 4-character 5x7 dot matrix alphanumeric programmable display with built-in CMOS control functions 이다. DIL 패키지 안에 5x7 매트릭스가 4개 들어있고 디스플레이 컨트롤러를 내장하고 있다.

이 부품을 사용하기 위해 구글의 도움으로 유저메뉴얼과 어플리케이션 노트를 찾아내었다.


일반적인 메모리같이 8-bit bidirectional data bus를 사용해서 마이크로컨트롤러와 데이터를 교환하고 ASCII 코드를 입력받아 그에 해당하는 문자를 표시하게 되어 있었다.

Arduino에 연결하려고 하는데 8-bit data bus를 모두 digital i/o에 연결해 버리면 arduino에 다른 주변기기를 붙일 수 없을거 같아 74LS164(8-Bit Parallel-Out Serial-In Shift Registers)를 같이 사용하기로 하였다.

이를 토대로 구성한 회로는 다음과 같다.


Arduino의 D2-D9까지를 사용하였다.

실제 기판에 만들기 전에 먼저 브레드보드에서 프로토타입으로 확인을 해 보았다.


큰 문제 없이 원하는 글자를 표시해 주었다. 테스트에 사용한 코드는 다음과 같다.

View source code


PD2437은 매우 쉽게 여러개를 cascading이 가능하기 때문에 현재 총 10개의 PD2437을 연결하여 20x2 LED display를 만들어 볼까 생각중이다. LCD에 비해 직접 발광을 하기 때문에 시야각 문제도 없고 시중에서 구할 수 있는 20x2 LCD보다 크기도 크기 때문에 야간에도 글자를 정확하게 확인할 수 있기 때문에 signboard로 적합할 거 같다.

Posted by nautes

http://arduino.cc 에서 arduino 소프트웨어를 다운받을 수 있다. Mac OS X, Linux, Windows를 모두 다 지원한다.

또한 OS용 디바이스 드라이버도 이 사이트에서 다운받을 수 있다.

다운받은 압축파일을 풀어주면 프로그램을 가지고 있는 폴더가 생긴다. 별도 설치 할 필요가 없이 그 폴더에서 arduino 프로그램을 바로 실행해주면 된다.

프로그램을 실행하면 다음과 같은 창이 열리게 된다..

먼저 arduino 보드에 맞게 환경설정을 해 주어야 한다. Tools 메뉴로 가 보면 아래와 같은 서브메뉴가 나온다.

먼저 통신에 사용할 시리얼 포트를 지정해 준다. Arduino보드를 USB 케이블에 연결하고 디바이스 드라이버가 제대로 설치되어 있으면 아래와 같이 포트가 보이게 된다. 아래 화면은 맥의 경우이고 윈도우 인 경우 COMx 란 이름으로 보이게 된다. 보드를 연결했는데도 포트가 보이지 않는다면 디바이스 드라이버를 다시 설치하고 프로그램을 실행하면 보일 것이다.

그 다음은 보드를 설정해 준다. Arduino도 여러 종류가 있어서 그에 해당하는 보드를 선택해주면 된다.


여기서는 아래의 보드를 사용할 것이기 때문에 Arduino Diecimila를 선택해주면 된다.


설정이 끝났으면 예제 프로그램을 실행시켜 보겠다. 아래 화면에서처럼 File -> Sketchbook -> Example -> Digital -> Blink 를 선택해 준다.

그러면 Blink 예제 파일이 열리고 내용을 볼 수 있게 된다. 여기서 맨 왼쪽의 플레이버튼을 누르면 프로그램이 컴파일 된다.

컴파일이 정상적으로 끝나면 화면 아래쪽에 다음과 같은 메세지가 나온다.

하지만 컴파일이 끝났어도 아직 프로그램이 arduino 보드로 옮겨진건 아니다. 프로그램을 arduino 보드로 전송하려면 오른쪽 두번째 버튼을 눌러준다.

그러면 arduino 보드의 TX, RX LED가 빠르게 번쩍이면서 프로그램이 전송되는걸 볼 수 있다. 전송이 끝나면 컴파일의 경우와 마찬가지로 메시지 창에 업로드가 끝났다는 메시지가 표시된다.

프로그램이 전송되고 나면 arduino 보드는 자동으로 reset이 되면서 프로그램이 바로 실행된다. 이 예제 프로그램은 보드에 있는 LED를 깜빡이게 하는 것이기 때문에 아래의 LED가 1초 간격으로 반짝이는걸 확인할 수 있을 것이다.

또한 arduino에는 시리얼 터미널 기능도 가지고 있다. 위의 예제에서는 시리얼 포트를 사용하지 않았지만 프로그램에 따라서는 시리얼 포트를 통해 데이터를 주고받을 수 있다. 맨 오른쪽의 아이콘을 눌러주면 아래쪽 메시지 윈도우가 시리얼 터미널 역활을 하게 된다.

검은 부분에 수신한 데이터가 표시되고 송신할 데이터는 입력창에 넣어주면 된다. 또한 통신속도도 임의로 변경할 수 있다. 물론 arduino보드의 시리얼 포트 설정속도와 동일하게 맞춰줘야만 한다.

Posted by nautes

Scilab1.jpg

이번 2월 12일에 Scilab v5.1을 발표하며 드디어 맥에서도 native 환경을 지원하기 시작하였다. 그 동안은 맥에서는 X11을 띄운 상태에서만 사용할 수 있어서 맥 환경의 장점을 살릴수가 없었었다.

scilab4.jpg

이전 X11환경에서 사용하던 Scilab 4.1.2

scilab5.1.jpg

Mac OS X native 환경에서 실행되는 Scilab 5.1

Scilab은 홈페이지의 설명대로 'The open source platform for numerical computation'이다. 조금 더 쉽게 설명하자면 오픈소스 matlab이라고 생각하면 된다.

문법은 matlab과 약간 다른 부분이 있지만 기능에서는 거의 차이가 없다. Scilab은 프랑스 INRIA에서 개발되기 시작하여서 주로 유럽쪽에서 더 많이 사용되고 있다. Matlab과 마찮가지로 Scilab Toolbox가 있어 다양한 기능을 추가할 수도 있고 Scilab-LavVIEW gateway, Scicos라는 block diagram modeller/simulator까지 있어 실제 현장에서 바로 사용하는데 문제가 없다.

200902171755.jpg

Scicos: Block diagram modeller/simulator

또한 scilab 으로 개발한 알고리즘/코드를 DSP나 마이크로컨트롤러에서 사용할 수 있도록 자동으로 코드를 생성해주는 FLEX toolbox가 있으며 scilab/scicos를 ARM프로세서를 사용하는 임베디드PC에 직접 집어넣을 수 있도록 최적화 된 Scilab-EMB도 제공되고 있다.


* 앞으로 몇번으로 나눠 기본 문법과 matlab과의 차이에 대해 설명하겠다.

Posted by nautes

이전버튼 1 2 이전버튼