드디어 2011.11.30일 아두이노가 1.0으로 Release 되었다. 짝짝~
1.0의 의미가 크다.


http://arduino.cc/en/Main/ReleaseNotes
http://arduino.cc/blog/2011/11/30/arduino-1-0-now-available/


1. .pde 확장에서 .ino로 변경
2. icon 및 color 변경
3. 시리얼 디버깅이 비동기화 처리 (Serial transmission is now asynchronous)
4. SD 메모리의 다중 파일 지원
5.  write(), print(), println() 가 size_t 타입의 값을 리턴
6. Client, Server, UDP에 대한 base class 추가
7. Ethernet 라이브러리의 DHCP, DNS 지원
8. SoftwareSerial 라이브러리 추가


설치해서 써보니. 기존에 비해서 획기적은 없다. 포트 번호가 우측에 나오니 조금 좋아졌다.
나머지는 쓰면서 테스트해봐야지..


 

Posted by '김용환'
,


아두이노에 적외선 수신 모듈을 붙이고, 리모콘 콘트로로를 붙여 보려고 했다.

적외선 수신 센서는 artrobot과 같은 다양한 여러 업체에서 살 수 있다. 나는 artrobot에서 송신 모듈이랑 같이 해서 통으로 샀다.

fritzing 파일로 그려본 그림이다.  (적외선 수신 센서 그림이 없어서, 온도계 그림으로 대체했다 ㅎㅎ)


fritzing 파일은 다음에서 다운받을 수 있다.



실제 빵판에 구현해보았다.  




동료로부터 IRremote.h와 IRremote.cpp 소스(Ken's Library)를 받았는데. 헉...
내가 가지고 있는 삼성, LG 리모콘으로는 인식이 안되었다.



소스를 보니, nec와 소니, rc5, rc6만 된다.

자료를 찾아보니. 요즘 나온 삼성꺼는 NEC와 약간다르다고 한다.

(참고)
http://cafe.naver.com/arduinostory.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=4487&


해당 파일 내용이 너무 좋아서 올려본다.
이 자료는 내가 만든것이 아닌. 시니어컴에서 만든 자료이다.  ^^;; 링크걸기가 어려워서 이렇게 파일을 업로드했다.




이 그림을 보니 NEC와 약간 내용이 다르다.  우선 내용을 읽는 ms가 다르다.



decodeNEC 함수를 복사해서 decodeSamsung 함수로 만들었다.


// if normal packet receives, arduino can get 32 (8bit * 4) bit value.
//                                                (custom code 2ea + data code 2ea)
long IRrecv::decodeSamsung(decode_results *results) {
  long data = 0;
  int offset = 1; // Skip first space
 
  // Initial mark
  if (!MATCH_MARK(results->rawbuf[offset], 4500)) {
    return ERR;
  }
  
  offset++;
 
  Serial.println("knight-1");
  // Check for repeat
  if (irparams.rawlen == 4 &&
    MATCH_SPACE(results->rawbuf[offset], NEC_RPT_SPACE) &&
    MATCH_MARK(results->rawbuf[offset+1], NEC_BIT_MARK)) {
    results->bits = 0;
    results->value = REPEAT;
    results->decode_type = NEC;
    return DECODED;
  }
 
  Serial.println("knight-2");
  if (irparams.rawlen < 2 * 32 + 4) {
    return ERR;
  }
  Serial.println("knight-3");
  // Initial space 
  if (!MATCH_SPACE(results->rawbuf[offset], 4500)) {
    return ERR;
  }
  offset++;
  Serial.println("knight-4");
  for (int i = 0; i < 32; i++) {
    if (!MATCH_MARK(results->rawbuf[offset], NEC_BIT_MARK)) {
      return ERR;
    }
    offset++;
    if (MATCH_SPACE(results->rawbuf[offset], NEC_ONE_SPACE)) {
      data = (data << 1) | 1;
    }
    else if (MATCH_SPACE(results->rawbuf[offset], 600)) {
      data <<= 1;
    }
    else {
      return ERR;
    }
    offset++;
  }
  Serial.println("knight-5" );
  // Success
  results->bits = 32;
  results->value = data;
  results->decode_type = SAMSUNG;
  return DECODED;
}
// knight end




그리고, 동작하는 pde 소스는 다음과 같다.
삼성 리모콘, LG 리모콘 모두 동작이 된다. 나는 삼성 리모콘의 전원과 LG  리코콘의 전원에 해당되는 키를 누르면 켜졌다가 안켜졌다가 하거나, 깜박깜박하는 것으로 마무리를 지었다.

#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
boolean isLight = false;

 

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(3, OUTPUT);
}

void loop() {
 
  if (irrecv.decode(&results)) {
    Serial.println(results.value);
    // samsung remocon (power)
    if (results.value == 0xE0E040BF) {
      toggleLight();
    }
    // lg remocon (power)
    if (results.value == 0xB4B40CF3) {
      shinyLight();
    }
   
    irrecv.resume();
    Serial.println("Attempting dumping");
    irrecv.dump(&results);
  }
 


}

void toggleLight() {
  isLight = !isLight;
  if (isLight) {
    Serial.println("turn on");
    digitalWrite(3, HIGH);
  } else {
    Serial.println("turn off");
    digitalWrite(3, LOW);
  }
}


void shinyLight() {
    Serial.println("shiny");
    for (int i = 0 ; i < 2 ; i++) {
      digitalWrite(3, HIGH);
      delay(500);
      digitalWrite(3, LOW);
      delay(500); 
    }

}




전체 소스는 다음과 같다.


디버깅을 위해서
#define DEBUG 을 header 파일에 선언해서 디버깅을 하도록 한다. 많은 도움이 있었다.


Attempting Samsung decode
Testing mark 4550 vs 4500: 69 <= 91 <= 116
knight-1
knight-2
knight-3
Testing space 4450 vs 4500: 66 <= 89 <= 111
knight-4
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 500 vs 1600: 22 <= 10 <= 38
Testing space 500 vs 600: 7 <= 10 <= 13
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1600 vs 1600: 22 <= 32 <= 38
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 600: 7 <= 11 <= 13
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 500 vs 1600: 22 <= 10 <= 38
Testing space 500 vs 600: 7 <= 10 <= 13
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 600: 7 <= 11 <= 13
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 500 vs 1600: 22 <= 10 <= 38
Testing space 500 vs 600: 7 <= 10 <= 13
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 600: 7 <= 11 <= 13
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1600 vs 1600: 22 <= 32 <= 38
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 600: 7 <= 11 <= 13
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 600: 7 <= 11 <= 13
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 500 vs 1600: 22 <= 10 <= 38
Testing space 500 vs 600: 7 <= 10 <= 13
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 500 vs 1600: 22 <= 10 <= 38
Testing space 500 vs 600: 7 <= 10 <= 13
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 600: 7 <= 11 <= 13
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 600: 7 <= 11 <= 13
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1600 vs 1600: 22 <= 32 <= 38
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 500 vs 1600: 22 <= 10 <= 38
Testing space 500 vs 600: 7 <= 10 <= 13
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 500 vs 1600: 22 <= 10 <= 38
Testing space 500 vs 600: 7 <= 10 <= 13
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 600: 7 <= 11 <= 13
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 500 vs 1600: 22 <= 10 <= 38
Testing space 500 vs 600: 7 <= 10 <= 13
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
knight-5
3031698675
shiny
Attempting dumping
B4B40CF3 (32 bits)
Raw (68): 15180 4550 -4450 550 -1650 600 -500 600 -1650 600 -1600 600 -550 550 -1650 600 -500 600 -550 550 -1650 600 -500 600 -1650 600 -1650 550 -550 600 -1600 600 -550 550 -550 600 -500 600 -500 600 -550 550 -550 600 -1600 600 -1650 600 -500 600 -500 600 -1650 600 -1650 550 -1650 600 -1650 550 -550 600 -500 600 -1650 550 -1650 600




* 근데..
좀더 찾아보니. 이미 소스는 이미 github에 다 있었다. 아래 주소를 참조하면 왠만한 모든 리모콘의 IR을 동작시킬 수 있을 것이다. 이거 다운로드해서 그냥 쓸 껄... 하지만, IR에 대해서 이해도를 높였다는 것이 중요하니까~ ^^

https://github.com/targettio/Arduino-IR-remote





이번에 아두이노를 하면서 시행착오가 있었다. ㅎㅎ 우선 전혀 IR에 대해서 몰랐는데. 이것저것 공부할 수 있어서 좋았다.

원래는 이렇게 오실로스코프를 이용해서 리모콘이 전달하는 파동을 찾아서 정보를 얻도록 하는 것이다.
measuring signal with photodiode



oscilloscope image of 2 commands


좋은 공부가 될만한 레퍼런스를 적어본다.

http://www.zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
http://luckylarry.co.uk/arduino-projects/arduino-redefining-the-tv-remote/
http://www.matlabinuse.com/index.php?mid=Arduino_with_MATLAB&document_srl=2751


Posted by '김용환'
,


EMF Dectector 라고 검색하면 나오는 동영상을 보면서 나도 이런 측정기가 있으면 좋겠다고 생각했는데, 이번에 함 만들어보았다.
http://www.youtube.com/watch?v=y1Bke3750WE


아두이노를 가지고, 아주 간단하게 만든 전자파(전자기파) 측정기(emf detector)를 만들었고,
내가 속한 환경에서 전자파가 얼마나 나오는지를 알고 싶었다. 결과는 상당히 충격적이었다.

모니터, pc, 선풍기, 전화기, 핸드폰(iphone), 갤탭 7인치에서는 검출되지 않았다.
일부 충전중인 아이폰에서는 전자파가 나왔다.

충전하는 노트북과 전원 연결, 어댑터에서는 조금 전자파가 나오는지 확인할 수 있었다. 1/10~3/10 정도였다. 또한, 휴텍스의 이온파크 송풍기에서 검출되었다. 
 
충전하는 노트북을 이 전자파 측정기로 살펴보았더니, 델, HP, 애플 최신 노트북, acer/eeepc 구형 노트북에서 발생되는 것을 확인했다. 특히 애플은 알루미늄때문에 그런지 아주 잘 잡힌다.

구형 소니 바이오 노트북, 신형 레노보 노트북, 신형 삼성, 신형  LG 노트북에서는 전자파가 발생되지 않았다.
(노트북이 진열된 곳에서 검사해봤다. 정확한 모델명은 잘 모르겠음..ㅎ )


전자기파를 0~1023까지의 숫자로 표현한다면 10~20% 정도가 근처에서 나왔다고 보면 된다.
애기와 산모등은 최대한 전원 어댑터와 노트북으로부터 피하는 것이 좋은 것 같다는 생각을 하게 되었다. 


실제로 만든 간단한 detetor이다.




아이폰 동영상을 반대로 해서 찍었지만, 대충. 이렇게 쓰일 수 있다는 의미로 보면 될 것이다.





소스를 공유한다.

fritzing 소스는 (아두이노 설계 프로그램 정도로 보면 된다. http://fritzing.org/ 참조 )
설계 파일은 아래 링크에서 다운받으면 된다.



 




아두이노 소스는 다음과 같다.

#define NUMREADINGS 10 // raise this number to increase data smoothing

int senseLimit = 10; // raise this number to decrease sensitivity (up to 1023 max)
int probePin = 5;
int val = 0;

int readings[NUMREADINGS];                // the readings from the analog input
int index = 0;                            // the index of the current reading
int total = 0;                            // the running total
int average = 0;                          // final average of the probe reading

int updateTime = 50;

byte seven_seg_digits[10][7] = { { 0,0,0,0,0,0,1 },  // = 0
                                 { 1,0,0,1,1,1,1 },  // = 1
                                { 0,0,1,0,0,1,0 },  // = 2
                                { 0,0,0,0,1,1,0 },  // = 3
                                 { 1,0,0,1,1,0,0 },  // = 4
                                 { 0,1,0,0,1,0,0 },  // = 5
                                 { 0,1,0,0,0,0,0 },  // = 6
                                 { 0,0,0,1,1,1,1 },  // = 7
                                 { 0,0,0,0,0,0,0 },  // = 8
                                 { 0,0,0,1,1,0,0 }   // = 9
 };

void setup() {               
  pinMode(2, OUTPUT);  
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  writeDot(0);  // start with the "dot" off
//  intro();
   Serial.begin(9600); 


}

void writeDot(byte dot) {
  digitalWrite(9, dot);
}
   
void sevenSegWrite(byte digit) {
  byte pin = 2;
  for (byte segCount = 0; segCount < 7; ++segCount) {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
  }
}

void loop() {
  
   val = analogRead(probePin);  // take a reading from the probe

  if(val >= 1){                // if the reading isn't zero, proceed
    val = constrain(val, 1, senseLimit);  // turn any reading higher than the senseLimit value into the senseLimit value
    //val = map(val, 1, senseLimit, 1, 1023);  // remap the constrained value within a 1 to 1023 range
    val = map(val, 1, senseLimit, 1, 1023);  // remap the constrained value within a 1 to 1023 range
   
    total -= readings[index];               // subtract the last reading
    readings[index] = val; // read from the sensor
    total += readings[index];               // add the reading to the total
    index = (index + 1);                    // advance to the next index

    if (index >= NUMREADINGS)               // if we're at the end of the array...
      index = 0;                            // ...wrap around to the beginning

    average = total / NUMREADINGS;          // calculate the average


    if (average > 950){
        sevenSegWrite(0);
    } else if (average > 850){
        sevenSegWrite(1);
    } else if (average > 750){
         sevenSegWrite(2);
    } else  if (average > 650){
         sevenSegWrite(3);
    } else if (average > 550){
         sevenSegWrite(4);
    } else if (average > 450){
        sevenSegWrite(5);
    } else if (average > 350){
          sevenSegWrite(6);
    } else if (average > 250){
        sevenSegWrite(7);
    } else if (average > 150){             
         sevenSegWrite(8);  
    } else if (average > 50){
         sevenSegWrite(9);
    }
   
    Serial.println(average);
    delay(updateTime);
  }

  
}

void intro() {
   for (byte count = 10; count > 0; --count) {
   delay(1000);
   sevenSegWrite(count - 1);
  }
  delay(100);
}





아래 싸이트에서 일부 내용을 참조하여 사용했다. `

http://arduino-projects-here.blogspot.com/2010/10/arduino-emf-electromagnetic-field.html

Posted by '김용환'
,



다시 7 segment로 count down(카운트 다운)을 다시 만들려고 하니. 갑갑해졌다.
정보도 찾기 힘들고. 이번기회에 정리해야지.

7 segment에 대한 좋은 정보는 여기서 확인할 수 있다.
anode type, cathod type이 있다는 것을 처음 알았다. 다 같은 녀석인줄 알았더니 아니구나.

http://cafe.naver.com/digiglue.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=25&



내가 가지고 있는 제품은 udg-1056A 라는 7 segment이다.





아두이노 핀과 7 segment와 잘 연결한다.


Arduino Pin 7 Segment Pin Connection
 2 7 (A)
 3 6 (B)
 4 4 (C)
 5 2 (D)
 6 1 (E)
 7 9 (F)
 8   10 (G)
 9  5 (DP)


8 번 GND과 3.3V connection pin 사이에 저항을 잘 둔다.




간단한 count down 코드 테스트


void setup() {              
  pinMode(2, OUTPUT); 
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(9, 0);  // start with the "dot" off
}

void loop() {
 // write '9'
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(1000);

 // write '8'
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(1000);
 
 // write '7'
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(1000);
 // write '6'
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(1000);
 // write '5'
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(1000);

 // write '4'
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(1000);
 // write '3'
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 0);
 delay(1000);
 // write '2'
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 0);
 delay(1000);
 // write '1'
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(1000);
 // write '0'
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
 delay(4000);

}
 





여기서 배열을 사용한 사례이다.


byte seven_seg_digits[10][7] = { { 0,0,0,0,0,0,1 },  // = 0
                                 { 1,0,0,1,1,1,1 },  // = 1
                                { 0,0,1,0,0,1,0 },  // = 2
                                { 0,0,0,0,1,1,0 },  // = 3
                                 { 1,0,0,1,1,0,0 },  // = 4
                                 { 0,1,0,0,1,0,0 },  // = 5
                                 { 0,1,0,0,0,0,0 },  // = 6
                                 { 0,0,0,1,1,1,1 },  // = 7
                                 { 0,0,0,0,0,0,0 },  // = 8
                                 { 0,0,0,1,1,0,0 }   // = 9
 };

void setup() {               
  pinMode(2, OUTPUT);  
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  writeDot(0);  // start with the "dot" off
}

void writeDot(byte dot) {
  digitalWrite(9, dot);
}
   
void sevenSegWrite(byte digit) {
  byte pin = 2;
  for (byte segCount = 0; segCount < 7; ++segCount) {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
  }
}

void loop() {
  for (byte count = 10; count > 0; --count) {
   delay(1000);
   sevenSegWrite(count - 1);
  }
  delay(4000);
}




idea :
http://www.hacktronics.com/Tutorials/arduino-and-7-segment-led.html

내가 쓰고 있는 7 segment와 약간 달라서 조금 수정

Posted by '김용환'
,

arduino에서 바로 시간 정보를 사용하려고 하면 다 짜야 한다.
그러나, arduino는 웹을 통해서 쉽고 사용할 수 있는 Time Library 파일을 제공하고 있다.

바로 Time Library이다.
http://www.arduino.cc/playground/Code/Time


http://www.arduino.cc/playground/uploads/Code/Time.zip 를 다운받아.
arduino 설치 디렉토리의 libraries 디렉토리 밑에 바로 풀면 된다.
이렇게 하면, DS1307RTC, Time, TimeAlarms 이런 디렉토리가 생긴다.
Time 디렉토리에 가보면, Time.cpp, Time.h 파일과 함께 Readme.txt 파일이 보일 것이다. 디렉토리 밑에는 Examples가 있다.

arduino 실행파일을 종료하고 다시 실행하면,  time library에 대한 example을 실행해볼 수 있다.
아두이노의 큰 장점이기도 하다.




시간은 약간 이슈가 있다.
현재의 시간(NTP)에 대한 정보를 받기 위해서는 이더넷 카드를 쓰거나 수동으로 현재 시간을 입력(setTime함수) 해줘야 한다. 아.. 테스트해보고 나서.. 알았다.

다음 예제를 가지고 만들었다.

http://arduino.cc/en/Tutorial/LiquidCrystal



똑같이 만들어 보았다.



기존 소스를 응용해서 LCD에 출력해보았다.

// include the library code:
#include <LiquidCrystal.h>
#include <Time.h> 

#define TIME_MSG_LEN  11
#define TIME_HEADER  'T'
#define TIME_REQUEST  7

 

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  lcd.begin(16, 3);
  lcd.print("Time");
}

void loop() {
   lcd.setCursor(1, 2);
   digitalClockDisplay(); 
   delay(1000);
}


void digitalClockDisplay(){
  // digital clock display of the time
  lcd.setCursor(0, 1);
  lcd.print(year());
  lcd.print(".");
  lcd.print(month());
  lcd.print(".");
  lcd.print(day());
  lcd.print(" ");
  lcd.print(hour());
  lcd.print(":");
  lcd.print(minute());
  lcd.print(":");
  lcd.print(second());

}






이더넷 쉴드를 사용해서 NTP를 쓸 수 없어서 간단한 테스트 정도로 해야겠다.
setTime() 함수를 이용해서 현재시간을 주고, 매 15분마다 alarm을 주는 예제..
간단하게 이벤트 처리로 사용할 수 있다는 점을 배움


#include <Time.h>
#include <TimeAlarms.h>
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  setTime(14,29,0,1,11,11);
  Alarm.timerRepeat(15, Repeats);            // timer for every 15 seconds   
}

void Repeats() {
    lcd.blink();
    delay(2000);
}

void  loop(){ 
  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display
}

void digitalClockDisplay()
{
 
  lcd.begin(16, 3);
 lcd.print(year());
  lcd.print(".");
  lcd.print(month());
  lcd.print(".");
  lcd.print(day());

  lcd.setCursor(0, 1);
  lcd.print(hour());
  printDigits(minute());
  printDigits(second());
}

void printDigits(int digits)
{
  lcd.print(":");
  if(digits < 10)
    lcd.print('0');
  lcd.print(digits);
}



결과 화면



그리 대단하지는 않지만, character lcd를 새로 사서 어떻게 써먹어야 할지 고민중..





Posted by '김용환'
,

가변저항

아두이노 2011. 11. 1. 10:19
Posted by '김용환'
,

무한도전 Speed 보니까 재미있었다.


<출처 : withmbc>

이렇게 동작하는 아두이노 데모를 하나 만들었다.
사실 프로그래밍 하는 사람이라면 금방할 수 있을 듯..



가변저항이 일종의 3색선 짜르는 거(빨리, 멈춤, 늦음)처럼 되는 대타가 되고.
카운터는 간단히 FND 쓰고..
터지는 것은 LED 하나과 미디 소리로 대신했다. (회사에서는 좀 시끄러워서..싀위치를 써봤다.)






굉장히 허접하긴 하지만. 공유해 본다. ㅎㅎ 아 재미있었다.





다음에는 부속부품들을 사면서 조금씩 배워야지..

'아두이노' 카테고리의 다른 글

아두이노(arduino)에서 time 사용하기  (0) 2011.11.01
가변저항  (0) 2011.11.01
저항 꼭 사용하기  (0) 2011.10.04
가변저항 테스트  (0) 2011.10.04
아두이노 디버그 방법  (0) 2011.09.28
Posted by '김용환'
,

손에 잡히는 아두이노
아두이노 for 인터랙티브 뮤직

어떤 예제를 이용해서 하다보면, 눈알이 빠지도록 너무 밝았다.
어떤 예제는 저항을 사용하기도 하고, 안사용하기도 하고..

이상하다 싶어서 자료를 찾아보니..

흑!!

저항이 있어야 너무 많은 전류가 아두이노 칩이나 LED에 들어가 타버리는 것을 막을 수 있다고 한다..
저항을 반드시 사용해야 하는데, 책 저자는 그것을 모르고, 그냥 테스트했다고 한다.
다행이 2쇄부터는 이 내용이 고치거나 빠진다고 하니 다행이다.

저항과 눈부심때문에 찾아봤는데...
궁금해서 찾아보길 다행이다... ㅎㅎ



관련 내용은 아래를 보면 된다.

http://blog.insightbook.co.kr/216

http://robobob.tistory.com/42

'아두이노' 카테고리의 다른 글

가변저항  (0) 2011.11.01
무한도전 Speed를 보고 데모용 아두이노 만들어보다.  (0) 2011.10.06
가변저항 테스트  (0) 2011.10.04
아두이노 디버그 방법  (0) 2011.09.28
not in sync 아두이노 에러  (2) 2011.09.28
Posted by '김용환'
,

가변저항이라는 것을 처음을 알았다.

먼저 아래 싸이트 가본다.
http://arduino.cc/en/Tutorial/AnalogInput




Fritzing 이라는 툴을 이용하면 배치도를 살펴볼 수 있다. 나같은 aduino 나 하드웨어 초보에겐 딱이다.





그리고,  아래 소스를 sketch에서 실행한다.

http://arduino.cc/en/Tutorial/AnalogInput


int sensorPin = A0;    // select the input pin for the potentiometer
int ledPin = 13;      // select the pin for the LED
int sensorValue = 0;  // variable to store the value coming from the sensor

void setup() {
  // declare the ledPin as an OUTPUT:
  pinMode(ledPin, OUTPUT);  
}

void loop() {
  // read the value from the sensor:
  sensorValue = analogRead(sensorPin);    
  // turn the ledPin on
  digitalWrite(ledPin, HIGH);  
  // stop the program for <sensorValue> milliseconds:
  delay(sensorValue);          
  // turn the ledPin off:        
  digitalWrite(ledPin, LOW);  
  // stop the program for for <sensorValue> milliseconds:
  delay(sensorValue);                  
}



a0 input을 받아서 가변저항으로부터 받은 sensorValue를 받아 13핀에 연결된 LED를 High(킴)했다가.
센서값만큼 delay하고, LED를 LOW(끔)을 하도록 한다. 그리고, 다시 delay..

가변저항의 아날로그 값을 움직일 때마다 반짝거리게 한다.





Posted by '김용환'
,


JTAG 이런 방식이 아니라 Serial (USB)로 간단하게 출력하는 것을 말한다.

C랑은 좀 다른 API를 제공한다.

#define LED 13

int val = 0;


void setup() {
   Serial.begin(9600);      
    pinMode(LED, OUTPUT);
     
}

void loop() {
    val = analogRead(0);
      Serial.print("Analog Censor"); 
      Serial.print("\t");     
     Serial.println(val);
    
    digitalWrite(LED, HIGH);
    delay(val);

    digitalWrite(LED, LOW);

   delay(val);

        
}




아래와 같이 나온다.



API 는 아래 문서 에 있다.. 역쉬~
http://www.arduino.cc/en/Serial/Print

'아두이노' 카테고리의 다른 글

저항 꼭 사용하기  (0) 2011.10.04
가변저항 테스트  (0) 2011.10.04
not in sync 아두이노 에러  (2) 2011.09.28
아두이노 Aduino 구매와 설치과 간단 동작 데모  (0) 2011.09.28
2011년 7월 아두이노 새소식  (0) 2011.07.22
Posted by '김용환'
,