SHOEISHA iD

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

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

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

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

 .NET nanoFrameworkは、組み込みデバイス向けの.NET実装です。.NET nanoFrameworkを用いれば、ハードウェア的な制約のあるマイコンボードでも、C#でのプログラミングが可能になります。この連載では、.NET nanoFrameworkと、ESP32マイコンモジュール(ESP32-WROVERなど)を使い、C#によるIoTプログラミングを解説します。第3回となる今回は、タッチセンサーとPWM機能を中心に紹介します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

対象読者

 IoTに興味があり、C#と電子工作の基本的な知識がある方を対象とします。C#や電子工作のごく初歩的な説明は割愛していますので、「C#ではじめるラズパイIoTプログラミング」の記事なども併せて参照してください。

はじめに

 連載第3回の今回は、ESP32のタッチセンサーとPWM機能を使ったプログラムを紹介します。

電荷でタッチイベントを検出、ESP32のタッチセンサーとは

 ESP32は、静電容量式のタッチセンサーが内蔵されており、ESP32のピン端子がそのままセンサーとして利用できます。前回のピンレイアウトの表にも書いているとおり、タッチセンサーとして使えるピンは10個あります。ただし、ESP32-WROVER開発ボードと現状の.NET nanoFrameworkの組み合わせでは、10個のタッチセンサーのうち、3個はうまく動作しないようです。

静電容量式タッチセンサー

 静電容量式のタッチセンサーは、コンデンサの原理を利用して、導体の接近を検出するセンサーです。ESP32では、ピンに接続されたコンデンサに電荷を貯めて、ピンの電荷を測定しています。ピンに触れるなどすると、電荷がピンから移動することで電荷が減るため、その変化をタッチイベントとして検出します。電荷の値は、ESP32の個体差や環境によって変わりますので、値の変化量でタッチされたかどうかを判定します。

タッチセンサーの基本的な使い方

 では、ESP32のタッチセンサー機能を確かめてみましょう。Visual Studioで、まずはBlank Applicationプロジェクトを作成し、それから、次のNuGetパッケージを追加します。

 そして、Mainメソッドを次のように書き換えます。ここでは、タッチセンサー番号として0を指定しています(1)。ESP32-WROVER開発ボードでは、GPIO4番がタッチセンサー0になりますので、GPIO4番につながるようにジャンパー線を接続しておきます。

 プログラムをデバッグ実行します。ジャンパー線の端子に直接触れると、タッチイベントが発火します。ジャンパー線をつかんだり離したりするたびに、ON、OFFの文字列がVisual Studioのデバッグ出力に表示されるはずです。

Program.csの一部
public class Program
{
    public static void Main()
    {
        // タッチセンサー番号の指定(1)
        var TouchPadNumber = 0;

        // TouchPadインスタンスの生成(2)
        var touchpad = new TouchPad(TouchPadNumber);

        // 基準値の取得(3)
        touchpad.GetCalibrationData();

        // しきい値の設定(4)
        touchpad.Threshold = (uint)(touchpad.CalibrationData * 0.8);

        // 測定モードをタイマーに設定する(5)
        TouchPad.MeasurementMode = MeasurementMode.Timer;

        // イベントハンドラの定義(6)
        touchpad.ValueChanged +=
            (_, e) => Console.WriteLine(e.Touched? "OFF":"ON");

        Thread.Sleep(Timeout.Infinite);
    }
}

 タッチセンサーは、TouchPadクラスを利用します。インスタンスを生成して(2)、まずは、最初に基準となる値を取得します(3)。そして、タッチイベントを発生させる、しきい値として、基準値(CalibrationDataプロパティ)の80%を設定します(4)。基準値の2/3程度を設定するのが標準的ですが、実際に試して調整するようにします。

 タッチセンサーに触れると、タッチセンサーから読み取れる値が下がります。しきい値を下回れば、タッチイベントが発生することになります。タッチセンサー値は、そのときの状況によって変化しますので、しきい値の設定は初期の値を元に計算するようにします。

 次に、測定モードを設定しています(5)。ここでは、タイマーとしていますが、設定できるモードは、次の2つです。

MeasurementMode.Timer バックグラウンドで値が自動的に取得される
MeasurementMode.Software 手動で値を取得する必要がある

 MeasurementMode.Timerでは、バックグラウンドで値が自動的に取得されてイベントが発生します。MeasurementMode.Softwareでは、手動で定期的に値を取得する必要があります。取得したときに、値がしきい値を下回れば、イベントが発生します。今回はセンサーの値は特に必要ないので、MeasurementMode.Timerに設定しています。

 (6)行では、ValueChangedイベントに、デバッグ出力するようにイベントハンドラを定義しています。イベントの2つめのパラメータは、TouchPadEventArgsオブジェクトになっています。このオブジェクトのTouchedプロパティが、タッチされたかどうかの状態を示します。ここでは、タッチされた時にON、その後に離れたときにOFFと表示します。

デバッグ実行画面
デバッグ実行画面

タッチセンサーでLEDをON、OFF

 前回は、LEDの点灯制御をタクトスイッチで行いましたが、これをタッチセンサーで置き換えてみましょう。

LEDとタッチセンサーの接続図
LEDとタッチセンサーの接続図

 次のように、Mainメソッドを書き換えます。

Program.csの一部
using var controller = new GpioController();

// GPIO22番の初期化、設定
var led = controller.OpenPin(22);
led.SetPinMode(PinMode.Output);
led.Write(PinValue.Low);

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

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

TouchPad.MeasurementMode = MeasurementMode.Timer;

touchpad.ValueChanged += ( _,  e) =>
{
    if (e.Touched)
    {
        led.Toggle(); // GPIOの値の反転
    }
};
Thread.Sleep(Timeout.Infinite);

 前回のGPIOのプログラムで、タクトスイッチ用のGPIO部分を、タッチセンサーの処理に変更しています。これを実行すると、ジャンパー線に触れるたびに、LEDが点いたり消えたりするはずです。

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
.NET nanoFrameworkとESP32でIoTプログラミング連載記事一覧

もっと読む

この記事の著者

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/19290 2024/04/11 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング