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でも同じ動作を試します。最後に、このサーボで位置制御ができない理由と、代わりに何を選ぶべきかを説明します。

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、オレンジは信号 |
FS90Rの配線:Arduino Uno、ESP32、Pico
| サーボの配線 | 役割 | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| 茶色 | GND | GND | GND | GND |
| 赤 | 電源4.8〜6 V | 5V(サーボ1個)または外部5 V電源 | VIN / 5Vまたは外部5 V電源 | VBUS(5 V)または外部5 V電源 |
| オレンジ | PWM信号 | D9 | GPIO 18 | GP15 |
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 µs | write(0) | 最高速度、時計回り |
| 1300 µs | write(54) | 中速、時計回り |
| 1461 µs | write(83) | ごく低速、時計回り |
| 1500 µs | write(90) | 停止(半固定抵抗が正しく調整されている場合) |
| 1538 µs | write(97) | ごく低速、反時計回り |
| 1700 µs | write(126) | 中速、反時計回り |
| 2000 µs | write(180) | 最高速度、反時計回り |
最初のスケッチ:前進、停止、後退
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とは?、通常のサーボによる角度制御はサーボモーターとは?で説明しています。
停止点(中央)調整用の半固定抵抗を調整する
- 下のキャリブレーション用スケッチを書き込みます。サーボには1500 µsの信号が送られ、通常は停止するはずです。
- サーボがゆっくり回る場合は、ケース側面のケーブル出口近くにある小さな穴を探してください。中に停止点を調整する半固定抵抗があります。
- 小さなマイナスドライバーまたはプラスドライバーで半固定抵抗をほんの少し回します。サーボの回転が遅くなれば、正しい方向に回しています。
- サーボが完全に停止し、かすかなうなり音も消えるまで、少しずつ調整します。半固定抵抗は非常に敏感で、4分の1回転でも回しすぎです。
- 半固定抵抗に触れたくない場合は、シリアルモニタから+と-を送ってサーボが停止するパルス幅を探し、コード内の1500の代わりにその値を使ってください。
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}ポテンショメーターで速度と回転方向を制御する
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に下がります。
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でロボットカーを作るを参照してください。
ESP32でFS90Rを使う
ArduinoのServoライブラリはESP32では動作しないため、代わりにライブラリマネージャからESP32Servoライブラリをインストールしてください。使い方はほぼ同じですが、setPeriodHertz(50)で50 Hzを明示的に指定します。PWMを出力できるGPIOなら、ほぼどれでも信号に使えます。入力専用のGPIO 34〜39だけは使えません。サーボの赤い線は3V3ピンではなく、ESP32のVIN(USBの5 V)ピンか外部5 V電源につないでください。下のコードは停止状態から最高速度まで滑らかに加速し、その後減速して逆回転させます。シリアルモニタには各段階のパルス幅が表示されます。
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の基本を読んでください。
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を購入するほうが手間がかかりません。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
サーボモーターの使い方
小型サーボモーターのアームが、一方の端、中央、もう一方の端の3つの位置へ順番に回り、それぞれの位置で2秒間止まります。Arduinoが保持する角度をモーターに指示すると、モーターはその位置まで動いて止まります。ロボットアームや自動開閉するふたが動く仕組みを学べます。

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

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

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

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

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

障害物回避ロボット
自分で進む道を見つける、賢い車を作ってみませんか?障害物回避ロボットは、前面の超音波センサーで周囲を常に調べます。障害物を見つけると停止し、サーボモーターで左右を確認して、最も障害物の少ない方向を選んで進みます。自動運転の基礎を学ぶのにぴったりの入門プロジェクトです。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

