프로세싱(Processing) 개발 툴을 분석하고 나면,  아두이노 개발 툴 소스 분석은 더 쉽다. 
아두이노 개발 툴은 프로세싱 개발 툴 소스 depedency가 있거나 복사된 소스들이 많다.  (정확히 역사는 어떻게 되었는지는 모르지만..^^;)

1. 소스를 다운받는다.

http://www.arduino.cc/en/Main/software  페이지에서 소스를 다운받는다.

 

2. 이클립스 프로젝트 환경 구축

이클립스 프로젝트를 하나 생성하고 다운받은 소스를 복사한다. 아두이노 개발 툴 안에 이클립스 설정이 파일이 있다.

 

아두이노 개발 툴의 build path를 살펴보면, processing-core를 참조하고 있다. (processing.core 패키지를 참조하고 있다.)

 

프로세싱 소스는 아래 위치에서 git로 다운받는다.

http://code.google.com/p/processing/source/checkout

 

프로세싱 코드는 2.0으로 다운받으면, processing.app.RunnerListener 인터페이스를 모두 상속해서 구현하지 않았다고 아두이노 개발 툴 소스의 Editor 클래스 컴파일 에러가 난다. API 구현해주면 깨끗하게 컴파일 완료된다.

public class Editor extends JFrame implements RunnerListener {

…..


@Override
public void startIndeterminate() {
    // TODO Auto-generated method stub
   
}


@Override
public void stopIndeterminate() {
    // TODO Auto-generated method stub
   
}


@Override
public void statusHalt() {
    // TODO Auto-generated method stub
   
}


@Override
public boolean isHalted() {
    // TODO Auto-generated method stub
    return false;
}

 

컴파일 완료된 상태

<아두이노 소스>

 

빌드 연동

 

프로세싱 소스 (core/src 디렉토리의 소스만 잘 빌드되면 됨)

 

3. 소스 디렉토리 확인

UI 부분은 프로세싱과 거의 동일하다.

 

디버그 관련 패키지가 들어가 있다.  컴파일도 하고 실행했을 때 output 처리하는 것들. arduino 보드에 올리는 클래스들이 담겨 있다.

 

프로세싱 개발 툴은 java 기반이지만, 아두이노 개발 툴은 자바 기반 언어대신 C 언어의 특성을 가지고 있다.  (그래서 antlr는 사용할 필요가 없다.)
그러나 화면에 출력되는 문법에 맞는 색상을 칠해주는 패키지이다.

 

이 외. 운영체제(플랫폼)에 맞는 다양한 작업 패키지들이 있다. 여기도 프로세싱 개발 툴처럼  jna가 쓰이고 있다.

processing.app.linux, processing.app.windows, processing.app.macosx


4. 빌드

빌드는 build 디렉토리에 있는 build.xml를 가지고 ant 컴파일 하면 된다.

Buildfile: G:\workspace\arduino-1.0\build\build.xml
build:
revision-check:
windows-checkos:
subprojects-build:
compile:
....
 [launch4j] Compiling resources
 [launch4j] Linking
 [launch4j] Successfully created G:\workspace\arduino-1.0\build\windows\work\arduino.exe
BUILD SUCCESSFUL
Total time: 44 seconds


 

Posted by 김용환 '김용환'



아두이노 보드에 이렇게 구성한다. 
8번 포트를 아웃푹으로 지정





아두이노 소스 




const int ledPin = 8;      // the pin that the LED is attached to

void setup()
{
  // initialize the serial communication:
  Serial.begin(9600);
  // initialize the ledPin as an output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  byte brightness;

  // check if data has been sent from the computer:
  if (Serial.available()) {
    // read the most recent byte (which will be from 0 to 255):
    brightness = Serial.read();
    // set the brightness of the LED:
    analogWrite(ledPin, brightness);
  }
}




프로세싱 소스

(원 소스는 http://www.learningprocessing.com 에서 있으며, 그림 예제에서 일부를 수정해서 만들었음)

 import processing.serial.*;
 Serial port;


boolean button = false;

int x = 150;
int y = 150;
int w = 100;
int h = 75;

void setup() {
  size(400,400); 
  
  // 디버그 
 println("Available serial ports:");
 println(Serial.list());
 // 내 pc 에는 Serial 내부 구조의 1번에 com3로 연결된 아두이노가 있다. 
  port = new Serial(this, Serial.list()[1], 9600);  
}

void draw() {
  if (button) {
    background(255);
    stroke(0);
  } else {
    background(0);
    stroke(255);
  }
  
  fill(175);
  rect(x,y,w,h);
}


void mousePressed() {
  if (mouseX > x && mouseX < x+w && mouseY > y && mouseY < y+h) {
    button = !button;
  }  

// 버튼의 값이 true이면 led을 끼고, false이면 led를 끈다.
  if (button == true) {
    // turn on led
     port.write(255);
  } else {
    // turn off led
    port.write(0);
  }
}





여기서 약간 나는 머리를 썼다.
LED를 재미있게 만들었다. 원래 선물받은 제품인대, 꼬마 전구가 문제가 생겨서 못쓰고 있었다.
(사실 나는 "손에 잡히는 아두이노" 책에서 영감받아 나만의 재미있는 것을 만들려던 참이었다.)









꼬마 전구 대신 간단한 LED를 이용했다. 그리고 간단하게 테이프를 붙였다.
(.  원리는 무척 간단한데, 이런 제품을 구하기 가 어렵다는 게 있다. )

그리고 아두이노에 연결했다

처음에는 검은 바탕으로 있다. 꺼져있다. 





가운데 버튼을 눌러주면 환하게 켜진다. 




그렇게 복잡하지는 않지만, pc에서 아두이노를 다룬다는 것은 재미있다. 복잡한 프레임워크나 어려운 코드를 쓰지 않아도 내가 원하는 것을 할 수 있다니 매력이 있다. 

흐흐.. 이제 점점 장난감으로 갈 것 같다. 


Posted by 김용환 '김용환'

아두이노를 다룰 때, 아두이노 자체에서만 동작하는 "Arduino software(아두이노 소프트웨어)"만 써왔다.
pc에서 아두이노 기기를 다룰려면, 드라이버를 이용해서 코딩해야 한다. 
찾아보니 Visial Studio에서 연동하는 게 있기는 한데..
간단하게 동작되는 것만 하고 싶었는데. Processing(프로세싱) 이라는 툴 및 언어를 이용하면 될 것 같다. 
(프로세싱 언어가 자바랑 비슷한 문법을 하고 있다. 자바 개발자에게는 어쩌면 딱이다.)

프로세싱은 UI 및 아두이노와 serial 통신을 책임져준다. 


"손에 잡히는 아두이노" 책에서 간단히 소개할 때는 그런가 보다 했는데..
조금씩 이해하면서 접근해야지. 


설치 
http://processing.org/download/ 에 접속해서 1.5.1 를 다운받는다. 
 

 


UI Loo& Feel 은 꼭 아두이노 소프트웨어처럼 생겼다. 하지만 거의 자바와 비슷한 문법을 취하고 있다. (사실 내부는 jvm을 사용하고 있다.)


실제 돌아가는지 테스트해본다. 

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




다음과 같이 설정한다. 



아두이노 소프트웨어에 다음의 코드를 넣는다.  


const int ledPin = 9;      // the pin that the LED is attached to

void setup()
{
  // initialize the serial communication:
  Serial.begin(9600);
  // initialize the ledPin as an output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  byte brightness;

  // check if data has been sent from the computer:
  if (Serial.available()) {
    // read the most recent byte (which will be from 0 to 255):
    brightness = Serial.read();
    // set the brightness of the LED:
    analogWrite(ledPin, brightness);
  }
}




프로세싱 코드


SERIAL 포트 중에 연결되어 있는 녀석으로 수정해야 한다. 
내 pc에는 1번 값에 com3로 arduino로 연결되어 있어서 1로 수정했다.  


 import processing.serial.*;
 Serial port;
 
 void setup() {
 size(256, 150);
 
 println("Available serial ports:");
 println(Serial.list());
 
 // Uses the first port in this list (number 0).  Change this to
 // select the port corresponding to your Arduino board.  The last
 // parameter (e.g. 9600) is the speed of the communication.  It
 // has to correspond to the value passed to Serial.begin() in your
 // Arduino sketch.
 port = new Serial(this, Serial.list()[1], 9600);  
 
 }
 
 void draw() {
 // draw a gradient from black to white
   for (int i = 0; i < 256; i++) {
   stroke(i);
   line(i, 0, i, 150);
   }
 
 // write the current X-position of the mouse to the serial port as
 // a single byte
 port.write(mouseX);
 }
 



그리고, processing 코드를 돌려보면 검은색 부분으로 마우스를 이동하면 LED가 꺼지고,
밝은 색 부분으로 마우스를 이동하면 LED가 켜진다. 




좋은 Reference 

http://www.arduino.cc/en/Tutorial/HomePage
http://processing.org/learning/
http://www.learningprocessing.com
http://www.cre8ive.kr/blog/2009/02/27/arduino-processing-%EC%97%B0%EB%8F%99/
책 - "손에 잡히는 아두이노"



Posted by 김용환 '김용환'



드디어 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 김용환 '김용환'
TAG Arduino


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

적외선 수신 센서는 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 라고 검색하면 나오는 동영상을 보면서 나도 이런 측정기가 있으면 좋겠다고 생각했는데, 이번에 함 만들어보았다.
https://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 김용환 '김용환'

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 김용환 '김용환'

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


<출처 : withmbc>

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



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






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





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

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

아두이노(arduino)에서 time 사용하기  (0) 2011.11.01
가변저항  (0) 2011.11.01
무한도전 Speed를 보고 데모용 아두이노 만들어보다.  (0) 2011.10.06
저항 꼭 사용하기  (0) 2011.10.04
가변저항 테스트  (0) 2011.10.04
아두이노 디버그 방법  (0) 2011.09.28
Posted by 김용환 '김용환'