SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

.NET nanoFrameworkとESP32でIoTプログラミング

C#によるIoTプログラミング!──7セグメントLEDで0.1秒カウントのプログラムを作ろう

.NET nanoFrameworkとESP32でIoTプログラミング 第4回

0.1秒カウントのプログラムを作ってみよう

MAX7219のピン配置図

 MAX7219のピン配置図は、次のようになっています。

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と7セグメントLED
MAX7219と7セグメントLED

 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 パッケージをインストールしておきます。

Program.csの一部

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使って、センサーの値を表示するプログラムを作成する予定です。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
.NET nanoFrameworkとESP32でIoTプログラミング連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/19635 2024/06/21 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー