.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
レッスン4: TTモーターをマスターする
============================================
これまでのレッスンでは、マーズローバー、そのサスペンションシステムについて探求し、Arduinoに関する知識を深めてきました。
このエキサイティングなコースでは、マーズローバーを駆動する主要コンポーネントであるモーターの仕組みについて探求します。これらのモーターに電力を供給する原理を理解し、SunFounder R3 BoardとGalaxyRVR Shieldを使用してモーターを制御する方法を学びます。
このコースの終わりには、モーター動作についての確かな理解と、モーター制御の実践的な経験が得られます。
さあ、始めましょう!
.. raw:: html
.. note::
GalaxyRVRを完全に組み立てた後にこのコースを学習する場合は、コードをアップロードする前に、このスイッチを右に移動してください。
.. image:: ../img/camera_upload.png
:width: 500
:align: center
コースの目標
----------------------
* モーターの基本原理とTTモーターの特性を理解する。
* TTモーターの方向と速度を制御する方法を学ぶ。
* GalaxyRVR Shieldが6つのモーターを制御する方法を理解する。
コースの教材
-----------------------
* SunFounder R3 Board
* TTモーター
* GalaxyRVR Shield
* バッテリー
* USBケーブル
* Arduino IDE
* コンピューター
コースの手順
------------------
**ステップ1: モーターとは?**
モーターは私たちの日常生活に欠かせない役割を果たしています。あらゆる場所にあります!暑い日に私たちを冷やしてくれる扇風機、美味しいケーキを作るのを助けてくれるミキサー、街を疾走する電気自動車まで、モーターは物を動かします!
.. image:: img/motor_application.jpg
モーターは機械の心臓のようなものです。電気エネルギーを機械エネルギーに変換し、おもちゃや家電製品、さらには大型車両までを動かします!
モーターの背後にある魔法は魔法ではなく、科学、特に電磁誘導の原理です。仕組みは次のとおりです。モーターに電気が供給されると、磁場が発生します。この磁場がモーター内の他の磁石と相互作用し、モーターが回転します。この回転は、コマを回すように、車輪、プロペラ、または機械のその他の可動部品を動かすために使用できます。
.. image:: img/motor_rotate.gif
:align: center
私たちのGalaxyRVRで焦点を当てているモーターの種類は、TTギヤモーターと呼ばれる特定の種類です。
.. image:: img/tt_motor_xh.jpg
:align: center
:width: 400
これは基本的に、一連のギヤと組み合わされた通常のモーターで、すべてプラスチックのシェルに収められています。
モーターが回転すると、ギヤがこの回転をローバーの車輪に伝えます。ギヤを使用することで重要な利点が得られます。トルクが増加し、モーターがより大きく重い負荷を動かせるようになります。
.. image:: img/motor_internal.gif
:align: center
:width: 600
科学と工学の原理がどのように実現するかを見るのは魅力的ではないですか?モーターはこれらの原理が動作する完璧な例です。モーターの仕組みを理解することで、多種多様な機械を夢見て発明することができます。モーターの世界にさらに深く飛び込み、創造性を解き放ちましょう!
**ステップ2: モーターの機能と動作を探る**
モーターとは何か、その幅広い応用範囲を理解したところで、モーター動作の核心に踏み込みましょう。
基本的に、モーターは電磁気の原理に基づいて動作します。電線に電流が流れると、その周囲に磁場が発生します。この磁場が他の磁場と相互作用して、動きを生み出します。
モーターを直接バッテリーに接続する簡単な実験を考えてみましょう。バッテリーからの電流がモーターに流れ込み、モーターの内部機構が回転を始めます。この回転動作は、モーター内部の磁力によるものです。
.. image:: img/motor_battery.png
興味深いことに、バッテリーへの接続を逆にすると、モーターは反対方向に回転します!これは電流の流れる方向が変わり、磁場の方向が変わり、その結果モーターの回転方向が変わるために起こります。
これで、モーターをバッテリーに直接接続すると回転させられることがわかりましたが、多くの場合、コードでその動きを制御したいため、それらの間にArduinoボードを配置します。しかし、モーターをArduinoボードの信号ピンに直接接続しようとすると、どうなるでしょうか?
.. image:: img/motor_uno.png
:width: 600
:align: center
モーターは回転しないと予想したなら、正解です!しかし、なぜそうなるのでしょうか?
答えはArduinoボードの電流出力にあります。通常のArduinoボードの信号ピンは約20mAの電流しか出力できず、モーターを駆動するには不十分です。
では、Arduinoを使ってどのようにモーターを制御できるのでしょうか?ここで重要なコンポーネント、モータードライバーが登場します。モータードライバーは、Arduinoとモーターの間の橋渡しのようなものだと考えてください。Arduinoからの低電流の制御信号を受け取り、それを増幅してモーターに送り、モーターを回転させます。
.. image:: img/motor_uno2.png
次のステップでは、モータードライバーの詳細に飛び込み、Arduinoボードと効果的に使用してモーターを制御する方法を理解します。さらなるエキサイティングな学習をお楽しみに!
**ステップ3: モータードライバーによるモーターの制御方法**
キットに含まれているGalaxyRVR Shieldは、マーズローバーの制御センターとして機能します。すべてのセンサー、モーター、電源を接続するハブです。ローバーを効果的に制御および給電するためのいくつかのコンポーネントで構成されています。
シールドの右側には、6つのモーターポートがあります。ただし、これらは2つのセットにグループ化され、それぞれが別々のモータードライブチップによって制御されます。「Left」と書かれた3つのポートは1つのチップで制御され、「Right」と書かれた他の3つのポートは別のチップで制御されます。
.. image:: img/motor_shield.png
実践を通して、これら2つのドライブチップがどのように6つのモーターを制御するかを学びましょう:
* **1. 回路の接続**
#. GalaxyRVR ShieldをR3ボードに差し込み、モーターを接続し、最後にバッテリーを接続して拡張ボードに電力を供給します。
.. raw:: html
#. 初回使用時は、まずType-C USBケーブルを接続してバッテリーを完全に充電することをお勧めします。その後、電源をオンにします。
.. raw:: html
* **2. コードの作成とアップロード**
#. Arduino IDEを開き、次のコードを入力します:
.. code-block:: arduino
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
}
void loop() {
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
}
* ``pinMode()``: この関数はピンをINPUTまたはOUTPUTに設定します。これは、物語の登場人物が話す(OUTPUT)か聞く(INPUT)かを決めるようなものです。
* ``digitalWrite()``: この関数はピンをHIGH(オン)またはLOW(オフ)に設定できます。まるで魔法のライトをオン/オフするようなものです。
#. 正しいボード(Arduino Uno)とポートを選択したら、 **Upload** ボタンをクリックします。これは郵便受けに手紙を入れるようなもの。Arduinoに指示を送信しています!
.. image:: img/motor_upload.png
#. コードが正常にアップロードされると、モーターが時計回りに回転し始めるのがわかります。
.. raw:: html
* **3. 回路内部接続について**
#. 「Left」と書かれたモーターポートにさらに2つのモーターを接続できます。それらが同時に回転するのを見ることができます。
#. では、2つのドライブチップがどのように6つのモーターを制御するかの簡単な原理を理解しましょう。Arduinoボードのピン2と3がモータードライブチップに信号を出力し、チップのもう一端は3つのモーターに並列に接続されています。同様に、ピン4と5が別のドライブチップに信号を出力し、そのチップはさらに別の3つのモーターに並列に接続されています。
.. image:: img/motor_driver.png
:width: 500
#. もう一方のドライブチップをテストしたい場合は、ピンを ``4`` と ``5`` に変更するだけです。
.. code-block:: arduino
:emphasize-lines: 10,11
const int in3 = 4;
const int in4 = 5;
void setup() {
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
}
void loop() {
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
}
ここでは、ピン4と5を表す2つの変数を定義しています。変数を使用することで、コード全体でピン割り当てを簡単に管理および調整できます。
これは、各ピン番号に特定の役割や任務を割り当てるようなものだと考えてください。役割を再割り当てする場合、スクリプト全体を調べてすべてのインスタンスを変更する代わりに、スクリプトの先頭(変数が最初に定義されている場所)で割り当てを更新するだけです。
* **4. 駆動ロジックについて**
#. これまでのテストでは、モーターがすべて一方向に回転していることに気づいたでしょう。反対方向に回転させるにはどうすればよいでしょうか?2つのピンのHIGHとLOWを入れ替えればよいと提案する人もいるかもしれません。その通りです。
.. code-block:: arduino
:emphasize-lines: 1,2
const int in3 = 4;
const int in4 = 5;
void setup() {
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
}
void loop() {
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
}
コードを書いてArduinoボードにアップロードすると、モーターは指示どおりに動作します。
.. raw:: html
#. では、ドライブチップの内部駆動ロジックを見てみましょう。
.. list-table::
:widths: 25 25 50
:header-rows: 1
* - INA
- INB
- モーター
* - L
- L
- スタンバイ
* - L
- H
- 時計回り
* - H
- L
- 反時計回り
* - H
- H
- ブレーキ
#. では、モーターを2秒間時計回りに回転させ、2秒間反時計回りに回転させ、その後停止するようにしてみましょう。
.. code-block:: arduino
:emphasize-lines: 10,11,12,13,14,15,16,17,18
const int in3 = 4;
const int in4 = 5;
void setup() {
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
}
void loop() {
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
digitalWrite(in3, HIGH);
digitalWrite(in4, HIGH);
delay(5000);
}
* ここでは ``delay()`` 関数を使用して、Arduinoを一定時間停止させています。これは物語の途中で短い昼寝をするようなものです。
* コードでは「ブレーキ」状態を使用してモーターを停止しており、モーターが急停止することに気づくでしょう。両方のピンをLOWに設定して「スタンバイ」状態をテストしてみると、モーターが徐々に減速して停止することがわかります。
これで、モータードライバーチップがGalaxyRVR Shieldを通じてどのようにモーターを制御するか、そしてArduinoコードを使用してモーターの動きを操作する方法について、より理解が深まったはずです。コードの数行がモーターのような物理的なオブジェクトの動作を指示できるのは魅力的ではないですか?
先に進むにあたり、次の質問について考えてみてください:
* ``loop()`` 関数からすべてのコードを ``setup()`` 関数に移動すると、モーターの動作はどのように変わりますか?
* 6つのモーターを同時に制御するには、コードをどのように変更しますか?
コードを試したり遊んだりすればするほど、より多くのことを学べます。適切だと思うように、自由にコードを微調整、修正、最適化してください。ハッピーコーディング!
**ステップ4: モーター速度の制御**
前のステップでは、ピンを単純にHIGHまたはLOWに設定することでモーターの方向を制御しました。これはモーターに最大電力を与えて駆動するようなもので、車でアクセルペダルを床まで踏み込むのに似ています。しかし、多くの状況では、都市部を運転するときと高速道路を運転するときで車の速度を調整するように、さまざまなシナリオに合わせてモーター速度を調整したい場合があります。ここでPWM(パルス幅変調)が登場します。
.. image:: img/motor_pwm.jpg
PWMは、出力をHIGHとLOWの間で高速に切り替えることによって、可変電圧出力の効果を生み出すために使用される技術です。PWMを使用すると、実際にはデジタル信号のみを出力しながら、アナログ信号の効果をシミュレートできます。
これは理解するのが難しいと感じるかもしれませんが、それで大丈夫です!次のセクションでは、コーディングを通じてPWMを使用してモーター速度を調整する方法を学びます。
SunFounder R3ボードにはPWM機能が組み込まれたピンがいくつかありますが、それらはすでに他の機能に使用されているため、モーターには使用できません。そのため、ドライバーチップをピン2、3、4、5に接続し、ArduinoのSoftPWMライブラリを使用してこれらのピンでPWMを有効にします。
次に行うことは次のとおりです:
#. Arduino IDEを開き、 **LIBRARY MANAGER** で ``softpwm`` を検索してインストールします。
.. raw:: html
#. 次のコードをArduino IDEに入力します。コードが正常にアップロードされると、モーターは時計回りに回転します。
.. code-block:: arduino
:emphasize-lines: 1, 7,11,12
#include
const int in1 = 2;
const int in2 = 3;
void setup() {
SoftPWMBegin();
}
void loop() {
SoftPWMSet(in1, 0);
SoftPWMSet(in2, 255);
}
* 上記のコードでは、最初にコードの先頭に ``SoftPWM.h`` を追加して、``SoftPWM`` ライブラリの関数を直接使用できるようにしています。
* 次に、``SoftPWMBegin()`` 関数で ``SoftPWM`` ライブラリを初期化します。
* 最後に、``loop()`` 関数内で ``SoftPWMSet()`` を使用して ``in1`` と ``in2`` に異なる値を割り当て、モーターを動作させます。効果は ``LOW`` と ``HIGH`` を直接使用した場合と似ていますが、ここでは ``0〜255`` の範囲の数値を使用します。
* Arduinoの世界では、速度は0(停止している車のようなもの)から255(高速道路を疾走するようなもの)の間の値として表現されることを覚えておいてください。つまり、``SoftPWMSet(in2, 255)`` と言うとき、モーターに全速力で進むように指示しているのです!
#. 次に、他の値を入力して、モーター速度の違いを観察してみましょう。
.. code-block:: arduino
:emphasize-lines: 12,13,14,15
#include
const int in1 = 2;
const int in2 = 3;
void setup() {
SoftPWMBegin();
}
void loop() {
SoftPWMSet(in1, 0);
for (int i = 0; i <= 255; i++) {
SoftPWMSet(in2, i);
delay(100);
}
delay(1000);
}
上記のコードでは、``for`` ループを使用して変数 ``i`` を ``255`` まで増加させています。C言語の ``for`` ループは、プログラムの一部を複数回繰り返すために使用されます。3つの部分で構成されています:
.. image:: img/motor_for123.png
:width: 400
:align: center
* **初期化**: このステップは最初に実行され、ループに初めて入ったときに一度だけ実行されます。ループ制御変数を宣言して初期化できます。
* **条件**: これは初期化の次のステップです。条件が真の場合、ループの本体が実行されます。偽の場合、ループの本体は実行されず、制御の流れはforループの外に出ます。
* **増分または減分**: 初期化と条件のステップおよびループ本体のコードを実行した後、増分または減分のステップが実行されます。この文は、ループ制御変数を更新できます。
forループのフローチャートを以下に示します:
.. image:: img/motor_for.png
したがって、上記のコードを実行すると、モーター速度が徐々に増加するのがわかります。1秒間停止し、その後再び0から始まって徐々に増加します。
.. raw:: html
このステップでは、モーターの速度を制御する技術であるPWM(パルス幅変調)について学びました。ArduinoのSoftPWMライブラリを使用することで、モーターの速度を調整でき、デジタル信号のみを出力しながらアナログ信号をシミュレートできます。これにより、ローバーの動きをより細かく制御でき、将来のより複雑な操作に備えることができます。
**ステップ5: 振り返りと改善**
このレッスンを完了すると、モーターの動作原理、およびプログラミングによる方向と速度の制御方法について理解できるはずです。
以下のチャレンジで理解度をテストしてみましょう:
* モーター速度を徐々に低下させるには、forループをどのように変更しますか?
* 反時計回りに回転しながら、モーターを加速または減速させるにはどうすればよいですか?
提供されたコードを試して、これらの質問に答えてみてください。仮説に従ってコードを自由に調整し、モーターの動作の変化を観察してください。
実際に手を動かして実験し、これらの質問について考察することで、理解が深まり、問題解決能力が向上します。このような課題を通じて、本当の学習が行われます。探求の旅には「正しい」も「間違い」もありません。これはすべて学習と発見に関するものです!