コモンアノード7セグメント4桁ディスプレイの使用方法


9

この質問を、以下の(自分自身の)回答の例として取り上げてください。

私は7セグメント、4桁のLEDディスプレイを持っていますが、それを配線する方法がわかりません。

共通のアノード/カソードの違いがわかりません。また、LEDごとに2つのピンがありません。これは奇妙です。ごく最近、「7セグメント4桁のコモンアノード」に関する質問が削除されました。その瞬間、私は答えをタイプしていました。

しかし、私はあなたや私の質問をした人と私の答えを共有したいと思っています。詳細を確認して回答を確認/更新してください。具体的には、誰かが機能するコードを追加できたとしても、現時点ではできません。


ちょっと興味があるんだけど。質問に回答できるように投稿しましたか?
PhillyNJ 2016年

実際にはそのためのオプションがあります。ただし、私の質問のコメントには「背景」も含まれています。削除された質問に答えていました。とにかく私の答えを投稿する必要性を感じました。はい、そうでした。しかし、それは有効な方法であり、質問の前に答えがありました。だから私には理にかなっています。本当に良い質問(と答え)があったら、いつか誰かに役立つかもしれないので、同じことをするように勧めるだけです。
Paul

回答:


7

ポールの答えを補足するものとして、私は彼の姿の7セグメント4桁ディスプレイを駆動する方法を示す短いプログラムを書きました:

配線図

これは実際には一般的なカソードディスプレイであるため、プログラムはそれと、図の特定の配線を前提としています。興味深い部分は、refresh_display()定期的に呼び出される関数です。アルゴリズムは次のとおりです。

  • 表示したい数字の1つに適切な信号で7つの陽極を駆動する
  • HIGHNPNトランジスタを介してその桁のカソードを制御する出力を設定します
  • 2.5 ms待機します(100 Hzのリフレッシュレートの場合)。
  • LOW陰極制御出力を設定する
  • 次の桁に移動します。

待機は、遅延のない ArduinoチュートリアルのBlinkで説明されている手法を使用して、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ライブラリの使用を提案する Parallaxのチュートリアルへのリンクを提供しました。そのライブラリは、使用されるピンについての仮定を行わないため、上記のサンプルコードよりも一般的です。しかし、ライブラリとこのコードの大きな違いは、タイミングの管理方法にあります。

  • ライブラリは、タイマー2のオーバーフロー割り込みによって駆動されます。これにより、非常に安定したタイミングが提供されますが、このジョブ専用のタイマーが1つ必要になります。
  • 上記のコードは、ユーザーがrefresh_display()頻繁に呼び出すことに依存しています。それは、専用のハードウェアリソースを必要としませんが、それはに時間がかかりすぎるのプログラムとうまく再生されないloop():それはあなたが呼び出すことはありませんようにdelay()

これが私がオープンソースのものを好きな理由です。ワークロードを他の世界と共有し、本当に素晴らしいものを作成できます。その後、他の世界と再び共有されます:)他の開発者から多くを学ぶことができ、その知識は永続的であり、他のすべての人から隠されているだけではありません。
Paul

Tranistorのベース抵抗値について質問があります。抵抗値の計算に大きな問題があります。4つの2N2222トランジスタで4.7Kの抵抗を使用する理由は何ですか?1つのセグメントが10mAを消費する場合、DPを含むすべてのセグメントで最大80mAの電流が流れます。V(BE * sat)= 1.3vおよびI(B)= 15mAの場合、300オームで十分です。計算に問題はありますか?
maruf

@maruf:必要な最小 I_Bは、予想されるI_Cを最小トランジスタゲインで除算したものです。コレクターに80 mAが必要で、少なくとも100のゲインが予想される場合(楽観的かもしれませんが、データシートをチェックしていません)、ベースに少なくとも80/100 = 0.8 mAが必要です。次に、ベース抵抗の最大値は、その両端の電圧降下(約5 V − 0.7 V)をその電流で割った値、または約5.3kΩです。
Edgar Bonet、

5

LEDなどの完全な基本を紹介します。4桁の7セグメントディスプレイは、複数の「LED技術」を組み合わせたものです。

LEDの配線

LED、または発光ダイオードは、Arduinoの楽しいものの1つです。

基本的に、それらは使いやすく、電源を入れると点灯します。

それらはある種の極性を持っているため、煩わしい場合があります。つまり、正しく配線した場合にのみ機能します。正と負の電圧を逆にしても、まったく点灯しません。

そのまま迷惑ですが、とても便利です。

カソードvsアノード

従来のLEDでは、長いリードは(+)アノードです。他のリードは(-)カソードです。

「または、誰かが脚をトリミングした場合は、LEDの外側ケーシングの平らな端を見つけてみてください。平らな端に最も近いピンが陰極の陰極ピンになります。」-Sparkfun

ソース:https : //learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity

Sparkfun

基本配線

インターネットから画像を取り込んだので、これが正しいかどうかはわかりません。

基本的なLED配線

LEDの配線は非常に簡単です。陽極(+)は、できれば電流制限抵抗を介して、正の電圧に接続します。カソード(-)はグラウンドに接続します(正側に電流制限抵抗がない場合は、抵抗を使用)。

電流制限抵抗は、LEDの短絡を防ぎ、LEDまたはマイクロコントローラー/ Arduinoに損傷を与えます。

複数のLED、マトリックス、RGB LED

複数のLEDを使用する場合、多くの場合、プラス側が接続された(+)、「共通のアノード」、またはすべてが(-)「共通のカソード」に接続されたLEDがあります。

基本的にはこれに帰着します。

RGB共通カソード/アノード

共通のカソードの場合は、オンにしたいピンに電流を供給します。

共通アノードの場合、LEDを介して電流をシンクします。

多重化(複数桁、7セグメント)

視差のチュートリアルを確認してください:http : //learn.parallax.com/4-digit-7-segment-led-display-arduino-demo

視差4桁7セグメント

多くのLEDがある場合、それらを「多重化」することはしばしば賢明です。通常、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.