전자, 전기, 소프트웨어, 기계, 3D 프린터, 아두이노, 라즈베리파이, 쇼핑몰 창업

전체 페이지뷰

이 블로그 검색

최신글

[Blender] 3D viewport 사용법

[강좌] 6. 아두이노 시리얼 모니터로 디지털 신호 읽어오기


무작정 보고 따라하며 배우는 아두이노 강좌입니다.
아두이노 공식 사이트에서 제공하는 강좌를 바탕으로 작성되었습니다.
해당 게시글은 Arduino UNO 보드를 기준으로 작성되었습니다.

6. 시리얼 모니터로 디지털 신호 읽어오기


아두이노에서 스위치 등 다른 하드웨어를 이용하여 LED등 어떠한 부품들을 제어하고자 한다면, 디지털 신호를 읽을 줄 알아야 합니다.

여기서 말하는 디지털 신호란, 전압이 HIGH인 상황 LOW인 상황 두가지를 말합니다.
우리는 컴퓨터와 같은 전자장비들이 0과 1로 신호를 주고받는다는 사실을 알고있습니다.

아두이노도 마찬가지로 전압이 HIGH인 1과 LOW인 0 두가지로 디지털 신호를 주고받습니다.

그럼 이 0과 1로 이루어진 디지털 신호를 읽는다고 했습니다.  단, 시리얼 모니터로 읽어온다고 하였지요. 그럼 시리얼 모니터가 무엇일까요?

시리얼 모니터를 이용하면 아두이노와 PC간의 통신이 가능합니다. 시리얼 모니터로 아두이노에 연결된 센서 혹은 스위치의 변화하는 값들을 우리 눈에 볼 수 있도록 띄워줄 수도 있습니다. 이 외에도 명령어를 미리 만들어두면 아두이노로 명령어를 전송하여 여러 기능을 할 수 있습니다.


이번 강좌부터는 아두이노 외부에 따로 회로를 구성합니다. 
택스위치를 사용하여 스위치의 열림, 닫힘으로 디지털 신호를 입력받아 시리얼 모니터에 출력합니다.

준비물 ( 아두이노와 PC는 기본입니다 )

브레드보드, 점퍼케이블, 텍스위치, 저항 10k옴



먼저, 아래 이미지와 같이 아두이노 보드와 각종 부품들을 연결해 줍니다.
5V 전원이 스위치로 들어가고 스위치의 열림, 닫힘에 따라 2번 핀으로 들어가는 전압이 달라집니다.  아래 회로에서 10k옴 저항은 스위치의 풀다운저항입니다. 

스위치도 물리적인 장치이니, 스위치를 작동할 때 입력 핀 쪽으로 전압이 HIGH LOW 두가지 경우가 정확히 나눠지는 것이 아니고, HIGH LOW의 상태가 번갈아 나타나는 현상이 발생합니다. 이를 플로팅 현상이라 하고 이러한 현상을 해결하기 위해 저항을 추가해 줍니다. 원리는 회로 속에 남아있는 전류를 저항을 통해 - 극으로 흘려주어 전압 상태를 깔끔하게 유지하는 것 입니다. 


다음으로, 아두이노에서 예제 소스를 불러와 줍니다.



/*
  DigitalReadSerial

  Reads a digital input on pin 2, prints the result to the Serial Monitor

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/DigitalReadSerial
*/
/*
  2번 핀의 디지털 입력을 읽고, 결과값을 시리얼 모니터로 출력합니다.
*/

// digital pin 2 has a pushbutton attached to it. Give it a name:
// 디지털 2번 핀에는 푸쉬스위치가 연결되어 있습니다. 이름을 정해줍니다 :
int pushButton = 2;

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  // 시리얼 통신의 속도를 9600으로 지정합니다.
  Serial.begin(9600);
  // make the pushbutton's pin an input:
  // 푸시 스위치가 연결된 핀의 모드를 입력으로 지정합니다.
  pinMode(pushButton, INPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input pin:
  // 입력 핀의 값을 읽어옵니다.
  int buttonState = digitalRead(pushButton);
  // print out the state of the button:
  // 버튼의 상태를 시리얼 모니터에 출력합니다.
  Serial.println(buttonState);
  delay(1);        // delay in between reads for stability
}


이번 예제 코드에는 아래의 명령어들이 추가되었습니다.

  int pushButton = 2;

int는 여러 변수의 종류 중 정수형 변수를 지정할 때 붙이는 것입니다.
정수형 변수로 그 이름을 pushButton이라 정하고 이 pushButton 정수형 변수의 값이 2라고 지정된 것입니다.


  Serial.begin(9600);

Serial 통신을 사용하기 위해 아두이노와 PC 사이의 통신 속도를 지정해야 합니다.
기본적으로 9600을 많이 사용합니다.


  int buttonState = digitalRead(pushButton);

buttonState라는 정수형 변수의 값을 digitalRead(pushButton)으로 지정합니다.

digitalRead(pushButton)는 괄호()안에서 언급된 핀의 디지털 신호를 읽어옵니다.
pushButton 변수의 값이 2였으니, 2번핀의 디지털 신호를 읽어온다는 뜻입니다.


  Serial.println(buttonState);

Serial 통신 기능의 명령어 중 하나입니다.
괄호() 안의 값을 시리얼 모니터에 띄워줍니다.



위 강좌를 모두 익혀 시리얼 모니터로 디지털 값을 읽어올 수 있으면, 직접 작품을 제작할 때 회로를 구성한 후 각 스위치 등 센서들이 정상작동을 하는지 시리얼 모니터를 통해 확인할 수 있습니다.




[추가 설명]

위 코드를 보면 그 어떠한 함수에도 속해있지 않는 제일 상단의 int 변수와 loop()함수 내부의 int 변수가 있습니다.

변수를 지정해주는 int의 위치에 따른 차이점이 존재합니다.

제일 상단, 어떠한 함수에도 속해있지 않는 int 변수는 전역변수로서 해당 스케치 내부에 어디서든 그 값을 불러올 수 있습니다.

그러나 loop()함수 내부에서 지정된 int 변수는 지역변수로서 loop()함수 외의 다른 함수에서는 그 값을 불러올 수 없습니다.



시리얼 통신의 명령어는 여러가지가 있습니다.

여러 값들을 옆으로 나란히 나열하고 싶은 경우에는 Serial.print 명령어를 사용합니다.

위 예제에서 사용된 Serial.println은 줄 바꿈 기능이 들어있는 명령어로, 괄호()안의 내용을 출력한 후 줄 바꿈을 해 줍니다.
그에반해 print 명령어는 줄 바꿈 없이 이전의 내용 옆에 쭉 이어서 출력됩니다.



setup() 함수에서 pushButtonpinModeINPUT으로 설정하였습니다.

위 아두이노 회로도를 보면 풀업저항으로 10k옴 저항을 사용하고 있습니다.

위와 같이 회로도에서 풀업저항으로 플로팅 현상을 제거하는 방법 외에도, 소프트웨어적으로 아두이노에서 pinModeINPUT_PULLUP으로 지정해 주면 풀업저항을 장착하지 않고 플로팅 현상을 제거할 수 있습니다.




0 개의 댓글:

댓글 쓰기