아두이노 실습 5주차 (아두이노 입력/시리얼 통신)

2023. 10. 18. 00:58아두이노 (Arduino)

실습 5주차

아두이노 보드와 점퍼 케이블 두 개를 이용해서 스위치 원리를 실습해 볼 수 있다.

 

 

아두이노 보드와 점퍼 케이블을 아래 그림과 같이 연결한다.

 

간단하게 스위치의 원리를 실습하는 것이기 때문에 쉽게 회로구현이 가능하다.

 

 

 

위 실습영상 처럼 두 점퍼 케이블을 붙이면 아두이노 보드의 LED가 켜진다.

 

반대로 떼면 LED가 꺼진다.

 

이것은 12번 핀의 내부 풀업 저항을 사용할 때 점퍼 케이블이 떨어져 있는 상태에서는 HIGH가 digitalRead(12) 함수로 읽히고,

점퍼 케이블을 연결한 상태에서는 GND 상태인 LOW가 digitalRead(12) 함수로 읽히기 때문이다. 

 

예제 코드의 if 문을 보면 sw_input이 LOW가 된다면 LED가 켜지게 되어 있다.

 


 

풀업(Pull-up) 저항과 풀다운(Pull-down) 저항

 

위에서 스위치 형태의 회로를 테스트 할 때 풀업 저항이라는 단어를 사용하였는데 그럼 여기서 풀업 저항이란 무엇일까?

 

풀업 또는 풀다운 저항은 스위치 회로에서 스위치의 On/Off 상태에 따라 분명한 논리 레벨을 얻기 위해서 연결하는 저항이다.

 

풀업 저항의 스위치는 부논리로 스위치가 On(닫힘)되면 논리 입력은 0(Low)이 되고, Off(열림)되면 논리 입력은 1(High)이 된다.

풀업 저항은 전원 쪽에 저항을 달아준다.

풀업 저항

 

풀다운 저항은 풀업 저항의 반대인 정논리로 입력 받는다.

즉, 스위치가 Off(열림)되면 논리 입력은 0(Low), On(닫힘)되면 논리 입력은 1(High)이 된다.

풀다운 저항은 GND쪽에 저항을 달아준다.

풀다운 저항

 

 

 

그렇다면 풀다운 저항을 이용해서 디지털 입력 읽기를 실습하여 보자.

 

먼저 아래와 같이 회로를 연결한다.

 

 

코드를 살펴보면 버튼을 누르지 않았으면 LOW(0)가 입력되어 불빛이 나지 않을 것이고,

 

버튼을 누르게 된다면 HIGH(1)가 입력되어 불빛이 나게 될 것이다.

 

아래 실습 영상을 살펴보자.

 

 

 

 

버튼을 눌렀을 때만 불빛이 들어오고 있다.

 

 

이렇게 버튼을 사용하는 실습을 할때 주의해야 할 점이 바로 '스위치 채터링' 문제이다.

 

 

스위치 채터링

 

스위치는 접점 부분에서 열림과 닫힘이 매우 짧은 시간에 여러번 반복되는 채터링 또는 바운스(Bounce)라고 부르는 현상이 발생한다.

 

우리가 스위치를 한번 눌렀다고 생각하지만, 마이크로 컨트롤러는 여러번 버튼은 누른 것으로 인식하기 때문에 스위치를 사용할 때는 채터링 문제를 반드시 해결해야 한다.

 

채터링 문제를 제거하는 것을 디바운싱이라 하며 디바운싱을 하는 방법은 하드웨어적인 방법과 소프트웨어적인 방법이 있다.

 


 

다음은 RGB LED를 사용하여 푸시 버튼을 누를 때마다 무지개색으로 색이 변하는 실습을 진행하려 한다.

 

아래와 같이 회로에 RGB LED와 푸시 버튼을 연결해 보자.

 

 

여기서 debounce함수는 스위치 채터링 문제를 제거하기 위한 디바운싱 코드이다.

 

버튼이 눌러진 상태를 currentButton에 저장하고 if 문을 통해 버튼을 누르지 않은 상태에서 눌러진 상태가 되었다면 ledMode 전역 변숫값에 1을 더한다.

만약 ledMode가 8이되면 다시 0으로 초기화 해서 빨, 주, 노, 초, 파, 남, 보 색이 반복 실행되도록 한다.

 

currentButton 변숫값을 lastButton 변수에 저장한다.

이것은 비튼을 누르지 않았을 때 ledMode 변숫값이 증가하지 않도록 하기위해 필요하다.

 

colorMode() 함수를 호출하면서 ledMode 변숫값을 전달하고 RGB LED는 그에 해당하는 색을 표시하게 된다.

 

 

 

실습 영상을 보면 버튼을 클릭함에 따라 LED 색상이 잘 바뀌는 것을 확인할 수 있다.

 

 

 


 

 

시리얼 통신

별도의 시리얼 통신 케이블 없이 아두이노 보드에 연결된 USB 케이블을 통해 컴퓨터와 아두이노 보드 간 시리얼 통신을 쉽게 구현할 수 있다.

 

컴퓨터와 아두이노 보드의 시리얼 통신 기능을 사용하여 아두이노 보드를 통하여 얻어진 입력 정보를 컴퓨터의 시리얼 모니터에 나타내 보자.

 

이번 실습에서는 아두이노 보드에 가변저항(VR)을 이용하여 정보를 입력받고 시리얼 모니터에 전송하고 표시하는 실습을 진행할 예정이다.

 

참고로 아두이노 IDE의 우측 상단에 SerialPlotter와 SerialMonitor를 열 수 있는 버튼이 있다.

 

 

가변저항의 값을 시리얼 모니터에 표시하고, 저항 값에 따라 LED의 밝기가 조절되는 스케치를 작성하고 실습을 진행해 보자.

 

먼저 회로는 아래와 같이 연결한다.

 

여기서 중요한 부분은 map()함수를 사용하여 0~1023범위의 val값을 0~100% 값으로 변환하여 시리얼 모니터에 출력하고,

 

map()함수를 사용하여 0~1023범위의 val값을 0~255 범위로 변환하여 LED의 밝기를 조절한다는 것이다.

 

 

 

실습영상을 보면 가변저항을 이용해서 LED의 밝기를 조절하는 것과 시리얼 모니터에 %값이 제대로 출력되는 것을 확인할 수 있다.

 

 


 

 

마지막으로 시리얼 통신으로 정보를 주고받는 상황을 실습으로 진행할 예정이다.

 

아래와 같이 스크레치를 작성해 보자.

시리얼 통신으로 정보를 주고 받을 경우 반드시 setup()함수에서 Serial.begin(9600); 과 같이 전송속도를 설정해 주어야 한다.

 

또한 컴퓨터에서 시리얼 모니터를 이용하여 데이터를 받을 경우 ASCII코드로 정보가 주어진다.

 

 

여기서 Serial.read()는 시리얼 통신을 통하여 아두이노로 받을 데이터를 입력받는 함수이다.

 

 

실습해보면 위 사진과 같이 아두이노 보드와 시리얼 통신으로 정보를 주고 받는다는 것을 확인할 수 있다.