対象読者
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が点灯します。