Front-end_dev

FND 점등 (알고리즘) 본문

Hardware/Arduino

FND 점등 (알고리즘)

Eat2go 2017. 4. 22. 02:01

문제 : 2개의 FND를 아두이노 보드에 점등하세요 


솔루션1 : FND는 7핀이니까 아두이노 보드에 0~13핀에 꽃아서 구현한다.


솔루션2 : 흠... 더 좋은 방법이 잇을텐데...



제가 처음에 생각한 솔루션2는 다음과 같습니다.

두개의 FND를 매우빠르게 구현하면 되지않을까?? 어,,, 그다음에는..... time control을 구현할까? 아 잠깐... 똑같은포트를공유하면 둘다같은것을 출력하게되는데... 각각 제어를 해야겠네... 어떻게하지??.... 하...


고민을 하면 할수록 더 이상한 쪽으로 빠지게되었습니다.


근데 같은반에 자바쪽으로 공부하던 동생이 한 명 잇었는데 그 동생하고 저만 솔루션2쪽으로 생각을 하고있었습니다.

그리고 좀 있다가 그동생이 성공을 하게 됐습니다. 그 동생의 알고리즘을 듣고 그자리에서 온몸에 소름끼치면서 감탄했습니다ㅡㅡ; 그 동생의 솔루션을 듣고 그 알고리즘을 바탕으로 코드를만들고 약간 응용하여 마무리하게 됬습니다. 




다시문제로..


FND 1개의 포트(7개 dot는뻇음)를 이용하여 FND2개를 순차점등해보기.



알고리즘 : 사람이 인지하지 못할 속도(매우빠르게)로 FND하나씩 점등하는 식으로 구현한다.


1. GND or VCC 제어 (디코더의구현)

2. time control 구현


우선포트를 공유하므로 1을출력하거나 2를 출력하거나 3을출력하거나 n을출력할때 m개의 FND는 같은숫자를 출력하데 될 것 입니다. 이때, 필요한게 바로 1번(디코더) 구현의 필요성입니다!!


그림으로 보면 이해하기 쉽습니다.



자, 이제 각각의 FND를 제어 할 수 있게 됬습니다. 90%가 끝났다고 봐도 됩니다.


이제 마지막인 time control을 구현 해야합니다. 

예를들어, 1초동안 왓다갓다하는 표시를 50번표시하고싶다. 그럼 pesudo code로 다음과같이 할 수 있습니다.

for(index = 0; index < 50; index++) {

 display_left();

 delay(1); // millisecond , 0,01 second

 display_right();

 delay(1); // sum = 0.02 second

}


2번은 정말 별거아닌데 time control을 한번도 구현해보지 못한 사람은 코드로 구현할 떄 멍해집니다.. 제가그랫어요...



결론 : 이것의 구현은 포트절약뿐아니라 동시에 그 FND4개같이달려있는거잇잖아요? 그거구현햇다고 보심됩니다. 이런 간단한문제에서 이런 귀한 경험을... ㅎㅎ  마무리로 코드와 시연 동영상 올리고 끝내겠습니다.


FND 2개 




FND 3개





아 그리고 지금 점등되는거 보면 희미하게 불들어오는거는 애노드FND로 구현하면 없어지더라고요... 혹은 제가 회로의 이해가 부족해서 그럴 수도 있고용.....


마지막으로 코드


const int a = 2;
const int b = 3;
const int c = 4;
const int d = 5;
const int e = 6;
const int f = 7;
const int g = 8;
const int LEFT_FND_GND = 9;
const int RIGHT_FND_GND = 10;
const int Hundred_FND_GND = 11;
int decimal_value = 0;
int Hundred_value = 0;
void flash(int cnt) {
// cnt(1의자리)가 10의 배수가 되면 10의자리를 1씩 증가시킨다
if(cnt % 10 == 0 && cnt != 0) decimal_value++;
// 1의자리 추출
cnt = cnt % 10;
// 1초 구현 : 0.02초 X 50
// 1.5초 구현 0.03초 X 50
for(int i=0; i<50; i++) {
//1의자리 FND 출력
digitalWrite(Hundred_FND_GND,HIGH);
digitalWrite(RIGHT_FND_GND,HIGH);
digitalWrite(LEFT_FND_GND,LOW);
display_num(decimal_value);
delay(1); // 0.01 second
//10의자리 FND 출력
digitalWrite(Hundred_FND_GND,HIGH);
digitalWrite(LEFT_FND_GND,HIGH);
digitalWrite(RIGHT_FND_GND,LOW);
display_num(cnt);
delay(1);
//100의자리 FND 출력
digitalWrite(LEFT_FND_GND,HIGH);
digitalWrite(RIGHT_FND_GND,HIGH);
digitalWrite(Hundred_FND_GND,LOW);
display_num(Hundred_value);
delay(1); // sum = 0.03 second
}
}
void display_num(int cnt) {
switch(cnt) {
case 0 : {
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(a,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,LOW);
}
break;
case 1 : {
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(a,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}
break;
case 2 : {
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(e,HIGH);
digitalWrite(d,HIGH);
digitalWrite(c,LOW);
digitalWrite(f,LOW);
}
break;
case 3 : {
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(f,LOW);
digitalWrite(e,LOW);
}
break;
case 4 : {
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(a,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
}
break;
case 5 : {
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(b,LOW);
digitalWrite(e,LOW);
}
break;
case 6 : {
digitalWrite(a,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(b,LOW);
}
break;
case 7 : {
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(f,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(g,LOW);
}
break;
case 8 : {
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
}
break;
case 9 : {
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(e,LOW);
}
break;
}
}
void setup() {
for(int i=2; i<=11; i++) {
pinMode(i,OUTPUT);
}
}
void loop() {
for(int i=0; i<100; i++) {
flash(i);
}
decimal_value = 0;
//Hundred_value = Hundred_value == 9 ? 0 : Hundred_value++; 삼항연산자안먹히는듯??
if(Hundred_value == 9) Hundred_value = 0;
else Hundred_value++;
}










'Hardware > Arduino' 카테고리의 다른 글

장난감만들기  (0) 2017.10.31