메뉴 건너뛰기

목록
2022.05.05 13:49

아두이노 공부 fnd 편

profile
조회 수 122 댓글 4 예스잼 6 노잼 0

KakaoTalk_20220505_131954469_01.jpgKakaoTalk_20220505_131954469.jpg

 

 

FND란 위같은 부품을 뜻하며 7-segment라고도 불리는 전자부품임 

0~9까지의 숫자를 표시할수 있으며 한칸당 led가 하나씩 들어있다고 생각하면됨 

다리가 총 10개있는데 

 

 

 

2FND.jpg

 

이렇게 연결되어있슴 저 세모난거에 짝때기 그어져있는게 led이며 총 7개의 led와 dp가 있음 

dp는 맨위 사진 숫자밑에 있는 . 을 말함 

만약 숫자 1을 표시 하고 싶다고 하면 led b와 led c만 on하면 됨 아주 젓밥이기때문에 아두이노 핀 출력만 할수있으면 쉽게 숫자를 표시할수잇음  

그리고 왼쪽은 공통애노드 오른쪽은 공통 캐소드인데 걍 led가 달려있는 방향이 다르다고 생각하면됨 

이 한칸짜리 fnd를 4개 붙혀놓은게 있는데 저는 오늘 그것을 제어해볼것임 

 

 

3833933_28133606large.jpg

 

image.png

 

이렇게 생겼고 위에랑 비교해보면 com1,com2,com3,com4가 생긴것을 알수있음 

각각 com1에 신호를 주면 첫번째 칸이 켜지고 com2에 신호를 주면 두번째 칸이 켜짐 

즉 4개 붙어있는것도 아주 젖밥이라고 생각하고 해봤으나 생각한것 처럼 잘안되었음 

이유는 회로도를 보면 알수있음 

 

제목_없음.png

이게 4칸짜리 fnd의 회로도인데 잘보면 4칸의 각각 a는 a끼리,b는 b끼리  전부 연결되어있음 

이말은 즉 만약 1을 표시하기 위해 b와 c에 신호를 주면 모든 칸에서 숫자 1이 표시됨 

각각 칸에서 따로 제어하는게 아니라 묶여있기때문에 모든 칸에 똑같은 숫자가 나오게되는것임.... 

 

그래서 여기서 우리는 새로운 방법을 생각해봐야함 각각의 칸은 선택할수있지만 어떻게 하든 숫자를 표시하는 a~g까지의 포트는 서로 공유하고 있음... 

그렇기에 사람들이 생각한 방법은 눈을 속이는 방법임 

눈을 속이는 방법이 무엇이냐면 말그대로 fnd를 개빠르게 동작시켜서 사람들의 눈을 속이는것임 

a~f의 칸을 공유하지만 각각의 칸은 선택할수 있으므로 1번째 칸을 선택하고 숫자를 개빠르게 뿌리고 그다음 두번째 칸을 선택하고 다른 숫자를 재빠르게 뿌리는것임 ㅡ.. 

이러한 방식으로 fnd를 고속동작 시키면 사람들은 각각 칸에 다른숫자가 표시되는것처럼 보이게 할수있음 

사실은 빠르게 한칸씩 켜지고 있는것인데 말임...

 

어쨋든 설명은 이정도로 하고 저는 오늘 간단하게 카운터를 만들어볼것임 스위치를 누르면 숫자가 커지는 간단한 프로그램임 

 

Amazing Habbi-Bombul.png

 

image.png

 

 

제가 팅커캐드로 개힘들게 그린 회로도임 아두이노 우노핀에 맞춰서 0번핀~7번은 a~f에 연결

com1 ~ com4 는 8번 핀 ~ 11번핀 마지막으로 스위치는 12번 핀에 연결하였음 

 

#include <Arduino.h>
 
int seg[8] = {0,0,0,0,0,0,0,0}; //0:A ~ 7:dp
int com[4] = {8,9,10,11}; //0: com1 ~ 3:com4
int num = 0000;
int com1 = 0;
int com2 = 0;
int com3 = 0;
int com4 = 0;
 
void setup() {
 
  pinMode(12,INPUT);
  for(int i=0 ; i<=7 ; i++){
    seg[i] = i;
    pinMode(seg[i],OUTPUT);
  }
  for(int i=8 ; i<=11; i++){
    com[i-8] = i;
    pinMode(com[i-8],OUTPUT);
  }
 
}
 
void seg_select(int num){
  switch (num)
  {
  case 0:
    seg[7] = 0; seg[6] = 0; seg[5] = 1; seg[4] = 1; seg[3] = 1; seg[2] = 1; seg[1] = 1; seg[0] = 1;
    break;
  case 1:
    seg[7] = 0; seg[6] = 0; seg[5] = 0; seg[4] = 0; seg[3] = 0; seg[2] = 1; seg[1] = 1; seg[0] = 0;
    break;
  case 2:
    seg[7] = 0; seg[6] = 1; seg[5] = 0; seg[4] = 1; seg[3] = 1; seg[2] = 0; seg[1] = 1; seg[0] = 1;
    break;
  case 3:
    seg[7] = 0; seg[6] = 1; seg[5] = 0; seg[4] = 0; seg[3] = 1; seg[2] = 1; seg[1] = 1; seg[0] = 1;
    break;
  case 4:
    seg[7] = 0; seg[6] = 1; seg[5] = 1; seg[4] = 0; seg[3] = 0; seg[2] = 1; seg[1] = 1; seg[0] = 0;
    break;
  case 5:
    seg[7] = 0; seg[6] = 1; seg[5] = 1; seg[4] = 0; seg[3] = 1; seg[2] = 1; seg[1] = 0; seg[0] = 1;
    break;
  case 6:
    seg[7] = 0; seg[6] = 1; seg[5] = 1; seg[4] = 1; seg[3] = 1; seg[2] = 1; seg[1] = 0; seg[0] = 1;
    break;
  case 7:
    seg[7] = 0; seg[6] = 0; seg[5] = 0; seg[4] = 0; seg[3] = 0; seg[2] = 1; seg[1] = 1; seg[0] = 1;
    break;
  case 8:
    seg[7] = 0; seg[6] = 1; seg[5] = 1; seg[4] = 1; seg[3] = 1; seg[2] = 1; seg[1] = 1; seg[0] = 1;
    break;
  case 9:
    seg[7] = 0; seg[6] = 1; seg[5] = 1; seg[4] = 0; seg[3] = 0; seg[2] = 1; seg[1] = 1; seg[0] = 1;
    break;
  default:
    break;
  }
}
 
void com_select(int comd){
  switch (comd)
  {
  case 1:
    for(int i=0 ; i<=3;i++){
      if(i == 0) digitalWrite(com[i],0);
      else digitalWrite(com[i],1);
    }
    break;
  case 2:
    for(int i=0 ; i<=3;i++){
      if(i == 1) digitalWrite(com[i],0);
      else digitalWrite(com[i],1);
    }
    break;
  case 3:
    for(int i=0 ; i<=3;i++){
      if(i == 2) digitalWrite(com[i],0);
      else digitalWrite(com[i],1);
    }
    break;
  case 4:
    for(int i=0 ; i<=3;i++){
      if(i == 3) digitalWrite(com[i],0);
      else digitalWrite(com[i],1);
    }
    break;
  default:
    break;
  }
}
 
void loop() {
  if(digitalRead(12)){
    num++;
  }
 
  com1 = (num/1000)%10;
  com2 = (num/100)%10;
  com3 = (num/10)%10;
  com4 = (num/1)%10;
 
  com_select(1);
  seg_select(com1);
  for(int i=0;i<=7;i++){
    digitalWrite(i,seg[i]);
  }
  delay(5);
 
  com_select(2);
  seg_select(com2);
  for(int i=0;i<=7;i++){
    digitalWrite(i,seg[i]);
  }
  delay(5);
 
  com_select(3);
  seg_select(com3);
  for(int i=0;i<=7;i++){
    digitalWrite(i,seg[i]);
  }
  delay(5);
 
  com_select(4);
  seg_select(com4);
  for(int i=0;i<=7;i++){
    digitalWrite(i,seg[i]);
  }
  delay(5);
}

 

코딩에 대한 전문적인지식은 별로없기에 주먹구구식으로 코딩해보았음 

loop 함수에서 1번칸 선택후 num숫자를 표시하고 다음은 2번칸 선택후  num숫자표시하고  ㅡ 이렇게 해서 모든칸을 무한반복해서 표시하고 

따로 스위치가 눌리면 num을 증가해서 숫자가 커지도록 하엿음 

 

KakaoTalk_20220505_131954469_03.jpg

 

KakaoTalk_20220505_132000166.mp4

 

 

잘됨  ㅇㅇ 


List of Articles
번호 제목 글쓴이 날짜 조회 수 추천
공지 수용소닷컴 이용약관 file asuka 2020.05.16 1347 1
739 삭제된 게시글입니다. 머저리 2022.05.30 7 0
738 아두이노 공부 fnd 2편 1 file 캬루단 2022.05.29 69 0
737 우분투 22.04는 아직 불안정한듯 3 히마와리 2022.05.25 34 0
736 프로그래머 수붕이들 3 아야나미레이 2022.05.22 75 0
735 머야 이제 임베디드가아니라 IOT임? 1 머저리 2022.05.22 23 0
734 스윙이랑 awt만들고 아야나미레이 2022.05.22 13 0
733 맥북에어 살까 맥북 프로 살까 4 MDR 2022.05.19 29 0
732 두나무 컨퍼런스 1 그리드 2022.05.18 22 0
731 컴공 머학원 스펙 뭐있어야하냐 2 아야나미레이 2022.05.18 45 0
730 삭제된 게시글입니다. midori 2022.05.17 33 0
729 리눅스 데탑 이젠 실사용 가능한 수준까지 온듯 6 file 히마와리 2022.05.15 76 0
728 다음 주 해야 할 일 6 삼육두유 2022.05.13 37 0
727 C와 C++을 동시에 공부하는 것에 대해 어떻게 봄 13 삼육두유 2022.05.13 57 0
726 오늘부터 C언어 공부 시작함 file 삼육두유 2022.05.13 39 0
725 엔비디아, GPU 커널 모듈을 오픈소스로 공개 1 file 히마와리 2022.05.12 39 0
724 삭제된 게시글입니다. midori 2022.05.09 41 0
723 망했으니 ㄹㅇ 공부한다 그리드 2022.05.08 31 0
722 삭제된 게시글입니다. midori 2022.05.06 37 0
» 아두이노 공부 fnd 편 4 file 코르캐쉬 2022.05.05 122 6
720 자작 NAS에 우분투 vs RHEL클론 5 히마와리 2022.05.04 48 0
목록
Board Pagination Prev 1 ... 15 16 17 18 19 20 21 22 23 24 ... 56 Next
/ 56