세븐 세그먼트 사용하기
1. 세븐 세그먼트란
아라비안 숫자를 표현하기 위해 7개의 LED로 구성된 표시 장치로, 전자 시계에서 가장 자주 접할 수 있다.
즉, LED를 7개 사용하여 숫자를 한자리 표현하는 표시 장치이다. 아래의 88:88 시계를 보면 바로 이해할 수 있다.
이러한 세븐 세그먼트에서 우측하단 점까지 포함하여 총 8개의 LED를 조합하여 숫자를 표현한다. 따라서 가장 첫번째 포스팅이었던 LED 조작에서와 같이 저항과 8개의 digital gpio가 필요하다.
각 저항은 7 세그먼트를 제작한 제조사의 메뉴얼을 참고하여 구하는 것이 좋으나, 적당히 200~300옴 정도를 사용하면 무방하겠다.
2. 애노드와 캐소드
애노드와 캐소드는 쉽게 말해서 +와 -라고 생각하면 된다. 주로 LED와 같이 전압을 인가해야 하는 장치에서 주로 표현한다. 각 장치에서 공용으로 사용되는 + 극을 Common Anode, 반대로 공용으로 사용하는 -극을 Common Cathode라고 표현한다.
우리가 사용하게될 7 세그먼트에도 CC타입과 CA 타입이 있으며, 대부분의 장치에서 CC 타입을 주로 사용한다. 그 이유는 이 링크를 참조해보면 좋을 것 같다.
아무튼 본론으로 돌아와 본 포스팅에서는 캐소드 타입과 애노드 타입을 모두 나열할 것이지만, 사용하는 7 세그먼트를 검색하여 어떤 타입인지 확인하는 것이 바람직 하다.
3. 7-Segment에 숫자 표현하기
세그먼트의 7개의 LED를 시계 순서대로 a,b,c,d,e,f,g하면, 아래와 같이 숫자를 표현할 수 있다.
4. Common Cathode 7-Segment 회로 & 소스코드
공용 핀에 GND를 인가하여 준다. 저항은 200~300옴을 적당히 쓰자.
// 세그먼트 디지털 핀 2~8
int seg[7] = {2,3,4,5,6,7,8};
// 7-segment
// a
//f b
// g
//e c
// d
// 숫자 0~9까지
int num[10][7] = {
{1,1,1,1,1,1,0}, //0
{0,1,1,0,0,0,0}, //1
{1,1,0,1,1,0,1}, //2
{1,1,1,1,0,0,1}, //3
{0,1,1,0,0,1,1}, //4
{1,0,1,1,0,1,1}, //5
{1,0,1,1,1,1,1}, //6
{1,1,1,0,0,0,0}, //7
{1,1,1,1,1,1,1}, //8
{1,1,1,0,0,1,1} //9
};
void setup() {
// 7개의 디지털 핀의 모드를 출력으로 변경
for(int i = 0; i < 7; i++){
pinMode(seg[i],OUTPUT);
}
}
void loop() {
// 0~9까지 나타내는 i
for(int i = 0; i < 10; i++){
// 7개의 세그먼트 led를 나타내는 j
for(int j = 0; j < 7; j++){
digitalWrite(seg[j], num[i][j]);
}
delay(1000);
}
}
5. Common Anode 7-Segment 회로 & 소스코드
커먼 캐소드에서 사용한 2개의 공용핀에 5V를 인가한다. 그게 끝이다.
// 세그먼트 디지털 핀 2~8
int seg[7] = {2,3,4,5,6,7,8};
// 7-segment
// a
//f b
// g
//e c
// d
// 숫자 0~9까지
int num[10][7] = {
{1,1,1,1,1,1,0}, //0
{0,1,1,0,0,0,0}, //1
{1,1,0,1,1,0,1}, //2
{1,1,1,1,0,0,1}, //3
{0,1,1,0,0,1,1}, //4
{1,0,1,1,0,1,1}, //5
{1,0,1,1,1,1,1}, //6
{1,1,1,0,0,0,0}, //7
{1,1,1,1,1,1,1}, //8
{1,1,1,0,0,1,1} //9
};
void setup() {
// 7개의 디지털 핀의 모드를 출력으로 변경
for(int i = 0; i < 7; i++){
pinMode(seg[i],OUTPUT);
}
}
void loop() {
// 0~9까지 나타내는 i
for(int i = 0; i < 10; i++){
// 7개의 세그먼트 led를 나타내는 j
for(int j = 0; j < 7; j++){
digitalWrite(seg[j], !num[i][j]);
}
delay(1000);
}
}
6. CC와 CA 회로 & 소스코드의 다른점?
1) Common Cathode에서는 공통 핀을 GND에 주었고, Common Anode에서는 공통핀에 5V를 인가해주었다. 2) 그리고 소스코드의 digitalWrite에서 num[i][j] 앞에 ! 비교 NOT 연산자를 호출하여 0을 1으로 1을 0으로 바꿔주었다.
이게 무슨말인가 하면, 캐소드는 GPIO에 1을 주면 GPIO 5V--- LED --- 저항 --- GND가 되어 불이 들어오지만, Anode는 GPIO에 0을 주어야 GPIO GND --- LED --- 저항 --- 5V가 되어 불이 들어온다.
즉 우리가 세그먼트의 각 LED를 켜고(1) 끈다(0)는 개념을 가지고 회로를 직관적으로 구성하기 위해서는 Common Cathode가 훨씬 좋다. 또한 Anode의 경우 LED에 전원을 완전히 끄기 위해서 5V와 동일한 전압을 계속해서 유지해야 하는 문제점도 있다.
아무튼 편리한 것을 사용하면 되지만, 위와 같은 직관성도 CC 타입이 주로 사용되는 이유 중 하나이다.
'라즈베리파이, 아두이노' 카테고리의 다른 글
[간단한 아두이노 코딩] 9. XYZ 가속도 센서 사용하기(GY-61) (0) | 2020.11.24 |
---|---|
[간단한 아두이노 코딩] 8. 세븐 세그먼트 + 디코더 사용하기 (2) | 2020.11.24 |
[간단한 아두이노 코딩] 6. 온습도 센서 사용하기(DHT11) (0) | 2020.11.24 |
[간단한 아두이노 코딩] 5. 온도 센서 사용하기(DS18B20, LM35) (0) | 2020.11.24 |
[간단한 아두이노 코딩] 4. 버튼 입력 제어하기 (인터럽트) (0) | 2020.11.24 |