レッスン89:連続回転または360度サーボモーターの使用|Arduinoステップバイステップコース
標準的なサーボのように前後にスイープするだけでなく、モーターを好きなだけどちらかの方向に回転させたいと思ったことはありませんか?これはまさに、連続回転サーボまたは360度サーボモーターが提供する機能です。特定の角度(通常は0〜180度)に動く標準的なサーボとは異なり、連続サーボは時計回りまたは反時計回りのどちらの方向にも無限に回転します。そのため、小型ロボット、カメラプラットフォーム、または連続回転制御が必要なあらゆるプロジェクトの構築に最適です。
このプロジェクトでは、3つのプッシュボタンだけを使用して360度サーボの制御システムを構築します。サーボを時計回り、反時計回りに回転させたり、いつでも停止させたりすることができます。このガイドでは、配線方法を説明し、コードのユーザー設定可能な部分を解説し、システムの動作のライブデモンストレーションを紹介します。
独自のプロジェクトで連続サーボを使用するための実用的なアイデアをいくつか紹介します:
- 小型二輪ロボットを構築する: 2つの連続サーボを使用して車輪を駆動し、前進、後進、旋回動作を可能にします。
- パン・チルトカメラマウントを作成する: 1つの連続サーボを使用して、防犯カメラや野生動物カメラをゆっくりと無限にパンします。
- コンベアベルトを自動化する: 小型コンベアシステムを制御して、物品の仕分けや排出を行います。
- 回転ディスプレイスタンドを設計する: 3Dモデルや製品を連続回転するプラットフォーム上に展示します。
必要なハードウェア
- Arduinoボード(Uno、Nanoなど)
- 連続(360度)サーボモーター(例:FS90R、DS04-NFC)
- プッシュボタン 3個
- ジャンパーワイヤー
- ブレッドボード
配線ガイド
このプロジェクトの配線は簡単です。サーボモーターには3本のワイヤーがあります:通常、アース(GND)用の暗い色のもの、電源(5V)用の中央のもの(多くの場合赤)、そして信号用の明るい色のもの(オレンジ、黄色、または白)です。ビデオで示されているように、サーボは次のようにArduinoに配線されます:
- サーボのアース(暗いワイヤー): ArduinoのGNDに接続します。
- サーボの電源(中央/赤いワイヤー): Arduinoの5Vに接続します。
- サーボの信号(明るいワイヤー): Arduinoのピン9に接続します。
3つのプッシュボタンについて、各ボタンには2つの側面があります。すべてのボタンの片側は互いに接続され、ArduinoのGNDに接続されます。各ボタンのもう一方の側は、以下に説明するように、個別のデジタルピンに接続されます(ビデオの03:40で説明):
- 時計回り(CW)ボタン: Arduinoのピン2に接続します。
- 停止ボタン: Arduinoのピン3に接続します。
- 反時計回り(CCW)ボタン: Arduinoのピン4に接続します。

コードの説明
コードは簡単に設定できるように設計されています。調整が必要な最も重要な部分は、サーボの動作を制御するために送信される特定のPWM値を保持するsc[]配列です。これらの値は普遍的ではなく、特定のサーボモーターに合わせて較正する必要があります(ビデオの12:23で説明)。
int sc[]={106, 58, 0};// サーボコマンドは順番に
//CCW、STOP、CW
この配列は較正の核心です。値は次の順序で使用されます:
- sc[0] = 106: この値はサーボを反時計回りに回転させるために送信されます。
- sc[1] = 58: これは「停止」値です。内部回路のため、モーターを正確に停止させる値は異なります。このコマンドを送信してもサーボがゆっくり回転し続ける場合があり、モーターの真の「完全停止」値を見つけるためにこの数値をわずかに調整する必要があります。
- sc[2] = 0: この値はサーボを最大速度で時計回りに回転させます。
sc[]配列の値を調整して、回転速度を変更できます。例えば、sc[0]を70に設定すると、反時計回りの回転が遅くなります。値が「停止」値(58)に近いほど、その方向のモーターの回転は遅くなります。58から離れた値は、最大限界まで速度を上げます。
変更が必要な他の重要な変数もいくつかあります。servoPinは9に設定されており、ArduinoのPWM対応ピンである必要があります。ボタンピンはコードの先頭で定義されており、必要に応じて変更できます。
int servoPin = 9;// このピンはPWM ~のあるもののいずれかである必要があります
#define STOPpin 3 // 停止用プッシュボタンピン
#define CWpin 2 // 時計回り用プッシュボタン
#define CCWpin 4 // 反時計回り用プッシュボタン
最後に、scText[]配列は、デバッグ用にシリアルモニターに出力される文字列を保持します。異なるメッセージを表示したい場合は、これらを変更できます。
コードの使用方法
提供されたコードをArduinoボードにアップロードします。シリアルモニター(9600ボーに設定)を開いて、ステータスメッセージを確認します。3つのボタンを使用してサーボを制御できるようになりました:
- CWボタンを押し続ける: サーボが時計回りに回転し始めます。シリアルモニターに「CW」と送信されている値が表示されます。
- CCWボタンを押し続ける: サーボが反時計回りに回転し始めます。シリアルモニターに「CCW」と送信されている値が表示されます。
- 停止ボタンを押す: サーボが停止しようとします。シリアルモニターに「Stop」と表示されます。
停止ボタンを押してもサーボが完全に停止しない場合は、sc[] 配列内の sc[1] の値を調整する必要があります。値を少し変更し(例:58から54や52へ)、モーターが完全に静止するまでコードを再アップロードしてみてください。
ライブデモンストレーション
ビデオでは、発表者が完全なシステムを実演しています。ボタンを押すことでサーボが両方向に回転する様子が見られます。また、シリアルモニタの出力も表示され、現在の状態(「CW」「Stop」「CCW」)とサーボに送信されている具体的な値が示されています。これは、デバッグや特定のモーターに最適なキャリブレーション値を見つけるための優れたツールです。デモでは、sc[] 配列の値を調整することで、モーターの速度が低速の動きから最大回転速度まで直接変化することも示されています。
結論
このプロジェクトは、連続回転サーボモーターを制御するためのシンプルで効果的な方法を提供します。「停止」値のキャリブレーションプロセスを理解することで、独自のロボット工学や自動化プロジェクトで正確な制御を確保できます。
ビデオチャプター
- [00:05] 連続回転サーボモーターの紹介
- [02:02] サーボのハードウェア概要
- [02:40] 配線図と接続
- [05:07] コード解説:変数とセットアップ
- [08:03] コード解説:メインループのロジック
- [09:56] servoCommand() 関数
- [10:54] ライブデモンストレーションとシリアルモニタ出力
- [12:23] サーボ速度と停止値のキャリブレーション
++
/*
* S05-13 Servo with 3 push buttons
* Demonstration of Controlling a Continuous Servo (360 servo)
* This code allows you to control a 360-degree servo using push buttons
*
* Modified by Ahmad Shamshiri for Robojax Robojax.com
* on Jan 17, 2019 at 22:42 in Ajax, Ontario, Canada
Watch the video instruction for this sketch: https://youtu.be/hVe4TSRV4ww
Watch Introduction to 360 Servo video with code: https://youtu.be/b_xvu6wWafA
You can get the wiring diagram from my Arduino Course at Udemy.com
Learn Arduino step by step with all libraries, codes, and wiring diagrams all in one place
visit my course now http://robojax.com/L/?id=62
If you found this tutorial helpful, please support me so I can continue creating
content like this.
or make a donation using PayPal http://robojax.com/L/?id=64
Original code by BARRAGAN <http://barraganstudio.com>
*
* Code is available at http://robojax.com/learn/arduino
* 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 downloaded 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 servoPin = 9;// this pin must be one of those with PWM ~
#define STOPpin 3 // push button pin for STOP
#define CWpin 2 // push button for CW
#define CCWpin 4 // push button for CCW
int sc[]={106, 58, 0};// servo commands are in order
//CCW, STOP,CW
String scText[]={"CCW","Stop","CW"};// define texts for 3 actions
int statusText;
int CWBS, CCWBS, SBS;
//CW button status (CWBS)
//CCW button status (CCWBS)
//stop button status (SBS)
void setup() {
Serial.begin(9600);
pinMode(STOPpin,INPUT_PULLUP);// set pin for push button STOP
pinMode(CCWpin,INPUT_PULLUP);// set pin for push button CCW
pinMode(CWpin,INPUT_PULLUP);// set pin for push button CW
myservo.attach(servoPin); // attaches the servo on pin 9 to the servo object
myservo.write(sc[1]);// send STOP command
statusText=1;// initial value is STOP
}
void loop() {
CCWBS = digitalRead(CCWpin);// read status of button CCW
SBS = digitalRead(STOPpin);// read status of button STOP
CWBS = digitalRead(CWpin);// read status of button CW
if(CCWBS ==LOW)
{
servoCommand(0);
}else if(SBS ==LOW)
{
servoCommand(1);
}else if(CWBS ==LOW)
{
servoCommand(2);
}
Serial.println(scText[statusText]);
delay(50);
}// loop
void servoCommand(int n)
{
statusText = n;
myservo.write(sc[n]);
Serial.print("Going to ");
Serial.print(scText[n]);
Serial.print( "(");
Serial.print(sc[n]);
Serial.println(")");
}
必要かもしれないもの
-
アマゾン360 Degree Servo motor on Amazonlink.amazon
-
イーベイ360 Degree Servo motor on eBayebay.us
-
アリエクスプレス360 Degree Servo motor on AliExpresss.click.aliexpress.com
-
アリエクスプレス360 Degree Servo motor on AliExpress-2s.click.aliexpress.com
リソースと参考文献
-
内部
ファイル📁
他のファイル
-
SG90 Seroo モーターのデータシート
robojax-servo-SG90_datasheet.pdf0.12 MB