.. note:: こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。 **参加する理由は?** - **エキスパートサポート**:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。 - **学び&共有**:ヒントやチュートリアルを交換してスキルを向上させましょう。 - **独占的なプレビュー**:新製品の発表や先行プレビューに早期アクセスしましょう。 - **特別割引**:最新製品の独占割引をお楽しみください。 - **祭りのプロモーションとギフト**:ギフトや祝日のプロモーションに参加しましょう。 👉 私たちと一緒に探索し、創造する準備はできていますか?[|link_sf_facebook|]をクリックして今すぐ参加しましょう! .. _iot_gate: 7. 電流制限ゲート ================================== 一部の状況、例えば駐車場などでは、数量の管理が必要となります。 ここではスマートゲートを作成します。サーボをゲートとして使用し、その前にIR障害物検出器を配置します。オブジェクト(例えば車)が検出されると、ゲートが開き、数字が1増加します。 そのカウントは7セグメントディスプレイで表示され、Blynkクラウドにもアップロードされるので、遠隔での閲覧も可能です。最後に、Blynkにはこのスマートゲートシステムを有効/無効にするためのスイッチウィジェットがあります。 **必要な部品** このプロジェクトでは、以下のコンポーネントが必要です。 全てのキットを一括で購入するのが便利です。リンクはこちら: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - 名前 - このキットのアイテム - リンク * - 3 in 1 Starter Kit - 380+ - |link_3IN1_kit| 以下のリンクから個別に購入することもできます。 .. list-table:: :widths: 30 20 :header-rows: 1 * - コンポーネントの紹介 - 購入リンク * - :ref:`cpn_uno` - |link_Uno_R3_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_esp8266` - |link_esp8266_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_servo` - |link_servo_buy| * - :ref:`cpn_avoid` - |link_obstacle_avoidance_buy| * - :ref:`cpn_7_segment` - |link_7segment_buy| * - :ref:`cpn_74hc595` - |link_74hc595_buy| **1. 回路を組む** .. note:: ESP8266モジュールは、安定した動作環境を提供するために高電流を必要としますので、9Vのバッテリーが接続されていることを確認してください。 .. image:: img/wiring_servo_segment.jpg :width: 800 **2. ダッシュボードを編集** #. 数を記録するために、 **Datastream** ページで **Virtual Pin** タイプの **Datastream** を作成します。DATA TYPEを ``Integer`` に設定し、MINとMAXを ``0`` と ``10`` に設定します。 .. image:: img/sp220610_165328.png #. 次に、 **Wed Dashboard** ページに移動し、 **Switch** ウィジェットをドラッグして、そのデータストリームを **V0** に設定し、 **Label** ウィジェットをドラッグして、そのデータストリームを **V8** に設定します。 .. image:: img/sp220610_165548.png **3. コードの実行** #. ``3in1-kit\iot_project\7.current_limiting_gate`` のパスの下の ``7.current_limiting_gate.ino`` ファイルを開くか、このコードを **Arduino IDE** にコピーします。 .. raw:: html #. ``Template ID`` 、 ``Device Name`` 、および ``Auth Token`` を自分のものに置き換えます。また、使用しているWiFiの ``ssid`` と ``password`` も入力する必要があります。詳細なチュートリアルは :ref:`connect_blynk` を参照してください。 #. 正しいボードとポートを選択した後、 **Upoad** ボタンをクリックします。 #. シリアルモニターを開き(ボーレートを115200に設定)、成功した接続などのプロンプトが表示されるのを待ちます。 .. image:: img/2_ready.png .. note:: 接続時に ``ESP is not responding`` というメッセージが表示された場合、次の手順に従ってください。 * 9Vのバッテリーが接続されていることを確認します。 * RSTピンを1秒間GNDに接続してESP8266モジュールをリセットし、その後、それを取り外します。 * R3ボードのリセットボタンを押します。 これらの操作を3-5回繰り返すことが必要な場合もありますので、お待ちください。 #. BlynkのButton Controlウィジェットをクリックして、スマートドアシステムを有効にします。IR障害物回避モジュールが障害物を検出すると、ゲートが開き、Blynkの7セグメント表示およびCountウィジェットが1加算されます。 .. image:: img/sp220610_165548.png #. モバイルデバイスでBlynkを使用したい場合は、 :ref:`blynk_mobile` を参照してください。 .. image:: img/mobile_gate.jpg **どのように動作するのか?** ``BLYNK_WRITE(V0)`` 関数は **Switch** ウィジェットのステータスを取得し、それを変数 ``doorFlag`` に割り当てます。これにより、スマートゲートシステムが有効かどうかを判断するために使用されます。 .. code-block:: arduino BLYNK_WRITE(V0) { doorFlag = param.asInt(); // ゲートを有効にする } Blynkタイマーでは、 ``doorFlag`` が毎秒判定され、有効になっている場合、ゲートのメイン関数が実行されます。 .. code-block:: arduino void myTimerEvent() { if (doorFlag) { channelEntrance(); } } ゲートのメイン関数は ``channelEntrance()`` です。 オブジェクトがゲートに近づくと(センサーが障害物があることを検出すると)、 ``count`` が1増加します。 Blynk Cloudの ``V8`` データストリームと回路の7セグメント表示に ``count`` を書き込み、ドアを開けます。 オブジェクトが存在から不在に移行する場合、つまりオブジェクトがドアに入った場合、ドアを閉じます。 .. code-block:: arduino void channelEntrance() { int currentState = digitalRead(irPin); // 0:障害物 1:障害物なし if (currentState == 0 && lastState == 1) { count=(count+1)%10; Blynk.virtualWrite(V8, count); showNumber(count); operateGate(true); } else if ((currentState == 1 && lastState == 0)) { operateGate(false); } lastState = currentState; } ``showNumber(int num)`` 関数は、7セグメント表示に値を表示するために使用されます。 .. code-block:: arduino void showNumber(int num) { digitalWrite(STcp, LOW); //ST_CPを接地して、伝送中は常に低く保つ shiftOut(DS, SHcp, MSBFIRST, datArray[num]); digitalWrite(STcp, HIGH); //データを保存するためにST_CPST_CPを引き上げる } ``operateGate(bool openGate)`` 関数は、参照が ``True`` の場合、ドアをゆっくり開け、参照が ``False`` の場合、ドアをゆっくり閉じます。 .. code-block:: arduino void operateGate(bool openGate) { if (openGate == true) { // open gate while (angle <= 90) { angle++; myservo.write(angle); delay(5); } } else { // close gate while (angle >= 0){ angle--; myservo.write(angle); delay(5); } } }