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-RP2040 | RaspberryPi Picoの互換基板 MAX7219を表示制御します。 | |
ブレッドボード | 配線します | |
– | ジャンパワイヤ数本 オス-メス | 配線します MAX7219のピンヘッダは標準でアングルが半田されているので ジャンパワイヤを直接接続します。 |
ライブラリ
ライブラリマネージャから以下2件のライブラリをインストールします。
ライブラリ名 | 検索 | 確認時のバージョン |
---|---|---|
MD_MAX72XX by majicDesigns | md_max7219 | 3.3.1 |
動作
メッセージ表示
説明
8桁使い、0から9へカウントアップする
-100.000 から 100.000まで0.1ずつ加算表示する
配線
YD-RP2040 | 配線 | MAX7219 |
---|---|---|
VBUS(5V) | 赤 | VCC |
GND | 黒 | GND |
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);
}
}
結果
数文字列の表示ができました。
自作の関数では再描画の前にクリアしているために高速で更新を繰り返すと若干ちらつきが発生します。
更新レートが人の目では読み取りできない高速更新をしなければあまり程度です。
コメント