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回

ESP32で7セグメントLEDを制御するには?

シフトレジスタ

 ESP32で7セグメントLEDを制御する方法はいくつかあります。単純に各LEDにGPIO端子を接続して制御することもできます。ただその場合、LEDの数だけGPIO端子が必要となり、実用的ではありません。そこで今回は、「シフトレジスタ」と呼ばれるICを使ってみます。シフトレジスタを利用すれば、少ないGPIO端子で、複数のLEDの制御が可能になります。

 シフトレジスタとは、0と1の信号を一定の方向に順番に移動(シフト)させることができる電子回路の一種です。シフトレジスタは、シリアルデータをパラレルデータに変換する用途でよく使われます。たとえば、8ビットに対応したシフトレジスタであれば、8ビットのデータを1ビットずつ(シリアル)設定し、その後にすべてのデータを一度に(パラレルで)出力することができます。この仕組みを7セグメントLEDに適用すると、1ビットずつのシリアルデータで、7セグメントLEDの8つのLEDを制御できるというわけです。

SN74HC595N

 SN74HC595Nという型番の8ビットのシフトレジスタを使います。このICについての詳細は、データシートを参照してください。

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

SH74HC595のピン配置
SH74HC595のピン配置
ピンの機能
ピン番号 端子名 入出力 機能
1~7、15 QA~QH O データ出力
8 GND - GND
9 QH’ O カスケード接続用
10 SRCLR I シフトレジスタクリア
11 SRCLK I クロック信号
12 RCLK I ラッチ信号
13 OE I 出力の有効化
14 SER I シリアルデータ入力
16 VCC - 電源(5V)

 端子には、表のような名前がついています。QA~QHがデータ出力なので、これらのピンに、7セグメントLEDと電流制限用の抵抗を接続します。QH'は、複数のシフトレジスタをカスケード接続(数珠つなぎ)する際に使用します。ここでは、1つのICしか使わないので接続は不要です。

 SER(14番ピン)がシリアルデータ入力です。このピンを使って、1ビットずつデータを入力します。

 SRCLK(11番ピン)は、1ビットのデータを内部的にセットする信号です。LOWからHIGHにすると、1ビットのデータ(SERピンの状態)がセットされます。

 RCLK(12番ピン)は、いわゆるラッチ信号の入力です。8ビット分のセット後に、LOWからHIGHにすると、すべてのデータがQA~QHに出力されます。

 OE(13番ピン)は、LOWのときに出力が有効になります。ここでは有効のままにしますのでGNDに接続しておきます。SRCLR(10番)は、LOWにすると出力がクリアされますので、今回は、電源に接続して常にHIGHにします。

配線

 今回使用した7セグメントLEDは、LN5160Aという型番のアノード・コモンのものです。

 前述のピン配置図のとおり、ピンの3番または8番ピンが共通のアノード端子になっているので、このピンを電源の+5Vに接続します。残りのピンに、抵抗を介して、74HC595のQA~QHを接続します。わかりやすいように、7セグメントLEDの1番ピン(カソード e)を、74HC595のQE(5番ピン)というように、a~hを合わせて接続します。

 電流制限用の抵抗は、ここでは330Ωとしました。SN74HC595Nのデータシートには、出力ピン1つあたり35mA以下、かつ全体で70mA以下の電流にするように書かれています。LN5160Aの順方向電圧降下Vfは、2.1Vなので、次のような計算になります(8つのLEDを同時に点灯した場合)。

 (5V - 2.1V)/(70mA / 8本)= 331Ω

 ※(電源電圧 – 順方向電圧降下)/ 順方向電流 = 制限抵抗値

配線図
配線図

 SN74HC595NのSER、SRCLK、RCLKは、それぞれ、ESP32のGPIO21、22、23に接続しました。

数字を表示する

 次に、プログラムを作成しましょう。じつは.NET nanoFrameworkには、SN74HC595N用のクラスが提供されており、シフトレジスタ内部の動作を知らなくても、かんたんに利用できるようになっています。.NET nanoFrameworkのブランクプロジェクトを新規作成後、NuGetパッケージマネージャで、nanoFramework.Iot.Device.Sn74hc595パッケージをあらかじめインストールしておきます。

 数字の0~9を順番に表示するプログラムは、次のようになります。

Program.csの一部

public static void Main()
{
    // dp g f e d c b a(4)
    byte[] bitp = {
                0b_1100_0000,    // 0
                0b_1111_1001,    // 1
                0b_1010_0100,    // 2
                0b_1011_0000,    // 3
                0b_1001_1001,    // 4
                0b_1001_0010,    // 5
                0b_1000_0010,    // 6
                0b_1111_1000,    // 7
                0b_1000_0000,    // 8
                0b_1001_0000,    // 9
            };

    // SER、SRCLK、RCLKを指定してSn74hc595オブジェクトを生成する(1)
    using Sn74hc595 sr = new(new Sn74hc595PinMapping(21, 22, 23));

    // すべて消灯(2)
    sr.ShiftByte(0b_11111111);

    while (true)
    {
        // 1秒ごとに0~9の順に表示する(3)
        foreach (byte b in bitp)
        {
            sr.ShiftByte(b);
            Thread.Sleep(1000);
        }
    }
}

 Sn74hc595PinMappingは、SER、SRCLK、RCLKを、それぞれESP32のどのピンに設定するかを指定するオブジェクトです。前述のとおり、GPIO21、22、23を指定します(1)。

 Sn74hc595クラスのShiftByte()メソッドが、SN74HC595Nに8ビット(1バイト)のデータを送るメソッドです。まず、すべてのLEDを消灯します(2)。一見すると、反対のビットを指定していると思うかもしれません。ここでの7セグメントLEDは、アノードコモンなので、ビットが1、つまり出力がHIGHのときに、LEDが消えている状態で、出力がLOWのときに点灯します。したがって、0b_11111111を設定すると、各LEDすべてが消灯になります。

 次に数字の出力です(3)。これは、数字の表示となるようなビットパターン(4)をShiftByte()メソッドで送信します。

 ShiftByte()メソッドに指定する値は、上位ビットから、7セグメントLEDのdp、g、f、e、d、c、b、aに対応します。たとえば、0b_1100_0000なら、dp、gが消灯、a~fが点灯となり、数字の0となります。

次のページ
MAX7219を使って、7セグメント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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー