Arduino UNO R4 MINIMAでSG90サーボモータを動かそうとしたらエラーが出て動かない、という経験はありませんか? UNO R3では問題なく動いていたのに、R4 MINIMAに切り替えたとたんにトラブルが発生するケースが報告されています。この記事ではその原因と具体的な解決方法を丁寧に解説します。
純粋なPython記事ではありませんが、「Pythonで顔認識してサーボモータでカメラを顔の方向へ向けたい」という制作過程でつまづいたトラブルを解決できましたので、同じ悩みを持つ方のために公開します。あくまで一つの解決策ですが、お役に立てれば幸いです。
実行環境
まず、本記事での動作確認環境を紹介します。
- OS:Windows 10 / 11
- Arduino IDE:2.2.1
- Arduino本体:UNO R4 MINIMA
- サーボモータ:SG90
- Python:3.11
上記は執筆時点での最新バージョンです。動作確認にはPythonのinput()メソッドからサーボの回転角度を指示するスクリプトを使用しています。
UNO R3とUNO R4 MINIMAの違い【トラブルの根本原因】
今回のトラブルを理解するうえで、UNO R3とUNO R4 MINIMAの技術的な違いを把握しておくことが重要です。
マイクロコントローラの変更
UNO R3は8ビットのATMega328Pマイコンを搭載していましたが、UNO R4 MINIMAは32ビットのルネサス RA4M1マイコンを搭載しています。
この変更によりクロック速度・メモリ・フラッシュストレージがそれぞれ3〜16倍に向上しています。これはWindowsのCore i3からi7へのアップグレードのような話ではなく、MacのCPUがIntelからAppleシリコン(M1)に切り替わったほどのアーキテクチャ変更です。
つまり、以前のマイコン向けに書かれたコードや使用していたライブラリが、そのままでは動作しない場合があります。今回のSG90サーボトラブルも、このマイコン変更が直接の原因です。
PWM(パルス幅変調)出力の仕様変更
SG90のようなサーボモータはPWM信号で角度を制御します。UNO R3とUNO R4 MINIMAではPWM出力の内部実装が異なるため、従来のServoライブラリをそのまま使用すると正常に動作しない・エラーになるケースがあります。
トラブルの状況:どんなエラーが出るのか
Arduino UNO R4 MINIMAでSG90サーボをR3と同じスケッチで動かそうとすると、以下のような問題が発生します。
- サーボが全く動かない(無反応)
- コンパイルは通るが動作しない
- サーボが震える・異音がする
- シリアル通信との併用でクラッシュする
解決方法:Arduino UNO R4 MINIMAでSG90を動かす手順
解決策①:Servoライブラリのバージョンを確認・更新する
まず、Arduino IDEのライブラリマネージャーでServoライブラリが最新版になっているか確認してください。UNO R4 MINIMAのRA4M1マイコンに対応したServoライブラリは、バージョンによってはR4をサポートしていない場合があります。
- Arduino IDE上部メニュー →「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」
- 検索欄に「Servo」と入力
- 「Servo by Michael Margolis, Arduino」を最新バージョンに更新
解決策②:ボードマネージャーを最新にする
UNO R4 MINIMAのボードパッケージが古いと、PWM制御が正常に機能しないことがあります。
- Arduino IDE →「ツール」→「ボード」→「ボードマネージャー」
- 「Arduino UNO R4 Boards」を検索
- 最新バージョンへ更新
解決策③:動作確認用Arduinoスケッチ
ライブラリとボードパッケージを更新したら、以下のシンプルなスケッチで動作を確認してみましょう。
#include <Servo.h>
Servo myServo;
void setup() {
Serial.begin(9600);
myServo.attach(9); // サーボをデジタルピン9に接続
Serial.println("サーボ初期化完了。角度(0〜180)を入力してください:");
}
void loop() {
if (Serial.available() > 0) {
int angle = Serial.parseInt();
if (angle >= 0 && angle <= 180) {
myServo.write(angle);
Serial.print("角度を設定しました: ");
Serial.println(angle);
} else {
Serial.println("0〜180の範囲で入力してください");
}
}
}
このスケッチをUNO R4 MINIMAに書き込み、シリアルモニターから角度(例:90)を送信してサーボが動けば正常に動作しています。
解決策④:Pythonからシリアル通信でサーボを制御する
Pythonからサーボを制御したい場合は、pyserialライブラリを使用してArduinoにシリアル通信で角度を送信します。
import serial
import time
# COMポートはご自身の環境に合わせて変更してください(例: COM3, /dev/ttyUSB0)
ser = serial.Serial('COM3', 9600, timeout=1)
time.sleep(2) # Arduino起動待ち
print("SG90サーボ制御 (Pythonから)")
print("終了するには 'q' を入力してください")
while True:
user_input = input("角度を入力してください (0〜180): ")
if user_input.lower() == 'q':
print("終了します")
break
try:
angle = int(user_input)
if 0 <= angle <= 180:
ser.write(f"{angle}\n".encode())
time.sleep(0.5)
else:
print("0〜180の範囲で入力してください")
except ValueError:
print("数値を入力してください")
ser.close()
pyserialがインストールされていない場合は以下のコマンドでインストールしてください。
pip install pyserial
配線方法:SG90とArduino UNO R4 MINIMAの接続
SG90サーボモータのケーブルは3本(茶・赤・橙)です。Arduino UNO R4 MINIMAへの接続は以下のとおりです。
| SG90ケーブル色 | 接続先(Arduino) | 役割 |
|---|---|---|
| 茶色 | GND | グランド |
| 赤色 | 5V | 電源(5V) |
| 橙色 | デジタルピン9 | PWM信号 |
注意: 複数のサーボモータを同時に使用する場合、ArduinoのUSB給電だけでは電力不足になる場合があります。その際は外部電源(単三電池4本など)を用意することをおすすめします。
まとめ:Arduino UNO R4 MINIMAでSG90を使うポイント
Arduino UNO R4 MINIMAでSG90サーボが動かない問題の原因と解決方法をまとめます。
- ✅ 原因:マイコンがATMega328P(8bit)からルネサスRA4M1(32bit)に変更されたため、PWM仕様が異なる
- ✅ 解決策①:Arduino IDEのServoライブラリを最新版に更新する
- ✅ 解決策②:ボードマネージャーの「Arduino UNO R4 Boards」を最新版に更新する
- ✅ 解決策③:Arduinoスケッチとシリアル通信で動作確認する
- ✅ 解決策④:Pythonのpyserialでシリアル通信を介して制御する
UNO R3で動いていたコードがR4 MINIMAで動かない場合は、まずライブラリとボードパッケージのアップデートを試してみてください。この記事が同じトラブルで悩む方の助けになれば幸いです。
ArduinoとPythonを組み合わせた制御については、以下の関連記事もぜひご参照ください。
▶ PythonとArduinoをシリアル通信で連携させる基本ガイド(関連記事)
📚 関連記事
- ArduinoとPython連携で作るIoT入門|センサーデータをリアルタイム可視化しよう— Arduinoとシリアル通信の実装方法を解説
- Arduino入門|電子工作初心者が最初に作るべきLEDプロジェクト5選— Arduino基礎とピン制御を学べる関連知識
- 【Python×Arduino】PySerialでPermissionError「アクセスが拒否されました」を解決する方法— シリアル通信トラブル解決の実践例
- Arduino×Pythonでシリアル通信!センサーデータをリアルタイムにグラフ表示する方法【初心者向け】— Pythonからのシリアル送受信実装方法






