ESP32開発ボード上でLEDを光らせよう!
ESP32のピンアサイン
プログラムが動作することが確認できたので、次はLEDを光らせてみたいところですが、ちょっとその前に、ESP32のピン端子について解説しておきましょう。
ESP32-WROVERの公式ドキュメントには、ピンアサイン(ピン配置図)が公開されています。
じつは、前回紹介したESP32開発ボードの写真でもわかるように、開発ボードによってピン端子数や配置が異なっています。同じピン数であれば、多くの開発ボードで共通していますが、XIAOシリーズなどのように独自のピンアサインになっているものもあります。
公式ドキュメントにあるESP32-WROVER開発ボードは、片側19本で、合計38ピンとなっています。この38ピンが標準的なタイプですが、少しピン数を減らした30ピンの開発ボードもよく見かけます。
この38本と30本のピンアサインを、わかりやすいように簡略化してみました。
筆者手持ちの30ピンの開発ボードでは、次のようなピンアサインになっています。
また、前回紹介した筆者の手元にあるFreenove ESP32-WROVER Boardは、ピン数が1組多く40ピンになっています。
このようなピン数の違いが生じるのは、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は、ブレッドボードを使って次のように接続します。
デジタル入出力に対応したGPIO22番を利用します。GPIOとLEDの接続は、LEDに流れる電流を制限する抵抗と直列につなぎ、LEDのカソード(足の短い方)側をGNDに接続します。抵抗値は、LEDの仕様から計算して求めることになりますが、求め方などの詳細は、また次回あらためて解説することにして、ここでは数百Ω程度の抵抗と、適当なLEDを接続することにします。
ちなみに、今回使用したブレッドボードは、サンハヤトのSAD-101という片側6列のブレッドボードです。ESP32開発ボードの基盤は幅が広いものが多く、標準的な片側5列のブレッドボードでは、端子のスペースが片側1列しか残りません。接続回路によっては、ブレッドボードを連結するなどの必要があります。
GPIOの操作プログラム
さきほどの、Blank ApplicationプロジェクトにGPIOを操作するコードを追加して、LEDを点滅させてみましょう。GPIOを操作するには、まずNuGetパッケージを追加します。Visual Studioのメインメニューの[プロジェクト]ー[NuGetパッケージの管理]を選びます。
そして、nanoFramework.System.Device.Gpioを検索してインストールします。
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が点滅するはずです。
