Arduino環境でLED7セグを使う(MAX7219)

コンピュータ、組み込み

Raspberry Pi Pico互換基板でLED7セグ MAX7219を使って数文字列の表示をします。

今回紹介するもの

LED7セグ MAX7219

特徴

単色の8桁の LED7セグメント表示器。

電源電圧5V
通信SPI
(CS, MOSI, SCK)
LED色購入時に選択します。
(赤, 青, 緑)

MAX7219 のMatrixLEDと同じで、1パネルあたり64個のLEDを制御します。
7セグが7桁あり、1桁あたり8個のLED(7セグとピリオド)で構成されています。

ピン配置
外観

今回ライブラリにはMD_MAX72XXライブラリを使用しました。
7セグを点灯させるために、MD_MAX72XX.setPoint()関数使用していますが、RawとColの関係を以下のようになっていす。
(サンプルを掲載しているので参照してください)

使用感

MAX7219のライブラリは数多く公開されていますが、MD_MAX72XXライブラリを利用して、7セグ表示器用の関数を追加しました。
表示したい数文字の7セグパターンをテーブルにして表示するだけの簡単な処理です。
更新時にクリアする処理があるので、高速な書き換えでは少しちらつきが出てしまいました。

SPIを使用してドライバ(MAX7219)を使用するため少ない配線で8桁の7セグを制御できます。
少ない線数で多くのLEDが制御できるのは魅力です。

最近ではマイコンでも4inch クラスのLCDが簡単に制御できるドライバとライブラリがあります。
器用な表示や特別な演出は難しいですが、7セグ特有のレトロ感は味わいを独特の味わいがあります。

MAX7219を使用して表示するLEDマトリクス表示機の記事

準備

使うもの

画像名称、型番用途
LED Matrix 4連
MAX7219
光ってもらいます。
YD-RP2040RaspberryPi Picoの互換基板
MAX7219を表示制御します。
ブレッドボード配線します
ジャンパワイヤ数本
オス-メス
配線します
MAX7219のピンヘッダは標準でアングルが半田されているので
ジャンパワイヤを直接接続します。

ライブラリ

ライブラリマネージャから以下2件のライブラリをインストールします。

ライブラリ名検索確認時のバージョン
MD_MAX72XX by majicDesignsmd_max72193.3.1

動作

メッセージ表示

説明

8桁使い、0から9へカウントアップする
-100.000 から 100.000まで0.1ずつ加算表示する

配線
YD-RP2040配線MAX7219
VBUS(5V)VCC
GNDGND
GPIO1 (SPI0 CS)CS
GPIO2 (SPI0 SCK)CLK
GPIO3 (SPI0 MOSI)DIN
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Raspberry Pi Pico

【スケッチの説明】
 8桁使い、0から9へカウントアップする
 -100.000 から 100.000まで0.1ずつ加算表示する

【ライブラリ】
 Raspberry Pi Pico/RP2040 > Raspberry Pi Pico
 MD_MAX72XX by majicDesigns

【準備】
Raspberry Pi Pico <-> MAX7219
VCC(5V)             <-> VCC
GND                 <-> GND
GPIO1 (SPI0 CS)     <-> CS
GPIO2 (SPI0 SCK)    <-> CLK 
GPIO3 (SPI0 MOSI)   <-> DATA

【バージョン情報】
2024/1/14 : 新規
**********************************************************************/

#include <MD_MAX72xx.h>

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW               //デバイス種別
#define MAX_DEVICES (1)                                 //8x8のマトリクス表示のユニット数
#define PIN_MOSI  (3)                                   //MOSI -> DIN
#define PIN_CS    (1)                                   //CS -> CS
#define PIN_SCK   (2)                                   //SCK -> CLK

MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, PIN_CS, MAX_DEVICES);               // SPI hardware interface

void setup()
{
  //==<<使用するペリフェラルを初期化>>==
  Serial.begin(115200);                           //シリアル通信(デバッグ出力用)
  
  //SPIのピン設定
  SPI.setTX(PIN_MOSI);
  SPI.setSCK(PIN_SCK);
  SPI.setCS(PIN_CS);
  SPI.begin();

  mx.begin();
}
 
void loop()
{
  //徐々にカウントアップする
  for(int16_t N = 0; N < 10; N ++)
  {
    for(int16_t C = 0; C < 8; C ++)
    {
      PutChar(C, (N | 0x30), false);
      delay(100);
    } 
  }

  //数文字列の表示, -100.000 から 100.000まで0.1ずつ加算
  char buf[16];
  for(int16_t Count = -1000; Count < 1000; Count ++)
  {
    sprintf(buf, "%2.3f", (double)Count / 10);
    PutString(buf, 1, true);
    delay(10);
  }
}

//MAX7219 7Segに数字を表示します。
//パラメータの桁数が先頭から8桁を超える場合は切り捨てされます。
//str : 数文字バッファの先頭アドレス。使用できる文字は '0' から '9' 、'-'、' '、'.'
//文字とピリオドが連続する場合は同じ桁にまとめます。連続したピリオドは1桁移動します。
//ピリオドだけで1桁使用する場合は " ."を設定します。
//Align : 0 = 左寄せ、1 = 右寄せ
//Clr : 8桁に満たない場合の空白桁の処理 : false = 変更しない, true = 消去する
//備考 : str = "1.234"の場合は "1.234"と表示される。 "1..234"の場合は"1. .234"と表示される。
void PutString(char *str, int8_t Align, bool Clr)
{
  char buf[17] = "";
  int16_t bindex = 0;
  int16_t Col = 7;
  int16_t i = 0;

  if(Clr == true)
  {
    mx.clear();
  }

  //右寄せの場合、表示開始の桁位置を求める。Align : 0 = 左寄せ, 1 = 右寄せ
  if(Align == 1)
  {
    Col = -1;
    while(*(str + i) != 0x00)
    {
      if(*(str + i + 1) == '.')
      {
        //ピリオドが含まれる場合、桁をまとめるので、ポインタのみ進める。
        i ++;
      }
    Col ++;
    i ++;
    }
  }
  if(Col > 7) Col = 7;    //桁が大きかった場合は最大7(8桁)

  i = 0;
  while(*(str + i) != 0x00)
  {
    if(*(str + i) == '.')
    {
      //ピリオドから始まる、または連続したピリオドの場合
      PutChar(Col, ' ', true);                  //ピリオドだけ表示する桁
    }
    else
    {
      if(*(str + i + 1) == '.')
      {
        //ピリオドが含まれる場合。
        PutChar(Col, *(str + i), true);
        i ++;                                   //ピリオド分のポインタを進める
      }
      else
      {
        PutChar(Col, *(str + i), false);
      }
    }
    i ++;
    Col --;
  }
}

//指定した桁に、7セグ点灯させる。
//Col : 表示桁。範囲は0 to 7、0が最も右の桁
//Dat : 7セグ表示させる数文字。使用できる文字は'0' ~ '9', '-', ' '
//Dot : ピリオドの表示, false = ピリオド非表示, true = ピリオド表示
void PutChar(int8_t Col, char Dat, bool Dot)
{
  if((Col < 0) || (7 < Col)) return;

  //7セグパターンを. MD_MAX72XX.setPoint()関数に基づいて定義する
  const char PatternTable[] = {0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70 ,0x7f ,0x7b};
  const char PatternMinus = 0x01;
  const char PatternSpace = 0x00;
  char DotPattern = (Dot == false) ? 0x00 : 0x80;
  char Pattern;
  
  if(('0' <= Dat) && (Dat <= '9'))
  {
    Pattern = PatternTable[Dat & 0x0f] | DotPattern;
    PutPattern(Col, Pattern);
  }
  else if('-' == Dat)
  {
    Pattern = PatternMinus | DotPattern;
    PutPattern(Col, Pattern);
  }
  else if(' ' == Dat)
  {
    Pattern = PatternSpace | DotPattern;
    PutPattern(Col, Pattern);
  }
}

//MD_MAX72XX.setPoint()関数を使い、7セグ点灯させる。
//Col : 表示桁。範囲は0 to 7、0が最も右の桁
//Pattern : ビットパターン。ビットオーダーは以下の通り
// 6
//1 5
// 0
//2 4
// 3  7
void PutPattern(int8_t Col, char Pattern)
{
  if((Col < 0) || (7 < Col)) return;

  //定義された7セグのビットパターンにより消灯/点灯を行う
  bool Stat = false;
  for (int16_t b = 0; b < 8; b ++)
  {
    Stat = (Pattern & 0x01);
    Pattern >>= 1;
    mx.setPoint(Col, b, Stat);
  }
}
結果

数文字列の表示ができました。

自作の関数では再描画の前にクリアしているために高速で更新を繰り返すと若干ちらつきが発生します。
更新レートが人の目では読み取りできない高速更新をしなければあまり程度です。

コメント

タイトルとURLをコピーしました