P. 226 ~ 229 중단원, 대단원(피지컬컴퓨팅 파트) 마무리하기 문제 해설(비상교육 정보교과서)

아두위키 : Arduwiki

본 위키는 비상교육 고교 정보교과서 P. 226 ~ 229 중단원, 대단원(피지컬컴퓨팅 파트) 마무리하기 문제를 해설합니다.


P. 226 중단원 마무리하기

문제로 정리하기

1. 피지컬 컴퓨팅 장치 중 센서, 버튼, 스위치는 대표적인 ( 입력 ) 장치이다.

  • 입력 장치 : 외부 환경에서 정보를 수집하는 역할
  • 출력 장치 : 컴퓨터가 처리한 정보를 외부 세계에 전달하는 역할

2. ( 발광다이오드(LED) )는 피지컬 컴퓨팅에서 사용하는 대표적인 출력 장치 중 하나로, 전압을 가하면 발광하는 반도체 소자이다.

LED(5mm) 문서에서 LED에 대한 자세한 내용을 참고하세요.


3. 출력 장치 중 하나인 ( 7세그먼트 )는 7개의 획으로 숫자나 문자를 나타내는데, FND(Flexible Numeric Display)라고도 한다.

4비트 세그먼트 문서에서 조금 더 큰 세그먼트에 대한 내용을 참고하세요.


4. ( 마이크로컨트롤러 )는 하나의 칩에 중앙 처리 장치(CPU)와 기억 장치를 내장한 반도체이다.


5. 피지컬 컴퓨팅 장치를 선택한 다음, 작동 순서에 맞게 각 장치의 연결 상태를 그림으로 표현한 것을 ( 회로도 ) 라고 한다.


6. ( 버그 )란 피지컬 컴퓨팅 장치나 제어 프로그램이 정상적으로 작동하지 않게 하는 오류를 말한다.


7. 다음을 서로 관련 있는 것끼리 연결하시오.


8. 다음 ( ) 안에 공통으로 들어갈 말을 쓰시오.

  • 소리를 전기적 신호로 변환하는 소리 ( 센서 )가 있다.
  • 빛의 양을 전압의 크기로 측정하는 빛(조도) ( 센서 )가 있다.
  • 피지컬 컴퓨팅의 입력 장치로 많이 사용하는 것은 여러 종류의 ( 센서 )이다.


9. 다음은 마이크로컨트롤러 보드의 디지털 입출력 3, 5, 7, 9번 핀의 상태값에 HIGH를 출력하기 위한 제어 프로그램의 일부이다. 프로그램 코드를 완성하시오.

int i;
int digitalPin[] = {3, 5, 7, 9};
for(i=0; i < 4; i=i+1){
    digitalWrite(digitalPin[i], HIGH);
}

초기값 i = 0에서 시작하여 i가 4보다 작을 동안 반복하며, 매 반복마다 i의 값을 1씩 증가시킵니다.

배열의 인덱스는 1로 시작하는 것이 아니라 0부터 시작하기 때문에 digitalPin[0], digitalPin[1], digitalPin[2], digitalPin[3] 핀에 차례로 HIGH 신호를 출력합니다.


서술형 · 논술형 문제

1. 다음과 같은 조건에서 초음파 센서로 거리를 측정하려고 한다. 초음파 센서로부터 읽은 값이 t μs(마이크로초)가 걸렸다면, 초음파로 측정한 물체까지의 거리(cm)는 얼마인지 계산 과정을 쓰고, 제어 프로그램을 작성하시오.

조건

  • 음파의 속도는 340m/s이다.
  • trig는 디지털 입출력 3번 핀, echo는 4번 핀에 연결되어 있다.
  • pulseIn(pin, value) 함수를 사용한다.


(1) 계산과정

시간 t μs(마이크로초)가 소요되었고, 음파의 속도는 340m/s이기 때문에 1cm를 이동하는 데 약 29μs가 걸린다.

→ 340m = 34000cm, 1s = 10^6μs

→ 1cm를 움직이는 데에 1/34000s(약 0.000029s) = 29μs

송신한 후에 수신해야 하기 때문에 음파의 이동 거리는 (왕복시간 / 1cm를 이동하는 데 걸린 시간(29μs) / 2)가 된다.

즉 이동 거리(cm) = t / 29 / 2 이다.

(2) 제어 프로그램

void setup(){
    Serial.begin(9600);
    pinMode(3, OUTPUT);
    pinMode(4, INPUT);
    digitalWrite(3, HIGH);
    delay(10);
    digitalWrite(3, LOW);
    unsigned long mstime = pulsIn(4, HIGH);
    Serial.print(mstime/29/2);
}


P. 228 대단원 마무리하기

4. 다음 중 장치에 대한 설명으로 옳은 것은?

① 발광 다이오드는 대표적인 입력 장치이다.

LED는 출력 장치입니다.

② 액정 표시기는 빛의 세기를 입력받는 장치이다.

LCD는 문자나 숫자를 디스플레이하는 모듈입니다.

③ 초음파 센서는 거리나 속도 측정에 사용할 수 있다.

④ 전동기는 운동 에너지를 소리 에너지로 변환하는 장치이다.

→ 전동기는 전기 에너지를 운동 에너지로 변환합니다.

⑤ 스피커는 전기 신호를 연결하는 역할을 하는데, 장치를 켜거나 끈다.

→ 스위치의 역할에 가깝습니다.



5. 다음 피지컬 컴퓨팅 회로도를 바르게 분석한 사람은?

① 버튼은 아날로그 입력이기 때문에 A2 핀에 연결해야 한다.

버튼은 (눌러졌는가, 눌러지지 않았는가) 디지털 입력에 해당합니다.

② 저항은 (+)극과 (-)극을 유의해서 연결해야 하는데, 잘못 연결되어 있다.

빛 센서는 디지털 입력이기 때문에 디지털 입출력 핀에 연결해야 한다.

→ 빛 센서는 아날로그 입력으로 빛의 세기에 따라 0 ~ 1024의 값으로 표현됩니다.

④ 빛 센서는 디지털 입출력 12번 핀에 연결해야 원하는 값을 측정할 수 있다.

⑤ 발광 다이오드는 (+)극과 (-)극을 유의해서 연결해야 하는데, 잘못 연결되어 있다.

LED는 긴 다리가 디지털 핀, 짧은 다리가 GND로 연결되어야 하므로 주어진 회로에서 반대로 연결되어 있습니다.


컴퓨팅 사고력 UP

1. 사람이 자리에 앉으면 빛의 양을 측정해서 출석을 확인하는 장치를 만들려고 한다. 빛 센서가 측정할 수 있는 값의 범위에서 중간 이하이면 1, 초과이면 0을 계속 출력하는 제어 프로그램을 작성해 보자.(단 빛 센서의 최댓값은 P_MAX, 최솟값은 P_MIN이고 아날로그 입력 A4 핀에 연결되어 있다. 마이크로컨트롤러 보드는 'COM6'에 연결되어 있다.)

정답지의 코드에서 1, 2번 줄을 추가했습니다.

빛 센서는 아날로그 입력 장치로 0 ~ 1024 값으로 빛의 양(세기)를 표현합니다.

P_MAX, P_MIN을 미리 설정해주지 않는다면 오류가 발생합니다.

int P_MAX = 1024;
int P_MIN = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int lightValue = analogRead(A4);
  if (lightValue <= (P_MAX+P_MIN)/2)
    Serial.println("0");
  else
    Serial.println("1");
}


2. 1번 피지컬 컴퓨팅의 디지털 입출력 12번 핀에 발광 다이오드를 추가로 연결하여 빛 센서에 의해 출력되는 값이 1이면 발광 다이오드를 켜고, 0이면 끄는 제어 프로그램을 작성해 보자.

int P_MAX = 1024;
int P_MIN = 0;

void setup() {
  Serial.begin(9600);
  pinMode(12, OUTPUT);
}

void loop() {
  int lightValue = analogRead(A4);
  if (lightValue <= (P_MAX+P_MIN)/2){
    Serial.println("0");
    digitalWrite(12, HIGH);
  }
  else{
    Serial.println("1");
    digitalWrite(12, LOW);
  }    
}


3. 빨간색, 녹색, 노란색의 발광 다이오드 3개와 버튼 1개를 이용해서 신호등을 만들려고 한다. 버튼을 누를 때마다 '빨간색 → 노란색 → 녹색 → 다시 빨간색' 순으로 순환하면서 발광 다이오드가 켜지도록 프로그램을 완성시켜 보자(단 한 번에 하나의 발광 다이오드만 켜져야 한다).

한 번에 하나의 LED만 켜져야 하기 때문에 나머지 LED들은 LOW로 처리한 모습입니다.

void setup() {
  pinMode(2, INPUT);
  pinMode(5, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(12, OUTPUT);
}

void loop() {
  while(digitalRead(2)==LOW);
  digitalWrite(12, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(5, LOW);
  delay(500);
  while(digitalRead(2)==LOW);
  digitalWrite(12, LOW);
  digitalWrite(8, HIGH);
  digitalWrite(5, LOW);
  delay(500);
  while(digitalRead(2)==LOW);
  digitalWrite(12, LOW);
  digitalWrite(8, LOW);
  digitalWrite(5, HIGH);
  delay(500);
}