티스토리 뷰

빛 센서와 피에조 부조

컴퓨터는 전기의 흐름으로 작동하는데 두 가지 전기 신호만 이해할 수 있습니다. 전기가 흐르면 1, 흐르지 않으면 0으로 이해합니다. 이렇게 1과 0으로 정보를 나눠서 표현하는 것을 디지털이라고 합니다.

 

우리 주변의 다양한 아날로그 정보를 컴퓨터에서 사용되는 디지털 정보로 바꿔주는 것을 디지털화라고 합니다. 그렇다면 아날로그(Analog)의 뜻은 무엇일까요? 아날로그(Analog)는 중간에 끊김이 없이 계속 이어지면서 변화하는 것을 뜻합니다. 하루 동안 온도가 점점 올라가다가 내려가는 것이 바로 아날로그입니다.

 

이제 아날로그 핀을 사용해서 코딩을 해보겠습니다. 빛의 밝기에 따라 저항값이 달라지는 빛 센서(CDS 센서)를 사용하여 코딩을 해보겠습니다.

 

그림 4-19처럼 이 빛 센서는 빛이 밝아지면 저항이 작아지고 빛이 어두워지면 저항이 커집니다.

그림 4-19 빛의 밝기에 따라 저항값이 달라지는 빛 센서

 

아두이노는 전압값은 읽을 수 있지만, 저항값은 읽을 수 없습니다. 우리는 멋진 전기회로 지식을 이용해서 문제를 해결하겠습니다. 그림 4-20처럼 5볼트짜리 전지와 2킬로옴 저항과 3킬로옴 저항을 한 줄로 쭉 연결한다고 생각해봅시다. 이렇게 한 줄로 쭉 연결된 것을 직렬연결이라고 합니다.

 

그림 4-20 전압 분배

 

직렬연결에서는 전류의 값이 같습니다. 전기가 한 길로만 흐르기 때문이죠. 하지만 각 저항마다 걸리는 전압은 다릅니다. 저항이 크면 큰 전압이 걸리고, 저항이 작으면 작은 전압이 걸립니다.

 

이것을 물과 물레방아를 이용해서 설명해 보겠습니다. 물레방아(저항)가 2개 직렬로 연결되어 있습니다. 하나는 가벼워서 잘 돌아가고(저항이 작다), 하나는 무거워서 잘 돌아가지 않습니다(저항이 크다). 이제 물을 흘려 내보냅니다.

 

물길은 하나니까 물의 흐름은 같습니다(전류가 똑같다). 가벼운 물레방아는 작은 힘으로도 돌릴 수 있지만(전압이 낮다), 무거운 물레방아는 큰 힘이 있어야 돌릴 수 있습니다(전압이 크다).

 

이것을 전압 분배라고 합니다. 어때요? 이해가 잘 되나요? 이렇게 직렬연결에서 연결된 저항의 값이 바뀌면 전압도 바뀌게 됩니다. 그 바뀐 전압의 값이 아날로그 핀으로 들어가게 회로를 만들 수 있다면 빛 센서를 이용해서 멋진 작품을 만들 수 있습니다.

 

빛 센서의 값에 따라서 엘이디(LED)의 밝기가 바뀌도록 코딩을 해보겠습니다. 이렇게 생각하면 편합니다. 빛 센서의 값은 아날로그 핀으로 들어온다. 엘이디 (LED)가 연결된 피더블유엠(PWM) 핀에는 값이 나간다. 어떤 연결고리가 보이나요?

 

‘빛 센서의 값을 변수에 저장을 하고 이 값을 잘 바꿔서 엘이디(LED)가 연결된피더블유엠(PWM) 핀으로 보내면 되겠다.’라는 생각을 한다면 이제 코딩이 무엇인지 감을 잡은 겁니다.

 

그림 4-21과 같이 빛 센서에서 변한 전압 값이 아날로그 입력 핀 A4로 들어갈 수 있도록 전선을 연결합니다. 그리고 엘이디(LED)는 피더블유엠(PWM) 9번 핀과 연결합니다.

그림 4-21 아날로그 핀과 연결

 

우선 변수를 두 개 만듭니다. 하나는 빛 센서의 전압값을 저장하는 변수인 빛 센서입니다. 다른 하나는 엘이디(LED) 밝기의 값을 저장하는 변수인 전구 밝기입니다. 다시 비트의 개념을 생각해 봅시다.

 

비트는 0, 1 값을 저장하는 사물함 같은 것입니다. 아날로그 핀은 10비트를 사용합니다. 더 많은 값을 사용해서 정확한 값을 저장하기 위해서죠. 10비트니까 2를 10번 곱한 것만큼 값을 표현할 수 있겠죠?

 

2×2×2×2×2×2×2×2×2×2는 1024입니다. 컴퓨터는 0부터 값을 센다는 것 기억나시죠? 1부터 1024까지의 값이 아닌 0부터 1023까지의 값을 사용하는 겁니다. 8비트의 최댓값은 값은 255이고 10비트의 최댓값은 1023입니다.

 

디지털 값과 아날로그 값이 서로 범위가 다릅니다. 서로 범위가 안 맞으니 범위를 맞춰줘야 합니다. 즉 최솟값과 최댓값의 범위를 비슷하게 맞춘다는 뜻입니다. 어떻게 맞출까요? 255는 256으로, 1023은 1024로 바꿔보겠습니다.

 

256과 1024 두 숫자에서 어떤 관계가 보이나요? 256의 4배로 늘리면 1024가 됩니다. 다시 말하면 1024를 4로 나누면 256이 되는 겁니다. 즉 아날로그 값을 4로 나눠서 디지털 값의 범위로 바꿔주는 겁니다. 그럼 값이 비슷해집니다.

 

즉 아날로그 4번 핀에서 값을 읽어서 빛 센서 변수에 저장합니다. 이것을 4로 나눠서 전구 밝기 변수에 저장하면 끝나는 거죠. 그런데 4로 나누다 보면 나머지가 생길 수 있는데 이 나머지는 필요가 없습니다. 그래서 그림 4-22와 같은 바닥 함수를 이용하면 나머지를 버릴 수 있습니다.

 

예를 들어 아날로그 값에 111이 들어오면 빛 센서 변수에도 111이 저장됩니다. 이것을 4로 나누면 몫이 27이 되고 나머지가 3이 되는데 바닥 함수를 이용해서 나머지 3을 버리고 27만 전구 밝기에 저장되는 겁니다. 조금은 어려울 수 있지만 반복해서 읽어서 이해 한다면 반드시 도움이 될 겁니다.

 

바닥 함수는 삼각형을 클릭하면 고를 수 있습니다. 다시 한 번 스크래치 블록을 사용하는 법을 복습하겠습니다. 그림 4-22와 같이 삼각형이 표시가 있다는 것은 고를 있는 것이 여러 개 있다는 뜻입니다.

 

그림 4-22 제곱근에서 바닥 함수 고르기

 

이렇게 빛 센서 변수 값을 잘 바꿔서 전구 밝기에 저장합니다. 그리고 그림 4-23처럼 피더블유엠(PWM) 9핀으로 전구 밝기 변수 값을 보내면 되는 겁니다. 그리고 0.01초를 기다리게 합니다.  

그림 4-23 빛 센서 코딩 완성

 

주위의 밝기를 다르게 해서 생각한 대로 프로그램이 잘 작동하는지 확인해 봅시다.

 

피에조 부저를 사용해서 소리를 만들 수 있습니다. 피에조 부저는 안에 얇은 막이 있어서 전기를 주면 떨리면서 소리가 납니다. 이번에는 빛 센서에 들어오는 빛의 세기에 따라서 소리가 다르게 나도록 코딩을 해보겠습니다.

 

코딩은 다음과 같이 3단계로 이루어지게 됩니다. 엘이디(LED) 전구 대신에 피에조 스피커를 사용하면 됩니다.

 

대신에 그림 4-24의 소리를 나게 하는 <톤 블록>을 사용해야 합니다.

그림 4-24 톤 블록

 

그림 4-24와 같은 명령어는 9핀에 연결된 피에조 부저를 C4(도)음으로 1/2박자로 소리를 내는 것입니다. 삼각형 표시가 있는 것을 보니 고를 수 있는 것이 여러 개 있다는 것을 알 수 있습니다. 주파수를 바꿔 소리를 다양하게 낼 수 있는데 가운데 C4가 있는 곳은 바로 주파수 값을 넣는 곳입니다.

 

주파수의 단위는 헤르츠(Hz)인데 인간은 200Hz에서 1500Hz 사이의 주파수를 들을 수 있다고 합니다. 다시 범위를 서로 비슷하게 맞춰줘야 합니다. 여기서는 더하기를 사용합니다. 그림 4-25처럼 회로를 만듭니다.

그림 4-25 소리내기 회로

 

그림 4-26과 같이 우선 변수를 두 개 만듭니다. 하나는 빛 센서의 전압값을 저장하는 변수인 [빛센서]입니다. 다른 하나는 소리를 바꾸기 위한 값을 저장하는 변수인 [소리]입니다.

 

빛센서 변수는 아날로그 값으로 0에서 1023까지의 값을 가질 수 있습니다. 우리가 원하는 값은 인간이 들을 수 있는 주파수 값인 200에서 1500입니다.

 

아두이노 스케치 프로그램에는 Map이라는 명령어가 있습니다. 하지만 mBlock 스크래치 프로그램에는 이런 명령어가 없습니다. 이가 없으면 잇몸으로 ~. 우리는 [빛센서] 변수에 200을 더해서 [소리] 변수에 저장합니다.

 

그러면 [소리] 변수는 200에서 1223까지의 값을 가질 수 있게 됩니다. 그리고 [소리] 변숫값이 500이 넘으면 소리가 나게 만들고 싶습니다. <만일 ~라면> 블록을 사용하면 되겠죠?

그림 4-26 소리내기 코딩

 

9번 핀에 [소리] 변숫값 만큼의 음을 1/2박자로 소리를 내도록 했습니다. 그리고 말하기 블록을 사용하여 곰돌이가 [소리] 변숫값을 말하도록 했고, 결합하기 명령어도 사용했습니다. ‘소리는’이라는 단어와 [소리] 변숫값을 합쳐서 말하게 됩니다.

 

만약 [소리] 변숫값이 300이면 곰돌이는 ‘소리는 300’이라고 말하게 됩니다. 어때요? 참 쉽죠? 그림 4-26에서 코딩한 내용을 조금씩 바꿔보면서 어떻게 작동되는지 자세히 살펴보세요.

 

손으로 빛 센서를 가리면 [빛센서] 변숫값이 작아집니다. 밝을수록 [빛센서] 변숫값이 커집니다.  그런데 2킬로옴 저항과 빛센서의 위치를 바꾸면 값이 반대로 바뀝니다. 밝을수록 [빛센서] 변숫값이 작아집니다. 참 신기하죠?

댓글
댓글쓰기 폼