レッスン18/31:Arduino SunFounderキットでサーボモーターを使う
サーボモーターは、数多くのロボット工学や遠隔操作プロジェクトの主力であり、ステアリング機構からロボットアームまで、あらゆるものに精密な角度制御を提供します。このガイドは、SunFounder Arduinoキットコースのレッスン18に基づいており、Arduinoでサーボモーターを使用する基本を順を追って説明します。ハードウェアの接続方法と、単純なスイープ動作とノブ制御による位置決めという2つの異なる方法を使用してモーターの位置を制御する方法を学びます。ここで得られる知識は非常に実用的で、以下のような幅広いプロジェクトに応用できます。
- 物体を正確に掴んで移動できるロボットアームの構築。
- サーボによるステアリングを備えた遠隔操作カーやボートの作成。
- 太陽を追跡してエネルギー収集を最大化するソーラートラッカーの開発。
- 監視や写真撮影のためのパン・チルト式カメラマウントの構築。
- 模型飛行機のラダーやエルロンなどの操縦面の自動化。


ハードウェア概要
コードに取り掛かる前に、サーボモーター自体を理解することが不可欠です。ビデオで示されているように、サーボモーターは標準的なDCモーターのように連続回転しません。代わりに、通常0度から180度の間の特定の角度位置に回転します。これにより、精密な動きを必要とする用途に最適です。ビデオでは、RCカーのステアリングからロボットアームの複雑な関節の制御まで、いくつかの例が強調されています(ビデオの00:06)。
サーボにはさまざまなサイズがあり、物理的なサイズとトルク定格によって価格と用途が決まります。小型のマイクロサーボは軽量モデルに最適ですが、「非常に強力または厚い車」のステアリングのような重い作業には、より大型で強力なサーボが必要です(ビデオの01:59)。
ほとんどのホビー用サーボには、標準コネクタに収められた3本のワイヤがあります。ビデオでは、賢い設計上の選択について説明しています。中央のワイヤは常に電源ワイヤ(VCC)であり、通常は5Vです。これは、コネクタが逆に差し込まれた場合に、デバイスを誤った極性から保護する安全機能です(ビデオの03:27)。他の2本のワイヤは、グランド(GND)と制御信号用です。
配線ガイド
サーボをArduinoに配線するのは簡単です。ビデオでは、接続の明確なデモンストレーションが提供されています(ビデオの04:48)。サーボコネクタの3つのピンは、次のようにArduinoに接続されます。
- 信号線(多くの場合オレンジまたは黄色): これをArduinoのデジタルPWMピンに接続します。この例ではピン9を使用しています。
- 電源線(多くの場合赤): これをArduinoの5Vピンに接続します。
- グランド線(多くの場合茶色または黒): これをArduinoのGNDピンの1つに接続します。
ビデオでは、発表者がオス-オスのデュポンジャンパーワイヤを使用して、サーボのメスコネクタをArduinoのピンヘッダに接続しています(ビデオの05:23)。
プログラム1:サーボモーターの制御(スイープ)
この最初のプログラムは、古典的な「スイープ」の例です。サーボを0度から180度の間で前後に動かすことで、サーボの全可動範囲を示すように設計されています。これは、配線が正しいことを確認し、サーボが動作しているのを確認するのに最適な方法です。ビデオでは、このコードをアップロードして、サーボが前後にスイープするのを見る様子が示されています(ビデオの09:21)。
サーボを制御するために、コードはまず組み込みのServo.hライブラリを含みます。これにより、必要な制御信号の生成プロセスが簡素化されます。次に、サーボオブジェクトを作成し、myservoのような名前を付けます。setup()関数では、myservo.attach(9)を使用してこのオブジェクトを特定のピンに接続し、サーボの信号線がピン9に接続されていることをArduinoに伝えます。
魔法はloop()関数で起こり、2つのforループを使用してサーボを動かします。最初のループは、位置変数posを0から180まで増分し、サーボを一度に1度ずつ動かします。2番目のループはその逆で、posを180から0に減分します。重要な部分は、各ループ反復の最後にあるdelay(15)です。この一時停止により、次のコマンドが送信される前に、サーボが新しい位置に物理的に移動するための十分な時間が与えられます。この遅延がないと、サーボは追いつかず、ストールしたりジッターしたりします(ビデオの12:31)。
この例は学習に最適ですが、実際のアプリケーションでは、サーボを特定の角度に設定したい場合がほとんどです。ビデオで示されているように、forループをmyservo.write(90)のような単一のコマンドに置き換えて、サーボを90度に動かしてそこに保持するようにコードを変更できます(ビデオの10:09)。
プログラム2:サーボモーターの制御(ノブ)
この2番目のプログラムは、ポテンショメータ(ノブ)を導入してサーボの位置をリアルタイムで手動制御できるようにすることで、サーボ制御をさらに一歩進めます。これは、アナログ入力がどのように正確な物理的な動きに変換されるかを理解するための素晴らしい方法です。
このプログラムは、前回のプログラムにポテンショメータを追加したものです。ポテンショメータは、アナログ電圧分圧器として機能する可変抵抗器です。つまみを回すと、出力ピンの電圧が変化します。Arduinoは、アナログピンの1つにあるアナログ-デジタルコンバータ(ADC)を使用してこの電圧を読み取り、0から1023の間の値に変換します。
このプログラムの鍵となるのは、map()関数です。この関数は、数値をある範囲から別の範囲にスケーリングします。この場合、ポテンショメータの生の値(0から1023)をサーボに適した値(0から180度)に変換するために使用されます。コードは、analogRead(potpin)でポテンショメータの値を読み取り、map(val, 0, 1023, 0, 180)を使用してスケーリングし、そのスケーリングされた値をmyservo.write(val)でサーボに送信します。これにより、つまみを中間点まで回すとサーボが90度に位置するなど、直接的なリンクが作成されます。
この制御方法は非常に直感的であり、単純なリモコンから複雑なロボットコントローラまで、多くの人間と機械のインターフェースの基盤となっています。
ライブプロジェクトデモンストレーション
ビデオでは、両方のプログラムのライブデモンストレーションが提供されています。スイーププログラムでは、サーボアームが0度から180度まで滑らかに動き、再び戻る様子を見ることができます。発表者はまた、forループ内のステップサイズ(例:1度から20度)と遅延時間を調整することで、サーボの動作がどのように変化し、動きが速くなるが滑らかさが失われるかを示しています(ビデオの11:19)。
ノブプログラムでは、ポテンショメータを回すことでサーボの位置がリアルタイムで直接制御される様子が示されています。この視覚的なフィードバックは、アナログ入力と物理的な出力の関係を理解するのに最適です。
チャプター
- [00:00] サーボモータの紹介
- [01:07] サーボモータの応用
- [02:57] サーボモータの構造
- [04:48] サーボをArduinoに配線する
- [06:06] スイープのサンプルコードの解説
- [09:21] スイーププログラムのデモンストレーション
- [10:04] カスタムサーボ角度の設定
- [11:19] スイープ速度とステップサイズの変更
- [13:15] 別のサーボモータの例
/*
Lesson 18/31: Controlling servo motor (sweep)
Get this code and watch video Download and resource page https://robojax.com/RJT601
YouTube video https://www.youtube.com/watch?v=KAt1WUWpHLQ
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Servo.h>
Servo myservo; // create Servo object to control a servo
// twelve Servo objects can be created on most boards
int pos = 0; // variable to store the servo position
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the Servo object
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15 ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15 ms for the servo to reach the position
}
}
/*
Lesson 18/31: Controlling servo motor (knob)
Get this code and watch video Download and resource page https://robojax.com/RJT601
YouTube video https://www.youtube.com/watch?v=KAt1WUWpHLQ
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}
Common Course Links
Common Course Files
必要かもしれないもの
-
アマゾンSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
アマゾン
-
アマゾン
-
アマゾン
リソースと参考文献
-
ドキュメンテーションSunFounder 3 in 1 IoT/スマートカー/学習キットのドキュメントdocs.sunfounder.com
-
外部SunFounderの3-in-1スマートカー学習キットを購入するsunfounder.com
ファイル📁
Arduinoライブラリ(zip)
-
SunFounderの3-in-1スマートカー学習キットソースコード
3in1-kit-main-v2.zip12.80 MB