[아두이노] LED & SWITCH Shield, FND Shield를 이용한 디지털 입출력 제어 실습

김우경·2021년 4월 12일
0

아두이노

목록 보기
6/9

이전 포스팅에 이어 이번에는 LED & SWITCH Shield, FND Shield를 이용해서 입출력에 대한 제어 실습을 해보려고 합니다.

디지털 입력과 출력 제어

LED & SWITCH Shield

  • 4개의 LED와 4개의 Switch로 구성
  • P1~P8에 LED와 Switch가 각각 연결
    -> Arduino UNO의 Digital Port 5~8에 Switch 1~4
    -> Arduino UNO의 Digital Port 9~12에 LED 1~4

아두이노와 연결하기

1번 스위치 클릭시 1번째 LED ON

  • 1번 스위치 클릭시 1번 LED ON
  • 2번 스위치 클릭시 1번 LED OFF
void setup() {
  Serial.begin(9600);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(9, OUTPUT);
}

void loop() {
  if (digitalRead(5) == LOW) {
    digitalWrite(9, 0);
    Serial.println("LED1 is on");
  } else if (digitalRead(6) == LOW) {
    digitalWrite(9, 1);
    Serial.println("LED1 is off");
  }
  delay(200);
}


굿 ,, 👍

예제 코드들

1번 스위치 눌렀을때 LED 1번부터 4번까지 순서대로 oN

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(5, INPUT);
  for (int i=9; i<13; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  // default OFF 상태로 만들기
  for(int i=9; i<13; i++){
    digitalWrite(i, 1);
  }
  if (digitalRead(5) == LOW) {
    for (int i=9; i<13; i++){
      digitalWrite(i, 0);
      Serial.print("LED ");
      Serial.print(i-8);
      Serial.println(" is on");
      delay(200);
    }
  }
}

2번 스위치 눌렀을때 LED 1,2 ON, 3번 누르면 3,4 ON

void setup() {
  Serial.begin(9600);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  for (int i=9; i<13; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  if (digitalRead(6) == LOW) {
    // 1,2번 LED 켜고 3,4번 LED 끄기 
    digitalWrite(9,0);
    digitalWrite(10,0);
    digitalWrite(11,1);
    digitalWrite(12,1);
  } else if (digitalRead(7) == LOW) {
    // 1,2번 LED 끄고 3,4번 LED 켜기
    digitalWrite(9,1);
    digitalWrite(10,1);
    digitalWrite(11,0);
    digitalWrite(12,0);
  }
}

SW 3번 누를때 전체 LED on, SW 4번 누를때 전체 LED off

void setup() {
  Serial.begin(9600);
  pinMode(7, INPUT);
  pinMode(8, INPUT);
  for (int i=9; i<13; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  if (digitalRead(7) == LOW) {
    for (int i=9; i<13; i++) {
      digitalWrite(i, 0);
    }
  } else if (digitalRead(8) == LOW) {
    for (int i=9; i<13; i++) {
      digitalWrite(i, 1);
    }
  }
}

디지털 출력 확장과 7 세그먼트

7세그먼트

  • 8개의 LED로 숫자나 문자를 만들 수 있도록 만들어진 표시 장치
  • 각각의 LED는 개별적으로 제어됨 -> 8개의 데이터 핀이 필요하다

공톡 양극과 공통 음극

  • 1개의 공통핀 + 8개의 세그먼트 제어핀
  • 공통 양극 : 공통핀에 VCC(양극), 제어핀에 GND
    -> 0V: OFF, 5V:ON
  • 공통 음극 : 공통핀에 GND(음극), 제어핀에 VCC
    -> 0V: ON, 5V:OFF

숫자 표현하기

-> 공통 양극방식 기준으로 (음극일땐 toggle하자)

4자리 7세그먼트

  • 12개의 핀을 가짐
    -> 4개 자릿수 선택 핀 + 8개의 제어 핀
  • 잔상효과 활용
    -> 한번에 한자리만 빠른 속도로 출력&이동
    -> 30Hz: 1초에 30번 깜빡이면 계속 켜있는 걸로 인식

7447을 이용한 7-세그먼트

  • 7447: 전용 IC로 출력 확장 chip이다 -> 일종의 decoder 역할
  • 출력포트 줄이기 위해서 사용 : 7세그먼트 하나 제어를 위해 8개의 디지털 출력포트 필요하다는 비효율성 개선

FND Shield

  • 2개의 7세그먼트로 구성
  • FND Shield의 P1~8은 Arduino pin5~12에 연결
    -> 5~8: digit 1, 9~12: digit 2

아두이노와 연결하기

예제 코드들

1번, 2번 FND에 0,0 표시하기

void setup() {
  for (int i=5; i<13; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  for (int i=5; i<13; i++) {
    digitalWrite(i, 0);
  }
}

1번째, 2번째 FND에 숫자 0부터 9까지 표시하기

void setup() {
  Serial.begin(9600);
  for (int i=5; i<13; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  int num[10][4] = {
    {0,0,0,0}, 
    {0,0,0,1}, 
    {0,0,1,0}, 
    {0,0,1,1},
    {0,1,0,0}, 
    {0,1,0,1}, 
    {0,1,1,0}, 
    {0,1,1,1}, 
    {1,0,0,0}, 
    {1,0,0,1}
    };
  for (int i=0; i<10; i++) {
    for (int j=0; j<4; j++) {
      digitalWrite(j+5,num[i][3-j]);
      digitalWrite(j+9,num[i][3-j]);
    }
    delay(1000);
  }
}

millis를 이용한 초시계 만들기

  • delay와 millis의 차이
    • delay: delay 시간동안 아무 동작도 x -> loop돌때마다 error누적
    • millis : 정확한 시간 체크
      -> 에 관한 자세한 설명은 arduino.cc millis() document에서 확인이 가능하다.
void setup() {
  for (int i=5; i<13; i++) {
    pinMode(i, OUTPUT);
  }
}

unsigned long fnd1, fnd2;
void loop() {
  int num[10][4] = {
    {0,0,0,0}, 
    {0,0,0,1}, 
    {0,0,1,0}, 
    {0,0,1,1},
    {0,1,0,0}, 
    {0,1,0,1}, 
    {0,1,1,0}, 
    {0,1,1,1}, 
    {1,0,0,0}, 
    {1,0,0,1}
    };
    
  unsigned long current = round(millis());
  current = int((((current+5)/10)*10)/1000);
  fnd1 = current%10;
  current = int(current/10);
  fnd2 = current%10;
  
  for (int i=0; i<4; i++){
    digitalWrite(i+5, num[fnd1][3-i]);
    digitalWrite(i+9, num[fnd2][3-i]);
  }
  delay(1000);
}

난수 생성해서 표시하기

int num[10][4] = {
    {0,0,0,0}, 
    {0,0,0,1}, 
    {0,0,1,0}, 
    {0,0,1,1},
    {0,1,0,0}, 
    {0,1,0,1}, 
    {0,1,1,0}, 
    {0,1,1,1}, 
    {1,0,0,0}, 
    {1,0,0,1}
};
int fnd1, fnd2;

void setup() {
  Serial.begin(9600);
  for (int i=5; i<13; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  long randNum = random(0,100);
  Serial.println(randNum);
  fnd1 = randNum % 10;
  randNum = int(randNum/10);
  fnd2 = randNum % 10;

  for (int i=0; i<4; i++){
    digitalWrite(i+5, num[fnd1][3-i]);
    digitalWrite(i+9, num[fnd2][3-i]);
  }
  delay(3000);
}
profile
Hongik CE

0개의 댓글