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

그림 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 : 시리얼 모니터 결과]

안녕하세요.
오늘 아두이노와 피에조 부저(Piezo Buzzer)를 이용해서 음악을 연주해보려고 합니다.

그림 1 : 부저 윗 부분
[그림 1 : 부저 윗 부분]

그림 2 : 부저 아랫 부분
[그림 2 : 부저 아랫 부분]

그림 1과 2에서 보시는 것처럼 부저에는 2개의 핀이 있습니다.
오늘도 간단한 작업이 될 것 같은 느낌이네요!

1. 회로 연결

회로 연결은 너무나 간단합니다. 따라서 회로도를 생략하고 연결된 그림만 보시겠습니다.

그림 3 : 부저 연결 회로
[그림 3 : 부저 연결 회로]

그림 3에서 보시는 바와 같이 부저의 (+)표시된 핀은 아두이노의 디지털 8번 핀에 연결하고, 나머지 한 핀은 아두이노의 GND(그라운드)에 연결합니다.
혹시 반대로 연결하게 되면 소리가 나지 않으니 주의하시길 바랍니다.

2. 스케치

const int BUZZER_PIN = 8;

const int C = 261;    //도
const int D = 294;    //레
const int E = 330;    //미
const int F = 349;    //파
const int G = 392;    //솔
const int A = 440;    //라
const int B = 494;    //시

void setup() {
}

void loop() {
  tone(BUZZER_PIN, C);
  delay(500);

  tone(BUZZER_PIN, D);
  delay(500);

  tone(BUZZER_PIN, E);
  delay(500);

  tone(BUZZER_PIN, F);
  delay(500);

  tone(BUZZER_PIN, G);
  delay(500);

  tone(BUZZER_PIN, A);
  delay(500);

  tone(BUZZER_PIN, B);
  delay(500);

  noTone(BUZZER_PIN);
}
  • 1 줄 : 부저를 8번 핀으로 정의합니다.
  • 3~9 줄 : 도부터 시까지의 음을 정의합니다. 각 음에 사용된 숫자는 해당 톤의 헤르츠(Hz) 값을 의미합니다.
  • 15 줄 : tone() 함수를 이용해서 부저 핀에 도 소리를 출력합니다. 이 함수는 두개의 인자를 받는데, 첫번째 인자가 핀 번호이고, 두번째 인자가 주파수입니다.
  • 16 줄 : delay() 함수를 이용해서 500ms 쉽니다. 즉, 도 소리를 500ms 만큼 출력하게 됩니다.
  • 18~34 줄 : 15~16줄과 같은 원리로 ‘레’부터 ‘시’까지 출력합니다.
  • 36 줄 : noTone() 함수를 이용해서 부저 핀의 소리를 끕니다.


3. 응용

기본적인 사용방법을 알아봤으니, 이제 응용을 해볼 차례입니다.
‘학교 종이 땡땡땡’을 연주하는 코드를 작성해보죠.

const int BUZZER_PIN = 8;

const int C = 261;    //도
const int D = 294;    //레
const int E = 330;    //미
const int F = 349;    //파
const int G = 392;    //솔
const int A = 440;    //라
const int B = 494;    //시

typedef struct  {  
  int tone;
  unsigned long delay;
} TAD; //Tone And Delay

TAD music[] = 
  {
    {G, 100}, {G, 100}, {A, 100}, {A, 100}, {G, 100}, {G, 100}, {E, 200},
    {G, 100}, {G, 100}, {E, 100}, {E, 100}, {D, 200}, {G, 100}, {G, 100},
    {A, 100}, {A, 100}, {G, 100}, {G, 100}, {E, 200}, {G, 100}, {E, 100},
    {D, 100}, {E, 100}, {C, 200}
  };

int musicLen;

void setup() {
  musicLen = sizeof(music) / sizeof(TAD);
}

void loop() {
  for(int i = 0; i < musicLen; i++) {
    tone(BUZZER_PIN, music[i].tone);
    delay(music[i].delay * 5);

    noTone(BUZZER_PIN);
    delay(30);
  }

  noTone(BUZZER_PIN);
  delay(1000);
}
  • 1~9 줄 : 위의 스케치와 동일합니다.
  • 11~14 줄 : TAD라는 이름의 구조체를 정의합니다. 이 구조체에는 음을 나타내는 tone 변수와 음의 지속 시간을 나타내는 delay 변수가 있습니다.
  • 16~22 줄 : TAD 구조체를 배열로 사용해서 음악을 구성합니다.
  • 24 줄 : 음악 배열의 길이를 담을 변수입니다.
  • 26~28 줄 : 음악 베열의 길이를 구합니다.
    • sizeof(music)을 하면 music 배열에 할당된 바이트 크기를 반환합니다.
    • sizeof(TAD)를 하면 TAD 구조체 하나가 가지는 바이트 크기를 반환합니다.
    • 따라서, sizeof(music) / sizeof(TAD) = (music 배열 전체의 바이트) / (TAD 구조체의 바이트) 가 되고, 이는 music 배열에서 TAD 구조체가 몇개 있는지를 구하게 됩니다.
  • 31~37 줄 : music배열을 하나씩 차례대로 읽어서 톤을 출력합니다.
    • 32~33 줄 : music[i]에 해당하는 음을 해당 딜레이 만큼 출력합니다.
    • 35~36 줄 : 각 음을 출력하고 잠깐 동안 아무 소리를 내지 않게 함으로써 연주하는 듯한 느낌을 줍니다.
  • 39~40 줄 : 음악을 다 연주한 후 1초 동안 아무런 소리를 내지 않도록 합니다.

이렇게 ‘학교 종이 땡땡땡’을 연주하는 스케치를 만들어봤습니다.
여기에서 얼마든지 응용해서 다른 음악을 연주하게도 할 수 있을 것 같습니다.

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

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

그림 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정도의 값이 나오네요.

+ Recent posts