対象読者
IoTに興味があり、C#と電子工作の基本的な知識がある方を対象とします。C#や電子工作のごく初歩的な説明は割愛していますので、「C#ではじめるラズパイIoTプログラミング」の記事なども併せて参照してください。
はじめに
連載第5回の今回は、マトリックスLEDを使った電光掲示板表示や距離センサーの値を表示するプログラムを作成します。
マトリックスLEDとは
マトリックスLEDは、複数のLEDを行列状にならべて一体化したLEDです。今回は、8×8ドット(LED縦横8個、計64個)のマトリックスLEDを利用します。
マトリックスLEDは、行と列を選択して特定のLEDを点灯させます。8×8ドットなら、計16ビットのデータで制御できるということです。前回解説した16ビットシフトレジスタMAX7219を使うことで、かんたんに制御することができます。
マトリックスLEDディスプレイモジュール
マトリックスLEDは、単体でも入手できますが、8×8ドットのマトリックスLEDとMAX7219をセットにしたディスプレイモジュールが安価で入手可能です。専用の基板上にLEDとICが配置されるので、LEDを配線する必要はありません。またESP32とは、SPIでの接続となります。
今回は、マトリックスLEDが1つのタイプと、4つカスケード接続されたタイプを利用します。いずれも、Amazon等で安価で販売されているものです。
接続
最初は、マトリックスLED1つのタイプです。このディスプレイモジュールには、電源と、MAX7219のSPIの3つの信号線(DIN、CS、CLK)が接続できるようになっています。3つの信号線それぞれを、ESP32のMOSI、CS、SCLKに設定した端子に接続します。今回も、GPIO21をMOSI、22をSCLK、23をCSとしています。
ハートマークを表示する
さっそくプログラムを作成しましょう。.NET nanoFrameworkのブランクプロジェクトを新規作成後、NuGetパッケージマネージャで、あらかじめ次のパッケージをインストールしておきます。
- nanoFramework.Hardware.Esp32
- nanoFramework.Iot.Device.Max7219
今回は、Max7219用のクラスを利用しますので、とてもシンプルなコードで制御することができます。まずは、次のようなハートマークを表示してみます。
ソースは、次のようになります。
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)
var m7219 = new Max7219(spi);
// ハートマークのバイト列データ(5)
var heart = new byte[] {
0b00000000,
0b01101100,
0b11111110,
0b11111110,
0b01111100,
0b00111000,
0b00010000,
0b00000000
};
// MAX7219の初期化(6)
m7219.Init();
// 表示データを内部バッファに書き込む(7)
for (var i = 0; i < 8; i++)
{
m7219[new DeviceIdDigit( deviceId:0, digit: i )] = heart[i];
}
// LEDに表示する(8)
m7219.Flush();
}
SPIの設定(1)~(3)は、前回と同じコードで、最初にSPI通信オブジェクトを生成します。そして、そのオブジェクトを引数にして、MAX7219オブジェクトを生成します(4)。
MAX7219の初期化は、Max7219クラスのInitメソッドを実行するだけです(6)。表示するハートマークは、LED1列に対応するデータを1バイトとするバイト配列で定義します。要素数は、8行分の8つとなります(5)。ビットが1で点灯、0で消灯となります。
LEDを点灯させるには、まずMax7219クラスの内部バッファに表示データを書き込み、その後にまとめてMAX7219に転送するという手順になります。内部バッファは、DeviceIdDigitというオブジェクトの配列になっています。このDeviceIdDigitオブジェクトは、MAX7219の複数接続に対応するため、deviceIdプロパティで、何番目のMAX7219かを指定することができます。ここでは、1つしかありませんので、0を指定しています(7)。Max7219クラスのFlushメソッドで、データが転送されLEDが点灯します。
