注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!

5.3 状態変化の検出

ボタンが他のデバイスを制御する場合、それは押されているときにのみ動作するだけでなく、リリースされたときに停止することもできます。 ボタンが押されるたびに動作状態を切り替えることも可能です。

この効果を達成するために、ボタンが押されたときに動作状態をオフとオンの間で切り替える方法を知る必要があります。 それは「状態変化の検出」です。

このプロジェクトでは、モーターを制御するためのボタンを使用します。

必要な部品

このプロジェクトには、以下の部品が必要です。

全体のキットを購入すると非常に便利です。こちらがリンクです:

名前

このキットのアイテム

リンク

3 in 1 Starter Kit

380+

3 in 1 Starter Kit

下記のリンクからも個別に購入することができます。

コンポーネントの紹介

購入リンク

Arduino Uno R4 Minima

-

ブレッドボード

購入

ジャンパーワイヤー

購入

抵抗器

購入

ボタン

購入

TTモーター

-

L9110 モータードライバーモジュール

-

回路図

../_images/circuit_8.3_statechange.png

配線図

../_images/5.3_state_change_bb.png

コード

注釈

  • 3in1-kit\learning_project\5.3.state_change_detection のパスの下で 5.3.state_change_detection.ino ファイルを開きます。

  • または、このコードを Arduino IDE にコピーします。

コードが正常にアップロードされた後、ボタンを押すとモーターが動き、再びボタンを押すとモーターが停止します。

どのように動作するのか?

  1. モーターとボタンのための変数を作成し、ピンを定義します。

    ...
    int detectionState = 0;
    int buttonState = 0;
    int lastButtonState = 0;
    
    • detectionState はボタンが押されるたびに値が変わるフラグです。例:この時は0、次は1、と交互に変わります。

    • buttonStatelastButtonState は、この回と前回のボタンの状態を記録し、ボタンが押されたか、放されたかを比較するために使われます。

  2. 各ピンを初期化し、シリアルモニターのボーレートを設定します。

    void setup() {
        pinMode(buttonPin, INPUT);
        Serial.begin(9600);
        pinMode(A_1A,OUTPUT);
        pinMode(A_1B,OUTPUT);
    }
    
  3. まず、ボタンの状態を読み取ります。ボタンが押された場合、変数 detectionState の値は0から1、または1から0に切り替わります。 detectionState が1の場合、モーターが回転します。ボタンが押されるたびに、モーターが交互に動作し、停止する効果があります。

    void loop() {
    // ボタンが押されるたびにdetectionStateを切り替える
        buttonState = digitalRead(buttonPin);
        if (buttonState != lastButtonState) {
            if (buttonState == HIGH) {
            detectionState=(detectionState+1)%2;
            Serial.print("The detection state is: ");
            Serial.println(detectionState);
            }
            delay(50);
        }
        lastButtonState = buttonState;
    
        // detectionStateに従って、モーターを起動する
        if(detectionState==1){
            digitalWrite(A_1A,HIGH);
            digitalWrite(A_1B,LOW);
        }else{
            digitalWrite(A_1A,LOW);
            digitalWrite(A_1B,LOW);
        }
    }
    

    すべてのワークフローは以下の通りです。

    • ボタンの値を読み取る。

    buttonState = digitalRead(buttonPin);
    
    • buttonStatelastButtonState が等しくない場合、ボタンの状態が変わったことを意味します。次の判断を続け、この時のボタンの状態を変数 lastButtonState に格納します。 delay(50) はジッタを排除するために使用されます。

    if (buttonState != lastButtonState) {
    ...
        delay(50);
    }
    lastButtonState = buttonState;
    
    • ボタンが押されたとき、その値はHIGHです。ここでは、ボタンが押されたときに変数 detectionState の値が変更されます。例:操作後に0から1へ。

    if (buttonState == HIGH) {
        detectionState=(detectionState+1)%2;
        Serial.print("The detection state is: ");
        Serial.println(detectionState);
        }
    
    • 変数 detectionState が1の場合、モーターを回転させます。それ以外の場合は停止します。

    if(detectionState==1){
        digitalWrite(A_1A,HIGH);
        digitalWrite(A_1B,LOW);
    }else{
        digitalWrite(A_1A,LOW);
        digitalWrite(A_1B,LOW);
    }