가상 시리얼 포트 에뮬레이터(VSPE)를 이용한 원격간 시리얼포트 제어에 대한 문의가 있어서 답변겸 자료를 정리합니다.

Virtual Serial Ports Emulator(VSPE) 이라는 프로그램을 이용합니다.
설정은 아래와 같습니다.
처음 두줄(Com2)은 제어할 장치가 있는쪽에 설정합니다.
물리적인 com포트에 장치가 물려있다면 첫번째줄은 필요 없습니다.
두번째 줄에서 설정한 포트(자신의 com포트에 맞춤니다)와 그 컴퓨터의 IP를 확인해야 합니다.
(IP확인: 시작> 실행> cmd(엔터) , ipconfig(엔터)

세번째 줄과 네번째 줄은 원격지에서 데이터를 보낼pc에 설정합니다.
거기에도 물리적인 com포트를 쓴다면 세번째는 생략합니다.
네번째에서 서버pc의 IP와 포트로 설정을 합니다.

설정이 모두 끝났습니다.
이제 양방향으로 데이터가 오고 갑니다 확인해보세요.
터미널 프로그램에서 com2 한개 띄우고, com3 한개 띄우면 서로 데이터가 오고 가는것을 확인할수 있습니다.


저는 한pc에서 테스트 하느라 서버와 클라이언트를 위에서 처럼 모두 설정했습니다.
실제로는 위에 두줄은 서버 pc에 아래 두줄은 클라이언트 pc에 설정 하셔야 합니다.
그럼 재미있게 활용하세요 ^^
아두이노를 하다보니 좀 이상한 습관이 생겼는데...
전자제품을 그냥 못버린다는 것입니다. ^^
버리기 전에 일단 열어서 머 쓸만한거 없나 확인하게 되죠.
남들이 보면 좀 괘상하게 볼수도 있습니다. ㅎㅎㅎ

얼마전에 복합기(프린터+스캐너)를 하나 발견하고 집으로 가져갔습니다.
아파트 재활용수거날 그렇게 찾아도 못찾았는데 회사앞에서 발견하고
고생(쪽팔림을 무릅쓰고)해서 집까지 운반했내요. ^^

작동하는지에는 별관심이 없었습니다. 오르지 안에있는 모터에만....

헤더부분을 들어났더니 용지 공급하는 스텝모터와 헤더를 이동시키는 (일반)모터가 들어 있네요.
아마도 해더 부분에서 헤더 축에 연결된 투명 띄에서 위치 이동을 인식하는 센서가 들어 있는듯합니다.

새워놓은 모습입니다.

뒷부분에 헤더 이동을위한 모터가 보입니다.

오른쪽 하단의 기어 박스에 들어 있던 스텝모터인데 용도는 잘 모르겠네요.

왼쪽 것이 헤더에 들어 있던 기판이고, 두번째것이 기어박스에 기어의 움직임을 감지하던 센서로 보이는 부품입니다.
오른쪽은 전원부이고요. 이 전원부도 써먹을수 있을까요?

상판 스캐너 부분입니다. 오른쪽에 스텝모터가 보이네요.

이렇게해서 목적이었던 스텝모터 3개를 얻었네요 ㅎㅎㅎ
이상 분해기였습니다. ^^;;

  1. 2010.04.07 16:58

    비밀댓글입니다

  2. BlogIcon mrkiss 2010.04.08 01:52 신고

    하 하 전자회로를 취미로 만지는 사람들의 공통점이군요. 저도 프린터 두대 가져다가 분해했었죠. 근데 아직 쓸모를 못찾고 있다는 슬픈 이야기가 --;;

    • BlogIcon pepsiman 2010.04.08 17:47 신고

      두대 씩이나 ㄷㄷㄷ 횡재하셨네요.
      그냥 바라만 봐도 흐뭇한거죠 머 ㅎㅎㅎㅎ

  3. BlogIcon pashiran 2010.04.09 12:11 신고

    ㅋㅋㅋ.. 저도 해봤습니다. 집에 스탭모터만 10개는 넘는듯 -_-;;
    추측하신 대로 첫번째 두번째 사진에 달려있는 작은 보드가 엔코드 센서 맞을거에요
    물려있는 투명한 필름을 보면 작은 선이 빽빽하게 그어져 있죠.
    옛날 프린터들은 그냥 스텝으로만 조정했는데 요즘 프린터들은 고속인쇄를 추구하다보니
    고속으로 이동하면서 보다 위치를 정확하게 잡기 위해 DC모터+엔코더를 이용하는 것 같더라고요.
    그러니까 아마도 잉크헤드 이송용 모터는 DC모터일 가능성이 높습니다. 사진상으로도 선이 2개밖에 없으니
    99% dc 모터..^^;

  4. BlogIcon pashiran 2010.04.09 12:11 신고

    스텝모터 필요하시면 디바이스마트 가보세요. 요즘 특별할인이벤트로 스텝모터 2종 개당 500원에 팔던데요

전에 구입했던 WIZ811MJ 모듈을 써먹어보려고 하다보니 느러져 있는 선들이 불편해서
간단하게나마 쉴드처럼 만들어보기로 했습니다.
2009/06/08 - 아두이노를 인터넷에 연결해보자 - arduino ethernet shield 호환모듈 WIZ811MJ
2009/05/19 - arduino에 사용가능한 이더넷 모듈

배선만 핀에 맞추어 연결해주면 되기 때문에 최소한의 만능기판과 핀헤더만으로 만들었습니다.
그래서 모양새는 좀 허접합니다. ^^;;;

바깥쪽은 아두이노에 꽂을 핀, 안쪽은 WIZ811MJ에 꽂을 핀헤더 입니다.

만능기판이 양면이 아니라서 핀헤더도 저렇게 연결했네요.

와이어가 겹치면 납땜하다 겹치는 부분이 자꾸 쇼트가 나네요.
동작을 안해서 테스터기로 확인해보면 어김없이 쇼트가 있더군요. 그래서 저 모냥이 됐습니다.
피복이 생각보다 잘 녹나봐요.

저렇게 합체가 되고요.




합체전...

최종 아두이노에 합체한 사진입니다.



요렇게 합체를 해놓고 전원과 랜선을 연결해주면 인터넷으로 접근이 가능합니다.

아무래도 에칭을 못하다보니 만능기판을 자주 사용하게 되네요. 만능기판은 홀위치가 정해저있어 위치가 않맞을 경우도 종종있지만 그냥 쓰고 있습니다. ^^;
만능기판옥션에서 여러가지 팔더군요. 저는 특히 휘어지는 것들이 맘에 들던데...
가격이 그리 만만치는 않지요 ^^;;;

자 이제 무슨 프로그램을 올려볼까요? ^^


  1. yun 2009.12.12 21:25 신고

    Arduino에 대해서 배워보려고 하는 학생입니다. 거의 컴맹수준인 저에게 큰 도전이긴 하지만 이곳에서 많이 배워가겠습니다. 좋은 정보들 감사드립니다.

    • BlogIcon pepsiman 2009.12.13 16:31 신고

      아두이노의 장점이 비 전문가도 도전할수 있다는 거죠.
      열심히 공부하셔서 자신만의 프로젝트를 해보세요 ^^

  2. yun 2009.12.16 04:50 신고

    Lily Pad에 대해서 관심있게 보고있습니다. 의류에만 사용이 되고 있는듯 싶은데 혹시 작업해보신적이있으세요?
    제가 스마트 섬유에 관심이 많은데, lilypad를 부착시켰을때 얻어지는 결과물은 led뿐인가요? 요즘 led 장착된 옷들이 많더라구요. 그것들은 lilypad를 사용한것인지 아니면 아두이노의 다른것을 사용한것인지 궁금합니다.혹시 알고계시면 알려주세요~. 감사합니다.

    • BlogIcon pepsiman 2009.12.16 10:20 신고

      제가 의류쪽에 대해서 잘은 모르지만...
      LilyPad도 아두이노와 똑같습니다 아두이노로 할 수 있는것을 똑같이 할수 있지요. 차이점이라면 의류에 사용하기 편한 외관을 가지고 있다는 것이지요. 납작한 형태의....

      따라서 LED뿐만 아니라 아두이노에 사용하던 센서류, 스피커, 서보, 모터, 똑같이 사용가능합니다.

      제가 소개한 아두이노 호환보드도 꽤작고 가격도 저렴하고 좋습니다. 한번 참고해보세요 ^^

  3. yun 2009.12.16 21:28 신고

    답글 감사합니다.아두이노 보드를 포함한 장비들을 구입하려고 하는데 보통 어디서 구입하시나요? 이곳이 외국이라 ebay로 검색을 했습니다. 가격이 좀 쎄던데요? 추천해주실만한 싸이트 있으신가요?

    • BlogIcon pepsiman 2009.12.16 22:42 신고

      저는 외국 사이트는 잘 모르고요.
      http://www.sparkfun.com
      요기도 많이 팔던데 어차피 아두이노는 라이센스 때문에 그가격 이하로는 안나올꺼에요

      국내 http://www.avrtools.co.kr/ 라는 사이트가 아두이노 호환보드를 저렴하게 팔고 있어서 이곳을 애용합니다.
      아두이노 정품은 너무 비싸요.

      AVR을 조금 아신다면 ATMega168 칩을 구입해서 쓰면 저렴할텐데....
      그건 어렵겠죠? ^^;;;
      도움이 못되드려서 죄송하네요. ㅠㅠ

  4. yun 2009.12.17 06:51 신고

    우선 사 봅니다. 만들면서 상황을 보고드릴게요.ㅋㅋ
    감사합니다. 꾸벅.

    • BlogIcon pepsiman 2009.12.17 11:13 신고

      상황까지 알려주신다니 너무 감사합니다.
      기대하고 있겠습니다 ^^

  5. hi 2010.12.02 20:11 신고

    쉴드에 저항 어떤역할을 하는건가요??

    • BlogIcon pepsiman 2010.12.20 13:05 신고

      오래 되서 데이터시트를 봐야 알겠지만...아마도 풀다운 저항 아닐까요?
      보통 reset핀이 있으니까...풀다운 해놨을껍니다.

하기 싫은 일....어쩔수 없이 해야 하는걸까?
재미있으면 하지 말래도 할텐데...
어떻게 하면 강제로 시키지 않고 자발적인 참여를 유도 할 수 있을까?
다음 동영상에서 그 답을 찾아봅니다.





 
아두이노와 직접적인 상관은 없습니다만 아두이노로 저런것을 만들어 보고 싶네요.
개인적으로 첫번째 작품이 맘에 드네요. 해보고 싶어요 ^^

와이프가 면 삶을때 시계보고 맞추기 불편하다고 해서 요리할때 사용할수 있는 타이머를 만들어봤습니다.
시간이 정확하진 않겠지만 그리 중요하지 않으니 무시했습니다 ^^;

동작은 SW2 버튼으로 시간을 설정하고 SW1 버튼을 누르면 시계가 거꾸로 가고, 시간이 0이 되면 알람이 울리는 것입니다.

부품도 몇 가지 안됩니다. 
ATTiny26L, 스피커, 스위치 두개, 풀업저항두개, 가변저항 10k ohm, LCD 입니다.

동작시키면 시간(분:초)과 현재 상태를 표시 했습니다.

전원을 9v 배터리로 사용하기 위해 레귤레이터를 이용하여 5v로 다운 하였습니다.



주방에서 사용하기 위해 케이스를 만들었습니다만....
상당히 엉성하네요. ㅠㅠ
어떻게 깔끔하게좀 안될까요?

브레드보드에 있던 회로는 만능기판으로 옮겼습니다.

역시나 이번에도 회로가 막판에 바뀌는 바람에(핑계ㅡㅡ;) 좀 보기 흉합니다. ^^;

SW1 : Start/Stop/time Reset
SW2 : +30 sec

1번 스위치를 한번 누르면 시계가 동작하고 다시 한번 누르면 멈추면서 원래 설정한 시간으로 돌아옵니다.
1번 스위치를 길게 누르면 시간이 0으로 리셋됩니다.

2번 스위치를 한번 누를때마다 설정시간이 30초씩 증가합니다.

옆에 있는 전원 스위치를 없에고 싶었으나 sleep모드를 어떻게 쓰는건지 몰라 포기하고 다음으로 미루었습니다.

작업중 가장 어려웠던 점은 tiny칩의 메모리가 너무 적다는것입니다.
아래 소스보면 아시겠지만 몇줄 안되는데 메모리를 100% 다 사용하더군요.
그래서 소스를 이리 바꾸고 저리 바꾸고 해서 겨우 구겨넣었습니다.
기능을 더 넣고 싶어도 생략하고 최대한 간단하게 넣었습니다.

별건 아니지만 써먹을수 있는걸 만들었다고 생각하니 흐뭇하군요.
얼마나 유용하게 써먹어 줄지는 미지수지만요. ㅎㅎㅎ

$regfile = "attiny26.dat"
$crystal = 4000000
'$sim
$hwstack = 32                                       ' default use 32 for the hardware stack
$swstack = 10                                       ' default use 10 for the SW stack
$framesize = 40                                     ' default use 40 for the frame space

Dim Lsec0 As Long , Lsec1 As Long , Lsec2 As Long , Ltmp As Long , Lmin As Long
Dim Startcooktimer As Byte , Presstime As Long , J As Byte
Dim Idletime As Long

Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.6 , Rs = Porta.7
Config Portb = Input

Initlcd
Cls
Cursor Off

'Locate 1 , 1 : Lcd "Cooking"
'Locate 2 , 2 : Lcd "Timer"
'Waitms 1000

Lsec0 = 120

Main:
   Startcooktimer = 0
   Gosub Initcooktimer

   Do
      ' SW 6 : Start/Stop/Reset
      If Pinb.6 = 1 Then
         Waitms 20
         If Pinb.6 = 1 And Lsec0 > 0 Then
            Waitms 200
            If Pinb.6 = 0 Then
               Startcooktimer = 1
               Exit Do
            End If
            Waitms 400
            If Pinb.6 = 0 Then
               Startcooktimer = 1
               Exit Do
            End If
            Waitms 400
            ' Reset
            If Pinb.6 = 1 Then
               Lsec0 = 0
               Gosub Initcooktimer
               Waitms 500
            End If
         End If
      End If
      ' SW 5 : +30 sec
      If Pinb.5 = 1 Then
         Waitms 20
         If Pinb.5 = 1 Then
            Lsec0 = Lsec0 + 30
            If Lsec0 >= 60000 Then
               Lsec0 = 0
            End If
            Gosub Initcooktimer
            Waitms 400
         End If
         'Idletime = 0
      End If
   Loop Until Startcooktimer = 1

   'run timer
   Do
      Decr Lsec1
      Gosub Displaycooktimer

      For J = 1 To 20
         If Pinb.6 = 1 Then
            Waitms 20
            If Pinb.6 = 1 Then
               Do
               Loop Until Pinb.6 = 0
               Startcooktimer = 0
               Gosub Initcooktimer
            End If
         End If
         Waitms 50
      Next J

      If Lsec1 <= 0 Then
         Gosub Playsound
         Exit Do
      End If
   Loop Until Startcooktimer = 0
Goto Main

Playsound:
   Sound Portb.4 , 80 , 500
   Waitms 100
   Sound Portb.4 , 80 , 600
   Waitms 100
   Sound Portb.4 , 80 , 700
   Waitms 500

   If Pinb.6 = 1 Then
      Waitms 20
      If Pinb.6 = 1then
         Do
         Loop Until Pinb.6 = 0
         Return
      End If
   End If
   If Pinb.5 = 1 Then
      Waitms 20
      If Pinb.5 = 1 Then
         Do
         Loop Until Pinb.5 = 0
         Return
      End If
   End If
   Goto Playsound
Return

Initcooktimer:
   Lsec1 = Lsec0
   Gosub Displaycooktimer
Return

Displaycooktimer:
   Cls
   Lmin = Lsec1 / 60
   Ltmp = Lmin * 60
   Lsec2 = Lsec1 - Ltmp
   Locate 1 , 1 : Lcd Lmin
   Locate 1 , 3 : Lcd ":"
   Locate 1 , 5 : Lcd Lsec2
   If Startcooktimer = 1 Then
      Locate 2 , 1 : Lcd "Start"
   Else
      Locate 2 , 1 : Lcd "Stop "
   End If
Return



  1. BlogIcon 푸른해아 2009.10.15 10:33 신고

    ㅎㅎ 나무나 아크릴등으로 간단하게 케이스를 주면 더 예쁠 것 같은데요.

    그런데 점점 실용화 되어가네요. 작동은 잘 되나요? 저도 요새 강력한 알람이 필요해요..ㅎㅎ

    • BlogIcon pepsiman 2009.10.15 10:38 신고

      강력한....이라면 혹시 자명종??? ^^

      제 사촌동생도 아침에 정말 못 일어나는데
      알람 시계를 선물받았어요. 근데 따르르르르르르릉...하는 단순한 소린데 정말 무서울 정도로 시끄럽더라구요.
      나중에 일어나는거 보니깐 알람 울리기 전에 일어나서 끄고 바로 계속 자더라는....
      그 시계 이름이 아마 battle 이었을꺼에요 ㅋ

    • BlogIcon 푸른해아 2009.10.15 11:10 신고

      아, battle요? ㅋㅋ

      제 자명종 시계는 일본산 전파알람시계인데..

      알람이 울리면 온건물에 들릴 지경이예요. 그래서 알람이 울리기전에 벌떡 일어납니다. ㅋㅋ

      아,그런데 자명종은 미세하게는 조절이 안되니까..
      저도 타이머나 이런 걸 장만할까 하거든요.
      얼마전에 몇 번이나 집에 불을 냈었어요. ㅋㅋ

    • BlogIcon pepsiman 2009.10.15 11:14 신고

      세상에 온건물에 들릴정도의 알람도 있단 말인가요??? 대단하군요
      푸른해아님도 요리 좋아하시는거 같던데..타이머 하나정도는 필요하실거 같아요. 가격도 얼마 안하는거 같던데요.
      사실 만드는거보다 사는게 싸요...중국산의 위력...ㄷㄷㄷ

      갑자기 "까스불 끄셨나요?" 광고가 생각나네요...정말 재밌는 광고였는데...^^

    • BlogIcon 푸른해아 2009.10.15 13:24 신고

      아,요리할 때는 타이머가 필요가 없는데..

      빨래를 삶거나 할 때 넋을 놓고 있다가 집에 불을 내네요.

      지난번에 뵌 조모님께서 '너는 낭비가 심하다'라고 야단을 치셨는데, 여러모로 정신적인 문제가 있는 것 같습니다.ㅋ

      여하간 타이머를 구입을 할까요? ㅎ
      아니면 펩시맨님의 게시물을 참고로 해서, 한 번 도전?
      워낙 게으른 인간이라 실행시기가 미지수겠지만요.ㅋ

    • BlogIcon pepsiman 2009.10.15 13:32 신고

      아하 빨래군요...
      그 귀찮은 빨래 삶기를 하시는걸 보니 깨끗한걸 좋아하시나보네요.

      정말 만들어 보시겠어요?? ^^
      가격 대비로야 사는게 싸겠지만....
      시간은 많은데 할 일이 없다거나...잡념이 많아 머리가 아플때...
      인두를 잡고 한번 만들어보세요....
      그러면 아마도........................ 집을 태울지도...ㅋ

    • BlogIcon 푸른해아 2009.10.15 13:38 신고

      그렇네요.

      작은 화재를 방지하려다가, 정말로 집을 전소할 지도..

      인두는 여러모로 쓰임새가 좋긴 한데 저랑 궁합도 별로고.

      여하간 요새 불과 관련된 일을 피하고 있습니다. ㅋ

      어우 어디로든 날아간 멘탈을 찾아서 제대로 심어야 할텐데요.

재미있는 프로그램을 소개해드립니다.

avr 프로그램을 하다보니 pc와 시리얼 통신을 할일이 종종 생깁니다.

이때 pc용 프로그램을 테스트할때 (특히 노트북 같이 시리얼포트가 없는 pc) 사용하면 편리한 프로그램입니다.

사용법은 가상 COM1, COM2를 만들고 둘을 연결합니다.
pc용 프로그램을 com1로 연결하고 하이퍼 터미널을 com2로 연결하면 pc용 프로그램에서 시리얼 통신으로 출력되는 내용을 하이퍼 터미널에서 확인할수 있습니다.



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


일반적인 경우에는 필요 없을지도  모르겠는데, 개발이나 테스트를 하시는 분이라면 꼭 필요한 프로그램입니다.

가상으로 시리얼 포트를 만들어주고 가상 시리얼끼리 리다이렉션도 해줍니다.

가상 시리얼 포트 Com1 Com2를 생성하고 둘을 연결시킨 화면입니다.

이렇게 하면 하이퍼터미널 두개로 Com1과 Com2를 각각 열면 둘간에 통신이 가능하게 됩니다.

시리얼 통신 프로그램 작성하시는 분들께는 대단히 편리한 프로그램이고 게다가 무료입니다.^^

나머지 활용은 어떤게 있을까요? 
  1. BlogIcon Nautes 2009.10.09 06:03 신고

    예전부터 가상시리얼 포트에 관한 포스팅 한다고 하면서도 게을러서 미루었더니 먼저 하셨군요. ^^;
    유사한 종류로 com0com 프로젝트가 있습니다.
    위에서 말씀하신대로 시리얼 프로그램 테스트에도 유용하지만 그 이외에도 시리얼포트를 네트웍으로 redirection시킬 수 있기 때문에 원격지에 있는 컴퓨터의 시리얼 포트를 인터넷을 통해 사용할 수 있습니다.

    http://sourceforge.net/projects/com0com/
    http://com0com.sourceforge.net/doc/UsingCom0com.pdf

    • BlogIcon pepsiman 2009.10.09 10:47 신고

      오...그런 응용이 가능하군요...
      VSPE도 기능이 꽤 있던데 사용해보다 잘 안돼서 그냥 미뤄놨네요 ^^;
      소개해주신 프로그램도 함 써봐야 겠네요.
      감사합니다.

- 5V와 3.3V 같이 사용하기

아두이노나 atmega128같은 AVR은 주로 5v에서 구동이 됩니다.

하지만 xBee(지그비)나 wiz811mj 같이 3.3v에서 구동되는 모듈들을 사용할 일이 종종 생깁니다.

이럴때 5v를 3.3v로 다운하여 사용하여야 하는데 이같이 전압을 변경하는 방법이 몇가지 있습니다.


1. 레귤레이터(regulator) 사용하기

제일 쉬운 방법은 레귤레이터를 사용하는 방법입니다.

전압 다운
5v 레귤레이터로는 78T05, 3.3v 레귤레이터로는 KA78R33, LM1117S-3.3 등이 있습니다.

위 이미지는 7805를 이용하여 8~18v로 5v를 얻는 방법입니다.
같은 방법으로 3.3v 레귤레이터를 사용하면 3.3v를 얻을 수 있습니다.

전압 업

7805와 위 공식으로 저항을 조절하면 입력보다 높은 전압을 얻을 수 있다네요.




2. 제너 다이오드(zener diode) 사용방법



제너 다이오드 1N4728로 3.3v를 만들고 저항으로 필요 전류를 조절하면 됩니다
저항을 줄이면 전류가 늘어나게 됩니다.


3. 레벨 변환칩 사용

이 방법은 아직 잘 모르겠습니다 ^^;


4. 전압나눔 을 이용한 방법

이 방법은 입력전압이 변하면 출력 전압도 변하므로 안정된 전압은 얻을수 없다는 문제가 있습니다.
  1. BlogIcon Nautes 2009.10.09 05:55 신고

    LM317을 이용하면 78xx에 사용하는것과 거의 유사한 회로에서 저항값만으로 원하는 전압을 얻을 수 있습니다.
    저항값 계산은 아래 웹 사이트의 계산기를 이용하시면 됩니다.

    http://www.electronics-lab.com/articles/LM317/

    • BlogIcon pepsiman 2009.10.09 11:13 신고

      nautes님 안녕하세요 ^^
      그렇지 않아도 궁굼하던 차였는데...어떻게 아셨지??
      정보 정말 감사합니다.
      감기조심하시고요~

써미스터는 작고 싸서 정확한 온도가 필요치 않는 곳에 사용하기 그만입니다.
250원짜리로 온도를 측정할수 있다니...정말 저렴하고 매력적인 센서네요.

아두이노를 이용하면 간단한 회로로 가능하니 한번 해보시기 바랍니다.
하지만 써미스터는 온도가 저항값으로 출력되기 때문에 계산하기가 번거롭네요.




NTC_502F397F.xls

엑셀파일에 5도씨 간격으로 온도별 저항값이 적혀 있습니다. 그것을 그래프로 그린것이 위 그래프입니다.

보통 씨피유 파워가 약하거나 시간이 오래 걸리는 계산에는 미리 계산된 값을 배열에 담아서 사용하기도 합니다만
위 엑셀에는 5도씨 간격인것도 있고 세세히 모두 배열에 넣으면 메모리를 많이 차지 한다는 단점도 있습니다.
각자에 상황에 맞게 이용하시면 됩니다.

저는 계산식을 이용해서 프로그램했습니다.
부품 : NTC-502F397
저항= 5K +-1%,  B=3970,    열방산정수= 3.5mW/C

R =R0 exp (B/T-T0)
R0:온도 T0(K)의 저항값 K는 273.15
R :온도 T(K)의 저항값
B :Thermistor 정수
라는데 위 식으론 어떻게 계산하는건지 도무지 계산이 안돼네요 ㅜㅜ  아시는분 계시면 도와주세요.



디바이스마트의 댓글에 적혀 있는 방정식을 토대로 온도를 구했습니다.
T(단위 K) = log(4R -3000) / ( -0.024119329) + 473    --- 저항의 단위는 (옴)
화씨(F) = 1.8 * 섭씨(Tc)+ 32
섭씨(Tc) = (F-32)/1.8
섭씨(Tc) = 절대온도(T) - 273.15

여기서 또 이상한점이 결과가 켈빈 온도라고 되어 있는데 화씨로 계산하니 값이 맞는거 같습니다. ^^;

회로는 써미스터의 출력값이 저항값이기 때문에 전압 나눔회로를 만들어서 저항을 측정했습니다.
기준 저항은 10K옴 입니다.
측정은 아두이노 0번 아날로그핀으로 했습니다.

int analPin = 0;
int ledPin = 13;   // select the pin for the LED
int val = 0;       // variable to store the value coming from the sensor
long x=0, vcc=4840;
float th=0,ce=0;

void setup() {
  pinMode(ledPin, OUTPUT);  // declare the ledPin as an OUTPUT
  Serial.begin(9600);
}

void loop() {
  val = analogRead(analPin);    // read the value from the sensor
  digitalWrite(ledPin, HIGH);  // turn the ledPin on
  x = map(val,0,1023,0,vcc);
  th = (((float)(vcc-x)*10.0)/(float)x)*1000.0;
  ce = ((log(4.0*th - 3000.0) / (-0.024119329) + 473)-32.0)/1.8;
  
  //Serial.print(vcc-x);
  //Serial.print(", ");
  //Serial.print(x);
  //Serial.print(", ");
  //Serial.print(th);
  //Serial.print(", ");
  Serial.println(ce);
  digitalWrite(ledPin, LOW);   // turn the ledPin off
  delay(200);                  // stop the program for some time
}
아두이노의 map명령은 여러모로 참 편한것 같습니다. 특히나 비례식 계산에는 복잡한 머리를 한결 가볍게 해주네요 ^^
실제 온도가 얼마인지 몰라서 오차가 얼마나 되는지 파악은 안되지만...
체리보드에서 측정된 온도와 1도 미만으로 차이 나더군요. 대충 비슷하게 맞는것 같습니다. ^^


  1. BlogIcon toms sale 2013.04.23 14:44 신고

    배우지 않으면 곧 늙고 쇠해진다.

CDS는 photo register 또는 photo cell 이라고도 부르며 빛의 밝기를 저항값으로 출력해주는 센서입니다.
PWM이란 펄스의 폭을 조절함으로써 전압을 제어하는 효과를 주는 기능으로 LED의 밝기를 조절한다거나 모터의 회전수를 조절하는등에 사용됩니다.

사용부품 : 220옴 2개, 10k옴 1개, led 2개
CDS가 스위치 역할을하여 초기상태보다 어두워지면 작동을 시작합니다.
즉 CDS의 빛을 가리면 작동을 시작합니다.

10번핀 LED는 천천히 켜졌다 어두워지고, 9번 LED는 빨리 켜졌다 어두워집니다.
두 속도가 다른 LED가 동시에 제어되는 예제입니다.

입력으로 CDS를 아날로그 0번 핀에 사용하고, 출력으로 LED 2개를 PWM 핀 9,10번에 연결했습니다.



      
위 동영상이 동작 모습입니다.

#include <stdio.h>

int photocellPin;
int buttonPin = 2;
int ledValue = LOW;

int cdsInitValue=0;
int fadeVal[12]={0};
long fadeTimer;

void InitCDS(int pin){
  photocellPin = pin;
  cdsInitValue=0;
  int i;
  for (i=0; i<10; i++){
    cdsInitValue +=  analogRead(photocellPin);
  }
  cdsInitValue = cdsInitValue / i;
}

int IsCDSOn(int val){
  int photocellReading = 0, i;
  for(i=0; i<3; i++){
    photocellReading += analogRead(photocellPin);
  }
  photocellReading /= i;
  
  char s[255];
  sprintf(s, "read=%d, initVal=%d\n", photocellReading, cdsInitValue);
  //Serial.print(s);
  
  if (val > 0){
    if (photocellReading > cdsInitValue + val)
      return 1;
    else
      return 0;
  }
  else {
    if (photocellReading < cdsInitValue + val)
      return 1;
    else
      return 0;
  }    
}

void InitFade(int val){
  for(int i=0; i<12; i++){
    fadeVal[i] = val;
  }
  fadeTimer=0;
}

int FadeCore(int pwmPin, int fadeSpeed, long startTime){
  char s[255];
  sprintf(s, "[%2d],timer=%ld, startTime=%ld\n",pwmPin, fadeTimer,startTime);
  Serial.print(s);
  if (fadeTimer < startTime) return fadeVal[pwmPin];
  
  fadeVal[pwmPin] += fadeSpeed;
  //char s[255];
  sprintf(s, "spd=%d, cnt=%d\n", fadeSpeed, fadeVal[pwmPin]);
  Serial.print(s);
  
  if (fadeVal[pwmPin] < 0) fadeVal[pwmPin] = 0;
  if (fadeVal[pwmPin] > 255) fadeVal[pwmPin] = 255;
  
  analogWrite(pwmPin, fadeVal[pwmPin]);
  /*
  if (fadeSpeed > 0){
    if (countFade < 255) return 1;
    else return 0;
  } else {
    if (countFade > 0) return 1;
    else return 0;
  }
  */
  return fadeVal[pwmPin];
}

void FadeDelay(long ms){
    delay(ms);
    fadeTimer += ms;
}

void Init(){
  int cdsPin = 0, startVal = 0;
  
  InitCDS(cdsPin);
  InitFade(startVal);
}

void setup(void) {
  Serial.begin(9600);  
  Init();  
}

void loop(void) {
  int fadeStep=3, fadePin10=10,fadePin9=9, cdsSense=-40, val1=0, val2=255, timeDelay=10;
  
  while (IsCDSOn(cdsSense) == 0);
  
  InitFade(0);
  while(val1 < 255){
    val1 = FadeCore(fadePin10, fadeStep, 0);
    FadeCore(fadePin9, fadeStep*4, 80);
    Serial.println(val1);
    FadeDelay(timeDelay);
  }

  InitFade(255);
  while(val2 > 0){
    val2 = FadeCore(fadePin10, fadeStep * (-1), 0);
    FadeCore(fadePin9, fadeStep * (-4), 80);
    FadeDelay(timeDelay);
  }
}


  1. 이한샘 2012.09.18 20:00 신고

    제가 이번에 첨으로 프로젝트를 하는데 cds와 pic을 이용해서 밝기를 4~5단계로 제어하려합니다
    근데 진짜 첨이라 회로도나 필요한 부품도 모르겠더라고요
    혹시 정보가 있으시면 좀 알려주세요

위에 왼쪽에 보이는 것이 브레드 보드 입니다.
좌우 새로로 두줄로 되어 있는 부분을 버스 영역 이라고 하여 전원이 지나가는 선이고,
중앙에 가로로 5칸씩되어 있는 부분을 IC 영역이라고 하여 부품을 배치하는 곳입니다.
작은 구멍이 뚫려 있어 각종 부품들의 다리를 꽂는 것 만으로 회로를 구성 할수 있습니다.
납땜할 필요가 없기때문에 회로를 테스트하고 수정하기 쉽게 되어 있고 초보자들도 사용하기 쉽습니다.

내부구조는 오른쪽 사진 처럼 각 구멍이 연결되어 있습니다 IC 영역은 세로로 전체가 연결되어 있고
버스 영역은 가로로 5칸씩 연결되어 있습니다.






이 회로는 led를 켜기 위한 예시를 보여 줍니다.
전원은 버스 영역에 + - 를 연결하고 +에 저항을 연결하여 반대쪽을 버스 영역에 연결하고 LED는 두 IC 영역에 걸쳐 연결합니다.
다시 LED의 한쪽을 - 버스 영역에 연결하여 회로가 연결됩니다.




















실제로 부품들이 브레드보드에 꽂혀 있는 모습입니다.
왼쪽부터 CDS, LED, 저항, 스위치 입니다.
아래쪽에 점프 와이어가 꽂혀 있습니다.
  1. BlogIcon 하얀말 2011.11.25 15:36 신고

    빵판을 쓰면 납땜을 안해도 된다던데, 사실인가요?

    • BlogIcon pepsiman 2011.12.20 17:26 신고

      네, 빵판은 전설을 꽂기만 하면 연결이 됩니다. 그래서 납땜을 안해도 되죠

+ Recent posts

티스토리 툴바