SHOEISHA iD

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

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

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

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

C#でIoTプログラミング! .NET nanoFrameworkを用いたプログラムとESP32でLEDを光らせよう!

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

ESP32開発ボード上でLEDを光らせよう!

ESP32のピンアサイン

 プログラムが動作することが確認できたので、次はLEDを光らせてみたいところですが、ちょっとその前に、ESP32のピン端子について解説しておきましょう。

 ESP32-WROVERの公式ドキュメントには、ピンアサイン(ピン配置図)が公開されています。

 じつは、前回紹介したESP32開発ボードの写真でもわかるように、開発ボードによってピン端子数や配置が異なっています。同じピン数であれば、多くの開発ボードで共通していますが、XIAOシリーズなどのように独自のピンアサインになっているものもあります。

 公式ドキュメントにあるESP32-WROVER開発ボードは、片側19本で、合計38ピンとなっています。この38ピンが標準的なタイプですが、少しピン数を減らした30ピンの開発ボードもよく見かけます。

 この38本と30本のピンアサインを、わかりやすいように簡略化してみました。

38ピンアサイン
38ピンアサイン

 筆者手持ちの30ピンの開発ボードでは、次のようなピンアサインになっています。

30ピンアサイン
30ピンアサイン

 また、前回紹介した筆者の手元にあるFreenove ESP32-WROVER Boardは、ピン数が1組多く40ピンになっています。

Freenove ESP32-WROVER
Freenove ESP32-WROVER

 このようなピン数の違いが生じるのは、ESP32モジュールに備わるピンのうち、どのピンを外部に引き出すか、開発ボードによって設計が異なるためです。多くの開発ボードには、ボードの基板上にピン名が印字されていますので、よく確認して使うようにしましょう。なお、基板上の印字文字は、開発ボードによって微妙に異なる場合があります。たとえば、GPIOの場合、数字だけではなく、D34などとDが付くボードもあります。ちなみに、この基板上の印刷や文字のことを、「シルク印刷」「シルク」とも呼びます。

ESP32のピン用途

 前述のピンアサインを見ると、それぞれのピンには、いろいろな名前がついていて、1つの端子にも複数の機能が割り当てられていることがわかります。利用するピンの詳細については、実際にセンサーや回路を接続する際に解説します。ここでは、どのようなものがあるのか、ざっと説明しておきましょう。

 一般的なESP32開発ボードのピンは、次のような機能が利用できます。

  • 電源供給(5V、3.3V)
    開発ボードへの電源供与や、他回路への電源として利用できる。
  • GPIO(General Purpose Input/Output、汎用入出力)
    デジタル入出力、アナログ入出力、PWM制御などに利用できる。
  • UART、I2C、SPI
    それぞれのシリアル通信に利用できる。
  • アナログ入力
    アナログ入力のみ利用できる。
  • タッチセンサーピン
    静電容量式のタッチセンサーとして利用できる。

 ESP32開発ボードのピンの動作は、ソフトウェアで変更することもできるのですが、ピンアサインにある主な用途で使われることが多いでしょう。

 前述のUART、SPI、I2Cは、いずれもシリアル通信のプロトコルのことで、IoTにはおなじみの通信方法です。シリアル通信とは、一定時間の間隔でデータを1ビットずつ送る通信方法のことです。

 シリアル通信のなかでも、いくつかの通信手順(プロトコル)があり、大きくは「同期式」と「非同期式(調歩同期式)」に分かれます。同期式は、クロックと呼ぶ一定周期の信号といっしょにデータを送る方式です。受信側は、クロック信号のタイミングでデータを読みとります。非同期式は、クロック信号がなく、最初に届いた信号のタイミングに合わせてデータを読み取る方式です。

 SPI、I2C、UARTの特徴は、次のとおりです。

  • SPI(Serial Peripheral Interface)

    SPIは、クロックを用いる同期式のシリアル通信です。次の4つの信号線を使用します。

    • クロック(SCLK:Serial Clock)
    • データ入力(MOSI:Master Out Slave In)
    • データ出力(MISO:Master In Slave Out)
    • チップ選択(CS/SS:Chip Select)
  • I2C(Inter-Integrated Circuit)
    I2Cは、SPI同様に同期式シリアル通信ですが、クロック(SCL:Serial Clock)とデータ(SDA:Serial Data)の2本の信号線のみで通信を行います。
  • UART(Universal Asynchronous Receiver Transmitter)
    UARTは、調歩同期式の通信です。開発用PCとESP32との接続にも用いられています。

 なお、用途に、内蔵フラッシュメモリとあるピンは、フラッシュメモリの通信に用いられていますので、通常は利用しません。また、GPIO1(TX)、GPIO3(RX)も、開発ボードのUSB端子につながっていますので、利用しません。PWM(Pulse Width Modulation)と呼ばれるパルス幅変調の信号は、全ての入出力対応ピンで有効にできます。

LEDの接続

 次は、LEDを接続して発光させてみましょう。いわゆるLチカと呼ばれているものです。なお、多くのESP32開発ボードでは、基板上にLEDを搭載しています。そのため外部に接続しなくても基板上のLEDを発光させることが可能です。ただ、電源に連動したLEDのみの開発ボードもありますので、ここでは、まずGPIOピンにLEDを接続してみます。

 ESP32開発ボードとLEDは、ブレッドボードを使って次のように接続します。

LED接続図
LED接続図

 デジタル入出力に対応したGPIO22番を利用します。GPIOとLEDの接続は、LEDに流れる電流を制限する抵抗と直列につなぎ、LEDのカソード(足の短い方)側をGNDに接続します。抵抗値は、LEDの仕様から計算して求めることになりますが、求め方などの詳細は、また次回あらためて解説することにして、ここでは数百Ω程度の抵抗と、適当なLEDを接続することにします。

 ちなみに、今回使用したブレッドボードは、サンハヤトのSAD-101という片側6列のブレッドボードです。ESP32開発ボードの基盤は幅が広いものが多く、標準的な片側5列のブレッドボードでは、端子のスペースが片側1列しか残りません。接続回路によっては、ブレッドボードを連結するなどの必要があります。

GPIOの操作プログラム

 さきほどの、Blank ApplicationプロジェクトにGPIOを操作するコードを追加して、LEDを点滅させてみましょう。GPIOを操作するには、まずNuGetパッケージを追加します。Visual Studioのメインメニューの[プロジェクト]ー[NuGetパッケージの管理]を選びます。

NuGetパッケージの管理
NuGetパッケージの管理

 そして、nanoFramework.System.Device.Gpioを検索してインストールします。

パッケージのインストール
パッケージのインストール

 Program.csは、次のように変更します。

Program.csの一部
using System.Device.Gpio;

namespace NFAppSample1
{
    public class Program
    {
        public static void Main()
        {
            using var controller = new GpioController(); //(1)

            // GPIO22番の初期化
            var led = controller.OpenPin(22);            //(2)

            // GPIO22番の設定
            led.SetPinMode(PinMode.Output);              //(3)
            led.Write(PinValue.Low);                     //(4)

            while (true)
            {
                // GPIOの値の反転
                led.Toggle();                            //(5)
                Thread.Sleep(500);
            }
        }
    }
}

 GPIOの操作には、GpioControllerクラスを利用します(1)。GpioControllerクラスのOpenPinメソッドを使い、GPIO22番ピンの初期化を行います。OpenPinメソッドの戻り値は、GpioPinクラスのオブジェクトで、このオブジェクトを使ってGPIOを操作します。なお、GpioPinクラスではなく、直接GpioControllerクラスのメソッドを利用してもGPIOの操作は可能です。

 次にGPIO22番を、SetPinModeメソッドで出力モード、PinMode.Outputに設定し、値をLowレベル、PinValue.LowにWriteメソッドで設定しています。

 最後のwhileの無限ループの中で、GpioPinクラスのToggleメソッドを実行しています。Toggleメソッドは、GPIOの値を反転します。つまり、LowレベルとHighレベルが交互に設定されることになります。なお、ESP32では、Lowレベルは、0~0.33V、Highレベルは、2.64~3.3Vの出力となります。

 このコードを実行すると、0.5秒間隔で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/18836 2024/01/22 11:00

イベント

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

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

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

メールバックナンバー