Neopixel을 이용한 7-Segment Display(아두이노)

in #kr-arduino6 years ago

Neopixel을 이용한 7-Segment Display(아두이노)



아두이노 디지털 시계를 유연히 유튜브에서 NeoPixel을 이용한 디지털 시계가 만들어 놓은 영상을 보다가 재밌을 것 같아서 한번 Neopixel로 7-Segment Display를 만들어 보는 실험을 해보았습니다. 7-Segment Display의 원리가 8개의 LED를 구성된 부품입니다. 사실 LED로 수작업으로 7-Segment Display 모양을 직접 만들면 선 연결이 복잡해지고 시계같은 것을 LED로 만들게 되면 귀찮은 부분들이 많은데 Neopixel를 이용하면 의외로 선 연결이 간단하게 설계 할 수 있습니다. LED로만 7-Segment Display를 생각했는데 왜 NeoPixel로 7-Segment Display로 표현 할 생각을 왜! 못했을까 하는 생각에 부품의 원리를 알고 있어도 실제 상상할 때 이런 것을 가끔 놓치는 경우가 발생하네요.

오늘은 Neopixel를 이용한 7-Segment Display를 어떻게 표현한느지 간단히 실험을 통해 살펴보도록 하겠습니다.

1. 7-Segment Display



7-Segment Display 부품은 아래 그림 과 같습니다. led 제어 a,b,c,d,e,f,g,dp핀으로 해당 위치에 LED에 불이 on/off 상태로 숫자와 문자를 만들어 냅니다.

위 모습을 좀 더 자세하게 나타내면은 아래 그림과 같습니다.

위 그림 처럼 8개의 LED로 구성되고 LED가 7-Segment Display 모양 형태로 배치만 하면 아래와 같습니다.

위 그림을 보면 좀 지져분하게 되었지만 어떤 느낌인지 아시겠지요. 일렬로 된 그림은 보기 편하게 되어 있는 것이고 실제로 7-Segment Display를 표현하려면 위와 같이 배치를 하면 됩니다. 참고로 선 모양은 깔끔하게 표현을 못했고 그냥 대충 막 선을 연결했네요. 선 관리가 일반 발광다이오드(LED)에서는 좀 불편 합니다. 그래서 아두이노 디지털 시계를 만들때 이 표현을 사용하지 않았습니다. 이 표현대로 4-Digit 7-Segment Display 표현을 수작업으로 직접 디자인 한다면 공유선까지 하면 답이 안보이고 꽤 머리를 써서 디장인설계를 해야 합니다.

하지만 NeoPixel를 이용한 회로도 설계는 단순화 디자인을 할 수 있는데 어떻게 표현하는지 한번 살펴 볼까요.

2. Neopixel 7-Segment Display 만들기


7-Segment Display의 a,b,c,d,e,f,g 핀 위치를 그대로 동일하게 표현하면 위 그림처럼 되는데 약간 선 방향이 연결에서 좀 불편하게 연결하게 되더군요. 이 상태에서 한세트 더 7-Segment Display를 연결하면 선이 좀 지져분 해지고 선 연결이 답이 안보이겠더군요.

그래서, 아래와 같이 선연결을 S자 방향으로 자연스럽게 이여지도록 표현 했네요. 대부분 실험을 하시는 분들이 S자 방향으로 선을 많이 연결하시더군요. 그리고 현재 선 방향을 반대 S자 방향으로 연결해도 됩니다. 정해진 것은 없고 S자 방향선을 연결하면 꽤 깔끔하게 연결이 되니깐 참고하시고 선을 연결하시면 됩니다.

위 그림으로는 7-Segment Display라고 잘 연상이 안되죠. 아래 그림을 보고 이해하시면 됩니다.

그리고, 추가로 7-Segment Display를 만든다면 아래와 같이 늘릴 수 있습니다.

별로 복잡하지가 않죠.

3. Neopixel 7-Segment Display 실험


1) Neopixel 7-Segment Display 회로도


  • 준비물 : Neopixel 7개, 아두이노우노
  • 내용 : 3번핀을 Neopixel 제어핀으로 사용한다.

2) 코딩


  • 설계 : 0~9까지 카운터 테스트

[Neopixel 함수]

#include <Adafruit_NeoPixel.h>

const byte neopixelPin = 3; 
Adafruit_NeoPixel neopixel = Adafruit_NeoPixel(7, neopixelPin, NEO_GRB + NEO_KHZ800);
  • neopixel.begin() : 네오픽셀 시작
  • neopixel.setPixelColor(위치,R,G,B) : 네오픽셀 위치에 색상 세팅
  • opixel.show() : 세팅된 값을 출력
  • neopixel.clear() : 네오픽셀 초기화

0~9까지 카운터 세기 위해서는 0~9까지의 숫자 패턴을 만들어야 합니다.

 byte segValue[10][7] = {
   {1,1,1,0,1,1,1}, //0
   {1,0,0,0,1,0,0}, //1
   {1,1,0,1,0,1,1}, //2
   {1,1,0,1,1,1,0}, //3
   {1,0,1,1,1,0,0}, //4
   {0,1,1,1,1,1,1}, //5
   {0,0,1,1,1,1,1}, //6
   {1,1,0,0,1,0,0}, //7
   {1,1,1,1,1,1,1}, //8
   {1,1,1,1,1,1,0}  //9   
 };

아두이노 시계의 패턴을 그대로 적용하려고 했지만 배선 순서가 바뀌어서 어쩔 수 없이 segValue[10][7]값을 수정했네요.

0~9까지 순서대로 출력해야 코딩을 만들어 봅시다.

for(0~9까지 반복){
  for(해당숫자패턴 배열을 출력){
      네오픽셀 숫자패턴 세팅;
  }
  네오픽셀 출력;
  delay(1000);
}

대충 이렇게 틀을 잡으면 됩니다.

코딩으로 하면,

  for(int i=0;i<10;i++){  //0~9까지 10개의 숫자를 반복
    for(int j=0;j<7;j++){ //한개의 숫자 당 7개의 네오픽셀 상태임으로 7번 반복
      if(segValue[i][j]==1){ //해당 숫자의 패턴 상태 체크
        neopixel.setPixelColor(j, 255, 0, 0); // 1이면 해당 네오픽셀에 Red color로 표현           
      }else{
        neopixel.setPixelColor(j, 0, 0, 0);  // 0이면 무색으로 표현       
      }
    }
    neopixel.show();  //7개의 패턴 상태가 세팅되면 수자가 만들어지게 되고 그 숫자를 출력      
    delay(1000); //딜레이 시간 1초을 줌
  }  

1초 단위로 0~9까지 숫자가 출력됩니다. 카운터 효과가 되겠죠.

종합해 보면,

#include <Adafruit_NeoPixel.h>

const byte neopixelPin = 3; 
Adafruit_NeoPixel neopixel = Adafruit_NeoPixel(7, neopixelPin, NEO_GRB + NEO_KHZ800);


 byte segValue[10][7] = {
   {1,1,1,0,1,1,1}, //0
   {1,0,0,0,1,0,0}, //1
   {1,1,0,1,0,1,1}, //2
   {1,1,0,1,1,1,0}, //3
   {1,0,1,1,1,0,0}, //4
   {0,1,1,1,1,1,1}, //5
   {0,0,1,1,1,1,1}, //6
   {1,1,0,0,1,0,0}, //7
   {1,1,1,1,1,1,1}, //8
   {1,1,1,1,1,1,0}  //9   
 };

void setup() {
  neopixel.begin();  
}

void loop() {      
  for(int i=0;i<10;i++){  //0~9까지 10개의 숫자를 반복
    for(int j=0;j<7;j++){ //한개의 숫자 당 7개의 네오픽셀 상태임으로 7번 반복
      if(segValue[i][j]==1){ //해당 숫자의 패턴 상태 체크
        neopixel.setPixelColor(j, 255, 0, 0); // 1이면 해당 네오픽셀에 Red color로 표현           
      }else{
        neopixel.setPixelColor(j, 0, 0, 0);  // 0이면 무색으로 표현       
      }
    }
    neopixel.show();  //7개의 패턴 상태가 세팅되면 수자가 만들어지게 되고 그 숫자를 출력      
    delay(1000); //딜레이 시간 1초을 줌
  }  
    
  //초기화  
  neopixel.clear(); 
  neopixel.show();
  delay(100);     
}

3) 결과


숫자 모양 틀로 표현했다면 아래 움짤이 숫자로 보였을 텐데 이상한 모양처럼 보이네요. 마지막에 9 다음에 0으로 다시 넘어갈 때는 0~9까지 1초 단위로 숫자가 바뀌다가 9 이후 초기화로 전부 지우는 동작을 한번 수행하기 때문에 약간 보시기에 부자연스러울 수 있을 꺼에요. 초기화 명령라인들을 지우고 프로그램을 실행시켜면 자연스러워질 꺼에요. 초기화 명령라인을 넣은 이유는 나중에 추가로 수정할 때 초기화 작업이 필요 할 수 있으니깐 이렇게 Neopixel를 초기화 할 수 있다는 것을 보여 드리기 위해서 초기화 명령라인을 남겨 뒀네요. 이부분을 감안하시고 보시기 바랍니다.

4. Neopixel 디지털 시계 디자인



대충 디지털 시계 디자인은 위와 같이 표현하시면 "00:00"으로 "시:분"으로 표현 할 수 있습니다. 여기서 초까지 출력되게 하고 싶다면 Neopixel를 더 추가해야 겠죠.

코딩은 위에서 숫자를 한개의 숫자를 출력하는데 0~6위치의 네오픽셀에 7개의 패턴을 만들어 출력했는데 이 원리를 기반으로 지난 시간에 아두이노 시계 코딩을 가지고 수정하시면 됩니다.

위 코딩에서는 일자의 자리 0~9까지를 카운터 했는데 십의 자리를 출력하고 싶다면

for문에서 0~6 Neopixel은 1의 자리이고 7~13 Neopixel은 10의 자리가 됩니다.

그러면 12라는 숫자를 출력하기 위해서는

7~13 Neopixel => 1
0~6 Neopixel => 2

이렇게 각 범위의 숫자를 만들어 내면 됩니다. 그러면 1의 자리 for문과 10의 자리 for문을 Neopixel 위치값을 지정해서 숫자를 만들어 내면 됩니다.

위의 사전학습에서 시계 코딩을 분석해 보고 오늘 post에서 숫자 카운터를 한 것을 기반으로 직접 상상 코딩을 통해 디티러 시계 코딩에 도전해 보세요.

이 코딩은 여러분들의 상상에 맡기고 소스는 공개하지 않겠습니다.

마무리


오늘은 Neopixel를 이용하여 7-Segment Display를 만드는 방법을 실험을 하였습니다. 직업 제작을 한다면 꽤 재밌는 것들을 만들 수 있습니다. 마지막에 디지털 시계 디자인 한 것처럼 시계를 만들 수 있습니다. 일반 발광다이오드(LED)로 디자인 하는 것보다 Neopixel 디자인이 좋은 점은 회로선을 연결하는데 편하고 아두이노에서 사용하는 핀은 단 한개로 제어가 가능합니다. 더 중요한 것은 바로 다양한 Color 표현이 가능하다는 점입니다. 3색 LED로 표현하면 Color를 만들 수 있지만 이경우는 회로도 선 배치가 단색 LED보다 더 복잡해지고 제어하는데 꽤 애먹습니다. 그러니 NeoPixel로 디자인하는게 훨 편하겠죠.

우연히 아두이노 디지털 시계 유튜드 영상을 보다가 "아! Neopixel이 있었지!"하고 Neopixel에 대해 잘 알고 있었는데 이걸 상상을 못했다는것이 참 아직도 아두이노의 실력이 부족하다는 것을 느낄 수 있었네요. 그래도 잠깐 몇초 본 영상으로 대충 느낌 아니깐 회로도 만드는 것은 어렵지 표현 했습니다.

아무튼 재밌는 실험을 했네요.

Sort:  

(jjangjjangman 태그 사용시 댓글을 남깁니다.)
[제 0회 짱짱맨배 42일장]3주차 보상글추천, 1,2주차 보상지급을 발표합니다.(계속 리스팅 할 예정)
https://steemit.com/kr/@virus707/0-42-3-1-2

3주차에 도전하세요

그리고 즐거운 스티밋하세요!

어려운 수학문제 제가이런 공식을 알려면 하늘이 두쪽나도 안되네요 ㅋㅋㅋ

수학을 알면 고퀄리티 제어가 가능하고 수학을 모르더라도 좀 코딩이 길어질 뿐 충분히 제어가 가능해요.

Coin Marketplace

STEEM 0.31
TRX 0.12
JST 0.033
BTC 64341.19
ETH 3145.13
USDT 1.00
SBD 4.00