NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

Arduinoでサーボモーターを使用してみる

概要

前回の記事では簡単にArduinoを始める環境構築について書きましたので、今回はArduinoでモーターを制御してみました!
これから始める人などに参考になれば幸いです。

Arduinoについて(おさらい)

初期コードにvoid setup()とvoid loop()とありますが、基本的に出力先のpinを設定するなど初期設定に関してはsetupに、繰り返し実行したい処理はloop内に記載します。
例えばLEDを繰り返し点灯させたい場合は以下のようになります。

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}

出力先として13番ピンを指定していますので配線はこんな感じになります。(最小構成で仮想的に表現しているので抵抗などは無視しています)

余談ですが、以下のサイトで簡単にコード、ボードのシミュレーションできるのでおすすめです。

New Arduino Uno Project - Wokwi Simulator

モーターを動かしてみる

今回はサーボモーターを使用します。
サーボモーターに関して簡単に説明するとモーター単体ではなく、ギアなど最初から組み込まれており、2足歩行や4足歩行ロボットやアームロボット、ラジコンのステアリングなどで使用されているモーターです。
今回もとりあえずwokwiを使用してボード側のシミュレーションを行なっていきます。
servoと部品検索すると以下のようなものがでてきます。

ちなみにシミュレーター上の?をクリックするとなんとサーボモーターの仕様を見る事ができます。
いちいち調べなくてもいいのでかなり便利です。
仕様は以下の通りです。

Name Description
PWM Servo control signal
V+ Positive voltage (5V)
GND Ground

実際に使用するサーボモーターはSG90というもので、Arduinoではよく使用されるものです。

マイクロサーボ9g SG−90: パーツ一般 秋月電子通商-電子部品・ネット通販

更に上記の秋月電子さんにデータシートがありましたのでそちらをみるとパルス幅も書かれていました。

0.5〜2.4の幅である事がわかる

以下DeepLで翻訳をかけたものです。

ポジション "0"(1.45msパルス)が中央、"90"(~2.4msパルス)が右端、"-90"(~0.5msパルス)が左端です。

上記を参考に0〜90°の範囲で動かしてみたいと思います。
※上記msはミリ秒で実際にArduinoで定義する際はマイクロ秒に換算して記載するため、以下サンプルコードでは1.45→1450となっています。

void setup() {
  pinMode(10, OUTPUT);
}

void loop() {
  digitalWrite(10, HIGH);
  delayMicroseconds(1450);
  digitalWrite(10, LOW);
  delay(1000);
  digitalWrite(10, HIGH);
  delayMicroseconds(2400);
  digitalWrite(10, LOW);
  delay(1000);
}

シミュレーターの様子

なお、標準でサーボモーターのライブラリがあるのでそちらを利用するともっとシンプルに書けます。

#include <Servo.h>

Servo servo;

void setup() {
  servo.attach(10, 500, 2400);
  pinMode(10, OUTPUT);
}

void loop() {
  servo.write(0);
  delay(1000);
  servo.write(90);
  delay(1000);
}

使用方法に関してはこちらを参考にしていただければと思います。

Servo - Arduino Reference

上記の実装でsetup内にservo.attachを使用していますが、こちらは左から順にpinのみもしくはmin, maxを設定する事ができます。

servo.attach(pin)
servo.attach(pin, min, max)

またmin、maxに関してはサーボモーターの角度とマイクロ秒単位のパルス幅に関して設定ができ、minでは0度に対してパルス幅544、maxでは180度に対してパルス幅2400がデフォルトで設定されています。
今回使用するサーボモーターは上記の通り、最小角度(0度の時)500マイクロ秒なのでデフォルト値の544から500に変更する処理を行なっています。
attachに関しては以下詳細がありますので気になる方は是非ご覧ください。

Servo - attach() - Arduino Reference

実際に動かしてみた様子が以下です。

最後に

今回はサーボモーターを使用してみましたが、コーディングをしつつ、ハードの部分を拡張していく事は非常にハードルが高く感じるかもしれません。
しかし実際はものすごく簡単な電気の配線知識と少しのコーディングから始める事ができます。
それだけで実際に動くものを作る体験ができるのは本当に素晴らしいなと改めて感じました。
また今後はモバイルからの操作でマイコン制御も行ってみたいなと思います。

執筆者岡優志

iOSエンジニア
iOSを専門とし、モバイルアプリの開発を行なっています。