簡単なプログラム(1)

ここからの内容は sLab工作ガイドを参考にさせて頂き、実際に動作確認していきます。
このサイトは、非常に細かく初心者に良く解る様な解説になっていますのでゆっくり眺めてみるのも勉強になりま
す。

【 Lチカ:ESPバージョン 】
通常のArduinoでの「Lチカ」スケッチ例は、<ファイル><スケッチ例><01.Basics><Blink>を選択します。
<コメント文は諸略しています。>


上記Arduino基本スケッチにESP用に変更したものが下記スケッチです。


シリアルモニター上に、LEDの点灯、消灯のコメントが表示させるコマンドが追加されています。


【照度センサ:ESPバージョン】
ここで使用する照度センサは、フォトトランジスタを使います。
光が当たると抵抗値が小さくなるので、GPI36の電圧が高くなってきます。


アナログ入力の最大値が 4095 なので、4095 で 100 にするため 100/4095 としています。



【温湿度センサ:ESPバージョン】
温湿度センサとして下図の DHT11 を使用します。VDDは3.3V~5.5Vの範囲で使えるので3.3Vでも5Vでも使用
可能です。
DATA線には、10kΩでプルアップしています。
DATA線からの信号は、そのままでは利用することが出来ないのでメーカーが準備しているライブラリを使います。
<ライブラリのインクルード方法>
ArduinoIDEの<スケッチ><ライブラリをインクルード><ライブラリーを管理>を選択します。
ライブラリマネージャの検索窓に「dht」と入力し「DHT sensor library by Adafruit」を見つけて、インストール
します。


スケッチの説明


① 今回のセンサのDHTライブラリをインクルードします。
② センサの入力ピン番号を指定します。
③ 読み込んだDHTライブラリのクラスをインスタンス化して変数dhtに定義しています。
⑦ DHT センサの利用宣言
⑩ readTemperature や readHumidity で温度と湿度の状態を読み出し float 型の変数にデータを格納します。
⑪ Print 文では、文字列型の必要があるので、float 型を String 型に変換した後表示しています。


【人感センサ:ESPバージョン】
人感センサとしてAM312を使います。(下図:集電型赤外線センサ)
検知距離は3m~5m程度、反応時間は2秒以下となっています。
使用可能電源電圧は、2.7V~12Vと範囲が広いのが特徴です。


人感センサは変化を検知するとVOUT端子がHIGH状態(3.3V)になります。
変化がなければLOW状態(GND)になりますので、digitalReadでHIGHかLOWかを判定します。
digitalReadの結果は、HIGH(3.3V入力)の場合はtrue、LOW(GND入力)の場合はfalseとなりますので、IF文で
判定しシリアルモニタに表示しています。
シリアルモニタにはセンサが感知した場合に”Detected!”と表示し感知していない場合に”No detected.”が表示
され下図のようになります。



【 赤外線リモコン受信:ESPバージョン 】

赤外線リモコンの信号を読み取るモジュールを利用して電子工作です。

 赤外線受信モジュールの外観が左記図です。

 受信モジュールには3つの端子があり、VCC端子には3.3Vを接続しGND
 端子にはGNDを接続します。
 Vout端子は赤外線信号を受信している間はHIGH(3.3V)を出力し赤外線
 信号がない場合はLOW(GND)を出力します。
 以下の通り端子はGPI36を利用し赤外線受信状態を検知します。










下記スケッチは3分割になっています。


① は赤外線受信モジュールを接続する端子番号を定義しています。
 setup関数内はシリアル通信でパソコンにシリアルモニタできる環境を設定しています。
② irRecv関数の呼び出しで赤外線受信処理を実行しています。
  irRecv関数の処理結果により受信成功時は⑱「RcvOK」、信号がなかった場合は⑲「NoSig」を シリアルモニタ
 に表示し結果がわかるようになっています。
  irRecv関数は信号を受信するまで15秒信号を待ち受け状態となります。
  15秒以内に正常に信号を受信した場合は戻り値として「true」(⑫)を返答し終了します。
  15秒経過しても信号を受信しなかった場合は「false」(⑮)を返答します。返答(戻り)値は returnで返す
 ことが可能です。
  また、returnはその関数がその時点で処理を終了し、呼び出し元に処理が戻ることを意味しています。
⑦ while(1)はbreakやreturnがあるまで繰り返し処理を行います。
  このWhile文により信号を受信するか15秒経過するまで処理を繰り返します。
⑧ 受信処理の開始時間を保持しています。
  経過時間を利用する場合、マイクロ秒単位かミリ秒単位によりmicros()、millis()を利用できます。
  開始時間は15秒経過を管理するためのものなので、マイクロ秒は細かすぎるのでミリ秒単位で値を 保持します
⑨ While分では状態が変化するまで繰り返し処理します。
  digitalRead(IR_R_PIN)はGPI36の端子状態となります。
  赤外線信号の受信時に赤外線受信モジュールは信号受信時に3.3VをGPI36に入力するため、 digitalReadは
 HIGH(数値の1)となります。
  逆に信号がない時はGND(0V)となりdigitalRead はLOW(数値の0)となります。
⑩ リモコン信号の終わりを判定しています。
  0.5秒間信号がなかった場合に終わりと判定しています。
  ただ、⑪で0/1の信号数が10個以上の場合のみ正常に信号が受信できたと判定しています。
  これは自然界に多くの赤外線が流れていますので数回の信号はリモコン信号がなくても受信して しまいます。
 リモコン信号であれば0/1の信号数が10個以上あるため10個以上の場合のみ正常完了
 と判定し⑫returnでtrueを呼び出し側に返答し、irRecv関数はは終了します。
⑭は⑧で取得した時間から15秒以上経過しているかを判定して経過している場合はIF文内が処理され⑮returnで
 戻り値falseを返答し関数を終了します。
 リモコン信号を受信した場合に最初に⑯の処理をします。リモコン信号の最初の信号を受信したタイミングは
 irCountが0なので⑯のIF文内の処理を実施し、開始タイミング時間(sMicro)を取得し信号先頭からの経過時間
(lastt)を0に設定します。
 リモコンの2つ目の信号からはirCountが1以上なので⑰else内の処理を実施します。
⑱と⑲で0/1の信号の継続時間を計算しています。
 以下に計算の考え方を示します。
⑲の計算で前回信号までの経過時間(lastt)を保存しているため、現在時間micros()との差分を⑱で計算しdeltt
 を取得しています。
 計算したdelttはシリアルモニターへ出力しています。
⑱では1/10に計算していますが多くは0,1のパルス幅(継続時間長さ)は100μ以上の長さで数μ秒の精度は必要な
 いことから扱いやすいように1/10で計算しています。


⑳でrStateの状態を反転させます。
 「!」は状態を反転できますのでTrueをFalseへ、FlaseをTrueへ値を反転できます。
 本変数の反転により信号待ち状態を変更しHIGH/LOWの次に変化するタイミングまで⑦while内を処理します。

スケッチを書き込み、プログラム起動後に赤外線受信モジュールに向けてリモコン信号を送信すると、シリアル
モニタは以下のように表示されます。


受信信号は「348,172,45,42,45・・・・」のように表示され、次の行に「RcvOK」と表示されていればリモコン
信号が受信完了しています。
ただ、雑音を受信している場合もありますので、正常に受信できていない可能性もあります。
この348,172,45・・・はマイクロ秒を1/10にしていますので、実際には3480μs,1720μs,450μs・・・となり、
これらは赤外線信号ONとOFFの状態を交互に時間間隔を表示しています。
今回の場合、最初の3480μsが赤外線信号ON状態の時間間隔で、その次に信号OFF時間間隔1720μsが続き、次に
信号ONが450μs間続くというように信号ONと信号OFFの時間が交互に表示されます。



<リモコン信号:フォーマット>
一般的なリモコン信号フォーマットは以下の通りです。

リモコン信号の初めは認識しやすい長めのリーダコードのONとOFF信号があり、その後にデータが続きます。

データコード内での信号1、0(信号あり、なし)は信号長さの違いで判定するのが一般的で、通常0信号の場合に
比べて3倍の長さがある場合に1の信号というイメージです。
もちろんメーカや機種により判定方法に違いがありますので、一つの例と考えて下さい。
このように赤外線送信あり・なし(信号あり・なし)を繰り返すことでデータ伝送を実現しています。
信号はキャリア周波数で伝送されます。通常、38KHzの周波数が用いられ下図のように約26μSec(1÷38,000)単位
にON・OFFが繰り返されています。
38KHz信号で信号ON/OFFの繰り返しが発生している場合に赤外線受信モジュールにおいても信号ありと判定され
Vout端子からHIGHで出力されます。
赤外線信号なしの場合はキャリア周波数の信号も何もなく、赤外線受信モジュールからVout端子もLOWとなります

上記の説明は、信号ありの場合は26μs単位に光をつけたり消したりして繰り返している状態で、信号なしは光を
常に消している状態ということになります。
(赤外線も光(可視光)も周波数が異なる電磁波の一種ですので光で仕組みを考えることができます。)
また、赤外線リモコンの周波数が仕様に「波長:940nm」などと記載されていますがこれは電磁波自体の
周波数を表しています。
一般的な赤外線リモコンの多くは940nmの電磁波を用いて38KHzのキャリア周波数を用いて信号の送受信を
行なっています。


【 赤外線リモコン送信:ESPバージョン 】
赤外線送信デバイスは、下記の部品を使います。


  《LED仕様》
   LED電流(順電流IF) : 300 mA
   LED電圧(順電圧VF) : 1.6 V










  《トランジスタ仕様》
   Base- Emitter Saturation Voltage (VBE) :
                     1.2 V
   DC Current Gain (hFE) : 100







スケッチ説明
10秒間隔で赤外線リモコン信号を送信するスケッチは以下に示します。


① 赤外線LEDを制御する端子を設定しています。
② 送信データは2-5.赤外線リモコン受信のシリアルモニターに表示された「347,172,40,・・・」を行の最後まで
 取得し、行の最後のカンマ(,)を削除し貼り付けて下さい。
 信号あり・なしの継続時間を表した値になりますので、その時間間隔に従って信号あり/なしを交互に送信します

loop関数は10秒間隔でリモコン信号を送信する関数irSend(⑦)を⑤で繰り返し呼び出し実行します。

irSend関数内で赤外線リモコン信号を送信しています。
まず、②で設定した全データ長を1個のデータ長で割ることで全体の個数(配列数)を⑨で計算しirCountに格納
しています。
この個数だけ信号あり・なしの数がありますので、その数を⑪のfor文で繰り返し処理します。
⑩で信号送信の開始時間を取得し保持しています。
⑪ for文では信号あり・なしの時間長が取得できますので、do〜while文は⑯で時間経過が終了するまで実行され
 ます。
⑬「digitalWrite (IR_S_PIN, !(i&1));」でiが偶数の時にHIGH(1)、iが奇数の時にLOW(0)がdigitalWriteGPIO32
 端子をON/OFF制御します。
 「i&1」はビット演算でiを1とANDを取っていますので、iの最終bitである0or1を取得しています。
 「!」はbitを反転を表していて、0は1へ、1は0へ反転させています。
 このため、iが0の時は「!(i&1)」は1(HIGH)を出力し、iが1の時は「!(i&1)」は0(LOW)を出力します iが2以降
 も同様に⑬でHIGHとLOWが順次交互に送信されます。
⑬ digitalWriteで設定した状態を「microWait(13);」で13μsそのままWaitして継続する処理をしていて、
 HIGHならHIGHの状態、LOWならLOWの状態を13μsそのまま維持します。
⑮「digitalWrite(IR_S_PIN, 0)」はLOWの状態にし13μsそのまま維持します。
 これはリモコン信号のキャリア周波数が38KHz(26μs周期)で送信しているために13μs毎で信号のON/OFFする
 ために実施しています。
 (信号ありの場合はHIGH/LOWを13μ秒毎に繰り返し、信号なしの場合はLOWの状態のまま)
 このように②で設定したデータを元に⑪のfor文で最後まで処理しリモコン信号を送信しています。