0.1秒カウントのプログラムを作ってみよう
MAX7219のピン配置図
MAX7219のピン配置図は、次のようになっています。
ピン名にSEGの付いた端子を、7セグメントLEDの対応する端子にそのまま接続します。電流制限用の抵抗は不要です。また、DIGというピン名は、桁数を表し、それぞれの桁の7セグメントLEDのカソード・コモンに接続します。DIG0~DIG7まであり、8桁(個)まで接続できます。
ピン名のDIN、LOCAD(CS)、CLKが、SPI通信で使用する端子です。それぞれを、ESP32のMOSI、CS、SCLKに設定した端子に接続します。
ESP32でSPI通信で使用するGPIO端子は、ソフトウェアで設定することができます。今回は、GPIO21をMOSI、22をSCLK、23をCSとしています。
MAX7219の18番ピンと電源(+)の間に10kΩの抵抗と、電源の+と-の間に、0.1㎌のコンデンサーを接続します。10kΩの抵抗は、LEDディスプレイの輝度調整用です。データシートには9.53kΩ以上と書かれていますので、ここでは10kΩとしました。また、コンデンサーは、いわゆるバイパスコンデンサ(パスコン)と呼ばれるもので、電源電圧の安定化のために使用します。今回の機器構成では、このコンデンサがないと、うまく表示できませんでした。
通信仕様
MAX7219は、16ビット(2バイト)のシフトレジスタなので、通信は2バイト単位で行います。1バイト目は、アドレス(コマンド)、2バイト目は、コマンドのデータを指定します。詳細は、データシートを参照してください。
| アドレス | データ | 概要 |
|---|---|---|
| 0x01 | 0x00~0x09、0x0A(-)、0x0F(ブランク) | 1桁めに設定するデータ |
| 0x02 | 0x00~0x09、0x0A(-)、0x0F(ブランク) | 2桁めに設定するデータ |
| 0x03 | 0x00~0x09、0x0A(-)、0x0F(ブランク) | 3桁めに設定するデータ |
| 0x04 | 0x00~0x09、0x0A(-)、0x0F(ブランク) | 4桁めに設定するデータ |
| 0x05 | 0x00~0x09、0x0A(-)、0x0F(ブランク) | 5桁めに設定するデータ |
| 0x06 | 0x00~0x09、0x0A(-)、0x0F(ブランク) | 6桁めに設定するデータ |
| 0x07 | 0x00~0x09、0x0A(-)、0x0F(ブランク) | 7桁めに設定するデータ |
| 0x08 | 0x00~0x09、0x0A(-)、0x0F(ブランク) | 8桁めに設定するデータ |
| 0x09 | 0x00(設定なし)、0xFF(全桁使用) | デコーモードの設定 |
| 0x0A | 0x00~0x0F | 輝度(最小0x00~最大0x0F) |
| 0x0B | 0x00~0x07 | 最大使用桁数(0始まり) |
| 0x0C | 0x00(シャットダウンモード)、0x01(通常) | シャットダウンモードは、LED非点灯の低消費モード |
0.1秒でカウントするプログラム
基本的な制御プログラムとして、0.1秒単位で、0.0から99.9の数値をカウントするプログラムを作ってみます。.NET nanoFrameworkには、MAX7219用のクラスが用意されていますが、7セグメントLEDには対応していませんので、今回は使用していません。SPI通信用のクラスのみ使用します。
新規プロジェクトを作成し、最初にNuGetパッケージ管理から、nanoFramework.System.Device.Spi パッケージをインストールしておきます。
public static void Main()
{
// SPIで利用する端子の設定(1)
Configuration.SetPinFunction(21, DeviceFunction.SPI1_MOSI);
Configuration.SetPinFunction(22, DeviceFunction.SPI1_CLOCK);
// CS端子とクロック周波数の設定(2)
var connectionSettings = new SpiConnectionSettings(1, 23) // CS GPIO23
{
ClockFrequency = 10_000_000, // 10MHzクロック
};
// SPI通信オブジェクトの生成(3)
using var spi = SpiDevice.Create(connectionSettings);
// MAX7219の設定(4)
spi.Write(new byte[] { 0xC, 0 }); // SHUTDOWN ON(表示OFF)
spi.Write(new byte[] { 0xB, 2 }); // SCANLIMIT(3桁の使用)
spi.Write(new byte[] { 0x9, 0xFF }); // DECODEMODE(デコードモードの使用)
spi.Write(new byte[] { 0xC, 1 }); // SHUTDOWN OFF(表示ON)
// 3桁のカウンター表示(5)
var val = 0;
while (true)
{
var d1 = val % 10; // 1桁目の値
var d2 = (val/10) % 10; // 2桁目の値
var d3 = val / 100; // 3桁目の値
if (10 <= d3) d3 = 0;
if (d3 == 0) d3 = 0b_0000_1111; // 上位桁の0はブランクに設定する(6)
spi.Write(new byte[] { 1, (byte)d1 });
spi.Write(new byte[] { 2, (byte)(d2 | 0b10000000)}); // 小数点の点灯(7)
spi.Write(new byte[] { 3, (byte)d3 });
Thread.Sleep(100);
val += 1;
}
}
ESP32で、.NET nanoFrameworkを利用してSPI通信を行うには、まずGPIO端子の設定を行います(1)。ここでは、Configuration.SetPinFunction()メソッドで、SPI通信のMOSI、SCLKを、それぞれGPIO21、22に設定しています。次に、SpiConnectionSettingsクラスで、スレーブデバイスを制御するための設定を行います。CSをGPIO23番とし、クロック周波数を10M㎐としています。クロック周波数は、接続デバイスが対応する周波数とします(MAX7219のデータシートより)。
そして、SPI通信でデータを送信するためにSpiDevice.CreateメソッドでSpiDeviceオブジェクトを生成します(3)。SPIでデータを送信するには、SpiDeviceクラスのWriteメソッドを、引数にバイト配列を指定して実行します。
まず、MAX7219の設定を行います(4)。まず、シャットダウンモードにして、すべてのLEDをオフにします。次に使用する桁数の設定(今回は3桁)、デコードモードの設定を行います。
デコードモードとは、数値を指定するだけで、その値に応じたLED表示を行うモードです。SN74HC595Nを使ったときのように、LED素子をビットで個別に設定する必要はなく、MAX7219がLEDを制御します。
そして 3桁のカウンター表示です(5)。10の位が1桁目、1の位が2桁目、小数第一位が3桁目になります。1桁目の10の位が0のときは、0表示ではなく、何も表示しないブランクとしました(6)。また、2桁目で最上位ビットを1にしています(7)。最上位ビットを1にすると、指定した桁の小数点が点灯します。
最後に
今回は、7セグメントLEDの基本のプログラムを作成しました。次回は、7セグメントLEDやドットマトリックスLED使って、センサーの値を表示するプログラムを作成する予定です。
