세미나/소프트웨어 세미나

[세미나] 2차시 - 아두이노 기초(디지털과 아날로그)

야호선종 2022. 7. 16. 23:34
반응형

☞ 진행 날짜 : 2022.07.13
☞ 진행자 : 야호선종
☞ 기록자 : 야호선종
☞ IDE : Arduino 1.8.12
☞ 준비물 : PC, Arduino UNO R3, 브레드보드, 조이스틱 1개, LED(발광 다이오드) 3개, 버튼 1개, 220Ω 혹은 330Ω 저항 3개




목차

 1. 디지털과 아날로그
 2. 버튼 제어
 3. 조건문 if
 4. 조이스틱 제어(과제)

 





① 디지털과 아날로그

 

세미나 진행자 이광진 PPT 中

 

 

 

※ 디지털

아날로그 데이터를 가공과 저장이 쉽도록 0과 1로 표현하는 것을 의미한다. 불을 켜거나 끄는 것, 물체를 감지했거나 하지 않았거나 등 이산적인 값을 나타낼 때 사용한다. 아두이노에서는 0(LOW) 또는 1(HIGH)과 같이 나타낸다.





※ 아날로그

연속적으로 변하는 물리량으로 나타내는 것을 의미한다. 자연에서 얻는 대다수의 데이터는 아날로그 데이터이다. 아날로그 센서인 조도 센서, 거리 감지 센서, 가속도 센서는 값을 연속적인 신호로 뽑아내 전압으로 나타낸다. 아두이노에서는 0에서 1023의 값인 2의 10제곱까지 값으로 나타낼 수 있다.



 

※ 디지털 - 아날로그 포트

 

◎ 디지털 포트 : 디지털 포트는 값을 두 가지 값 HIGH / LOW로 처리하기 때문에 LED, 버튼 등 상황을 두 가지로 나눌 수 있는 장치는 디지털 포트에 연결한다. 아두이노 IDE를 사용하면서 핀에 대해서 변수로 선언할 때 디지털 포트는 숫자만 써서 나타낸다.

 

// 디지털 포트 12번 선언
int digitalPort = 12;

// 디지털 포트를 OUTPUT 모드로 설정
pinMode(digitalPort, OUTPUT);

 

 



◎ 아날로그 포트 : 아날로그 포트는 값을 연속적인 전압으로 처리하기 때문에 조도 센서, 거리 감지 센서, 가속도 센서는 아날로그 포트에 연결하여 사용한다. 아두이노 IDE를 사용하면서 핀에 대해서 변수로 선언할 때 아날로그 포트는 접두사 'A' 와 숫자(핀 번호)를 붙여서 나타낸다.

// 아날로그 포트 0번 선언
int analogPort = A0;

// 아날로그 포트를 INPUT 모드로 설정
// 아날로그 포트는 핀 모드를 따로 설정하지 않아도 된다.(핀 모드 생략 가능)
pinMode(analogPort, INPUT);

 

 

 

 

 


② 버튼 제어

 

버튼 예제

 

https://www.tinkercad.com/things/

 

 

☞ 소스 코드

 

int btn = 11;

void setup() {
  Serial.begin(9600);
  pinMode(btn, INPUT);

}

void loop() {
  Serial.print("Button State : ");
  Serial.println(digitalRead(btn));

}

 

 

 

 

 

☞ 문제점

 

회로, 코드 모두 간단하지만, 문제가 하나 있다. 위와 같이 pinMode(btn, INPUT) 처럼 입출력 모드를 INPUT으로 설정하고 시리얼 모니터를 보면 버튼을 누를 때마다 0과 1의 값이 바뀌어야 하지만 실제로는 그렇지 않다.

 

해결 방법은 버튼에 저항을 추가하거나 pinMode(btn, INPUT_PULLUP) 으로 코드를 변경하면 된다.

 

디지털 신호에서 HIGH 상태도 아니고 LOW 상태도 아닌 애매한 상태를 Floating(플로팅) 현상이라고 하는데 이렇게 이도 저도 아닌 신호의 흐름을 HIGH, LOW 상태로 다시 밀어줘 올바른 흐름으로 보내는 것을 풀업, 풀다운 저항이라고 한다. 입출력 모드를 INPUT에서 INPUT_PULLUP 으로 변경하면 아두이노 보드 내에 저항을 이용해서 위 문제를 해결할 수 있다.

 

 

// 입출력 모드 수정
pinMode(btn, INPUT); -> pinMode(btn, INPUT_PULLUP);

 

 

 

 


③ 조건문 if

 

※ 조건문 if 란?

 

세미나 진행자 이광진 PPT 中

 

 

if는 뜻 그대로 '만약에' 를 의미한다. if 문을 이용하면 조건에 맞을 때 실행하거나 실행하지 않도록 제어할 수 있다. 조건이 독립적일 때 많이 사용한다. if - else if - else 문으로도 사용하는데, 조건문을 사용할 때는 조건을 부여하는 순서가 중요하다.

 

 

 

☞ 조건문을 사용할 때는 순서를 유의하자. [if - else if - else 문]

 

int LED = 13;
int lightValue = analogRead(lightSensor);

// 빛의 양이 적당하면 LED 깜빡깜빡
if (lightValue < 500) {
  digitalWrite(LED, HIGH);
  delay(200);
  digitalWrite(LED, LOW);
  delay(200);
}

// 빛의 양이 적으면 LED 항상 켜기
else if (lightValue < 200) {
  digitalWrite(LED, HIGH);
}

// 빛의 양이 많으면 LED 항상 끄기
else {
  digitalWrite(LED, LOW);
}

 

 

위와 같은 코드가 있다고 가정하자. 각 조건의 내용은 다음과 같다.

 

 

◎ 첫 번째 if 문 :  lightValue 값이 500 이하일 때 실행

 

◎ 두 번째 else if 문 :  lightValue 값이 200 이하일 때 실행

 

◎ 마지막 else 문 :  lightValue 값이 500 초과일 때 실행

 

 

조건문을 위와 같이 선언하면 두 번째 조건문에 있는 내용은 영원히 실행할 수 없을 것이다. 왜냐하면 lightValue 값이 500 이하일 때는 200 이하일 때의 값을 포함하기 때문이다. 그러므로 lightValue 값이 500 이하일 때는 첫 번째 조건문을, 500 초과일 때는 else 문을 실행하여 else if 문은 실행되지 않는다.

 

실제로 위와 같이 빛의 양(lightValue)이 적을 때 항상 LED를 켜고 싶다면, 첫 번째 조건과 두 번째 조건을 바꿔서 코딩을 해야한다. 조건문을 사용할 때는 순서에 대해서 유의하고 작성하도록 하자. 

 

 

 

☞ 수정한 소스 코드

 

int LED = 13;
int lightValue = analogRead(lightSensor);

// 빛의 양이 적으면 LED 항상 켜기
if (lightValue < 200) {
  digitalWrite(LED, HIGH);
}

// 빛의 양이 적당하면 LED 깜빡깜빡
else if (lightValue < 500) {
  digitalWrite(LED, HIGH);
  delay(200);
  digitalWrite(LED, LOW);
  delay(200);

}

// 빛의 양이 많으면 LED 항상 끄기
else {
  digitalWrite(LED, LOW);
}

 

 

 

 


④ 조이스틱 제어(과제)

 

 

 

 

 

※ 조이스틱

세미나 진행자 이광진 PPT 中

 

 

 

※ 회로 구성

세미나 진행자 이광진 PPT 中

 

 

세미나 진행자 이광진 PPT 中

 

회로도에 있는 조이스틱이 우리가 사용한 조이스틱과 배선이 다르다. 아래의 내용을 참고하기바란다.

 

◎ GND 

◎ +5V

◎ VRX - A0

◎ VRY - A1

◎ SW - D8

 

 

 

※ 소스 코드

세미나 진행자 이광진 PPT 中

 

 

 

 

※ 결과

세미나 진행자 이광진 PPT 中

 

 

 

 

※ 비밀결사대 앙치킨

 

 

 


문의글은 댓글로 남겨주세요.

반응형