SHOEISHA iD

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

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

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

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

ESP32のタッチセンサーとPWM機能を活用したIoTプログラミング──C#で電子ピアノを作ってみよう!

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

デジタル信号を使ってアナログ的信号を生み出す「PWM機能」とは

 単にLEDの点灯だけでは面白くないので、次は、タッチによってLEDの明るさを変更するようにしてみましょう。LEDの明るさを変化させるには、PWM方式を使うのが一般的です。

PWMとは

 PWMとは、PWMはPulse Width Modulationの略で、日本語では「パルス幅変調」となります。パルス信号のONの時間(パルス幅)を長くしたり、短くすることで、平均電圧を変化させることができます。この仕組みは、デジタルな信号を使用してアナログ的な信号を生み出すための手法です。

 このPWMの信号でLEDを点灯させると、非常に短い間隔で、点灯と消灯を繰り返すことになります。ただし人の目には、ずっと点灯しているように見えます。点灯と消灯との時間の割合(デューティ比)を変化させると、人の目には、明るさが変わったように見えるのです。

PWMを使うには

 PWMを使うには、次のNuGetパッケージを追加します。

 先ほどのプログラムを変更して、PWMを利用するようにしてみます。PWMでは、GPIOの設定は不要なのでGpioControllerは使わず、代わりに、nanoFramework.Hardware.Esp32.Configurationクラスを利用します。

Program.csの一部
public class Program
{
    public static void Main()
    {
        // ピンにPWM機能を割り当てる(1)
        Configuration.SetPinFunction(22, DeviceFunction.PWM1);

        // PWMの設定(2)
        var pwmPin = PwmChannel.CreateFromPin(22, 400, 0.5);

        // PWM出力の開始(3)
        pwmPin.Start();

        Thread.Sleep(Timeout.Infinite);
    }
}

 まず、Configurationクラスの静的メソッドであるSetPinFunctionメソッドを使って、ピンにPWM機能を割り当てます。第2パラメータに設定しているDeviceFunction.PWM1は、複数のピンでPWMを利用する際の識別子となるものです。PWM1~PWM16まであり、複数のPWMを使用する時は、それぞれ別の値を指定します。

 そして、System.Device.Pwm.PwmChannelクラスを用いて、個別のPWMの設定を行います。CreateFromPinメソッドで、ピン番号と、PWMの周波数とデューティ比を指定します(2)。PWMの周波数とは、1秒あたりのパルスの数を表し、デューティ比はパルスがオンになっている時間の割合を示します。ここでは、周波数を400㎐、デューティ比を0.5(50%)にしています(この値がパラメータのデフォルト値になります)。

波形の確認

 Startメソッドで、PWM出力が開始されます。このプログラムを実行すると、デバッグ表示には何も出力されないものの、オシロスコープなどで22番ピンを測定すると、次のような波形が確認できます。多少誤差はありますが、周波数400㎐、デューティ比が50%になっています。

デューティ比0.5の波形
デューティ比0.5の波形

タッチセンサーでLEDの明るさを変える

 それでは、タッチセンサーで明るさを変えてみましょう。プログラムを次のように書き換えます。LEDの接続は、いままでと同様に、抵抗を介して22番に接続します。

Program.csの一部
public static void Main()
{
    Configuration.SetPinFunction(22, DeviceFunction.PWM1);

    // デューティ比を0にしておく(1)
    var pwmPin = PwmChannel.CreateFromPin(22,400, 0);
    pwmPin.Start();

    var TouchPadNumber = 0;
    var touchpad = new TouchPad(TouchPadNumber);

    var calib = touchpad.GetCalibrationData();
    touchpad.Threshold = (uint)(touchpad.CalibrationData * 0.8);

    TouchPad.MeasurementMode = MeasurementMode.Timer;

    double duty = 0.0;
    touchpad.ValueChanged += ( _,  e) =>
    {
        if (e.Touched)
        {
            // デューティ比を0.01ずつ増加させる(最大1.0)(2)
            duty += 0.01;
            if (1 < duty) duty = 0.0;
            pwmPin.DutyCycle = duty;
        }
    };
    Thread.Sleep(Timeout.Infinite);
}

 最初にデューティ比を0にして、消灯状態にしています(1)。タッチイベントのハンドラで、デューティ比を増加させています(2)。タッチするたびに、次第に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/19290 2024/04/11 11:00

イベント

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

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

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

メールバックナンバー