Project 17.1 リレーとモーター制御/Relay & Motor

前回は2つのシフトレジスタを使用してドットマトリクスLEDのコントロール方法を学びました。

あわせて読みたい
Project 16.3 ドットマトリックスLED/LED Matrix 前回はシフトレジスタを使用して4つの7セグメントディスプレイを制御する方法を学びました。 https://kaneshige.org/?p=453 今回は同じ考え方を使用して、マトリックスL...

今回はリレーを使用してモーターをコントロールする方法を学びましょう!

目次

リレーについて

リレーは、低電力の回路を使って高電力の回路を制御することができる、安全なスイッチです。電磁石と接点から構成されています。電磁石は低電力回路によって制御され、接点は高電力回路で使用されます。電磁石に通電すると接点を引き寄せます。

以下は一般的なリレーの回路図と、このプロジェクトで使用される5Vリレーの特徴と回路図記号です。

ピン5とピン6は内部で接続されています。コイルのピン3と4が5V電源に接続されると、ピン1はピン5&6から切り離され、ピン2がピン5&6に接続されます。このため、ピン1はNC(NormallyClose/常閉)、ピン2はNO(NormallyOpen/常開)と呼ばれます。ピン5と6はCOM(Common/共通)

インダクタについて

インダクタの記号は「L」で、単位は「ヘンリー」(H)です。例として、1H=1000mH、1mH=1000μH となります。

インダクタは、電気エネルギーを磁気エネルギーに変換する蓄電素子です。一般的に、特定量のインダクタンスを持つ巻き線コイルで構成されています。インダクタは、電流の変化を妨げます。 コイルを流れる電流が増えるときは、電流の増加を妨げようとし、逆に電流が減る時は、電流の減少を妨げようとする働きがあります。そのため、インダクタを流れる電流は、瞬間的には変化しません。

リレーのリファレンス回路は次の通りです。リレーのコイルはインダクタのような役割を果たすため、トランジスタがリレーへの電源供給を切断しても、コイル内の電流はすぐには止まりません。そのため電源への悪影響が生じてしまいます。そこで、リレーのコイルピンの両端に逆方向に並列ダイオードを接続します。これにより、ダイオードを通して電流が流れるため、電源への悪影響を回避することができます。このようなダイオードをサージキラーダイオード(サージ吸収ダイオード)と言います。

モーターについて

モーターは、電気エネルギーを機械エネルギーに変換する装置です。モーターは、固定されたステーターと回転するローターの2つの部分で構成されています。モーターが動作するとき、固定されている部分はステーターで、回転する部分はローターです。ステーターは通常モーターの外側ケースであり、電源に接続するための端子を備えています。ローターは通常モーターのシャフトであり、他の機械的装置を駆動して動作させることができます。以下の図は、2つのピンを備えた小型のDCモーターです。

モーターを電源に接続すると、一方向に回転します。電源の極性を逆にすると、モーターは反対方向に回転します。

回路図

接続図

モーター回路は、無負荷でも約0.2~0.3Aと大きな電流を使用します。拡張ボードには9V電池での給電を推奨します。

電池はキットの付属していませんので、別途購入してください。

コード

/**********************************************************************
  Filename    : Control Motor by Relay
  Description : Use relay to control motor.
  Auther      : www.freenove.com
  Modification: 2022/10/24
**********************************************************************/
int relayPin  = 14;         // the number of the relay pin
int buttonPin = 21;         // the number of the push button pin

int buttonState = HIGH;     // Record button state, and initial the state to high level
int relayState = LOW;       // Record relay state, and initial the state to low level
int lastButtonState = HIGH; // Record the button state of last detection
long lastChangeTime = 0;    // Record the time point for button state change

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);           // Set push button pin into input mode
  pinMode(relayPin, OUTPUT);                  // Set relay pin into output mode
  digitalWrite(relayPin, relayState);         // Set the initial state of relay into "off"
}
void loop() {
  int nowButtonState = digitalRead(buttonPin);// Read current state of button pin
  // If button pin state has changed, record the time point
  if (nowButtonState != lastButtonState) {
    lastChangeTime = millis();
  }
  // If button state changes, and stays stable for a while, then it should have skipped the bounce area
  if (millis() - lastChangeTime > 10) {
    if (buttonState != nowButtonState) {    // Confirm button state has changed
      buttonState = nowButtonState;
      if (buttonState == LOW) {             // Low level indicates the button is pressed
        relayState = !relayState;           // Reverse relay state
        digitalWrite(relayPin, relayState); // Update relay state
      }
    }
  }
  lastButtonState = nowButtonState; // Save the state of last button
}

プロジェクト2.2では、ボタンを押したり離したりすると機械的な振動(バウンス)が発生していました。この問題を解決しないと、手順に予期せぬ影響が及ぶ可能性があります。Project 2.2 MINI table lampに戻るにはここをクリックしてください。

振動を解消するために、nowButtonState でボタンの電気レベルを、lastChangeTime でピンのレベルが最後に変化した時点を記録します。ボタンの状態が変わると、その変化の時点を記録するのです。

  // If button state changes, and stays stable for a while, then it should have skipped the bounce area
  if (millis() - lastChangeTime > 10) {
    if (buttonState != nowButtonState) {    // Confirm button state has changed
      buttonState = nowButtonState;
      if (buttonState == LOW) {             // Low level indicates the button is pressed
        relayState = !relayState;           // Reverse relay state
        digitalWrite(relayPin, relayState); // Update relay state
      }
    }
  }
  lastButtonState = nowButtonState; // Save the state of last button

ピンの状態が変化し、一定時間安定している場合、有効なキー状態の変化とみなすことができます。その際はキー状態変数 buttonState を更新し、現在の状態に応じてキーが押されたのか、離されたのかを判断します。

ボタンを押してもすぐにリセットされてしまう場合は、モーターの近くに10μFのコンデンサを接続しましょう。モーターと並列に接続します。あるいはブレッドボードの5V側の+と-をコンデンサで接続する形でも良いです。これはパイパスコンデンサ(いわゆるパスコン)と言って、電源を安定させる効果があります。

次回はモータードライバとポテンションメーターでモーターを制御する方法を学びましょう。

あわせて読みたい
Project 17.2 モータードライバ/Control Motor with Potentiometer 前回はリレーを使用してモーターをコントロールする方法を学びました。 https://kaneshige.org/?p=471 今回はモータードライバを使用してコントロールする方法を学びま...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

金重総合研究所の主席研究員。
子供の頃から研究者を目指し、ライフワークとして日々様々な研究をしています。
経営・マネジメント・金融・DXあたりが本職です。
私を採用したい人、私と一緒に働きたい人、一緒に知識を肥やしていきたい人はぜひお声がけ下さい。

コメント

コメントする

目次