部品 · 読了まで10分

360度サーボ(FS90R):Arduinoで速度と回転方向を制御

360度サーボFS90Rはどのように動くのでしょうか。write(90)による停止、速度と回転方向の制御、停止位置を調整する半固定抵抗、ロボットの車輪としての使い方、ESP32とPicoのPWMコードを紹介します。

360度サーボはサーボという名前ですが、実際には特定の角度まで動いて停止するのではなく、回転し続ける小型のギヤードモーターです。よく知られているのがFEETECHのFS90Rです。SG90と同じ大きさで、同じ3本の配線を使いますが、送る信号が指定するのは角度ではなく回転速度と方向です。モータードライバなしでArduinoのピンに直接接続できるため、小型ロボットの車輪、回転台、ペット用自動給餌器などのプロジェクトに便利です。

このガイドでは、FS90Rの内部が通常のサーボとどう違うのか、write(90)命令でモーターが停止する理由、パルス幅で速度と方向を設定する方法、ゆっくり回り続けてしまうサーボを停止点調整用の半固定抵抗で調整する方法を学びます。続いて、FS90Rを2個使った小型ロボットを走らせ、ポテンショメーターで速度を制御し、ESP32とRaspberry Pi Picoでも同じ動作を試します。最後に、このサーボで位置制御ができない理由と、代わりに何を選ぶべきかを説明します。

FS90R 360度連続回転サーボ
FS90R連続回転サーボはSG90と同じ大きさで、重さは9グラムです。信号が指定するのは角度ではなく、回転速度と方向です。

360度サーボとは?通常のサーボとの違い

通常のサーボには、小型DCモーター、ギヤボックス、制御回路、出力軸につながったポテンショメーターが入っています。制御回路は、入力パルスが指定する角度とポテンショメーターで読み取った実際の角度を比較し、差がゼロになるまでモーターを回します。軸が目標に到達すると停止します。連続回転サーボでは、このフィードバックのつながりが切られています。ポテンショメーターは軸から切り離され、中央位置で固定されており、ギヤの機械的なストッパーも取り除かれています。回路は引き続き「目標位置と実際の位置との差」を計算しますが、実際の位置として読み取る値が変わらないため、差が埋まりません。その結果、差が大きいほどモーターが速く回り、差の符号によって回転方向が決まります。

項目SG90(180°サーボ)FS90R(360°連続回転)
信号が指定するもの軸の角度(0〜180°)回転速度と方向
1500 µsのパルス中央(90°)に移動し、その位置を保つ停止する
1000 µs / 2000 µs一方の端または反対の端に移動する一方または反対の方向に最高速度で回転する
内部のフィードバック軸につながったポテンショメーターなし。ポテンショメーターは停止点の調整のみ
機械的なストッパーありなし。回転し続ける
位置の保持負荷がかかっても角度を保つ不可。停止した位置を把握できない
主な用途アーム、ふた、操舵車輪、回転台、スクリューフィーダー

FS90Rの仕様

項目値
動作電圧4.8〜6 V
無負荷時の回転速度4.8 Vで約100〜110 rpm、6 Vで約130 rpm
ストールトルク4.8 Vで約1.3 kg·cm、6 Vで約1.5 kg·cm
電流無負荷時は100〜130 mA、6 Vでストールした場合は最大800 mA
制御信号50 HzのPWM。1500 µsで停止、使用範囲は約900〜2100 µs
信号レベル5 Vと3.3 Vの信号に対応
回転方向1500 µsより長い場合は一方に、短い場合は反対に回転(出力軸側から見て、1500 µsより長い場合は反時計回り)
重量と寸法9 g、約23 × 12 × 22 mm(SG90と同じ筐体)
配線茶色はGND、赤はVCC、オレンジは信号
販売店が「360度サーボ」と呼ぶ製品のすべてが、連続回転サーボとは限りません。0〜360°(または0〜270°)の範囲で位置を保持するサーボもあります。これらはFS90Rのように回転し続けるのではなく、指定した角度まで動いて停止します。製品説明に連続回転と書かれているか確認してください。また、手で押さえたり障害物に当たったりしてFS90Rが長時間ストールしたまま無理な力がかかると、モーターやプラスチック製ギヤが壊れます。

FS90Rの配線:Arduino Uno、ESP32、Pico

サーボの配線役割Arduino UnoESP32Raspberry Pi Pico
茶色GNDGNDGNDGND
赤電源4.8〜6 V5V(サーボ1個)または外部5 V電源VIN / 5Vまたは外部5 V電源VBUS(5 V)または外部5 V電源
オレンジPWM信号D9GPIO 18GP15

FS90Rを1個、無負荷で動かす場合はUnoの5Vピンで十分です。サーボの車輪が地面に接したり、2個のサーボが同時に動き始めたりすると、電流は数百ミリアンペアに跳ね上がります。USBの電圧が低下し、Arduinoがリセットされたり、サーボが震えたりすることがあります。そのため、ロボットではサーボに別の5 V電源(NiMH電池4本、5 Vレギュレーター、または適切な電源)から給電してください。サーボ用電源のGNDは必ずArduinoのGNDにつなぎ、サーボの配線の近くに470 µFのコンデンサを追加します。ESP32とPicoの3.3 V信号でFS90Rを制御できますが、サーボ自体は3.3 Vピンではなく5 Vから給電する必要があります。

write(90)=停止:パルス幅はどのように速度に変わる?

サーボの制御信号は1秒に50回(20 msごと)送られるパルスで、重要なのはパルスの長さです。FS90Rでは1500 µsが「停止」を意味します。パルスが1500 µsより長くなるほど一方の方向に速く回り、短くなるほど反対方向に速く回ります。約1000 µsと2000 µsで最高速度に達し、それを超えても速度はほとんど上がりません。このため、ArduinoのServoライブラリではwrite(90)が停止、write(0)とwrite(180)がそれぞれの方向への最高速度を意味します。ただし、小さな落とし穴があります。ライブラリはデフォルトで0〜180を544〜2400 µsの範囲に変換するため、write(90)が実際に出力するのは1472 µsです。この差だけでも、write(90)でサーボがゆっくり回ってしまうことがあります。対策は、attach(9, 1000, 2000)で範囲を狭めるか、writeMicroseconds(1500)を直接使うことです。

パルス幅対応するServo.write(attach(pin, 1000, 2000)を使用)FS90Rの動作
1000 µswrite(0)最高速度、時計回り
1300 µswrite(54)中速、時計回り
1461 µswrite(83)ごく低速、時計回り
1500 µswrite(90)停止(半固定抵抗が正しく調整されている場合)
1538 µswrite(97)ごく低速、反時計回り
1700 µswrite(126)中速、反時計回り
2000 µswrite(180)最高速度、反時計回り

最初のスケッチ:前進、停止、後退

C++ (Arduino IDE)
1// FS90R ilk test: ileri, dur, geri / FS90R first test: forward, stop, backward
2#include <Servo.h>
3
4Servo teker;                         // sürekli dönüş servosu / continuous rotation servo
5
6void setup() {
7  teker.attach(9, 1000, 2000);       // write(0..180) artık 1000..2000 µs üretir / write(0..180) now outputs 1000..2000 µs
8}
9
10void loop() {
11  teker.write(180);                  // tam hız bir yöne / full speed one way
12  delay(2000);
13  teker.write(90);                   // 1500 µs: dur / 1500 µs: stop
14  delay(1000);
15  teker.write(0);                    // tam hız ters yöne / full speed the other way
16  delay(2000);
17  teker.write(110);                  // yavaş / slow
18  delay(2000);
19  teker.writeMicroseconds(1500);     // durmanın en kesin yolu / the most precise way to stop
20  delay(1000);
21}

このスケッチではサーボをD9に接続し、attach(9, 1000, 2000)でwrite()の値をFS90Rが実際に使う範囲に対応させるため、write(90)がちょうど1500 µsになります。速度はパルス幅に比例して変化するわけではありません。1500 µsのすぐ近くにはサーボが動かない数十マイクロ秒の不感帯があり、1500 ± 300 µsの範囲では速度が急に上がり、両端に近づくとほぼ一定になります。ゆっくり精密に動かしたい場合は、1500 µsに近い値を使ってください。パルス幅の基本はPWMとは?、通常のサーボによる角度制御はサーボモーターとは?で説明しています。

停止点(中央)調整用の半固定抵抗を調整する

  1. 下のキャリブレーション用スケッチを書き込みます。サーボには1500 µsの信号が送られ、通常は停止するはずです。
  2. サーボがゆっくり回る場合は、ケース側面のケーブル出口近くにある小さな穴を探してください。中に停止点を調整する半固定抵抗があります。
  3. 小さなマイナスドライバーまたはプラスドライバーで半固定抵抗をほんの少し回します。サーボの回転が遅くなれば、正しい方向に回しています。
  4. サーボが完全に停止し、かすかなうなり音も消えるまで、少しずつ調整します。半固定抵抗は非常に敏感で、4分の1回転でも回しすぎです。
  5. 半固定抵抗に触れたくない場合は、シリアルモニタから+と-を送ってサーボが停止するパルス幅を探し、コード内の1500の代わりにその値を使ってください。
C++ (Arduino IDE)
1// Durma noktası ayarı: Serial Monitor'den µs değeri gönder
2// Stop point calibration: send a µs value from the Serial Monitor
3#include <Servo.h>
4
5Servo teker;
6int darbe = 1500;                    // başlangıç: teorik durma noktası / start: theoretical stop point
7
8void setup() {
9  Serial.begin(9600);
10  teker.attach(9);
11  teker.writeMicroseconds(darbe);
12  Serial.println(F("Sayi yaz (900-2100) ya da + / - gonder"));
13  Serial.println(F("Type a number (900-2100) or send + / -"));
14}
15
16void loop() {
17  if (Serial.available()) {
18    char c = Serial.peek();
19    if (c == '+') { Serial.read(); darbe += 5; }          // 5 µs artır / add 5 µs
20    else if (c == '-') { Serial.read(); darbe -= 5; }     // 5 µs azalt / subtract 5 µs
21    else if (isDigit(c)) darbe = Serial.parseInt();       // doğrudan değer / direct value
22    else { Serial.read(); return; }                       // satır sonu vb. atla / skip line endings etc.
23
24    darbe = constrain(darbe, 900, 2100);
25    teker.writeMicroseconds(darbe);
26    Serial.print(F("Darbe / pulse: "));
27    Serial.print(darbe);
28    Serial.println(F(" us"));
29  }
30}
停止点は電源電圧や温度によって数マイクロ秒ずれることがあります。電池が消耗すると再び少しずつ回り始めても、不思議ではありません。長時間完全に停止させたい場合は、detach()で信号を完全に切ることができます。信号がないFS90Rは停止し、ほとんど電流を消費しません。再び動かすときは、attach()を呼び出すだけです。

ポテンショメーターで速度と回転方向を制御する

C++ (Arduino IDE)
1// Potansiyometreyle hız ve yön: ortada dur, sağa ileri, sola geri
2// Speed and direction with a pot: centre = stop, right = forward, left = backward
3#include <Servo.h>
4
5const int POT_PIN = A0;
6const int OLU_BOLGE = 40;            // ortadaki ±40 adım: kesin dur / ±40 steps in the middle: solid stop
7Servo teker;
8
9void setup() {
10  teker.attach(9);
11}
12
13void loop() {
14  int okuma = analogRead(POT_PIN) - 512;                   // -512 ... +511
15  int darbe = 1500;                                        // varsayılan: dur / default: stop
16  if (okuma > OLU_BOLGE) {
17    darbe = map(okuma, OLU_BOLGE, 511, 1540, 2000);        // ileri, yavaştan hızlıya / forward, slow to fast
18  } else if (okuma < -OLU_BOLGE) {
19    darbe = map(okuma, -OLU_BOLGE, -512, 1460, 1000);      // geri / backward
20  }
21  teker.writeMicroseconds(darbe);
22  delay(20);                                               // servo periyodu kadar / one servo period
23}

ポテンショメーターを5V、A0、GNDに接続すると、中央位置で停止、右に回すと前進、左に回すと後退になります。コードでは中央に±40段階の不感帯を設けているため、ポテンショメーターが正確に中央になくても、読み取り値が少し揺れても、確実に停止します。不感帯の外では値を1540〜2000 µsまたは1460〜1000 µsに変換するため、つまみを少し回すと低速で回り、端まで回すと最高速度になります。同じ考え方をジョイスティックにも使えます。ポテンショメーターの配線はポテンショメーターとは?で説明しています。

FS90Rを小型ロボットの車輪に使う

FS90Rがロボットで人気なのは、構成がシンプルだからです。ギヤボックスと駆動回路を内蔵しているため、別のモータードライバ、Hブリッジ、エンコーダーは不要で、車輪1つにつき信号ピン1本で済みます。2個のサーボは車体の左右に鏡像になるよう取り付けるため、前進するには一方を時計回り、もう一方を反時計回りに回す必要があります。下のコードではsurus()関数の中でこの処理を行うので、-100〜+100の速度を指定するだけです。60 mmの車輪が6 Vで130 rpmで回転すると、1秒に約0.4メートル進みます。4.8 Vでは約0.3 m/sに下がります。

C++ (Arduino IDE)
1// İki FS90R ile küçük robot: tekerlekler ayna gibi takılır
2// A small robot with two FS90Rs: the wheels are mounted as mirror images
3#include <Servo.h>
4
5Servo sol, sag;
6const int DUR_SOL = 1500;            // kalibrasyonla bulduğun değerler / values you found during calibration
7const int DUR_SAG = 1500;
8
9// hiz: -100 (tam geri) ... +100 (tam ileri) / speed: -100 (full back) ... +100 (full forward)
10void surus(int hizSol, int hizSag) {
11  sol.writeMicroseconds(DUR_SOL + hizSol * 5);             // sol teker normal yönde / left wheel normal direction
12  sag.writeMicroseconds(DUR_SAG - hizSag * 5);             // sağ teker ters takılı / right wheel is mounted reversed
13}
14
15void setup() {
16  sol.attach(9);
17  sag.attach(10);
18  surus(0, 0);
19  delay(1000);
20}
21
22void loop() {
23  surus(80, 80);    delay(1500);     // ileri / forward
24  surus(0, 0);      delay(500);      // dur / stop
25  surus(-60, 60);   delay(600);      // yerinde sola dön / spin left in place
26  surus(60, 60);    delay(1000);
27  surus(30, 80);    delay(1500);     // sola doğru yay çiz / curve to the left
28  surus(-80, -80);  delay(1000);     // geri / backward
29  surus(0, 0);      delay(2000);
30}

2個のサーボがまったく同じ速度で回ることはありません。ロボットが直進せず片側にそれる場合は、それぞれの停止値(DUR_SOL、DUR_SAG)を個別にキャリブレーションし、速い側の係数を少し下げてください。FS90Rの1.5 kg·cmのトルクは、重さが数百グラム以下の小型ロボットに適しています。重い車体や大きな車輪には、L298Nで駆動するDCモーターやギヤードモーターのほうが向いています。電池で動かす場合、NiMH電池4本(4.8 V)が理想的な電圧です。新品のアルカリ電池4本は6.4 Vに達し、サーボの上限を超えることがあります。車体とセンサーを含む一式の製作は、Arduinoでロボットカーを作るを参照してください。

FS90Rでは位置制御ができません。内部に軸の位置を測る仕組みが残っていないため、「90度回って停止する」とは指示できません。「1秒間回す」といった時間による動作も、電池の電圧、負荷、温度によって毎回結果が変わります。特定の角度に動かす必要がある場合は通常のサーボ、精密に一定のステップで回す場合はステッピングモーターを使うか、車輪にエンコーダーを追加して回転数を数えてください。用途に応じたモーターの選び方は、DCモーター・サーボ・ステッピングモーターの違いで説明しています。

ESP32でFS90Rを使う

ArduinoのServoライブラリはESP32では動作しないため、代わりにライブラリマネージャからESP32Servoライブラリをインストールしてください。使い方はほぼ同じですが、setPeriodHertz(50)で50 Hzを明示的に指定します。PWMを出力できるGPIOなら、ほぼどれでも信号に使えます。入力専用のGPIO 34〜39だけは使えません。サーボの赤い線は3V3ピンではなく、ESP32のVIN(USBの5 V)ピンか外部5 V電源につないでください。下のコードは停止状態から最高速度まで滑らかに加速し、その後減速して逆回転させます。シリアルモニタには各段階のパルス幅が表示されます。

C++ (Arduino IDE)
1// ESP32 + FS90R: ESP32Servo kütüphanesiyle hız rampası
2// ESP32 + FS90R: a speed ramp with the ESP32Servo library
3#include <ESP32Servo.h>
4
5const int SERVO_PIN = 18;            // PWM verebilen herhangi bir GPIO / any PWM-capable GPIO
6Servo teker;
7
8void setup() {
9  Serial.begin(115200);
10  teker.setPeriodHertz(50);          // standart servo frekansı / standard servo frequency
11  teker.attach(SERVO_PIN, 1000, 2000);
12  teker.writeMicroseconds(1500);     // dur / stop
13  delay(1000);
14}
15
16void loop() {
17  for (int us = 1500; us <= 2000; us += 25) {   // yavaşça hızlan / speed up gently
18    teker.writeMicroseconds(us);
19    Serial.println(us);
20    delay(200);
21  }
22  for (int us = 2000; us >= 1000; us -= 25) {   // yavaşla, dur, ters yöne hızlan / slow down, stop, reverse
23    teker.writeMicroseconds(us);
24    Serial.println(us);
25    delay(200);
26  }
27  teker.writeMicroseconds(1500);
28  delay(2000);
29}

Raspberry Pi PicoとMicroPythonでFS90Rを使う

Picoでは追加のライブラリは不要です。machine.PWMオブジェクトを50 Hzに設定し、duty_ns()でパルス幅をナノ秒単位で指定します。コード内のhiz()関数は-100〜+100の値を1000〜2000 µsに変換します。DUR_USの行に、キャリブレーションで見つけた停止値を入れるだけです。Ctrl+Cでプログラムを止めたときには、サーボも停止させます。そうしないとPWMは最後の値で動作を続け、車輪が回り続けます。サーボにはPicoのVBUSピン(USBの5 V)から給電してください。MicroPythonが初めての場合は、先にMicroPythonの基本を読んでください。

MicroPython
1# Raspberry Pi Pico (MicroPython) + FS90R: hız -100 ... +100
2# Raspberry Pi Pico (MicroPython) + FS90R: speed -100 ... +100
3from machine import Pin, PWM
4import time
5
6servo = PWM(Pin(15))
7servo.freq(50)                        # 20 ms periyot / 20 ms period
8DUR_US = 1500                         # kalibrasyonla bulduğun durma noktası / your calibrated stop point
9
10def hiz(yuzde):
11    yuzde = max(-100, min(100, yuzde))
12    us = DUR_US + yuzde * 5           # -100 -> 1000 µs, +100 -> 2000 µs
13    servo.duty_ns(us * 1000)
14
15try:
16    while True:
17        for h in (50, 100, 0, -50, -100, 0):
18            hiz(h)
19            print("Hiz / speed:", h)
20            time.sleep(2)
21except KeyboardInterrupt:
22    hiz(0)                            # durdurunca teker dönmeye devam etmesin / stop the wheel on exit
23    servo.deinit()

360度サーボのプロジェクトアイデア

  • 小型ライントレースロボット:FS90Rを2個、赤外線センサーを2個搭載した軽い車体です。制御の考え方はライントレースロボットで説明しています。
  • 障害物を避けるロボット:前面にHC-SR04を追加し、障害物を検知するとその場で旋回して方向を変えます。
  • スマホで操作する車:HC-05 Bluetoothモジュールを使ってスマホから命令を送ります。
  • ペット用自動給餌器:FS90Rで搬送用のスクリューを回し、タイマーで設定した時刻にエサが落ちるようにします。
  • 展示用回転台:商品写真やタイムラプス撮影向けの、ごくゆっくり回る台です。1500 µsに近い値で速度を設定します。
  • 小型ウインチやカーテンの開閉装置:軽いひもを巻き取ります。両端に2個のリミットスイッチを設け、正しい位置でモーターを停止させます。

よくある問題と対処法

症状考えられる原因対処法
write(90)でもゆっくり回るデフォルトの変換範囲では1472 µsが出力される、または停止点調整用の半固定抵抗がずれているattach(pin, 1000, 2000)またはwriteMicroseconds(1500)を使い、半固定抵抗を調整する
サーボがまったく回らない信号ピンの間違い、GNDが共通でない、または実際には角度を指定するサーボピン番号とGNDの接続を確認し、連続回転サーボであることを確かめる
サーボが震え、ArduinoがリセットされるUSB電源が電流のピークに対応できない外部5 V電源からサーボに給電し、GNDを共通にして、470 µFのコンデンサを追加する
パルス幅を1000 µsから1200 µsに変えても、速度がほとんど変わらない範囲の両端付近ではすでに最高速度に達しており、速度が飽和している細かな速度制御には1500 ± 300 µsの範囲を使う
ロボットが直進しない2個のサーボで速度と停止点が異なる各サーボを個別にキャリブレーションし、速い側の係数を下げる
サーボが熱くなり、うなり音がするが回らない軸が動かないよう押さえられている、または負荷が重すぎる障害物を取り除き、負荷を軽くする。ストールするとギヤとモーターが壊れる
ESP32でコンパイルエラーが出る、または信号が出ないAVR専用のServoライブラリを使用している、またはGPIO 34〜39を選んでいるESP32Servoライブラリをインストールし、出力可能なGPIOを選ぶ

FS90Rは、モータードライバを使わず、ピン1本で回り続ける機構を制御する最も簡単な方法です。1500 µsで停止し、好みの速度で両方向に回転するため、小型ロボットの車輪用モーターとしてそのまま使えます。最初に停止点を調整し、位置制御が必要な用途では通常のサーボやステッピングモーターに切り替えることを忘れなければ、長く安定して使えます。BlueGraysアプリには、サーボの基本、ポテンショメーターやジョイスティックでのサーボ制御、ステッピングモーターから360度サーボを作る方法、ロボットカーのプロジェクトがあり、手順ごとの配線図とすぐ使えるコードを掲載しています。

よくある質問

360度サーボを停止させるには?

FS90Rのような連続回転サーボは、1500 µsのパルスを受け取ると停止します。ArduinoではwriteMicroseconds(1500)を使うか、attach(pin, 1000, 2000)で接続してからwrite(90)を使います。その値でもゆっくり回る場合は、ケースにある小さな半固定抵抗をドライバーで調整するか、実際にサーボが停止する値をコードに設定してください。

360度サーボと通常のサーボの違いは?

通常のサーボは、内部のポテンショメーターが軸の位置を測定するため、信号に応じて特定の角度まで動き、その位置を保持します。360度連続回転サーボにはこのフィードバックがありません。信号は角度ではなく速度と回転方向を指定し、サーボは回転し続けます。

360度サーボで角度制御はできますか?

できません。FS90Rは軸の位置を把握できないため、特定の角度まで動いて停止することはできません。一定時間回せばおおよその位置には動かせますが、結果は電圧や負荷によって変わります。角度を指定する必要がある場合は、通常のサーボ、ステッピングモーター、またはエンコーダー付きモーターを使ってください。

FS90Rは何Vで動作しますか?

FS90Rの動作電圧は4.8〜6 Vで、Arduinoのプロジェクトでは通常5 Vから給電します。信号線は5 Vと3.3 Vの両方に対応するため、ESP32やRaspberry Pi Picoに直接接続できますが、電源には引き続き5 Vが必要です。

ArduinoにはFS90Rを何個接続できますか?

ServoライブラリはArduino Unoで最大12個のサーボに対応していますが、実際の制約は電流です。FS90Rは1個につき、負荷がかかると数百ミリアンペア、ストール時には最大800 mAを消費します。2個を超えるサーボを使う場合は必ず外部5 V電源から給電し、GNDを共通にしてください。

SG90を360度サーボに改造できますか?

できますが、元に戻せない改造です。サーボを開けてギヤの機械的なストッパーを切り取り、ポテンショメーターを軸から切り離します。ポテンショメーターは同じ抵抗値の抵抗2本に置き換えるか、中央位置で固定します。FS90Rのように動作するようになりますが、保証は失われ、再び角度を保持することはできません。通常は完成品のFS90Rを購入するほうが手間がかかりません。

全プロジェクトを見る
サーボモーターの使い方
#35初級
プレミアム

サーボモーターの使い方

小型サーボモーターのアームが、一方の端、中央、もう一方の端の3つの位置へ順番に回り、それぞれの位置で2秒間止まります。Arduinoが保持する角度をモーターに指示すると、モーターはその位置まで動いて止まります。ロボットアームや自動開閉するふたが動く仕組みを学べます。

4.7(48)
67
ポテンショメーターでサーボモーターを操作
#36初級
プレミアム

ポテンショメーターでサーボモーターを操作

ポテンショメーターのつまみを回すと、サーボモーターのアームもそれに合わせて回ります。つまみの一方の端が0度、もう一方の端が半回転に対応します。Arduinoがつまみの位置を常に読み取り、サーボモーターが動きにすぐ反応します。ロボットアームや回転式カメラ台などのプロジェクトへの第一歩です。

4.6(37)
52
ESP32サーボモーター(ポテンショメーター制御)
#118中級
プレミアム

ESP32サーボモーター(ポテンショメーター制御)

このプロジェクトでは、ポテンショメーターでSG90サーボモーターを制御します。ポテンショメーターから読み取ったアナログ値を0~180度の範囲に変換し、サーボの角度を調整します。ESP32Servoライブラリは、ESP32の出力に対応した適切なGPIOでサーボ信号を生成します。このプロジェクトではGPIO 18を使います。ロボットアームやカメラ用ジンバル、自動ドアの機構に使われる基本的な制御方法です。

4.3(29)
42
ジョイスティックでサーボモーターを制御
#60中級
プレミアム

ジョイスティックでサーボモーターを制御

防犯カメラの向きを変えるように、ジョイスティックで2つのモーターを操作します。スティックを左右に倒すと下側のサーボモーターがゆっくり回り、上下に倒すと上側のサーボモーターが上下に傾きます。手を離すと、どちらもその位置で止まります。カメラやレーザーの台座など、2方向に動く装置の基礎を作ります。

4.7(42)
58
ステッピングモーターで作る360度サーボモーター
#68中級
プレミアム

ステッピングモーターで作る360度サーボモーター

普通のステッピングモーターを、1周の範囲で好きな角度へ動かせるようにします。Arduinoが各角度に必要なステップ数を計算し、モーターは0、90、45、180、135、360度へ順番に移動します。それぞれの位置で少し止まり、最初から繰り返します。通常は半回転の範囲に限られるサーボモーターの働きを、1周全体で実現する仕組みを作れます。

4.5(22)
32
L298Nで作るBluetooth操作の車
#80上級
プレミアム

L298Nで作るBluetooth操作の車

スマートフォンをリモコンにして、自作のロボットカーを操作できます。ArduinoはBluetoothモジュールを通じてスマートフォンのリモコンアプリから指令を受け取り、モータードライバーで車輪を回します。前進、後退、左右や斜めへの移動ができ、速度もスマートフォンから調整できます。停止ボタンを押すと、短いブレーキ動作でモーターがすぐに止まります。

5.0(38)
65
障害物回避ロボット
#81上級
プレミアム

障害物回避ロボット

自分で進む道を見つける、賢い車を作ってみませんか?障害物回避ロボットは、前面の超音波センサーで周囲を常に調べます。障害物を見つけると停止し、サーボモーターで左右を確認して、最も障害物の少ない方向を選んで進みます。自動運転の基礎を学ぶのにぴったりの入門プロジェクトです。

5.0(38)
49