[아두이노] [강좌] 7. digitalRead() 함수(1) - 스위치를 이용한 DigitalReadSerial 예제

드디어 Blink 예제에서 벗어나, 새로운 함수를 살펴보는 시간!! 


brown_and_cony-75


digitalRead() 함수는 INPUT 모드에서 사용되는 함수다. pinMode() 함수를 설명할 때 INPUT 모드에 대해서 이미 설명했으니 INPUT 모드에 대해서는 앞 강좌를 참고하도록 하고.

  

핀의 모드를 INPUT, 입력으로 설정하고, 실제로 핀의 상태를 읽어오기 위한 함수가 바로 digitalRead() 함수. 함수의 구조는 다음과 같다. 


int digitalRead(pin)



 

 매개 변수

 

 

 pin : 입력 값을 읽어 올 핀의 번호. digitalWrite() 함수의 경우와 마찬가지로 아두이노 보드에서 사용할 수 있는 모든 핀 번호가 올 수 있다.



  

 반환 값

 

 HIGH/LOW : 반환 값의 타입은 int지만 HIGH 또는 LOW 둘 중에 하나만 반환된다. (HIGH랑 LOW가 사실은 int 타입이기 때문에)




digitalWrite() 함수에 대해서 잘 알고 있다면 digitalRead() 함수 역시 어렵지 않을 것이다. 매개 변수로 핀 번호를 주고, 그 핀으로 들어오는 값이 HIGH인지 LOW인지를 판단해서 반환하는 것이 digitalRead() 함수의 기능이다.

 


함수 자체는 어렵지 않으므로 바로 실습에 들어가보도록 하자.

 

준비물은 스위치와 LED. 아두이노 보드와 핀 케이블과 브레드 보드는 기본. 스위치는 아래처럼 생긴 스위치면 된다.

 c8ce0ead25725c7f0cb361ebb4106d1c.png 


내가 사용하는 스위치는 이거. 사은품으로 받았..(부끄)


c8865074715825c2da6502e2a96ef6ae.jpg


스위치를 뒤집어보자. 핀 4개가 마주보고 붙어있다. 마주보고 있는 두 핀은 연결되어 있고, 나란히 있는 두 핀은 떨어져 있다. 음? 다음 사진을 보자.

c4f75eb54a10db8bf07f8bba2282baa2.jpg

 bbfd9f581ac9e9d649f8ca5054f48fc0.jpg 

 

다시 한번. 마주보고 있는 두 핀은 연결되어 있고, 나란히 있는 두 핀은 떨어져 있다. 떨어져 있는 두 핀은 스위치가 눌리면 연결되는 구조이다. 즉 스위치가 눌리면 4개의 핀이 모두 연결됨.

  

그럼 아두이노 보드와 스위치를 연결해 보자. 다음 그림과 사진을 보면서 꽂으면 쉬울거에요. 


7b3a7dd390d4f75f5b623765e5bb8e40.png

 567fe1ec50595d1acb43b155db34820b.jpg


fed1c991052351c58147b3de7e964ea8.jpg

266fa78b5d7404fe3bf3c1db294a1703.jpg

94fe12071a9925a3eb8d4bf3e7143df8.jpg


음. 선 두 개만 연결하면 되는 아주 쉬운 예제이다.


그리고 “DigitalReadSerial” 예제를 열어보자. 스케치 툴에서 “파일→예제→01.Basics→DigitalReadSerial” 선택.

 

주석문을 제외하고 실제 소스만 옮기면 다음과 같다. 



 DigitalReadSerial.ino


 int pushButton = 2;

  

 void setup() {

 Serial.begin(9600);

 pinMode(pushButton, INPUT);

 }

 

 void loop() {

 int buttonState = digitalRead(pushButton);

 

 Serial.println(buttonState);

 delay(1);

 

 }


 



어, 그런데 예제 소스에는 2번 핀으로 연결하라고 되어 있네. 아무 생각 없이 12번 핀에 연결해서 사진 찍었..;; 다시 사진 찍기 귀찮으니 소스를 수정하자. pushButton 변수의 초기값을 12로 수정!



 DigitalReadSerial2.ino

  

 int pushButton = 12;

 

 void setup() {

 Serial.begin(9600);

 pinMode(pushButton, INPUT);

 }

 

 void loop() {

 int buttonState = digitalRead(pushButton);

 

 Serial.println(buttonState);

 delay(500);

 }




 

빨간 색으로 표시한 변수 선언 부분을 12로 바꾸고, loop() 함수 마지막의 delay() 시간을 500밀리초로 바꿨다. 1밀리초마다 한 번씩 읽으면 값이 눈 깜짝할 새에 지나갈 것 같아서.

 

새로운 “Serial”이라는 단어와 함수들이 생겼다. 지금 예제에서 “Serial”은 스위치의 상태를 사용자의 PC 모니터에 보여주기 위해 사용되었다. 자세한 내용은 다음에 “Serial” 강좌에서 따로 설명하도록 하고, 지금은 그냥 출력문이라는 정도만 알아두고 넘어가자.

 

코드를 우선 살펴보면, int 타입의 ‘pushButton’이라는 이름의 변수가 선언되고, 12라는 값으로 초기화 되었다. 스위치의 핀 번호를 저장하는 변수이다.

 

setup() 함수에서는 “Serial.begin(9600)”이라는 함수가 호출되었고, pinMode() 함수로 pushButton 핀을 ‘입력’ 모드로 설정하였다.

 

loop() 함수에서는 int 타입의 ‘buttonState’라는 변수를 지역 변수로 선언하고, 그 값으로 digitalRead() 함수의 반환 값을 저장한다. digitalRead() 함수의 매개 변수로 pushButton에 저장된 스위치 핀 번호를 넣어주었으므로, 12번 핀으로 입력되는 값이 buttonState 변수에 저장될 것이다. 저장되는 값은 “HIGH”나 “LOW” 둘 중에 하나겠지.

 

그리고는 “Serial.println()”이라는 함수가 호출되었는데, 이 함수가 바로 PC 모니터에 값을 보여주기 위한 함수이다. 그리고는 delay() 함수를 이용해 1밀리초만큼 딜레이를 준다. 그리고는 반복.

 

 

이제 소스 내용을 이해하는 건 어렵지 않죠, 여러분? (Serial에 관한 내용은 제외하고.)

 

 

업로드 하기 전에 생각해보자. 스위치의 두 핀은 서로 떨어져있고, 스위치가 눌리면 연결된다. 한 핀은 3.3V에 연결되어 있고, 한 핀은 아두이노의 12번 핀에 연결되어 값을 입력 받고 있다. 그럼 스위치가 눌려지면 어떤 값이 들어올까?

 

‘HIGH’가 들어오겠지. 스위치의 두 핀이 연결되어 3.3V가 들어올 테니까. 그럼 눌려지지 않은 상태에서는 어떤 값이 들어올까? 연결이 끊어져서 전기가 들어오지 않을 테니 ‘LOW’가 들어오겠지?

 



자, 업로드하자.

 

 

그리고 업로드가 완료되면 스케치 툴의 “도구→시리얼 모니터”를 선택하거나, 아래 그림에 표시된 돋보기 모양의 아이콘을 클릭하자.


f6ed538a1c88c704a6e77d903a9a514f.png


그러면 다음과 같은 창이 열릴 것이다. 


a2f1c82f2873da289c4642eec8f2d36f.png


빨간색 네모 박스에 유의! “9600 보드 레이트”를 선택해야 제대로 값이 출력된다. 요건 setup() 함수에서 “Serial.begin(9600);”이라는 구문을 사용했기 때문인데, 매개 변수로 넣어준 값과 같아야 한다.


그리고는 ‘0’ 또는 ‘1’의 값이 다음과 같이 출력될 것이다.


c16941a2afbe0bb69cabaaa950b26269.png


여기서 ‘0’은 ‘LOW’를 뜻하고, ‘1’은 ‘HIGH’를 뜻한다. 그리고 스위치를 눌러보자. 누른 상태에서 값이 ‘0’인지 ‘1’인지 확인하고, 손을 뗀 후에 값이 ‘0’인지 ‘1’인지 확인하자.

 

스위치를 눌렀을 때 ‘1’이 나오고, 손을 뗐을 때 ‘0’이 잘 나오는가?

 


 moon_and_james-33


 

안 나올 것이다.  

 

스위치를 누르면 ‘1’이 잘 나오겠지만, 손을 떼면 ‘0’이 나오거나 ‘1’이 나오거나 제 맘대로 나올 것이다.

 


왜!??

 

스위치를 안 누른 상태에서는 두 핀이 연결되지 않아 전기가 입력되지 않기 때문에 당연히 ‘0’이 나와야 하는데, 왜 ‘1’이 나왔다, ‘0’이 나왔다 하는 걸까?



 

 

이유는 다음 강좌에서. To be continue…brown_and_cony-79

 

 

 

 

이런 거 해보고 싶었ㅋㅋㅋㅋㅋㅋㅋㅋ던게 아니고, 사실은 글이 너무 길어져서;; 잠시 쉬었다가 다음 강좌에서 만나요. ㅜㅜ 안녕.

 



brown_and_cony-77(어차피 난 계속 써야하지만…) 

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

임베디드 보드

번호 제목 글쓴이 날짜 조회수
58 아두이노 [강좌] 50. 와이파이 통신 (4) - WebServer 예제 icon 양재동메이커 03-21 21,968
57 아두이노 [강좌] 49. 와이파이 통신 (3) - WebClient 예제 icon 양재동메이커 03-21 25,684
56 아두이노 [강좌] 48. 와이파이 통신 (2) - 커맨드 모드 사용하기 (WiFly 쉴드) icon 양재동메이커 03-20 20,316
55 아두이노 [강좌] 47. 와이파이 통신 (1) - 와이파이란 무엇인가 icon 양재동메이커 03-20 25,338
54 아두이노 [강좌] 46. 블루투스 통신 (5) - 프로토콜 만들기 (2) icon 양재동메이커 03-20 20,341
53 아두이노 [강좌] 45. 블루투스 통신 (4) - 프로토콜 만들기 (1) icon 양재동메이커 03-20 21,407
52 아두이노 [강좌] 44. 블루투스 통신 (3) - RN42 모듈에서 직접 접속하기 icon 양재동메이커 03-20 18,330
51 아두이노 [강좌] 43. 블루투스 통신 (2) - 스마트폰과 통신하기 icon 양재동메이커 03-20 20,506
50 아두이노 [강좌] 42. 블루투스 통신 (1) - RN42 블루투스 모듈 실습하기 icon 양재동메이커 03-20 22,796
49 아두이노 [강좌] 41. 서보 모터 (2) - Servo 함수 알아보기 icon 양재동메이커 03-20 24,095
48 아두이노 [아두이노 강좌] 40. 서보 모터 (1) - 서보 모터 동작 방식 icon 양재동메이커 03-20 24,804
47 아두이노 [강좌] 39. 스텝 모터 (3) - 모터 드라이버 EasyDriver(A3967) 사용하기 icon 양재동메이커 03-20 20,052
46 아두이노 [강좌] 38. 스텝 모터 (2) - Stepper 함수 알아보기 icon 양재동메이커 03-20 24,204
45 아두이노 [강좌] 37. 스텝 모터 (1) - 스텝 모터 동작 방식 icon 양재동메이커 03-20 21,311
44 아두이노 [강좌] 36. DC 모터 (2) - DC 모터 드라이버 실습하기 (TB6612FNG) icon 양재동메이커 03-20 20,375
43 아두이노 [강좌] 35. DC 모터 (1) - DC 모터 동작 방식 icon 양재동메이커 03-20 23,059
42 아두이노 [강좌] 34. SPI 통신 (3) - 기압 센서(MPL115A1) 실습하기 icon 양재동메이커 03-20 19,361
41 아두이노 [강좌] 33. SPI 통신 (2) – SPI 함수 알아보기 icon 양재동메이커 03-20 28,186
40 아두이노 [강좌] 32. SPI 통신 (1) - SPI 통신이란 무엇인가 icon 양재동메이커 03-20 32,439
39 아두이노 [강좌] 31. I2C 통신 (3) - 온도 센서(TMP102) 실습하기 icon 양재동메이커 03-20 27,665