공통 양극 7 세그먼트 4 자리 디스플레이를 사용하는 방법은 무엇입니까?


9

이 질문을 아래의 (나의) 대답에 대한 예로 들어보십시오.

7 세그먼트, 4 자리수 LED 디스플레이가 있지만 배선 방법에 대한 아이디어가 없습니다.

공통 양극 / 음극의 차이점을 이해하지 못하고 LED 당 2 개의 핀이 없으므로 이상합니다. 최근에, "7 세그먼트 4 자리 공통 양극"에 관한 질문이 삭제되었습니다. 바로 그 순간에 나는 대답을 입력하고있었습니다.

그래도 여전히 답변을 요청한 사람이나 귀하와 답변을 공유하고 싶습니다. 자세한 내용은 답변을 확인 / 업데이트하십시오. 특히 누군가가 작업 코드를 추가 할 수는 있지만 지금은 할 수 없습니다.


그냥 궁금해서 답변 할 수 있도록 질문을 게시 했습니까?
PhillyNJ

실제로는 옵션이 있습니다. 그러나 내 질문에 대한 의견도 "배경 이야기"를 알려줍니다. 질문에 대답했는데 삭제되었습니다. 그리고 내 답변을 아무렇게나 게시해야 할 필요성을 느꼈습니다. 그렇습니다. 그러나 그것은 유효한 방법이며 질문 전에 대답을했습니다. 그래서 이해가되었습니다. 정말 좋은 질문과 대답이 있다면 어느 시점에서 누군가에게 유용 할 수 있기 때문에 똑같이 할 것을 권장 할 수 있습니다.
Paul

답변:


7

Paul의 답변을 보완하는 것처럼, 나는 그의 그림의 7 세그먼트 4 자리 디스플레이를 구동하는 방법을 보여주는 짧은 프로그램을 작성했습니다.

배선도

이것은 실제로 일반적인 음극 표시이므로 프로그램은 그림의 특정 배선뿐만 아니라이를 가정합니다. 흥미로운 부분은 refresh_display()함수이며 주기적으로 호출해야합니다. 알고리즘은 다음과 같습니다.

  • 우리가 보여주고 싶은 숫자 중 하나에 대한 적절한 신호로 7 개의 양극을 구동하십시오.
  • HIGHNPN 트랜지스터를 통해 해당 숫자의 음극을 제어하는 ​​출력 설정
  • 2.5ms 동안 대기 (새로 고침 빈도 100Hz)
  • 설정 LOW음극 출력 제어
  • 다음 자리로 이동하십시오.

대기 시간은 지연없는 Arduino 자습서 에서 설명한 기술을 사용하여 CPU를 차단하지 않고 수행됩니다 . 프로그램은 다음과 같습니다.

const int NB_DIGITS     = 4;  // 4-digit display
const int FIRST_ANODE   = 2;  // anodes a..g on pins 2..8
const int FIRST_CATHODE = 9;  // cathodes, right to left, on pins 9..12

// Digits to display, from right to left.
uint8_t digits[NB_DIGITS];

// Set all the used pins as outputs.
void init_display()
{
    for (int i = 0; i < 7; i++)
        pinMode(FIRST_ANODE + i, OUTPUT);
    for (int i = 0; i < NB_DIGITS; i++)
        pinMode(FIRST_CATHODE + i, OUTPUT);
}

// This should be called periodically.
void refresh_display()
{
    // Our 7-segment "font".
    static const uint8_t font[10] = {
        //abcdefg
        0b1111110, // 0
        0b0110000, // 1
        0b1101101, // 2
        0b1111001, // 3
        0b0110011, // 4
        0b1011011, // 5
        0b1011111, // 6
        0b1110000, // 7
        0b1111111, // 8
        0b1111011  // 9
    };

    // Wait for 2.5 ms before switching digits.
    static uint32_t last_switch;
    uint32_t now = micros();
    if (now - last_switch < 2500) return;
    last_switch = now;

    // Switch off the current digit.
    static uint8_t pos;
    digitalWrite(FIRST_CATHODE + pos, LOW);

    // Set the anodes for the next digit.
    pos = (pos + 1) % NB_DIGITS;
    uint8_t glyph = font[digits[pos]];
    for (int i = 0; i < 7; i++)
        digitalWrite(FIRST_ANODE + i, glyph & 1 << (6-i));

    // Switch digit on.
    digitalWrite(FIRST_CATHODE + pos, HIGH);
}

/***********************************************************************
 * Example usage.
 */

void setup()
{
    init_display();
}

void loop()
{
    uint32_t now = millis();

    // Change the number displayed every second.
    static uint32_t last_change;
    if (now - last_change >= 1000) {
        digits[3] = digits[2];
        digits[2] = digits[1];
        digits[1] = digits[0];
        digits[0] = (digits[0] + 1) % 10;
        last_change = now;
    }

    refresh_display();
}

Paul 은 Multiplex7Seg Arduino 라이브러리 사용을 제안하는 시차 에 대한 자습서 링크를 제공했습니다 . 해당 라이브러리는 사용 된 핀에 대한 가정을하지 않기 때문에 위의 예제 코드보다 더 일반적입니다. 그러나 라이브러리와이 코드의 큰 차이점은 타이밍이 관리되는 방식에 있습니다.

  • 라이브러리는 타이머 2 오버 플로우 인터럽트에 의해 구동됩니다. 이 작업에 하나의 타이머를 사용하는 비용으로 매우 안정적인 타이밍을 제공해야합니다.
  • 위의 코드는 refresh_display()자주 호출하는 사용자에 의존합니다 . 전용 하드웨어 리소스가 필요하지 않지만 너무 오래 걸리는 프로그램에서는 잘 작동하지 않습니다 . loop()전화를 걸고 싶지 않습니다 delay().

이것이 제가 오픈 소스를 좋아하는 이유입니다. 다른 세계와 워크로드를 공유하고 정말 멋진 것을 만들 수 있습니다. 그런 다음 다른 세계와 다시 공유됩니다. :) 다른 개발자로부터 많은 것을 배울 수 있으며 그 지식은 영구적이며 다른 모든 사람에게 숨겨지는 것이 아닙니다.
Paul

Tranistor의 기본 저항기 값과 관련하여 질문이 있습니다. 저항 값을 계산하는 데 큰 문제가 있습니다. 4 개의 2N2222 트랜지스터에서 4.7K 저항을 사용하는 이유는 무엇입니까? 단일 세그먼트가 10mA를 소비하면 DP를 포함한 모든 세그먼트에 대해 최대 80mA의 전류가 흐릅니다. V (BE * sat) = 1.3v이고 I (B) = 15mA이면 300ohm이면 충분합니다. 내 계산에 문제가 있습니까?
maruf 2019

@maruf : 필요한 최소 I_B는 예상되는 I_C를 최소 트랜지스터 이득으로 나눈 것입니다. 컬렉터에서 80mA를 원하고 최소 100의 이득을 기대하는 경우 (최적 일 수 있지만 데이터 시트를 확인하지 않았 음)베이스에서 80/100 = 0.8mA 이상이 필요합니다. 그런 다음 기본 저항 의 최대 값은 해당 전류 또는 약 5.3kΩ으로 나눈 전압 강하 (약 5V-0.7V)입니다.
Edgar Bonet 19 :

5

4 등의 7- 세그먼트 디스플레이는 여러 "LED 기술"의 조합이므로 LED 등의 전체 기본 사항을 살펴 보겠습니다.

배선 LED

LED 또는 발광 다이오드는 Arduino의 재미있는 기능 중 하나입니다.

기본적으로 사용하기 쉽고 전원을 켜면 불이 켜집니다.

그들은 어떤 종류의 극성을 가지고 있기 때문에 성 가실 수 있습니다. 즉, 올바르게 연결하면 작동합니다. 양의 전압과 음의 전압을 반대로하면 전혀 켜지지 않습니다.

성가시다, 그것은 또한 매우 유용하다.

음극 대 양극

전통적인 LED에서 긴 리드는 (+) 양극입니다. 다른 리드는 (-) 음극입니다.

"또는 누군가 다리를 다듬었다면 LED의 외부 케이스에서 평평한 가장자리를 찾으십시오. 평평한 가장자리에 가장 가까운 핀은 음극 음극 핀이됩니다." -스파크 펀

출처 : https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity

스파크 펀

기본 배선

인터넷에서 이미지를 찢어 냈기 때문에 이것이 올바른지 확실하지 않습니다.

기본 LED 배선

LED 배선은 매우 쉽고 양극 (+)은 양의 전압, 바람직하게는 전류 제한 저항을 통해 연결됩니다. 음극 (-)은 접지에 연결됩니다 (양극에 전류 제한 저항이없는 경우 전류 제한 저항 사용).

전류 제한 저항은 LED가 단락되는 것을 방지하여 LED 또는 마이크로 컨트롤러 / 아두 이노를 손상시킵니다.

다중 LED, 매트릭스, RGB LED

여러 개의 LED를 사용하면 양극 (+), "공통 양극"또는 모두 (-) "공통 음극"에 연결된 LED가 있습니다.

기본적으로 이것으로 내려갑니다.

RGB 공통 음극 / 양극

공통 음극의 경우 원하는 핀에 전류를 공급합니다.

공통 양극의 경우 LED를 통해 전류를 싱크합니다.

멀티플렉싱 (다수, 7 세그먼트)

시차의 자습서를 확인해야합니다 : http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo

시차 4 자리

LED가 많으면 "멀티 플렉스"하는 것이 현명합니다. 일반적으로 LED의 "그룹"은 빠르게 진행되므로 모두 동시에 켜져있는 것처럼 보입니다.

일반적으로 LED 열에서 전류를 싱크하고 행의 개별 LED에 전류를 공급합니다.

또는 LED 열에 전류를 공급하고 행의 개별 LED에서 전류를 싱킹합니다.

활성화 할 열과 점등 할 열을 선택할 수 있습니다. 이 열 / 행을 빠르게 변경하면 훨씬 적은 핀으로 여러 LED를 제어 할 수 있습니다.

소프트웨어의 전환을 관리하고 싶지 않은 경우이를위한 디스플레이 컨트롤러도 있습니다.

따라서 4 자리, 다중화 된 7 세그먼트, 공통 양극이있는 경우

다이어그램은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

http://www.mytutorialcafe.com/Microcontroller%20Application%20C%207segmen.htm

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.