Plus電子デバイス・電子工作用語集モータドライバ博士のQ&A読者よりいただいたお問い合わせを元に、ロボット製作者、エンジニアのみなさんに役に立つ技術解説を発信していきます。Plus電子デバイス・電子工作用語集モータドライバ博士のQ&A読者よりいただいたお問い合わせを元に、ロボット製作者、エンジニアのみなさんに役に立つ技術解説を発信していきます。ESP32とRTCで「二度寝防止アラーム時計」を作ろう!毎朝、みなさんはどのようなアラーム時計で目覚めていますか?一般的なアラーム時計でやってしまいがちな、「ベッドから手を伸ばして、アラームを止めて二度寝する」ということが簡単にできてしまう問題。そこで今回、ESP32を使って、この問題を解決する「二度寝防止アラーム時計」を作ってみることにしました。子機の配線ライブラリとフォントファイルのインストールアラーム時計本体のプログラム子機のプログラム動作の確認まとめ今回作るアラーム時計についてESP32を使って、一般的なアラーム時計のように日付や時刻をディスプレイに表示し、指定した時刻にアラーム音を出せるようにしてみます。「二度寝防止アラーム時計」にするために、アラーム時計本体と、アラームを止めるためのボタンがついた子機を別々の場所に置き、起き上がって子機のところまで歩かないとアラームを止められないという仕組みを考えてみました。以下の動画のように、ESPを2つ使って、片方を本体、もう片方を子機にします。動画では本体と子機が隣にありますが、WiFiで接続できる範囲であれば、離して置くことが可能です。本体と子機を離した場所に置くために、ESP32のWiFiの機能を活用します。2つのESP32をWebサーバーかつクライアントとして動作させて、HTTPで図1のように通信するようにします。日時を刻む「RTC」Arduinoなどのマイコンでは、起動時からの経過時間を取得できることが一般的です。それを応用して、時計の表示に使うこともできなくはありません。得られる時刻があまり正確ではありませんし、電源を切ると経過時間がリセットされるという問題もあります。ESP32なら、WiFiを経由してインターネットに接続することができますので、インターネット上のNTPサーバーから定期的に日時を取得し、それをESP32に設定して利用することも可能です。Unoなど、インターネット接続機能がないマイコンもあり、日時を扱いやすくする仕組みがあると便利です。Clock)というICを使うことがよくあります。RTCは、一定周期の信号を発する素子を元にして、時刻を刻むことができるICです。電池などの外部電源を接続して、マイコン本体の電源がオフの間でも時刻を刻み続けることができます。RTCにはいろいろな製品がありますが、今回は「DS3231」というRTCがモジュール化されたものを使います。DS3231のモジュールは、電子工作で使うRTCモジュールの中ではポピュラーで、入手しやすいものです。接続はI2Cなので、線は4本で済みます。RTCの機能だけでなく、温度センサーの機能もあります(ただし、温度センサーは今回の記事では使いません)。写真1のDS3231では、マイコンの電源を切っても日時を刻み続けるように、「LIR2032」というボタン電池を取り付けます。LIR2032はCR2032と同じ大きさの電池ですが、充電池になっている点が異なります。時計は現在の日時の確認に使うものですので、日時を分かりやすく表示できることが必要です。日時を表示するのに使うデバイスとしては、以下のようなものがあります。7セグメントLEDマトリックスLEDOLEDディスプレイキャラクタ液晶ディスプレイグラフィック液晶ディスプレイデバイスによってライブラリが違いますし、プログラムの方法も違いがあります。作りたいものに適しているかどうかも異なってきます。7セグメントLEDは数字だけを安価に表示するのに適していますが、細かな表示には向いていません。上記の中では、グラフィック液晶ディスプレイが最も汎用的で、様々な工作に活用できるため、今回はそちらを使うことにしました。液晶ディスプレイモジュールにもいろいろなものがありますが、今回は「ILI9341」というコントローラを搭載していて、SPI接続のものを使います(写真2)。液晶ディスプレイモジュールの中ではよく見かけるものであり、また2.2インチ/2.4インチ/2.8インチの3つの大きさの製品が販売されていますので、工作するものに合わせて使い分けやすいというメリットがあります。ILI9341コントローラの2.8インチ液晶ディスプレイMP3モジュールでアラーム音を出すアラーム時計なので、指定の時刻に音を出すことも必要です。ESP32にブザーを接続して単音を出すこともできますが、できれば自分の好きな音を使いたいところです。Mini」というモジュールを使うことにします(写真3)。Miniは、シリアル接続でコマンドを送ることで、microSDカード内のMP3を再生することができるモジュールです。スピーカー出力のピンに、小さなスピーカーを接続して音を出すことができます。Miniアラーム時計本体の配線それでは、実際の制作に入りましょう。アラーム時計本体の配線を行います。Miniを接続します。各パーツの配線は図2のようになります。ESP32は幅が広く、通常のブレッドボードだと片側にしかジャンプワイヤを刺すことができません。そこで、電源ラインが片側だけで、その代わりに穴が1列多いブレッドボードを使います(サンハヤトのSAD-101など)。ESP32と液晶ディスプレイはSPIで接続します。ESP32ではSPIを2系統使うことができますが(VSPIとHSPI)、VSPI(18/19/23番ピン)を使います(表1)。ESP32とDS3231は、I2Cで接続します。ESP32では任意のピンにI2Cを割り当てることができますが、標準のピン(SDA=21番、SCL=22番)を使います(表2)。Miniはシリアルで接続します。ESP32では3系統のシリアルを使うことができますが、16番ピンと17番ピンの組み合わせのものを使います(表3)。Miniの「SPK1」と「SPK2」のピンにスピーカーを接続します。次に、子機も配線します。こちらの配線は図3のようになります。ESP32にスイッチとLEDを接続するだけです。スイッチの片側をESP32の3V3のピンに接続し、もう片方を4番ピンに接続します。ESP32の13番ピンから、抵抗→LEDと経由して、GNDに接続します。スイッチの状態を読み取る回路では、本来ならプルアップ抵抗もしくはプルダウン抵抗を入れます。ESP32では内蔵の抵抗でプルアップ/プルダウンを行うことができますので、外付けの抵抗は省略します。子機の配線ライブラリとフォントファイルのインストール配線ができたら、今度はプログラムを作っていきます。以下の各ライブラリをインストールします。ILI9341RTCLibDFRobotDFPlayerMiniインストールの手順は以下の通りです。「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」メニューを選び、ライブラリマネージャを開きます。GFX」と入力します。GFXが表示されますので、「インストール」ボタンをクリックします(図4)。同じ要領で、各ライブラリを順にインストールします。RTCLibとDFPlayerのライブラリは、似たような名前の物が複数あります。DFRobot」をインストールします。GFXライブラリのインストールまた、時刻を大きな文字で表示するために、フォントファイルもインストールします。以下のZipファイルをダウンロードして解凍すると、「FreeSans40pt7b.h」というファイルができます。IDEの標準のスケッチ保存先フォルダを開き、その中にある「libraries」→「Adafruit_GFX_Library」→「Fonts」フォルダを開いて、そこにフォントのファイルをコピーします。IDEでアラーム時計本体のプログラムを作り、ESP32に書き込みます。プログラムの内容はリスト1のようになります。アラーム時計本体のプログラムただし、17行目〜21行目は、以下のように書き換えることが必要です。・17/18行目お手持ちのWiFiルーターのSSID/パスワードに合わせて書き換えます。・19行目ESS32に割り当てるIPアドレスを指定します。お手持ちのWiFiルーターのネットワーク構成に合わせて、ご自分でIPアドレスを決めます。通常のIPアドレスは4つの数値をピリオドで区切りますが、この行では関数の引数の形になっていますので、4つの数値をコンマで区切ります。・20行目ネットワークのデフォルトゲートウェイのIPアドレスを指定します。通常はWiFiルーターのIPアドレスになります。IPアドレスの4つの数値はコンマで区切ります。子機のESP32に割り当てるIPアドレスに合わせて書き換えます。表4のように設定したい場合、17〜21行目をリスト2のように書き換えます。“http://192.168.1.102/alarm”;子機のプログラム一方、子機のプログラムはリスト3のようになります。リストの5〜9行目は、アラーム時計本体と同じ要領で書き換えます。7行目には子機に割り当てるIPアドレスを指定します。9行目の「本体のIPアドレス」には、アラーム時計本体のIPアドレスを指定します。本体/子機ともにプログラムの書き込みが終わったら、動作を確認します。手順は以下の通りです。32GB以下のmicroSDカードを用意し、「mp3」というフォルダを作ります。アラーム音に使いたいMP3ファイルを用意し、「0001.mp3」というファイル名を付けて、1のmp3フォルダに保存します。Miniに装着します。本体および子機を起動します。するとWiFiなどの初期化が終わり、本体に現在の日時が表示されます。本体/子機と同じネットワークにあるパソコンなどでWebブラウザを起動し、「http://本体のIPアドレス/」のアドレスに接続します。写真4のようにWebブラウザにアラーム設定のフォームが表示されますので、時刻を指定して「アラーム設定」ボタンをクリックします。」のようにアラームをセットした時刻が表示されます。アラームをセットした時刻に、本体で音が鳴ることを確認します。アラームをセットした時刻に、子機のLEDが点灯することを確認します。子機のスイッチを押して、アラームが止まることを確認します。アラームの設定を解除するには、Webブラウザで「http://本体のIPアドレス/」のアドレスに接続し、「アラームOff」のボタンをクリックします。まとめESP32はWiFiでネットワークに接続することができます。インターネットに接続するのはもちろんのこと、今回の事例のように、ネットワーク内の機器同士の接続に使うこともでき、様々な電子工作に活用することができます。PiやArduinoを使った電子工作にも取り組んでいます。プログラム次第でいろいろ作り込める点が、電子工作の面白さだと感じています。Arduinoで作る簡易百葉箱(その2)。電光掲示板(7セグメントLED)を使って数値を表示。