Arduinoでサーボモーターを動かす|パルス幅での角度指定、電源の分け方と震えるときの直し方
ボリュームの値を読んで、狭い範囲の角度へ変換する
可変抵抗はArduino側の電源へつなぎます
ボリュームは、つまみの位置を電圧として読み取る可変抵抗です。例えば10kΩ程度の直線的に変化するものを使い、両端をArduino側の5VとGND、中央の端子をA0へつなぎます。端子配置は部品の資料で確認します。入力の上限電圧を超えないよう、サーボの外部電源のプラスからは給電しません。
3.3V系のボードなら、入力上限に合う電源と読み取り範囲へ変更が必要です。analogReadの最大値も必ずしも1023ではありません。配線と分圧の仕組みを先に確認したい場合は、Arduinoで可変抵抗を読む|analogReadと分圧のしくみ、map()でLEDの明るさを変えるまでが参考になります。
次の例ではA0を8回読んで平均し、0〜1023を指令値60〜120へ変換します。つまみを端まで回しても、サーボの全可動域を使わない設定です。コードは前の二例とは別のスケッチとして使い、setupやloopを重ねて貼り付けないでください。
#include <Servo.h>
Servo servo;
const int SERVO_PIN = 9;
const int POT_PIN = A0;
const int MIN_ANGLE = 60;
const int MAX_ANGLE = 120;
int lastAngle = 90;
void setup() {
servo.attach(SERVO_PIN, 1000, 2000);
servo.write(lastAngle);
}
void loop() {
long sum = 0;
for (int i = 0; i < 8; ++i) {
sum += analogRead(POT_PIN);
}
const int raw = sum / 8;
int target = map(raw, 0, 1023, MIN_ANGLE, MAX_ANGLE);
target = constrain(target, MIN_ANGLE, MAX_ANGLE);
if (target >= lastAngle + 2 || target <= lastAngle - 2) {
lastAngle = target;
servo.write(lastAngle);
}
delay(20);
}
mapは数値の範囲を対応付ける関数で、範囲外の入力を自動で切り詰める機能はありません。そのため、最後にconstrainで指令の範囲を制限しています。平均の合計はlongで持ち、読み取り値を足す処理の余裕を確保しました。電源の雑音などで値がわずかに揺れる場合に備え、前回から2以上変わったときだけ指令を更新します。
平均と更新のしきい値には、使い分けがあります
平均はばらつきをならし、しきい値は無視する変化の大きさを決めます。この例では1だけの変化は送られません。細かな操作への反応を優先するなら、配線と電源を安定させてから値を見直します。
8回の連続読み取りでは、ゆっくり変動する電源の揺れを十分に抑えられない場合もあります。平均回数を増やす前に、A0の接触、GND、電流の戻り道を確認します。指令値を表示すれば、入力の揺れとサーボ自体の震えを分けやすくなります。
つまみを急に回すと目標も大きく変わります。ゆっくり追い掛けさせるなら、目標と出力中の指令を別の変数に持ち、前のページの時間管理で一段ずつ近づけます。雑音を抑える処理と速さを制限する処理は分けて調整します。
震える・唸る・リセットする症状を切り分ける
固定指令、無負荷、一台の状態へ戻します
症状が出たら電源を切り、機構やボリューム入力を外して中央付近の固定指令へ戻します。サーボ一台、短い配線、確認できた外部電源で、変える条件を一つに絞ります。
| 症状 | 考えられる原因 | 最初の対処 |
|---|---|---|
| 小刻みに震える | 入力値の揺れ、接触不良、電源や信号の乱れ | 固定指令へ戻し、共通GNDと配線を確認 |
| 停止中に強く唸る | 重い負荷、機構の干渉、位置を保つための過大な負担 | 電源を切り、負荷を外して取り付けを確認 |
| 端でガリガリ鳴る | 可動域の端への押し付け、ギアの損傷 | 直ちに電源を切り、範囲を狭め、損傷品は交換 |
| 動き始めにArduinoが再起動する | 電圧低下、共通配線の抵抗、電源の保護動作 | サーボの給電経路と電流容量を見直す |
| 動かず、異常な発熱やにおいがある | 逆接続、拘束、内部故障など | 電源を切り、冷めてから配線と仕様を確認 |
| 位置に止まらず回り続ける | 連続回転型の使用、製品の取り違え | 電源を切って型式と制御方式を確認 |
表は原因の候補で、故障の確定には使えません。小さな補正音が出ることはありますが、強い唸りや発熱は放置しないでください。中央の無負荷でも異常が続く場合はメーカーへ相談するか、正常な部品へ交換します。
起動時のリセットは、繰り返し方にも注目します
起動直後に動いて再起動することを繰り返す場合は、始動電流による電圧低下が疑われます。待ち時間の変更では給電の問題は解消しません。マイナス側の細い線を長く共有しても電位が変動するため、電流の戻り道も見直します。
電源の表示が消える、保護が作動する場合は、単なる容量不足だけでなくショートも候補です。電流制限を上げて押し切らず、電源を切って極性、むき出しの導体、ブレッドボードの列のつながりを確かめます。電源を分けた途端に動かなくなったなら、GNDの共通接続の抜けも確認します。
電圧はサーボの接続点に近い場所で、適切な測定レンジを使って測ります。普通のテスターでは瞬間的な電圧低下を捉えられない場合もあります。電流レンジで電源の両端を測ると短絡になるため、方法に不安があれば詳しい人に確認を頼みます。
機構と複数台の設計は、力と電流から考える
可動域は、機械の端へ当てて探しません
資料にある範囲の内側で、中央から少しずつ指令を変えます。音が出るまで動かして限界を探す方法は避けます。ホーンの向きやリンクの長さによって機構が先に突き当たる場合もあり、組み付け後の確認も必要です。端から余裕を残した値をコードの上下限にします。
ホーンは中央指令での位置を確認し、電源を切ってから製品の方法に従って固定します。軸の溝へ無理に押し込んだり、手で軸を回して合わせたりしないでください。電源が切れていても、逆向きの力でギアを傷める場合があります。
小型DCモーター単体は、外側の回路で電流のオン・オフなどを制御します。RCサーボには内部に制御回路があるため、三本のうちの信号線へ指令を送ります。モーター単体を扱うトランジスタのスイッチ回路|Arduinoでモーターや多くのLEDを動かす、ベース抵抗の決め方の配線を、そのままサーボの三本線へ置き換えないようにします。
台数を増やす前に、拘束時電流を確認します
電源の見積もりには、待機時の小さな電流だけを使いません。資料で動作中や拘束時の電流を調べます。拘束時電流は、軸が回れない状態でモーターが駆動されるときの電流で、電源と配線の負担を考える手がかりです。数値を測るために手で軸を止める実験はせず、メーカーの条件付きの値を使います。
同時に力を出す場合は、同じ電圧条件で各台の拘束時電流を合計し、ほかの負荷と余裕も含めて検討します。これは設計の出発点で、常にその値だけで決められるわけではありません。必要電流が不明なら外形から推測せず、仕様の分かる部品を選びます。
細いジャンパー線やブレッドボードの接点へ、大きな電流をまとめて流してはいけません。電流に合う配線、分配端子、保護を用意します。電源とGNDを分配点から各台へ配り、ArduinoのGNDもそこへつなぎます。配線用品の定格が不明なら使用を止めて確認します。

起動をずらすと始動時の負担を減らせる場合もありますが、同時に保持する負荷や故障への備えは必要です。信号が出る順番とモーターへ電流が流れる時間は一致せず、信号が順番に出ても電流が一台分に収まるとは限りません。
連続回転型と、信号を止めた後の動きも区別します
一般的な連続回転型は、中央付近のパルス幅が停止、その前後が回転方向と速さに対応します。write(90)で特定の角度へは向かわず、停止値にも個体差があります。調整は製品の資料に従います。連続回転型サーボの解説でも、位置制御との違いを確認できます。
detachでも給電は残り、信号がなくなった後の動作は製品によって異なります。自重で動く可能性もあるため、電源を切っても安全な構造にします。角度の上下限、中央のパルス幅、機構の向き、電源条件をメモすれば、部品交換後も同じ条件から確認できます。
まとめ
サーボは信号、電源、軸へかかる力をそれぞれ確かめます。約20ms周期のパルス幅が位置を伝え、Servoライブラリは角度の数値を時間幅へ変換します。実際の可動角はその数値と一致するとは限らず、電源容量にも始動時と保持中の負担を含めます。
初回は、製品の資料で電圧・配線・対応パルス幅を確認し、外部電源と共通GNDで一台だけを接続します。中央付近の固定位置と小さな往復が落ち着いてから、ゆっくりした移動、ボリューム入力、機構の取り付けへ進みます。まずは手元のサーボの資料を開き、三本線の役割と、中央位置に使うパルス幅をメモするところから始めてください。
よくある質問
小型サーボ一台ならArduinoの5Vピンから給電できますか?
軽い負荷で動く場合はありますが、動き始めや位置を保つときの電流で電圧が下がり、リセットすることがあります。初めての実験でも、サーボの仕様に合う外部電源を使い、ArduinoとはGNDを共通にする構成から始めると原因を分けやすくなります。
サーボはPWM端子につながないと動きませんか?
対応ボードでServoライブラリを使う場合、通常はPWMの印がないデジタル端子も信号出力に使えます。analogWriteでLEDを調光する信号とは扱いが違うため、ボードとライブラリが対応する端子を公式資料で確認してください。
write(90)とwriteMicroseconds(1500)は同じですか?
attachで1000〜2000マイクロ秒を指定した場合、write(90)はその中央付近のパルス幅になります。設定によって対応は変わり、どちらも実際の軸が正確に90度になったと確認する命令ではありません。
サーボが震えたり、端でガリガリ鳴ったりしたらどうしますか?
まず電源を切り、機構の引っ掛かりや可動域の端への押し付けがないか確かめます。負荷を外して中央付近の固定指令でも震える場合は、電源、共通GND、配線、信号の順に切り分け、異常が続くサーボは使い続けないでください。
連続回転型サーボも角度を指定して止められますか?
一般的な連続回転型では、パルス幅が回転方向と速さの指令に対応し、通常の位置制御型のようには角度を指定できません。中央付近が停止に対応することが多いものの個体差があり、停止値や調整方法は製品の資料を確認します。










コメント
まだコメントはありません。最初の感想をどうぞ。