.. note::
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
**参加する理由は?**
- **エキスパートサポート**:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
- **学び&共有**:ヒントやチュートリアルを交換してスキルを向上させましょう。
- **独占的なプレビュー**:新製品の発表や先行プレビューに早期アクセスしましょう。
- **特別割引**:最新製品の独占割引をお楽しみください。
- **祭りのプロモーションとギフト**:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[|link_sf_facebook|]をクリックして今すぐ参加しましょう!
レッスン4:TTモーターをマスターする
====================================
これまでのレッスンでは、火星ローバー、そのサスペンションシステム、そしてArduinoについての知識を探求しました。
このエキサイティングなコースでは、火星ローバーを動かす鍵となる部品であるモーターの仕組みを探ります。
これらのモーターを動かす原理を理解し、SunFounder R3ボードとGalaxyRVRシールドを使用して制御する方法を学びます。
このコースの終わりまでに、モーターの操作とモーター制御の実践経験に関するしっかりとした理解を持つようになります。
さあ、始めましょう!
.. raw:: html
.. note::
GalaxyRVRを完全に組み立てた後にこのコースを学ぶ場合、コードをアップロードする前にこのスイッチを右に移動する必要があります。
.. image:: img/camera_upload.png
:width: 500
:align: center
学習目標
----------------------
* モーターの基本原理とTTモーターの特性を理解する。
* TTモーターの方向と速度を制御する方法を学ぶ。
* GalaxyRVRシールドが6つのモーターを制御する方法を理解する。
材料
-----------------------
* SunFounder R3ボード
* TTモーター
* GalaxyRVRシールド
* バッテリー
* 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シールドは、私たちの火星ローバーの制御センターとして機能します。これは私たちがすべてのセンサー、モーター、電源を接続するハブです。これにはローバーを効果的に制御し、電力を供給するためのいくつかのコンポーネントが含まれています。
シールドの右側には6つのモーターポートがありますが、これらは2つのセットに分けられ、それぞれ別々のモータードライブチップによって制御されます。「Left」とマークされた3つのポートは1つのチップによって制御され、「Right」とマークされた他の3つのポートは別のチップによって制御されます。
.. image:: img/motor_shield.png
これら2つのドライブチップが6つのモーターをどのように制御するかを、実践を通じて学びましょう:
* **1. 回路の接続**
#. GalaxyRVRシールドを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が一定時間一時停止するようにしました。まるで物語の途中で短い昼寝をするようなものです。
* コードでは「Brake」状態を使用してモーターを停止させ、モーターが急停止するのがわかります。両方のピンをLOWに設定して「待機」状態をテストすると、モーターが徐々に減速して停止するのがわかります。
これで、GalaxyRVRシールドを通じてモータードライバーチップがモーターを制御する方法や、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
* **Initialization**:これは最初にループに入ったときに最初に実行され、一度だけ実行されます。これにより、ループ制御変数を宣言し初期化することができます。
* **Condition**:初期化の次のステップです。真であればループの本体が実行されます。偽であればループの本体は実行されず、制御フローはforループの外に移動します。
* **Increment or Decrement**:初期化と条件のステップおよびループ本体コードを実行した後、増分または減分ステップが実行されます。このステートメントにより、ループ制御変数を更新することができます。
forループのフローチャートは下記の通りです:
.. image:: img/motor_for.png
このコードを実行すると、モーターの速度が徐々に上がるのを見ることができます。1秒間停止し、再び0から始まって徐々に速度が上がります。
.. raw:: html
このステップでは、モーターの速度を制御するためのパルス幅変調(PWM)について学びました。ArduinoのSoftPWMライブラリを使用してモーターの速度を調整することで、デジタル信号のみを出力しながらアナログ信号をシミュレートすることができます。これにより、ローバーの動きをより細かく制御し、将来のより複雑な操作に備えることができます。
**ステップ5:振り返りと改善**
このレッスンを終えた今、モーターの動作原理や、プログラミングによるその方向と速度の制御方法について熟知しているはずです。
以下のチャレンジであなたの理解をテストしてみましょう:
* モーターの速度を徐々に減速させるためにforループをどのように変更しますか?
* 反時計回りに回転しながらモーターを加速または減速させるにはどうしますか?
これらの質問に答えるために、提供されたコードで実験してみてください。仮説に応じてコードを調整し、モーターの動作の変化を観察してください。
これらの質問に対するあなたの実践的な実験と考察は、理解を深め、問題解決スキルを向上させるでしょう。このようなチャレンジを通じて、本当の学習が起こります。探索的な旅路に「right」や「wrong」はないことを常に覚えておいてください - これは学びと発見についてのことです!