공대생과 공부하기/전기공학 실험 보고서

[전기전자공학 실험] 아두이노 I/O 기초와 시리얼 통신 : 예비보고서

전기과 팡팡이 2019. 8. 17. 17:23
728x90

1. 개요

 아두이노에서 지원하는 디지털 I/O와 아날로그 I/O를 사용하는 기초적인 실험을 해보고, 시리얼 통신을 통해 PC에서 아두이노의 수행 결과를 확인하고 프로그램을 디버깅하는 방법을 학습한다.

  * I/O : Input / Output 입출력 단자

 

2. 관련 이론

디지털 I/O

 디지털 신호는 High(1) 또는 Low(0)라는 두 가지 값으로 나뉜다. 또한 이 값은 입력 혹은 출력의 값으로 쓰인다. 아두이노의 디지털 입력과 출력은 센서, 엑츄에이터 및 기타 집적회로를 연결할 수 있게 해준다.

 

아날로그 I/O

 아날로그 신호는 디지털 신호와 달리 어떤 값도 가질 수 있는 신호다. 아날로그 신호를 측정하기 위해 아두이노에 내장된 ADC(Analog Digital Converter)를 사용한다. ADC는 아날로그 신호를 디지털 신호로 바꾸어 주는 역할을 한다.

 

시리얼 통신

 시리얼 통신은 연속적으로 통신 채널이나 컴퓨터 버스를 거쳐 한 번에 하나의 비트 단위로 데이터를 전송하는 과정을 말한다. 아두이노 보드와 컴퓨터 사이에 통신할 때 쓰이는 것으로 디지털 핀 RX와 TX에서 USB를 통해 컴퓨터와 통신한다.

 

3. 실험 기기

 랩톱 PC아두이노 우노 보드, 브레드보드, 전선, 저항, 버튼형 스위치, LED, 포텐셔미터(손잡이식 가변 저항)오실로스코프

 

4. 예비 보고서

1) 지난 실험에서 학습했던 아두이노 우노 보드의 핀 중 제한 없이 사용 가능한 디지털 I/O와 아날로그 I/O핀들을 정리하고, 또한 디지털 I/O핀 중 PWM을 지원하는 핀이 몇 번인지 확인해 정리하시오.

  핀번호 설명 PWM 가능 여부
Digital I/O

D0,D1

시리얼 통신에 사용되며, USB로 PC와 통신할 수 있다.

X

 

D3,D5,D6,D9,D10,D11

디지털, 아날로그 입/출력을 낼 수 있다. D3은 인터럽트 기능을 갖는다.

O

 

D0,D1,D2,D4,D7,D8,D12,D13

디지털 입/출력만 가능하다. D2는 인터럽트 기능을 갖는다.

X

Analog I/O

A0~A5

아날로그 입력 핀이란 외부의 아날로그 입력값을 읽어 들이는 핀으로서 주로 센서와 연결하여 사용된다. 아날로그 신호는 디지털 신호와는 달리 연속값을 의미하며 예를 들어서 온도, 빛의 세기 등이 있다. 이러한 물리량을 센서가 전기 신호로 변환하며 이것을 아날로그 핀으로 읽어 들일 수 있다. 센서를 통해 읽은 전압값은 0~1023 사이의 숫자로 변환된다. 기준 전압은 5V이지만 1.1V의 내부 전압이 사용될 수 있으며 AREF핀으로 기준 전압을 직접 인가할 수도 있다.

 그리고 아날로그 핀은 디지털 입/출력 핀으로도 사용할 수 있다.

 

  

2) Pull up Pull down의 개념에 대해 조사 및 정리하고, I/O에서 Pull up 및 Pull down이 필요한 경우를 예를 들어 기술하시오.

풀업(Pull-up)

 풀업이라는 말의 의미는 플로팅 상태일 때의 값을 끌어올린다는 의미이다. 플로팅 상태의 값을 올리기 때문에 스위치가 열려 있을 때의 상태는 플로팅 상태가 아닌 값이 1이 된다. 풀업을 사용할 때의 연결 방법은 아래와 같다. 저항을 Vcc단자에 달아주는 것이 중요하다. (풀다운의 경우에는 반대로 Vcc가 아닌 GND쪽에 저항을 달아준다.저항 하나를 달아주므로써 플로팅 상태를 방지할 수 있다.

 스위치가 열려 있을 때, 스위치가 열려있기 때문에 전류는 GND가 아닌 입/출력 핀으로 흐르게 되고 따라서 입/출력 핀에서는 1(High)의 값을 읽을 수 있다.

 스위치가 닫혀 있을 때, Vcc와 GND가 서로 연결이 된다. GND는 모든 전류가 도착하는 전압이 가장 낮은 지점이기 때문에 모든 전류는 GND 방향으로 흐르게 된다. 따라서 입/출력 핀에 흐르는 전류가 없기 때문에 이때는 0(Low)가 출력된다.

풀다운(Pull-Down)

 풀업과 반대로 플로팅 상태의 값을 다운시켜버린다는 의미이다. 그렇기 때문에 스위치가 열려 있을 때의 값은 다운되서 0이된다. 풀 다운은 풀업과 반대로 저항이 Vcc가 아닌 GND 쪽에 달려있다.

 스위치가 열려 있을 때, Vcc와 회로는 단절되기 때문에 입/출력 핀에서 흐르는 전류는 GND로 향하게 된다. 따라서 입/출력 핀에는 0(Low)을 출력한다.

 스위치가 닫혀 있을 때, 열려 있을 때 단절됐던 Vcc부분이 회로와 연결된다. 원래라면 Vcc에서 흐르는 전류는 GND로 흘러야 하지만, GND부분에 설치된 저항으로 인해 전류는 GND로 흐르지 못하고 입/출력 핀으로 흐르게 된다. 따라서 입/출력 핀에서는 1(High)이 출력된다.

 위와 같이 풀업, 풀다운을 사용하면 값이 떠 있는 플로팅 상태를 방지 할 수 있기 때문에 아두이노에서 스위치 사용에 있어서 필수적으로 사용하게 된다. 일반적으로 풀다운보다는 풀업이 노이즈나 충격에 강하기 때문에 풀업을 많이 사용한다. 예를 들어 GPIO(General Purpose Input Output) Pert에서는 단지 High, Low를 인식하여 신호를 처리한다. High일 때, Chip Enable이 된다면 system이 동작할 때 High Level이 5V로 인식한다면 system 전압이 정확이 5V가 나온다면 문제가 없다.

 그러나 여러 가지 이유로 전압이 5V가 나오지 않는다. 4.3V 정도가 나온다고 가정했을 때 Chip에서 이것을 High로 제대로 인식하지 못한다면 system에 오류가 생긴다. 이런 경우 그 신호 Line에 저항과 전원(5V)를 연결하는 것이 pull up, 반대로 저항과 GND를 연결하는 것이 Pull Down이라고 볼 수 있다. 그렇게 되면 정확하게 5V와 0V를 구분할 수 있기 때문이다. 때문에 일반적으로 전원이 3.3V 5V인 경우, 4.7k의 저항을 직렬로 연결하여 Pull up이나 GND와 직렬로 연결하여 Pull Down을 사용한다.

 

3) 프로그램의 디버깅이란 무엇인지 조사하여 정리하고, 이를 위해 어떠한 절차가 꼭 필요한지 본인의 생각과 그 이유를 정리해 기술하시오.

 컴퓨터 분야에서 디버깅이랑 컴퓨터 프로그램이나 하드웨어 장치에서 잘못된 부분, 즉 버그를 찾아서 수정하거나 또는 에러를 피해나가는 처리 과정이다.

 프로그램이나 하드웨어 장치의 결함을 제거하기 위해서는 문제가 되는 부분을 분리시킨 후 수정해야 한다. 프로그램이 디버깅 되었다거나 프로그램의 결함을 해결하였다는 것은 더 이상의 잘못된 부분이 없다는 것을 의미한다.

 디버깅은 상용 제품이든 기업 용도이든 개인용이건 관계없이거의 모든 소프트웨어나 하드웨어를 개발할 때 반드시 처리해야 할 과정이다. 복잡한 제품의 경우, 디버깅은 시스템의 최소 단위에 대한 단위 테스트와, 이어서 일정 부분들이 합쳐졌을 대의 구성 테스트, 기존의 다른 제품과 연계되어 사용될 때의 시스템 테스트, 그리고 실제 상황에서 고객으로 하여금 그 제품을 사용하게 해보는 베타 테스트 등이 일련의 작업으로 이루어진다. 대부분의 컴퓨터 프로그램과 하드웨어의 프로그램화된 부분은 수 많은 줄의 코드로 구성되어 있기 대문에, 거의 대부분의 제품들이 어느 정도의 잘못된 부분을 포함하게 된다. 가장 많이 사용되는 기능에서 잘못된 부분이 가장 먼저 발견되는 것이 보통이다. 초기 버전의 프로그램은 의례 잘못된 부분을 많이 갖고 있다는 의미로, 미국에서는 이를 ‘buggy’ 라고 부른다.

 디버깅 도구를 사용하면 각 개발단계에서의 잘못된 코딩 부분을 쉽게 찾아낼 수 있으며, 몇몇 프로그램 개발 패키지에는 프로그램 작성 시 그때그때 잘못된 부분을 검사할 수 있는 기능이 포함되어 있다.

 즉, 디버깅 절차는 간단히 말해 시스템의 모든 노이즈를 제거하여 특정 버그를 고립시키고 노출시켜 해결하거나, 각 프로그램을 모두 독립적으로 분리시켜서 테스트를 통해 디버깅을 해야 한다. 왜냐하면 임의의 코딩에서 버그를 찾으려면 프로그래밍이 되어있는 양이 방대하기 때문에 절차를 통해 효율성을 추구해야 한다고 판단했다.

 

4위와 연관하여, 아두이노 프로그램을 디버깅하기 위해 왜 시리얼 통신을 사용하는지 논리적으로 설명하시오.

 시리얼 통신이란 직렬 통신으로써 하나 또는 두 개의 전송 라인을 사용하여 데이터를 송수신하는 통신 방법으로한 번에 한 비트 씩 데이터를 지속적으로 주고 받는다. 위처럼 디버깅의 절차에서 독립적으로 분리시켜 테스트를 해야 한다고 했다. 시리얼 통신은 1대1 통신 방식이라 할 수 있으므로 그 디버깅 절차에 적합하며 효율적이고, 데이터를 지속적으로 주고 받는다는 점에서 실시간 오류 검출이 가능하기 때문이다.

 

5. 실험 순서

 디지털 Input (Read)

1) 다음과 같은 회로를 구성한다.

 

2) 스위치가 눌렸는지 그 상태가 시리얼 모니터에 연속으로 출력되도록 프로그램을 작성한다.

void setup(){

 Serial.begin(9600);

 pinMode(2,INPUT);

}

void loop(){

 if(digitalRead(2)==HIGH){

  Serial.print("ON");

 }

 else{

  Serial.print("OFF");

 }

}

 

3) 컴파일 및 업로드한 후, 스위치를 눌렀다 떼며 그 결과를 확인한다.

 디지털 Output (Write)

 

4) [그림 11]의 회로를 다시 구성한다.

 

5) 스위치가 눌렸을 때, 보드 위에 장착된 LED (디지털 13 출력과 연결)가 켜지도록 프로그램을 작성한다.

#define LED 13

#define BUTTON 2

 

void setup(){

 pinMode(LED, OUTPUT);

 pinMode(BUTTON, INPUT);

}

void loop(){

 if(digitalRead(BUTTON)==HIGH){

  digitalWrite(LED, HIGH);

  delay(500);

  digitalWrite(LED, LOW);

 }

}

 

6) 컴파일 및 업로드한 후, 스위치를 눌렀다 떼며 그 결과를 확인한다.

 아날로그 Input (Read)

 

7) 다음과 같은 회로를 구성한다.

 

8) 포텐셔미터에 의해 조절된 전압 값이 시리얼 모니터에 연속으로 출력되도록 프로그램을 작성한다.

void setup(){

 Serial.begin(9600);

}

void loop(){

 Searial.println(analogRead(A0));

}

 

9) 컴파일 및 업로드한 후, 포텐셔미터를 조절해가며 그 결과를 확인한다.

 아날로그 Output (PWM Write)

 

10) 다음과 같은 회로를 구성한다.

 

11) LED가 처음에는 가장 밝은 밝기로 켜진 후, 매 1초마다 점점 어두워졌다가, 다시 점점 밝아지는 것을 반복하도록 프로그램을 작성한다.

void setup(){

 pinMode(9,OUTPUT);

}

void loop(){

 for(int i=255; i>=0; i-51){

  analogWrite(9,i);

  delay(1000);

 }

 for(int i=0; i<256; i+51){

  analogWrite(9,i);

  delay(1000);

 }

}

 

12) 컴파일 및 업로드한 후 그 결과를 확인하고, 9번 핀을 오실로스코프 프로브로 찍어 그 파형을 함께 확인한다.


 

유익하셨다면 좋아요와 구독 꾹 부탁드립니다 ㅎㅎ