써미스터는 작고 싸서 정확한 온도가 필요치 않는 곳에 사용하기 그만입니다.
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 신고

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

서보모터가 생겨서 아두이노로 한번 돌려봤습니다.

생각보다 무지 간단하네요.
서보에 3가닥 선으로 되어 있습니다.
+- 전원 두가닥과 신호선 1가닥입니다.
전원선은 각각 5V(Vcc)와 GND에 연결하고, 나머지 1개 신호선은 PWM핀 아무거나에 연결하면 됩니다.
저는 10번핀에 연결했습니다.

서보모터에는 톱니가 있는 축으로 되어 있는데 가운데 구멍이 있길래...돌아가는거 잘 보이라고 않에 와이어를 꽂아 봤습니다.

간단하지요?




역시 폰카입니다...ㅜㅜ

소스는 arduino.cc의 servo 샘플소스입니다. 출처: http://arduino.cc/en/Tutorial/Sweep

myservo.write(pos); 함수에 pos에 각도만 주면 그 각도로 움직이네요.
서보모터의 회전 범위 역시 0 ~ 180도로 회전하네요.

전에 소개한 위즈넷 이더넷 모듈과 같은 W5100칩을 사용한 iConn5100M이라는 이더넷 모듈입니다.
2009/05/19 - [Arduino/AVR/1. H/W] - arduino에 사용가능한 이더넷 모듈



스펙

•  10/100 Base TX 지원
•  Half/Full duplex 지원
•  Auto-negotiation, Auto Crossover Detection 지원
•  IEEE 802.3/802.3u Compliant
•  5V Tolerant I/O, 3.3V 동작
•  Network Status Indicator LEDs
•  Hardware Internet Protocols : TCP/IP v4, UDP, ICMP, ARP, PPPoE, IGMP
•  Hardware Ethernet Protocols : DLC, MAC
•  4 independent Channels
•  MCU bus Interface and SPI Interface
•  Direct/Indirect mode bus access
•  Application Programmer를 위한 Socket API 제공 : W5100 Driver, DHCP, SMTP, DNS, DDNS
•  2개의 2.0mm pitch 2*14 header pin




스펙과 다이어그램을 보면 기존 위즈넷 모듈과 비교해 가장큰 장점은 바로 Tiny24로 보이는 칩을 내장했다는 것입니다.
MCU를 내장함으로써 DHCP, SMTP, DNS, DDNS 등을 지원하고, MAC Address도 내장 되어 있어 프로그램으로 구현할 필요가 없다는 것이 가장 큰 장점이네요.
핀이 2mm 피치 라는것이 약간 불편하긴 하겠습니다.
인터페이스는 SPI를 사용하는것 같네요.

가격도 WIZ810MJ 보다 저렴한 2만원 입니다. (ICBank)

아래는 데이터시트 입니다.

  1. 웅쓰 2009.07.08 15:39 신고

    안에 있는 Tiny MCU는 MAC address만 저장하는 기능을 합니다.
    DHCP, SMTP, DNS, DDNS는 지원가능하지만, 직접 코딩해야 합니다.
    간단히 요약하면 [위즈넷 모듈 기능 + MAC 저장] 기능입니다.

    • BlogIcon pepsiman 2009.07.08 15:41 신고

      아 그런가요?
      그런 내용은 못봤는데...
      정말 그렇담 별거 아니네요....그래도 머 가격은 싸니...^^
      정보 감사합니다

아두이노 전압계 와 processing 만 있으면 아두이노를 오실로스코프로 활용할수 있습니다.

일단 아두이노는 이전 포스팅의 전압계 프로그램을 넣어 놓습니다.

processing라는 프로그램을 다운 받아 설치합니다.


processing에 다음 코드를 붙여 넣게 합니다.
/*
 * Oscilloscope
 * Gives a visual rendering of analog pin 0 in realtime.
 * 
 * This project is part of Accrochages
 * See http://accrochages.drone.ws
 * 
 * (c) 2008 Sofian Audry (info@sofianaudry.com)
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */ 
import processing.serial.*;

Serial port;  // Create object from Serial class
int val;      // Data received from the serial port
int[] values;
String s;

void setup() 
{
  size(640, 480);
  // Open the port that the board is connected to and use the same speed (9600 bps)
  port = new Serial(this, "COM3", 9600);
  values = new int[width];
  smooth();
}

int getY(int val) {
  return (int)(val / 600.0f * height) - 1;
}

void draw()
{
  while (port.available() >= 1) {
    //if (port.readString() == 0xff) {
    //  val = (port.read() << 8) | (port.read());
    //}
    s = trim(port.readString());
    val =   int(s );
    println(val);
  }
  for (int i=0; i<width-1; i++)
    values[i] = values[i+1];
  values[width-1] = val;
  background(0);
  stroke(255);
  for (int x=1; x<width; x++) {
    line(width-x,   height-1-getY(values[x-1]), 
         width-1-x, height-1-getY(values[x]));
  }
}
원본코드를 아두이노 전압계에 맞게 약간 수정 했습니다.
아두이노에서 시리얼 포트(제꺼에서는 COM3)쪽으로
119
399
47
499
38
169
436
13
499
이런 식으로 출력 됩니다
이걸 processing에서 받아서 그래프로 출력합니다.



결과물을 볼까요?

아두이노의 ADC가 여러개 있으니 다채널도 가능하겠지요.
  1. 제갈식 2013.05.16 10:03 신고

    내용이 좋아서 퍼갑니다.

    잘 읽었습니다.,

    http://cafe.naver.com/iphonediy

2009/05/19 arduino에 사용가능한 이더넷 모듈에서 소개했던 WIZ811MJ이 도착했습니다.
사실 벌써 도착했는데 만질 시간이 없어서 못하고 있었다는...

보시다 시피 썰렁하게 연결되어 있는데, 간단한 연결(6핀)만으로 아두이노를 인터넷에 연결이 가능합니다.

사진과 같이 연결하였고, 연결은 엉성해도 동작은 잘 되더군요. ^^

필요한 핀에만 소켓을 끼웠습니다.

많은 핀중에 6개만 사용하면 됩니다. 나머지 하나는 리셋핀....

조그만한게 귀엽게 생겼죠? ^^;


WIZ811MJ 모델은 2.54mm 간격의 40핀으로 핀이 구성되어 있습니다. 듀얼핀이라 브레드보드에 직접은 안되네요.
아두이노와 각 핀의 연결은 위의 그림과 같이 D10~D13, 3V3, GND 6개의 핀을 연결합니다.
아두이노 두에밀라노브(데시밀라)에는 3.3v 출력이 있어서 직접 연결이 가능합니다.



WIZ811MJ는 arduino ethernet shield와 같은 칩을 사용하기 때문에 라이브러리도 호환된다는것이 최대 장점이라고 할 수 있습니다. 이미 만들어져 있는 아두이노 이더넷 라이브러리를 가져다 쓰기만 하면 됩니다. 예제까지도....

아두이노 소스는 아두이노 웹서버로  Examples/Library-Ethernet/WebServer 에 있는 예제를 사용해봤습니다.

/*
 * Web Server
 *
 * A simple web server that shows the value of the analog input pins.
 */

#include 

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 20 };

Server server(80);

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  Client client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean current_line_is_blank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // if we've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so we can send a reply
        if (c == '\n' && current_line_is_blank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          
          // output the value of each analog input pin
          for (int i = 0; i < 6; i++) {
            client.print("analog input ");
            client.print(i);
            client.print(" is ");
            client.print(analogRead(i));
            client.println("
"); } break; } if (c == '\n') { // we're starting a new line current_line_is_blank = true; } else if (c != '\r') { // we've gotten a character on the current line current_line_is_blank = false; } } } // give the web browser time to receive the data delay(1); client.stop(); } }
소스중 위의 mac과 ip 부분은 자신에 맞게 수정해야 합니다.

WIZ811MJ는 DHCP를 지원하지 않는데, 아마도 DHCP기능이 없어서 그냥은 연결이 안되는듯합니다.
소스의 빨간색부분을 공유기의 IP 수동할당에 추가하고, 오른쪽에 추가버튼을 누르면 왼쪽에 추가 됩니다.


브라우저에서 설정한 IP로 아두이노에 접속한 모습입니다. 아날로그 핀의 값을 출력하는 웹서버 프로그램입니다.

이제 아두이노에 달린 날개를 잘 활용하는 일만 남았네요. ^^
  1. Wowwon 2010.12.02 20:26 신고

    저는 이더넷 모듈 WIZ 145SR을 사려고 하는데 님이 사용하신 811MJ와 많은 차이가 있을까요??

    811보다 아두이노와의 연결도 쉬웠으면 하는데, 고민중입니다


LCD 화면을 지우고 싶으면 D7~D0에 00000001 즉 0x01을 command로 보내면 됩니다.
위치 지정 명령은 1xxxxxxx 인데, 첫번째 줄은 0x80~0x8F, 두번째줄은 0xC0~CF 를 command로 보내면 됩니다.



아두이노(arduino)에서 2색 도트매트릭스를 구동시켜 보았습니다.

부품

아두이노(arduino)
도트매트릭스(DotMatrix 8x8 2색)
74HC595 x2
74HC138


나름 하트를 그려봤는데 생각만큼 이쁘게 나오진 않는군요 ^^;


배선이 좀 많이 들어가네요
핀은 24핀으로 위에 12, 아래 12개 입니다.
핀소켓에 납땜으로 배선을 연결했습니다.
전선이 부드러운줄 알았는데 연결하고 나니 엄청 뻣뻣하네요 ㅜㅜ


1번핀 - [LED1-],   2번핀 - [LED1적+], 3번핀 - [LED1녹+], 4번핀 - [LED2-],   2번핀 - [LED2적+], 3번핀 - [LED2녹+]......
위 사진상으로 보면 모델번호를 위로 놓고 볼때 우상터 1~12, 우하 13~24번 입니다.




가장 왼쪽 브레드보드 대신에 도트매트릭스라고 보고
이 보드의 red에 연결된 흰색 배선 위쪽부터 도트매트릭스의 2,5,8,11,14,17,20,23,
green에 연결된 배선 위쪽부터 도트매트릭스의 3,6,9,12,15 18,21,24 번에 연결합니다.



74HC138 디코더 입니다.
Y0 ~ Y7 은 도트매트릭스의 1,4,7,10,13,16,19,22에 각각 연결합니다.
4, 5번 핀은 GND, 6번핀은 VCC에 연결합니다.
A0~A2는 아두이노의 digital 5~7에 연결합니다,







소스

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

//holders for infromation you're going to pass to shifting function
byte data;
byte data2;
byte dataArray[10];
int val=0;

void setup() {
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  // 74HC138N 
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  Serial.begin(9600);

  dataArray[0] = 0x24; //00100100
  dataArray[1] = 0x5a; //01011010
  dataArray[2] = 0x81; //10000001
  dataArray[3] = 0x81; //10000001
  dataArray[4] = 0x81; //10000001
  dataArray[5] = 0x42; //01000010
  dataArray[6] = 0x24; //00100100
  dataArray[7] = 0x18; //00011000
}

void loop() {
  for (int j = 0; j < 8; j++) {
    //load the light sequence you want from array
    data = dataArray[j];
    //ground latchPin and hold low for as long as you are transmitting
    digitalWrite(latchPin, 0);

    shiftOut(dataPin, clockPin, LSBFIRST, 0); 
    shiftOut(dataPin, clockPin, LSBFIRST, data); 
    digitalWrite(7, j>>2 & 0x1);
    digitalWrite(6, j>>1 & 0x1);
    digitalWrite(5, j & 0x1);

    digitalWrite(latchPin, 1);
    delay(1);
  }
}


선이 뻣뻣해서 매트릭스가 공중에 떠버렸습니다.
깔끔하게 하려면 만능기판으로 옮겨야할듯싶네요. 다시만들어야겠네....ㅜㅜ

원래 2색인데, 2색 모두 구동 됩니다만 데이타 만들기 귀찮아서 단색만 했습니다.
회로는 2색 모두 지원합니다.
저항 연결하니 빛이 어두워서 저항도 연결하지 않았습니다.

  1. calian 2009.06.03 16:56 신고

    브레드보드있는 회로 그림은 어떤 프로그램으로 그리셨나요>

    • BlogIcon pepsiman 2009.06.03 17:12 신고

      calian님// arduino 사이트에 있는 이미지를 가져온 겁니다.

      브레드 보드 회로를 그릴수 있는 프로그램으로 제가 아는것은
      Fritzing 이라는 프로그램이 있습니다.
      시뮬은 안되고 그림만 그릴 수 있습니다.참고하세요. ^^
      http://fritzing.org

  2. calian 2009.06.03 20:58 신고

    답변감사합니다^^;;

  3. leejie 2009.12.01 12:09 신고

    브레드보드에 있는 검정블럭같은게 무엇인지 알려주실수 있을까요??
    그리고 만들면서 쓰신 부품들 이름을 알고 싶어요..!
    처음 만들어 보려고 하는데 배울게 많네요..ㅠㅠ;;ㅋ

    • BlogIcon pepsiman 2009.12.04 03:06 신고

      사용한 부품 목록은 맨 위에 있는 목록 그대로입니다.

      브레드 보드 사진으로 왼쪽부터 보면
      맨 왼쪽의 것은 무시하시고요 138, 595, 595, 아두이노, 도트매트릭스
      다만 아두이노가 아두이노 호환 미니 인데...그냥 아두이노 쓰셔도 됩니다.

  4. 깜빡 2009.12.08 06:01 신고

    제가 이해한게 맞는지 모르겠는데요 led매트릭스니깐 8*8 이면 64개의 led와 2색이니깐 총 128개를 제어할수 있는건가요?

    • BlogIcon pepsiman 2009.12.08 15:15 신고

      네 맞습니다. 한번에 한줄씩 제어 하니 순차적으로 16개씩 8번 제어하게 됩니다.

  5. ㅁㄴㅇ 2010.12.03 06:51 신고

    혹시 회로도 왼쪽 빵판에 잇는 초록색 빨간색 똥그란게 뭔지 알수 있을까요;

  6. dfa 2011.03.24 14:36 신고

    잘 봤습니다. 그런데 몇가지 궁금한게 있는데요. 도트매트릭스 사진보면 많은 배선들이 연결돼있는데 위 12부분을 연결한걸 어디다가 연결을 해야하죠 밑12부분도 궁금하구요.. 그리고 브레드보드 들어가 있는 사진보면 맨 왼쪽거 제외를 하고 왼쪽부터 138 595 595 인가요? 그리고 595 밑에 얇은 검정 블락두개가 있는데 이것들은 뭔가요? 또한 그 사진에 보면 가운데 있는 브레드보드에 주황색깔 있죠.. 그건 pushbutton 인지 궁금하네요 그리고 빨간색과 초록색은 LED 라고 말씀하셨는데 어떤 LED인지.. 그리고 그 옆에 있는건 resistor 인가요? 무슨 resistor 인지 궁금해요
    그리고 제가 마지막으로 processing 에 관해서 잘 몰라서 그러는데 소스안에 processing이 사용돼있나요?

    • BlogIcon pepsiman 2011.04.15 17:22 신고

      와이어링은 본문 중간에 595와 아두이노 연결 그림이 있는부분에 있습니다. 설명을 좀더 자세히 추가했습니다. 이해가 되실지 모르겠네요 ^^; 거기서 말하는 숫자는 도트매트릭스의 핀번호입니다 (위쪽에 도트메트릭스의 회로도에 있습니다)

      138도 바로 아래쪽에 설명이 있고요.

      칩에 순서는 138 595 595 입니다. 사진에서 선이 자세히 안보이는 상테에서 순서는 별의미 없지만요 ^^;

      주황색은 먼지 저도 잘 모르겠네요

      빨간색과 초록색은 도트매트릭스를 사용할꺼니까 직접 연결하면 되고요

      저항은 보통 220옴 쓰는데 도트매트릭스에서는 불빛이 넘 약해서 달지 않았습니다.

  7. ㅠㅠ 2011.06.11 23:07 신고

    죄송한데 만능기판에 만들어져있는건 없나요?ㅠㅠ

  8. BlogIcon 오또군 2011.11.04 00:51 신고

    네이버 블로그에 정보수집용으로 퍼갑니다 ^^;; 안된다면 네이버 블로그에 글을 남겨 주세요 ㅠ

  9. vivaman 2011.11.15 14:24 신고

    따라하는 초보입니다.
    하트는 만드는데 성공 했습니다..

    감사합니다.

    Green 색으로도 해보고 싶은데.. 어딜 수정하면 될까요..
    그리고, 2가지 색깔을 섞어 주황색도 만들어 보고 싶습니다..

    ^^

이 글은 arv을 배우려는 사람보다는 저처럼 비 전공자(피지컬 컴퓨팅, 미디어아트, 인터렉티브 미디어 분야등)가 avr에 관심을 갖고 계신분에게 더 유용할꺼라 생각됩니다.
처음 이쪽 분야를 접하고 arduino나 wiring, atmega128(avr 중하나)을 접하면서 선택의 기로에 서게 됩니다.
이때 이글이 도움이 되길 바랍니다.

1. Arduino
아두이노 데시밀라는 atmega168 칩을 사용합니다
칩만 보면 메모리는 8k이고 가격은 4천원대 입니다.(디바이스마트)

아두이노 두에밀라노브는 328(메모리 32k)을 사용하고 국내 정식(플러그하우스)판매가격은 3.9만원 합니다, ($29.95)

아두이노 데시밀라는 168 사용(메모리 16k)

아두이노 미니는 168을 사용하고 국내 정식판매가격은 4.8만원 합니다 ($33.95)

arduino nano는 별로 특징이 없네요. 미니 usb를 가지고 있어 좋기는한데 너무 큰듯한...

최근에 나온 아두이노 메가는 1280칩(메모리 128k)을 사용하고 


1-1 . Arduino 호환보드


아두이노스토리 카페의 딸기보드는 카페에서 공동 제작 형식으로 판매했던것 같은데 사용자가 많지않아 더이상 생산은 어려울것 같습니다.

AVRTOOLS에서 아두이노 데시밀라(168) 호환보드를 팔고 있고, 아두이노 미니 호환 보드도 팔고 있는데 가격도 저렴하고 크기도 작아 상당히 매력이 있네요.

2. Wiring

와이어링에서 사용하는 atmega128 칩은 128k 메모리에 6~7천원 합니다.(디바이스마트)
Wiring-IO (atmega128)를 샘플전자에서 17.6만원에 팔고 있네요ㅡㅡ; (이런 날...)

Wiring mini 샘플전자에서 12.1만원에 팔고 있습니다

2-2. Wiring 호환보
샘플전자에서 와이어링 미니 호환보드를 2.9만원에 판매하고 있습니다.


3. AVR

AVR은 ATmel사의 mcu로 메모리와 속도등에 따라 상당히 많은 종류가 있습니다.
그중에 가장 가격대비 성능이 좋은 atmega128이 많이 쓰이는것 같습니다.(6~7천원대)
외국에서는 attiny2313 칩도 많이 쓰더군요(2000원정도)

이러한 128보드는 1만원대 부터 다양하게 있는데 가장 싼것들은 mcu에 핀만 연결해놓은것으로 다용도로 쓸수 있고 가격도 쌉니다. arduino나  wiring도 이런 기본 보드에 속합니다.
비싼보드는 여러가지 센서나 스위치, LCD등을 붙여 놓아 별도로 구입하는 번거로움을 없에기는 했으나 가격이 꽤 비쌉니다. 
이런 교육용보드중에 유명한것으로는 네이버의 당근이의 AVR갖고 놀기 카페의 당근보드(atmega32)와 아두이노스토리 카의 체리보드(atmega128)가 있고 이들을 이용하면 카페에서 지속적인 도움을 받을수 있어 편리합니다.
당근보드 메인4만원 + 디스플레이보드 4만원

체리보드 5.5만원(2009.06.08 현재 공구중 - 아두이노 스토리카페)



4. avr을 arduino로 만들기

atmega168 보드들은 아르두이노 부트로더를 올리면 아르두이노로 쓸수 있습니다.
atmega128 보드들은 와이어링 부트로더를 올리면 와이어링으로 쓸수 있습니다.(32.768K의 크리스탈을 달아야만 합니다)

이방법이 가장 저렴하긴한데 좀 번거롭습니다.
그리고 초기에는 그다지 저렴하지도 않고요. (이것 저것 준비할게 많습니다. ISP, usb2uart)

작은태양님께서 atmega168(AVRMall) 보드에 arduino 부트로더를 올려 아르두이노로 만드는 과정을 포스팅해 놓으셨습니다. http://tinysun.net/8

동작시켜보기 위한 과정을 간단히 요약해보면
부트로더 심기
1) 아르두이노 부트로더 다운로드
2) atmega168에 ISP를 연결하여 부트로더 업로드
사용하기
3) usb2uart 연결하기
4) IDE 에서 프로그램 작성 및 컴파일
5) arduino(atmega168)에 프로그램 업로드
6) 동작

1),2) 만 하면 아르두이노가 만들어 진겁니다.
하지만 avr(atmega168)이나 아르두이노 미니 같은경우 USB 포트가 없기 때문에 usb2uart 모듈을 이용하여 프로그램을 업로드 해야 합니다.
저근 이부분이 이해가 안돼서 처음에 무지 고생했지요.

직접 만들어보는것도 좋지만 호환보드들도 워낙 저렴하니 호환보드를 구입해서 쓰는것도 추천할만한 방법입니다.
LCD를 연결하고나니 활용방안이 많네요.
지난번 arduino 전압계에 이어 요번엔 자전거용 속도계를 만들어봤습니다.

회로는 전압계와 비슷합니다. 전압계는 아날로그 입력을 사용했고, 속도계는 디지털입력을 사용한다는 차이뿐
하지만 프로그램은 약간더 복잡하지요.

사용부품

[플러그하우스판매]아두이노 두에밀라노브 1개
usb케이블 1개
[디바이스마트]점퍼와이어 (피복 안에 선이 하나로 된 전선) 1m 이상
캐릭터LCD 16x2 14핀(또는 16핀 - 백라이트지원) 1개
핀헤더 Single 1x40Pin Straight(2.54mm) 1개
ND자석 (네오디움) 10pi x 2T 1개
리드스위치 PMC1001 1개
(* 리드스위치는 잘 망가지니 여분으로 하나 정도는 더 구입하시길)
9v 배터리스넵  Snap.I-3(for 9V)  1개
dc 플러그 2.5pi 1개
브레드보드 WBU-D, WBU-T 각 1개
저항 10K옴 1개
TRIMMER(가변저항) WIW1036(3323 Series)-10KΩ 1개

기타 [디바이스마트 또는 동네 전파사]
인두 1개
실납 1개
니퍼 1개
전연 테이프 1개


자전거에 장착해야 하기 때문에 좀더 튼튼하게(?) 고정했습니다. 고무줄로...^^;;



속도를 측정하기 위해서 한바퀴 회전하는데 걸리는 시간을 측정했습니다.
일반적으로 판매되는 자전거용 속도계와 원리는 같습니다.
자석 스위치를 앞바퀴 프레임에 붙이고 자석은 바퀴살에 붙였습니다. 자석이 스위치옆을 지날때마다 스위치가 단락됩니다.

자석 스위치는 위와 같이 생겼습니다. 표면이 유리인데 납땜하고 약간 비틀었더니 부서져 버려서 하나는 망가져 버렸습니다.
자석을 스위치 근처로 가져가면 스위치가 단락됩니다.

검은색 전기 테이프로 대충 고정했습니다. 프레임에 스위치의 간격조절도 테이프를 대충 말아서 높이를 줬습니다.

고정도 대충하고 자석

바퀴살에 붙어있는것이 nd 자석이라불리는 지름 10mm짜리 네오디움자석을 테이프로 고정해서 붙였습니다.

자석과 스위치의 간격은 약 1cm 정도 되는데 동작은 잘하네요.
스위치의 선은 브레이크 라인을 타고 올라와 아르두이노가 있는 빵판에 연결됩니다.

왼쪽은 LCD모듈 오른쪽은 9v 배터리, 아래로 아르두이노가 있네요.
자전거에 장착은 검정테이프 하나가 다입니다. 떨어질까봐 조마 조마 ^^;
자전거를 살짝 움직여보니 시속5km라고 찍혔네요. 옆에 RPS는 초당 앞바퀴 회전수....나중에 페달 회전수가 들어가야 하는데,
스위치를 하나 망가트리는 바람에 바퀴 회전수가 들어갔습니다.

 천천히 가니 10km는 그냥 나오더군요. 한강을 살짝 달려보았습니다. 최고 속도 32km 나오더군요.
대충 맞는거 같기도 하고....어차피 숫자 계산이니 틀리면 고치면 되겠죠.
다음에 gps를 가져가서 속도를 비교해봐야겠네요. 그때까지 분해가 안된다면....ㅋㅋㅋ

To Do
자전거를 멈췄을때 속도가 0이 안되는 문제 -> 스위치가 on 됐을때만 속도를 계산하기 때문
페달 회정수 측정 -> 스위치 구입
외관 디자인 자전거고정 -> OTL

속도 계산
바퀴둘레     = 26인치 * 25.4 * 3.14 = 2074 mm = 2.074 m = 0.002074 km
속도(시속)  ->  한바퀴회전시간(ms) : 0.002074 km(바퀴둘레) = 1000ms * 60 * 60 (1시간) : 1시간동안 이동거리
속도(km/h) =  7466.4 / 한바퀴회전시간(ms)


두번째 압축 파일은 아두이노 개발툴 설치 폴더의 hardware\libraries\LiquidCrystal_pepsiman 폴더에 압축을 풀어주세요.
(이 파일은 플러그 하우스LCD용 파일입니다. 다른 LCD는 Arduino 사이트의 LiquidCrystal 라이브러리를 사용하세요)
소스코드
#include <stdio.h>
#include <LiquidCrystal_pepsiman.h>

// LiquidCrystal display with:
// rs. rw, e, d4, d5, d6, d7 - LCD pin name
//  4,  5, 6, 11, 12, 13, 14 - LCD pin #
LiquidCrystal lcd(2,3,4,  8,9,10,11); // arduino pin #

char buf[33]={0};
unsigned long time, oldtime, delta;
float spd=0;
int ledpin = 13, swpin=12, swval=0, oldswval=0;

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

  pinMode(ledpin, OUTPUT);
  pinMode(swpin, INPUT);
  lcd.clear();
  lcd.print("hello, world!.............");
}

void loop()
{
  swval = digitalRead(swpin);
  if (oldswval == LOW && swval == HIGH)
  {
    time = millis();
    delta = millis() - oldtime;
    //26" * 25.4 * 3.141592 = 2.074m, 0.002174 km;
    // * 3600 = 7446.4 km/s
    spd = 7466.4 / (float)delta;
   
    sprintf(buf, "SPD %3ld RPS %4ld", (long)spd, (long)(1.0 / (float)delta * 1000.0));
    Serial.println(buf);
    lcd.clear();
    lcd.print(buf);
   
    oldtime = time;
    digitalWrite(ledpin, HIGH);
    delay(20);
  }
  digitalWrite(ledpin, LOW);
  oldswval = swval;
}


추가) 회로에 대한 문의가 있어서 추가 합니다.

솔찍히 회로 라고 할만한게 없습니다 ^^;
리드 스위치를 아두이노의 12번 핀에 연결하면 끝입니다.(하나는 GND, 하나는 아두이노의 D12)

추가) 전원(베터리)에 대한 문의가 있어서 추가합니다.

아두이노는 기본적으로 아답터 단자로 들어오는 7~12v 전압을 5v로 바꿔주는 레귤레이터를 내장하고 있습니다.
따라서 9v전지용 스넵단자와 아답터 단자를 구입해서 선으로 연결해 주기만하면 
아답터 단자로 9v전지를 연결해 아두이노의 전원으로 사용할 수 있습니다.
  1. BlogIcon 이수빈 2009.08.08 13:05 신고

    자전거가 왠 쌩쇼냐?
    ㅎㅎ 자전거 쌩쇼하는거 첨이야

    • BlogIcon pepsiman 2009.08.08 16:40 신고

      잘 모르는 사람이 보면 생쑈로 보일수도 있겠네요^^

  2. 이동준 2009.08.09 20:43 신고

    대단 하십니다. 수고 많으셨네요.
    잘 보고 갑니다. 나도 한번 만들어 봐야지............... 소스 퍼갑니다

  3. ㅋㅋ 2009.09.09 17:37 신고

    저도 친구 이거 만들어줬는데 친구놈이 그걸버리고 5마넌짜리 속도계 달았다능 ㅠㅠ

    • BlogIcon pepsiman 2009.09.09 17:42 신고

      다시 뺏어서 기능 왕창 추가해서 자랑하세요.
      케이던스, 누적거리, GPS등등 ^^

  4. kmw880 2010.12.10 01:52 신고

    질문이 있습니다.
    님이 올려준 소스와 회로를 기반으로 똑같이 구현해보려고 시도해보았는데요...
    리드스위치에 자석을 접근시켜도 LCD출력에 변화가 없네요.
    LCD에는 "speed 7656 rps 100" 이라는 문구만 고정되서 출력되는데...
    소스가 문제가 있는건지, 회로설계에서 이상이 있는건지 감이 안잡히네요ㅠ
    댓글 부탁드립니다^^

  5. elnino 2011.10.18 17:09 신고

    펩시맨님...

    리드스위치를 gnd 에 연결하고 아두이노 D12 번에 꽂는순간 속도가 110~150 으로 표현이 됩니다....

    그리고 저는 칼로리도 추가했는데 칼로리도 10억칼로리 이상나오네요..ㅡㅡㅋ ㅎㅎㅎㅎㅎㅎ

    외람된 질문일지모르겠지만.....혹시 제가 한게 뭐가 잘못된건지 좀 지적해주실수있을까요??ㅠㅠ 부탁드립니다....

    넘 중요한거라.....꼭 좀 답변 부탁드리겠습니다.....great-55@hanmail.net 메일로 답변주셔도 감사하겠습니다...

  6. 지돌 2013.03.25 20:03 신고

    안녕하세요 저는 아두이노를 사용안하고 PIC을 사용하고 있습니다.

    속도를 구하는부분이 궁금한데 죄송하지만 설명 좀 해주시면 안될까요? 저도 리드스위치를 사용중이거든요..

LCD 구동 이후 무엇을 해볼까 하다가 전압계를 만들어 보았습니다.

머 말은 거창하지만 사실 아르두이노의 아날로그 입력을 이용하면 간단합니다.
선만 두개 더 추가하면 되지요.

아르두이노의 아날로그 입력은 0 ~ 5v를 입력받을수 있습니다. 해상도는 10bit = 1024입니다.
즉 0.0048828125v , 약 4.88mV 단위로 측정가능합니다.

위 사진은 충전지의 전압을 측정해 본것입니다. 약 1.22v가 나오네요.
소수점 출력하는법을 몰라 x100 해버렸습니다. ^^; (출력 formatting 하는 법좀 알려주세요~)
암튼 별건 아니지만 재미있네요.



#include <LiquidCrystal.h>
// LiquidCrystal display with:
// rs. rw, e, d4, d5, d6, d7 - LCD pin name
//  4,  5, 6, 11, 12, 13, 14 - LCD pin #
LiquidCrystal lcd(2,3,4,  8,9,10,11); // arduino pin #
int val = 0;
void setup()
{
  Serial.begin(9600);
  lcd.clear();
  lcd.print("hello, world!.............");
  delay(1000);
}
void loop()
{
  val = analogRead(0)*500.0/1024.0;    // read the value from the sensor
  Serial.println(val, DEC);
  lcd.clear();
  lcd.print(val);
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
}

숙제가 하나 남았네요.
5v가 넘는 전압은 어떻게 해야 측정이 가능할까요?

추가) 
아두이노에 5v이상의 전압을 직접 연결하면 아두이노가 사망할수 있으니 주의하세요.
5v 이상의 전압을 측정하려면 전압나눔 회로를 사용해야 합니다.

+ Recent posts