前回は2つのシフトレジスタを使用してドットマトリクスLEDのコントロール方法を学びました。
今回はリレーを使用してモーターをコントロールする方法を学びましょう!
リレーについて
リレーは、低電力の回路を使って高電力の回路を制御することができる、安全なスイッチです。電磁石と接点から構成されています。電磁石は低電力回路によって制御され、接点は高電力回路で使用されます。電磁石に通電すると接点を引き寄せます。
以下は一般的なリレーの回路図と、このプロジェクトで使用される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側の+と-をコンデンサで接続する形でも良いです。これはパイパスコンデンサ(いわゆるパスコン)と言って、電源を安定させる効果があります。
次回はモータードライバとポテンショメーターでモーターを制御する方法を学びましょう。
コメント