전자, 전기, 소프트웨어, 기계, 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으로 지정해 주면 풀업저항을 장착하지 않고 플로팅 현상을 제거할 수 있습니다.



[강좌] 5. 아두이노 내장 LED 제어하기


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

5. 내장 LED 제어하기


보통 소프트웨어 교육을 시작하면 "Hello World"를 출력하는 방법을 먼저 가르쳐줍니다.
아두이노 프로그램 자체에 내장되어있는 예제에서도 첫번째 예제는 시리얼 모니터로 아날로그 센서의 값을 읽어오는 것이 있지요. 

하지만 본 강좌에서는 일반적인 아두이노 교육에서 가장 먼저 배우는 LED 제어를 알려드립니다.

이번 강좌에서는 아두이노에 자체 내장된 LED를 제어할 것으로, 추가적인 회로 구성은 필요하지 않습니다. 
아두이노와 PC를 연결시키고 포트를 잡아줍니다.


아두이노에서는 13번 핀과 내장 LED가 연동되어있습니다.

이말은 즉슨, 아두이노 코드를 짤 때, 13번 핀에 굳이 회로를 만들지 않고도 코드를 짜면 아두이노 보드에 있는 LED가 작동됩니다.


아두이노 우노 ( Arduino UNO ) 보드를 기준으로 빨간 표시된 위치에 LED가 있습니다.


아두이노와 PC를 USB 케이블로 연결 후 아두이노를 켜 줍니다.

본 강좌에서는 아두이노 프로그램에 내장되어있는 예제 소스들을 분석하는 방식으로 강좌를 진행합니다.



일단 예제 파일에서 1.Basic -> Blink 를 열어줍니다.


Blink 예제를 열어주면 아래와 같은 소스가 열립니다.
/* */으로 이루어진 주석 부분에는 해당 예제에 대한 간단한 설명이 들어있습니다.



/* 
깜빡임
LED를 1초간 킵니다, 그리고 1초간 끕니다, 반복적으로.
대부분의 아두이노는 제어가 가능한 LED가 내장되어 있습니다. UNO 보드 MEGA보드, ZERO보드에 13번 디지털 핀으로 내장되어 있습니다. MKR1000보드의 경우 6번 핀에 연결되어 있습니다. 
~중략
더 많은 보드들의 LED가 내장된 핀 번호를 알고 싶으면 아두이노 사이트를 참고하라고 합니다.
~중략
*/
/*
  Blink

  Turns an LED on for one second, then off for one second, repeatedly.
  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino
  model, check the Technical Specs of your board at:
  https://www.arduino.cc/en/Main/Products

  modified 8 May 2014
  by Scott Fitzgerald
  modified 2 Sep 2016
  by Arturo Guadalupi
  modified 8 Sep 2016
  by Colby Newman

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/Blink
*/
// 셋업 기능은 보드에 리셋 버튼을 누르거나 보드에 파워를 넣으면 한번만 작동됩니다.

// the setup function runs once when you press reset or power the board
void setup() {

  // LED가 내장된 핀 번호를 출력 모드로 설정해 줍니다.

  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}
// 반복 기능은 계속 영원히 반복됩니다. 
// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  // LED를 킵니다.  HIGH 는 전압의 정도를 나타냅니다.
  delay(1000);                       // wait for a second
  // 잠깐 기다려줍니다.
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  // LED의 전압을 LOW로 하여 꺼 줍니다.
  delay(1000);                       // wait for a second
  // 잠깐 기다려줍니다.
}



굉장히 기초적인 코드입니다.

LED_BUILTIN 이라는 핀을 출력모드로 정하고, 반복구문에서 LED_BUILTIN 핀에 전압을 높여주고 1초간 쉬었다가 전압을 낮춰주고 1초간 쉬는 작업을 반복합니다.



지난 강좌에서 setup() 함수와 loop()함수에 대해 설명하였기에, 본 강좌에서는 해당 내용을 언급하지 않고 새로이 등장한 명령어에 대해 설명하겠습니다.

위 코드에서 아래 명령어들이 새로 등장하였습니다.

pinMode(LED_BUILTIN, OUTPUT);
  보통 setup()함수에서 pinMode(핀번호, 모드); 의 형태로 사용합니다.
  핀번호에서 지정된 핀이, INPUT 인지 OUTPUT 모드인지 지정할 때 사용합니다.

  위 코드에서는 LED 출력을 위해 사용한 핀이라 OUTPUT 모드로 지정되어있습니다.

  UNO 보드를 사용한다면 LED_BUILTIN을 13 으로 수정해주면 됩니다.

digitalWrite(LED_BUILTIN, HIGH);
  디지털 출력을 담당하는 명령어입니다.
  digitalWrite(핀번호, 상태); 의 형태로 사용합니다.

  위 코드에서는 LED에 불을 키고 끄기 위해 LED_BUILTIN을 UNO보드를 사용한다면 13으로 바꿔줍니다.  전압의 상태를 0과 1 또는 LOW와 HIGH로 조절합니다.

  LED를 키고 끄기 때문에 위 소스에서는 HIGH 와 LOW 가 반복적으로 사용되고 있습니다.

delay(1000);
  1초간 잠시 기다려주는 명령어입니다.
  digitalWrite명령어 사이에 사용되어, LED에 전압을 인가한 후 1초간 기다려주는 목적으로 사용되고 있습니다. 
  
  delay(시간); 형식으로 사용되며, 시간 단위로는 ms(밀리세컨드)를 사용합니다.
  1초의 지연을 위해서는 1000을 입력해 주어야 합니다.


본 예제에서 언급된 새로운 코드 3가지를 이용하여 LED를 더욱 다양하게 제어할 수 있습니다.

다음 강좌에서는 1. Basic 예제의 DigitalReadSerial에 대해 설명해 드리겠습니다.