안녕하세요. 오늘은 수위 센서를 사용하는 방법에 대해 알아보고자 합니다.
앞에서 배웠던 다른 센서들과 마찬가지로 수위 센서도 굉장히 간단한 센서에 속합니다.

그림 1 : 수위 센서
[그림 1 : 수위 센서]

그림 1에서 볼 수 있듯이 수위 센서에는 3개의 핀이 있습니다.
먼저 S라고 적혀있는 핀은 물의 높이를 입력으로 보내주는 핀입니다.
그 옆에 있는 + 핀은 전원(5V)을 연결하는 핀입니다.
가장 오른쪽에 있는 - 핀은 그라운드(GND)에 연결하는 핀입니다.

아래의 표 1에 아두이노 보드와 수위 센서에 연결되는 각 핀의 대응 관계를 나타냈습니다.

아두이노 보드 핀 수위 센서 핀
아날로그 0번 핀 신호 입력 핀(S)
5V +
GND -

[표 1 : 아두이노 보드와 연결되는 수위 센서 핀]

1. 회로 연결

표 1에 적혀 있듯이 각 핀을 연결해줍니다. 이 정도는 너무 간단하니 빵판(bread board)없이 작업하겠습니다.

그림 2 : 아두이노 보드와 수위 센서 연결
[그림 2 : 아두이노 보드와 수위 센서 연결]

2. 스케치

수위 센서의 값을 입력으로 받아서, 시리얼 모니터로 출력하는 스케치를 작성해보겠습니다.
시리얼 모니터가 생소하다면, 이 글을 참조하시기 바랍니다.

const int WATER_SENSOR_PIN = A0;

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

void loop() {
  int sensorVal = analogRead(WATER_SENSOR_PIN);

  Serial.print("sensor value = ");
  Serial.println(sensorVal);

  delay(500);
}
  • 1 줄 : 수위 센서 핀을 A0 핀으로 설정합니다. 디지털 핀의 경우는 1, 2같은 숫자를 썼지만, 아날로그 핀은 A0, A1과 같이 앞에 ‘A’를 붙여 줍니다.
  • 3~5 줄 : 수위 센서의 값을 시리얼 모니터로 확인하기 위해서 9600 baud rate로 Serial.begin()을 사용합니다. 디지털 핀의 경우, 입력모드인지 출력모드인지 설정해주기 위해 pinMode()함수를 사용했던 것과 다르게, 아날로그 입력은 pinMode()설정이 필요없습니다.
  • 8 줄 : analogRead()함수를 이용해서 수위 센서의 값을 받아옵니다.
  • 10~11 줄 : 8줄에서 입력받은 센서 값을 시리얼 모니터에 출력합니다.
  • 13 줄 : 500ms 동안 쉽니다.

3. 결과

이번 실험은 수위 센서를 물에 담궈야합니다.
이때 핀이 있는 위쪽에 물이 닿게 되면 어떤 일이 벌어질지 모르니, 아래쪽의 센서 부분에만 물이 닿도록 합니다.

그림 3 : 수위 센서를 물에 담근 모습
[그림 3 : 수위 센서를 물에 담근 모습]

그림 3과 같이 수위 센서를 물에 담그고, 시리얼 모니터를 열어보면 수위에 대한 값이 출력 됨을 확인할 수 있습니다.
물을 더 넣어보면 값이 증가하는 것도 확인할 수 있을 것 입니다.

그림 4 : 시리얼 모니터 결과
[그림 4 : 시리얼 모니터 결과]

안녕하세요. 오늘은 소리 센서를 사용하는 방법을 알아보고자 합니다.

소리 센서는 말 그대로 소리를 탐지하는 센서입니다.
여기에서 소리를 탐지한다는 것은 소리의 크기만 탐지하는 것이지, 음의 높낮이 등의 정보는 얻을 수 없음에 유의하시기 바랍니다.

그림 1 : 소리 센서
[그림 1 : 소리 센서]

이번 실험에서는 소리 센서로 입력받은 값을 시리얼 모니터로 출력합니다.
시리얼 모니터의 사용법을 잘 모르시는 분들은 시리얼 모니터와 가변저항 포스팅을 참고하시기 바랍니다.

1. 회로 연결

이번에는 회로도 없이 바로 연결된 사진을 보시겠습니다.

그림 2 : 아두이노에 소리 센서 연결
[그림 2 : 아두이노에 소리 센서 연결]

아두이노 보드 핀 소리 센서
아날로그 0번 핀 A0
GND(그라운드) GND
VCC(5V) VCC

[표 1 : 아두이노 - 소리 센서 핀 연결]

표1에 나와있는 것처럼 각 핀들을 연결해주면 됩니다.
소리 센서 뿐만 아니라, 보통 센서들은 전원과 그라운드를 연결해줘야 하고, 추가적으로 입력을 받기 위한 핀이 한개 이상 존재합니다.
소리 센서는 단 하나의 입력 핀이 있네요. 이 핀(A0)을 아두이노 보드의 A0에 연결해주면 되겠습니다.

2. 스케치

이번에는 스케치도 정말 간단합니다.

const int SOUND_SENSOR_PIN = A0;
int sensorValue;

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

void loop() {
  sensorValue = analogRead(SOUND_SENSOR_PIN);
  Serial.println(sensorValue);
  delay(20);
}
  • 1 줄 : 입력 핀 A0를 상수로 정의합니다.
  • 5 줄 : 9600 baud rate로 Serial 통신을 시작합니다. 이는 소리 센서가 받아오는 입력 값을 보기 위한 용도로 시리얼 모니터를 쓰기 위함입니다.
  • 9 줄 : analogRead()함수를 이용해서 A0 핀으로부터 아날로그 입력을 받습니다. 값의 범위는 0~1023 사이 입니다.
  • 10 줄 : 소리 센서의 값을 시리얼 모니터에 출력합니다.
  • 11 줄 : 20ms 동안 대기합니다.



3. 결과

그림 3 : 소리 크기 측정 결과
[그림 3 : 소리 크기 측정 결과]

그림 3에서 보시는 바와 같이 시리얼 모니터를 통해 소리의 크기를 확인할 수 있습니다.
저는 현재 제 주변에서의 기본적인 소리의 크기가 17정도인 것 같고, 박수를 가볍게 치면 20정도의 값이 나오네요.

안녕하세요. 오늘은 시리얼 모니터와 가변저항을 사용하는 방법을 배워보겠습니다.

1. 시리얼 모니터

시리얼 모니터는 아두이노 보드와 PC간에 시리얼 데이터를 주고 받을 수 있는 별도의 분리된 창입니다.
아래의 그림 1과 같이 시리얼 모니터 버튼은 아두이노 소프트웨어의 오른쪽 상단에 돋보기 모양의 아이콘으로 있습니다.

그림 1 : 시리얼 모니터 버튼의 위치
[그림 1 : 시리얼 모니터 버튼의 위치]

시리얼 모니터 버튼을 누르면 그림 2와 같이 시리얼 모니터가 팝업 형태로 뜨게 됩니다.

그림 2 : 시리얼 모니터
[그림 2 : 시리얼 모니터]

여기에는 입력할 수 있는 인풋 필드와 출력을 위한 텍스트 필드, 그리고 데이터 전송 속도 설정인 baud를 선택하는 팝업 리스트를 볼 수 있습니다. 처음부터 모든 것을 다 알려고 하면 힘드니까, 오늘은 출력 부분과 baud 설정만 살펴보도록 하죠.

1-1. 시리얼 모니터 출력 부분

출력 부분은 말 그대로 아두이노에서의 보내는 시리얼 데이터를 출력하는 곳 입니다.
Serial.print() 또는 Serial.println()을 이용해서 시리얼 모니터에 출력할 수 있습니다.
이 둘은 함수의 인자로 들어온 변수 값을 출력하는 일을 하는데, Serial.println()은 마지막에 라인엔딩을 추가해서 줄내림을 해줍니다. 이 두 함수에 사용되는 인자는 아두이노에서 정의하고 있는 모든 데이터 타입이 가능합니다.

숫자를 출력할 경우에는 특별히 2번째 인자를 사용해서 숫자의 출력 포맷을 결정할 수 있습니다.
포맷에는 DEC, HEX, OCT, BIN 이렇게 4가지 종류가 있는데 각각은 다음과 같습니다.

  • DEC - 십진수로 표현합니다.
  • HEX - 16진수로 표현합니다.
  • OCT - 8진수로 표현합니다.
  • BIN - 2진수로 표현합니다.

백문이 불여일견이라고, 실제로 사용하는 방법을 살펴보도록 하죠.

int x = 0;    // variable

void setup() {
  Serial.begin(9600);      // open the serial port at 9600 bps:    
}

void loop() {  
  // print labels 
  Serial.print("NO FORMAT");       // prints a label
  Serial.print("\t");              // prints a tab

  Serial.print("DEC");  
  Serial.print("\t");      

  Serial.print("HEX"); 
  Serial.print("\t");   

  Serial.print("OCT");
  Serial.print("\t");

  Serial.print("BIN");
  Serial.println("\t"); 

  for(x=0; x< 64; x++){    // only part of the ASCII chart, change to suit

    // print it out in many formats:
    Serial.print(x);       // print as an ASCII-encoded decimal - same as "DEC"
    Serial.print("\t");    // prints a tab

    Serial.print(x, DEC);  // print as an ASCII-encoded decimal
    Serial.print("\t");    // prints a tab

    Serial.print(x, HEX);  // print as an ASCII-encoded hexadecimal
    Serial.print("\t");    // prints a tab

    Serial.print(x, OCT);  // print as an ASCII-encoded octal
    Serial.print("\t");    // prints a tab

    Serial.println(x, BIN);  // print as an ASCII-encoded binary
    //                             then adds the carriage return with "println"
    delay(200);            // delay 200 milliseconds
  }
  Serial.println("");      // prints another carriage return
}

위의 예제 코드는 아두이노 사이트의 Serial.print()문서에서 참고한 코드입니다.
0부터 시작해서 63까지의 값을 출력하는데, 순서대로 기본 포맷, 십진수, 16진수, 8진수, 2진수로 출력해줍니다.
실제로 실행해보면 다음과 같은 결과를 볼 수 있습니다.

그림 3 : 숫자 출력 포맷
[그림 3 : 숫자 출력 포맷]

1-2. 시리얼 모니터 baud 설정

그림 4 : baud 설정
[그림 4 : baud 설정]

그림 4와 같이 시리얼 모니터 창에는 baud를 설정할 수 있는 팝업 리스트가 있습니다.
baud rate보레이트라고 읽고, 이는 시리얼 통신의 속도를 의미합니다.
기본적으로 디버깅의 용도로 시리얼 모니터를 사용하는 경우에는 9600을 사용합니다.
필요에 따라 다른 baud를 사용하기도 하는데, 아직은 정확히 그 용도를 모르겠습니다.

시리얼 모니터를 사용할 때 주의해야할 점은, 아두이노 스케치(코드)에서 설정한 baud와 시리얼 모니터 창에서의 baud값이 같아야 서로 통신을 할 수 있다는 점입니다.
위에서 보여줬던 코드의 setup부분을 보면 Serial.begin(9600);을 쓰고 있습니다.
이는 앞으로 9600 baud rate로 시리얼 데이터를 송수신하겠다는 의미입니다.
따라서 아래 그림 5와 같이 시리얼 모니터에서도 baud rate를 9600으로 맞춰줘야 합니다.

그림 5 : 시리얼 모니터 baud 9600
[그림 5 : 시리얼 모니터 baud 9600]

2. 가변 저항

가변 저항은 말그대로 저항의 값이 바뀔 수 있는 저항을 의미합니다.
가변 저항의 종류에도 여러가지가 있지만, 오늘은 회전형 가변 저항을 알아 보겠습니다.

그림 6 : 회전형 가변 저항
[그림 6 : 회전형 가변 저항]

그림 6과 같이 연결 핀이 3개가 있고, 회전할 수 있는 기다란 막대가 하나 있습니다.
3개의 핀을 차례대로 1번, 2번, 3번 핀이라고 하겠습니다.
가변 저항의 전체 저항 값은 정해져있고, 회전 막대를 어느 방향으로 회전하냐에 따라, 1번과 2번 사이의 저항 값과 2번과 3번 사이의 저항 값이 변하게 됩니다.

즉, 다음과 같이 정리할 수 있습니다.
(전체 저항) = (1번과 2번 사이의 저항) + (2번과 3번 사이의 저항)

전체 저항 값이 고정되어 있기 때문에 1번과 2번 사이의 저항 값과 2번과 3번 사이의 저항 값은 회전 막대의 회전 정도에 따른 비율에 따라 저항 값이 결정됩니다.
이해를 돕기 위해 그림으로 살펴보도록 하겠습니다.

그림 7 : 가변 저항 0%
[그림 7 : 가변 저항 0%]

그림 7은 가변 저항을 가장 왼쪽으로 돌린 경우라고 볼 수 있습니다. 이러한 경우에 1-2번 사이의 저항 값은 전체 저항의 0%값이 되고, 2-3번 사이의 저항 값은 전체 저항의 100%가 됩니다.

그림 8 : 가변 저항 50%
[그림 8 : 가변 저항 50%]

그림 8은 가변 저항을 가운데 쯤으로 돌린 경우라고 볼 수 있습니다. 이러한 경우에 1-2번 사이의 저항 값과 2-3번 사이의 저항 값은 각각 50%씩 갖게 됩니다.

그림 9 : 가변 저항 100%
[그림 9 : 가변 저항 100%]

그림 9는 가변 저항을 가장 오른쪽으로 돌린 경우라고 볼 수 있습니다. 이러한 경우에 1-2번 사이의 저항 값은 전체 저항의 100%가 되고, 2-3번 사이의 저항 값은 전체 저항의 0%가 됩니다.

이렇듯 가변 저항은 1-2번 값이 커지면 2-3번의 값이 작아지고, 1-2번 값이 작아지면 2-3번 값이 커지는 성질을 가지고 있습니다.

3. 실습

기본적인 이론을 살펴봤으니 이제 가변저항과 시리얼 모니터를 이용한 실습을 해보도록 하겠습니다.

3-1. 회로

먼저 회로도를 살펴보겠습니다.
아두이노 보드에 가변 저항만 연결하면 되므로 회로는 정말 간단합니다.

그림 10 : 가변 저항 연결 회로도
[그림 10 : 가변 저항 연결 회로도]

그림 11 : 아두이노에 가변 저항 연결
[그림 11 : 아두이노에 가변 저항 연결]

가변 저항의 1번 핀을 그라운드에, 2번 핀의 값을 확인하기 위해 A0에, 3번 핀은 5V에 연결했습니다.
이렇게 함으로써 코드 상에서 1-2번 사이에 걸리는 전압을 확인할 수 있을 것 입니다.

3-2. 스케치

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

void loop() {
  int sensorValue = analogRead(A0);

  float voltage = sensorValue * (5.0 / 1023.0);
  
  Serial.print("sensorValue = ");
  Serial.print(sensorValue);
  Serial.print(", voltage = ");
  Serial.println(voltage);
}
  • 1~3 줄 : 9600 baud rate로 시리얼 통신을 시작합니다.
  • 6 줄 : 아두이노의 A0 핀에서 아날로그 값을 읽습니다.
  • 8 줄 : 6줄에서 읽은 센서 값을 전압으로 변환합니다. analogRead()의 반환 값이 0~1023의 범위이기 때문에 1023으로 나눠주게 되면 0에서 1사이의 값을 가지게 되고, 여기에 회로에서 연결한 5v 값을 곱해주면 0~5v 사이의 값을 얻을 수 있습니다.
  • 10~13 줄 : 센서 값과 전압 값을 출력합니다.


3-3. 결과

먼저, 스케치를 업로드하고 시리얼 모니터를 켭니다.
가변 저항을 왼쪽과 오른쪽으로 돌려보면, 그림 12과 같이 센서 값과 전압 값이 시리얼 모니터에 출력되는 것을 볼 수 있습니다.

그림 12 : 가변 저항 시리얼 모니터 결과
[그림 12 : 가변 저항 시리얼 모니터 결과]

+ Recent posts