電子工作入門:4 of 4

電子工作「どきどきウチワ」の最終回。心拍に合わせてサーボモータを動かすソフトウェア(プログラム)を作成して完成です。今年の夏は、これで快適!

プログラムの設計図「フローチャート」を作成しよう!

前回の連載では、「どきどきウチワ」のハードウェアを組み立てました。このハードウェアを動かす、ソフトウェア(プログラム)を作成しましょう。必要な動作は、心拍センサで「どきどき」を検出して、それに合わせてサーボモータを制御することです。この場合の制御とは、「ドックン」という心拍一回に合わせて、ウチワで「パタッ」と一回あおぐことです。

ウチワであおぐ(風をおくる)ためには、サーボモータを、ある角度動かして、もう一度反対方向に同じ角度を動かします。今回の工作では小型のサーボモータを使用しているので、無理のないように、動かす角度を30度とします。サーボモータの仕様を調べると、30度動くのに約0.1秒かかるようです。

ここで、心拍センサの出力(図1)を見てみましょう。上は平常時の心拍、下が軽い運動後(ドキドキ時)の心拍です。どちらも、出力は、高い電圧を短時間保ち、続いて比較的長時間の低い電圧の区間があります。山と谷のイメージですね。高い電圧の区間(山)をR区間、低い電圧の区間(谷)を非R区間と呼ぶことにしましょう。

心拍に合わせてウチワを振るために、R区間にサーボモータを30度回転させ、非R区間になったら30度戻す制御を行うことにします。

図1:平常時(上)とどきどき時(下)の心拍データ

図1:平常時(上)とどきどき時(下)の心拍データ

センサからの出力は、「GR-SAKURA」のマイコンに搭載されているA/D変換器に入力されます。この入力が、ある数値より大きければR区間と判断して、ウチワを動かすための指令をサーボモータに送ります。プログラムの中で、この値は「R_HEIGHT」という定数で定義しています。一方、非R区間は先ほどの値「R_HEIGHT」よりも小さな値が得られた時、とします。ここで反対向きにウチワを動かす指令を出します。

R区間か非R区間かを見分けることでウチワは動きますが、少し工夫を加えましょう。ある向きにウチワを振ったら、目的の角度になる(=サーボモータが動き終わる)までに約0.1秒が必要です。ウチワを振っている最中に、逆の動作の指令が出ないように、ウチワを振り始めたら(=サーボモータを動かし始めたら)、0.1秒間は「何もしない」時間を設けることにしましょう。

ここまで説明した処理をフローチャートにしました(図2)。フローチャートを用いることで、プログラムの流れが正確に把握でき、他の人にプログラムの内容を伝えることが可能になります。

右のフローチャートを元に「どきどきウチワ」のプログラム(コンパイル前のソースコード)を記述しました(GR Sakura Source File (TXT))。この連載では、プログラムの文法等の書き方の説明は省き、工作物を動かすことに進んでいきます。しかし、プログラム自体は難しくはないので、ぜひご自分でも試してみて下さい。

※ルネサスでも、それぞれのレベルに合わせた入門セミナを実施しています。機会があればぜひご参加ください。

図2:「どきどきウチワ」のフローチャート

図2:「どきどきウチワ」のフローチャート

操作簡単のWebコンパイラ&使えるライブラリで、楽々プログラミング

「GR-SAKURA」では、Webコンパイラを使って簡単にプログラミングを行います。最初に、「HeartBeatFan」という名前で新しいプロジェクトを作りましょう。本連載の第2回目の「ついにGR-SAKURAを起動!~次に、クラウド環境にあるWebコンパイラを準備」の章を参考にして下さい。

続いて、「GR-SAKURA」に用意されている、サーボモータを動かすためのプログラム(ライブラリ)をインポートします。Webコンパイラの上部メニューの「ライブラリ」をクリックし、選択画面から「gr_sakura_servoライブラリ」を選択してインポートします(図3)。これだけの作業で、プログラム(ソースコード)をコンパイルする時に、サーボモータのライブラリがリンクされ、一体化したプログラム(オブジェクトコード)が完成します。「GR-SAKURA」には、他にもさまざまなライブラリが用意されているので、とっても便利です。

図3:サーボモータのライブラリを簡単にインポートする

図3:サーボモータのライブラリを簡単にインポートする

では、プログラミングを進めましょう。Webコンパイラの画面左側部分にある「gr_sketch.cpp」をクリックします。すると図4のような画面になるはずです。

「gr_sketch.cpp」に収められている初期のプログラムは、「GR-SAKURA」のLEDを光らせるサンプルのソースコードです。プログラミングは、このプログラムを書き換えることで行います。先のフローチャートを元に記述したプログラムをコピーして下さい(コピー&ペースト、または手入力で)。ここで、一旦内容を保存します。Webコンパイラの保存ボタンをクリックして下さい。

次に、ビルドを押してコンパイルを行います。エラーがなければ、新たに「sketch.bin」というプログラムファイル(オブジェクコード)が出来上がります。

図4:「gr_sketch.cpp」のプログラム(ソースコード)

図4:「gr_sketch.cpp」のプログラム(ソースコード)

図5:「sketch.bin」をパソコンにダウンロードする

図5:「sketch.bin」をパソコンにダウンロードする

「GR-SAKURA」へ「sketch.bin」を読み込ませるために、パソコンにダウンロードします。「sketch.bin」を右クリックして、「ダウンロード」を選んで下さい(図5)。ブラウザが指定するダウンロード用のフォルダに、ファイルがダウンロードされます。

「GR-SAKURA」とハードウェアに電源ON 初めての電子工作が完成です!

それでは、「どきどきウチワ」を動かしましょう!本連載の第3回目を参考にして、ハードウェアの組み立てを確認して下さい。「GR-SAKURA」と心拍センサ、ブレッドボード、サーボモータを回路図どおりに接続します(写真1)。

写真1:配線した「GR-SAKURA」とブレッドボード

写真1:配線した「GR-SAKURA」とブレッドボード

その後は順番に、

  • (1) 「GR-SAKURA」をUSBケーブルでパソコンとつなぐ(←「GR-SAKURA」へ電源が供給される)
  • (2) ブレッドボードに電池ボックスからのバッテリースナップをつなぐ(←ブレッドボードへ電源が供給される)

ここでは、ブレッドボードから電源が供給されているサーボモータの誤動作を防ぐために、「GR-SAKURA」の電源を先に入れるようにします。電源供給は制御するコンピュータ(「GR-SAKURA」)を先に、周辺機器(今回はブレッドボードやサーボモータ)を後にして、安全に工作を楽しみましょう。

次に、パソコンにダウンロードした「sketch.bin」ファイルを、ドライブとして見えている「GR-SAKURA」にドラッグします。LEDが消灯し、サーボモータが動けば成功です。ここで、指先に心拍センサを付けましょう。マジックテープを強く結ぶよりも、「センサに余分な光を入れないために巻く」といった軽い巻き方の方が反応が良いようです。

指先にセンサを取り付け、ウチワの場所(サーボモータを固定)が決まったら、青ボタンを1回押します。心拍に合わせてLEDが光り、ウチワが爽やかな風を送ってくれるでしょう!

動作を停止するには、「GR-SAKURA」の赤ボタンを押します。ブレッドボードに供給している電源を抜き、次いで「GR-SAKURA」のUSBケーブルを抜けば、停止作業完了です。停止の際は、電源供給の時とは逆で、周辺機器の電源を先に切ります。

いかがでしょう、心拍に合わせてウチワは動いてくれましたか? 今回のプログラムは、心拍の速さ・遅さには自動的に追随するように作られています(上限は120回/分まで)。

電子工作にトライしたいけど難しそう……という声をよく聞きます。確かに以前は初心者向けの解説が少なく、ハードルが高かった時代もありました。でも、いまでは「GR-SAKURA」のような電子工作にうってつけのボード製品が提供され、そして、入門には何よりも大切な「充実したサポート」が用意されています。ぜひ、初めての電子工作に挑戦して下さい。

どきどきウチワの動作を確認!

どきどきウチワの動作を確認!

動画を再生する

「GR-SAKURA」ではプログラムのことをスケッチと呼び、起動時に一度だけ呼ばれる関数「setup()」と、自動的に繰り返し呼ばれる関数「loop()」で構成します。

プログラムのヒント(1)

「setup()」では、入出力に使うポートの設定、A/D変換器の入力電圧範囲の設定などを行います。今回は、心拍に合わせてLEDも光らせるので、出力先に「LED0」、動作開始を青ボタン(スイッチ)で知らせるため「PIN_SW」からの入力を宣言しています。そして、サーボモータをスタート位置(75度)にして待機します。青ボタンを押すとプログラムがその先に進むように、青ボタンの値を監視するループが入れてあります。

プログラムのヒント(2)

「loop()」では、心拍を見つけ、ウチワを動かす処理を行います。ここでは2つの関数を使います。一つ目はR区間を見つける「rPulseDetect()」、もう一つは非R区間を見つける「nonRDetect()」です。それぞれの関数は、目的の区間(R区間または非R区間)を見つけると、見つけるまでに掛かったおおよその時間「msec」を返します。戻り値を受けた後、「fanservo.write()」処理でサーボモータを振り、その後一定時間の停止を「delay()」関数で行います。

hakase

電子工作入門「どきどきウチワ」の全4回はいかがでしたか?

気軽にできる工作で「モノづくり」の楽しさを感じてもらえたでしょうか。

本連載はこれで最終回となりますが、また次の「モノづくり」でお会いできることを楽しみにしています!

電子工作入門

  1. 必要な機能を考えよう!
  2. 見て、 触って、準備しよう!
  3. いよいよハードを組み立てよう!
  4. ソフトを作成して、どきどきウチワが完成