아두이노 센서 값 초기화 - adu-ino senseo gabs chogihwa

※ 아두이노 나노의 경우 제가 테스트해보니 watchdog이 정상작동되지 않네요. 부트로더의 문제라고 하는데 아직 해결하지는 않은듯 합니다. 나노를 사용하시는 분들은 참고하시기 바랍니다. 만약.. 나노보드를 이용해서 watchdog 리셋기능을 꼭.. 사용하시고자 한다면.. 나노에 아두이노 우노의 부트로더를 업로드(굽기?) 하시는것도 하나의 방법이 되실듯 합니다. 단 이때는 A6,A7 핀 사용은 포기하셔야 할 듯 합니다..

3. 프로그램 다시 시작하기

. 해당 방법은 보드 자체를 재기동하지는 않고 프로그램을 다시시작하는 방법입니다. 프로그램을 다시 시작하기 때문에 setup함수 부터 다시 시작되게 됩니다. 하지만 보드를 리셋하는 개념은 아니기 때문에 기존에 핀이 가지고 있던 값이 다시 초기화 되거나 하지는 않습니다.

. 사용방법은

void(* resetFunc) (void) = 0; 를 정의하고 리셋이 필요한 곳에서 해당 함수를 호출하면 됩니다.

. LED를 2,3번핀에 연결하여 놓고 차례로 2,3번핀에 HIGH신호를 주되 3번핀에 HIGH신호를 주기전에 resetFunc()함수를 호출해보겠습니다. 그렇게 되면 3번핀에 연결된 LED에는 불이들어오지 않고 LED2번만 불이 들어왔다 꺼졌다 하게 됩니다.

이 스케치는 아날로그 입력 단의 센서 값을 읽어 들일 때, 몸무게를 잴 때 저울을 영점 조정(calibration)하듯이 초기화 부분에서 5초 동안 센서의 최소 값과 최대 값을 측정하고 이 값들을 가지고 주 처리 부분인 loop()에서 측정한 센서 값을 조정하는 것을 보여주는 예제입니다.

1. 준비물과 회로 구성

준비물은 아날로그 센서로 포토레지스터 1개와 10KΩ​ 저항, LED 1개와 LED를 보호할 220Ω 저항 그리고 점퍼선 5개가  필요로 됩니다.  

준비물

=====

  • 포토레지스터 1개
  • LED 1개
  • 10KΩ, 220Ω 저항  각 1개 
  • 점퍼선 5개

회로 구성

=======

  • 디지털 9번 핀과 LED의 아노드를 연결하고, LED의 캐소드를 220Ω 저항 다리애 연결하고 저항 맞은 편 다리를 GND로 연결합니다.​
  • 포토레지스터를 아날로그 A0 핀과 연결하고 10KΩ 저항을 통하여 GND로 연결합니다. 포토레지스터 다른 쪽 다리를 +5V와 연결합니다. ​

2. 스케치 설명

초기화 부분을 담당하는 setup()에서는 아두이노 보드에 장착되어 있는 LED를 교정 시작과 끝을 알리기 위한 용도로 사용합니다. 이를 위하여 pinMode() 함수를 이용하여 출력 핀으로 선언하고 바로 LED를 digitalWrite() 명령을 이용하여 켭니다.

  pinMode(13, OUTPUT);

  digitalWrite(13, HIGH);

아두이노 보드가 리셋 되어 처음 시작할 때, millis() 함수는 0에서 시작됩니다. 이 값이 5000 보다 작을 때, 즉 5초 보다 작을 동안만 센서 값을 읽어 최소 값과 최대 값을 기록하게 됩니다.

while(millis() < 5000) {

  ...

}

 재미있는 것은 analogRead() 함수로 읽어 들일 때, 제일 큰 값이 1023이고 제일 작은 값이 0인데, 시작할 때, 최소 값으로 1023을 최대 값으로 0로 놓고 읽어 들인 값들과 비교하여 새로운 최대, 최소 값으로 바꿔 놓습니다. 교정이 끝나면 LED를 끕니다.

sensorValue = analogRead();

digitalWrite(13, LOW);

주 처리 부분인 loop()에서는 map() 함수를 이용하여 최소 값과 최대 값의 범위의 값으로 PWM 신호를 만들어 낼 0 ~ 255 사이의 값으로 변환합니다.​ 재미있는 것은 센서 값이 최소 값과 최대 값 범위를 벗어나면 0 ~ 255 사이의 값으로 변환이 안되기 때문에 constrain() 함수를 이용하여 다시 0 ~ 255 사이의 값으로 바꿔줍니다. 이 값을 이용하여 LED의 밝기를 조절합니다.

sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);

sensorValue = constrain(sensorValue, 0, 255);

analogWrite(ledPin, sensorValue);

스케치

=====

  Calibration (교정 | 보정 | 영점 조정)

 센서 입력 값을 교정하는 하나의 기법을 보여주는 예제입니다.

 스케치가 실행될 때 최초 5초 동안 센서 핀에 연결된 센서의

 기대치의 최대 최소 값을 결정하기 위하여 센서를 읽어 들입니다.

 센서의 최대 값과 최소 값의 초기 값은 서로 반대로(거꾸로) 되어

 있습니다. 시작할 때, 최소 값을 높게 놓고 낮은 센서 값이 읽히면

 이 값을 새로운 최소 값으로 놓습니다. 이와 같이 최대 값은 낮게

 놓고 새로운 높은 값이 읽히면 이를 새로운 최대 값으로 놓습니다.

 * 아날로그 센서(포토레지스터)을 아날로그 입력 핀 A0에 연결합니다.

 * 220Ω 저항 한쪽을 디지털 9번 핀에 연결하고 저항 다른 한쪽을 LED의

   아노드(다리가 긴쪽)에 연결합니다. LED의 캐소드(다리가 짧은 쪽)를

 David A Mellis에 의하여 2008년 10월 29에 창작되었으며

 2011년 08월 30일에 Tom Igoe에 의하여 수정되었습니다.

// 이 상수 값들은 결코 변하지 않으며, 사용된 핀들에 이름을 붙여

const int sensorPin = A0;    // 센서가 연결된 핀

const int ledPin = 9;        // LED가 연결된 핀

int sensorValue = 0;         // 센서 값

int sensorMin = 1023;        // 센서 최소값

int sensorMax = 0;           // 센서 최대값

  // 교정 중이라른 것을 알리기 위하여 LED를 ON합니다:

    sensorValue = analogRead(sensorPin);

    if (sensorValue > sensorMax) {

    if (sensorValue < sensorMin) {

  sensorValue = analogRead(sensorPin);

  sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);

  // 교정중에 범위가 넘어간 센서값인 경우에는 0 ~ 255 값으로 제한합니다

  sensorValue = constrain(sensorValue, 0, 255);

  // 교정된 값을 이용하여 PWM 신호를 만들어 LED에 공급합니다:

  analogWrite(ledPin, sensorValue);

Colored By Color Scripter™

3. 실행 결과

스케치를 업로드하면, 아두이노 보드에 있는 LED에 불이 들어오고 최소 값과 최대 값을 정하기 위하여 아날로그 A0 핀에 연결되어 있는 포토레지스터 센서 값을 읽어 들이기 시작합니다. 5초가 지나면 LED가 꺼지면서 포토레지스터 센서 값에 해당된 밝기로 디지털 9번 핀에 연결되어 있는 LED에 불이 들어옵니다.