サーボモータを制御する | arduinoロボットプログラミング

2023年11月20日

回転速度などを指定したり、好きな角度でピタッと止めたりすることができるサーボモーターをArduinoのCプログラムからコントロールする方法をマスターします。このサーボモーターはクムクムロボットの手足顔などに使用されてこのモーターをうまくコントロールすることで二足歩行も実現できています。

サーボモーターの構造

扇風機や洗濯機、プラモデルのプロペラなどに使用される、電源を加えると勝手にくるくると回りだすモーターは自由な角度でピタッと止めることはできません。
サーボモーターの中に使われているモーターは、実はこの扇風機などに使われているモーターが内部では使われているのですが、そのモーターの先に多くのギアーを取り付けることで回転数をメカ的に制御し何回くるくる回っても決められた角度にしか回らないようになっています。
また、その回転をしている状態を検知できる電子的な構造を組み合わせて、任意の角度に止めることができます。

基本的な構造ですが、このトランスギアーによって通常のモーター(ここではDCモーター)の回転をメカ的に制御し、その回転位置を最下部のポテンションメーターで受け、その信号を電子基板で受け電子的な制御をかけます。

Arduinoとの接続は3本ラインで、通常 赤黒の電源ラインに対して、制御用信号の受け渡し用のラインを1本持ちます。
この図ではオレンジのラインがそれにあたります。

Arduinoとの接続方法

基本的にはオレンジの線(信号)とGNDをArduinoのポートにそれぞれ接続し、モーター用の電池または電源のプラスをモータのコネクターのプラスに、そしてマイナスをArduinoのGNDへ接続します。
ラジコン用のモーターはほとんどが5Vで動作するため、Arduinoの基板にある5Vの端子とモーターのプラスを接続したくなりますが、残念ながらArduinoのポートからの電流ではサーボモーターを回転させられない(させられてもArduinoボードを壊すか正しく動かない可能性がある)ため、必ずサーボモータのプラスは別の電源でとる必要があります。
また、GNDは電源のマイナスとも電気的に接続していなければいけないため、ArduinoボードのGNDへ接続しておきます。

オレンジの線(信号)は基板上に~が書かれているポートに接続します。下記Arduino Leonardoでは5に接続しています。

プログラムによる制御方法

接続方法で書きました、Arduinoとの信号線は~が書かれたポート(上記では5)は、ArduinoではPWMが出力可能なポートです。
PWMとはPulse Width Modulationの略でパルス幅変調を示します。
サーボモーターの制御は、この1本の線で角度信号を出力するために、パルスをいう方法を利用します。
通常、Arduinoのデジタルポートでは、digitalWrite(5,HIGH)やdigitalWrite(5,LOW)のようにHIGHかLOWの出力でLEDなどの制御を行っているのですが、このLOWとHIGHだけでは回転角度を指定することができません。
そのため、このLOWとHIGHを細かい周期でパルスとして出力することで、モータの制御を行います。
Arduinoでは、Arduinoがもともと用意しているPWM制御が可能なポートを~で示してくれています。
そのため、サーボモーターの信号線を~マークのポートに接続しました。

実はArduinoのCPUに使用されているCPU的にはどのポートでもPWMを使用することができます。
自分でしっかり周期を制御しパルスを作り上げることができればどのポートでも使用できます。
が、この制御は結構厄介なもので、Arduino標準ライブラリーではあるポートに固定してソフトウェア的にPWMのポートを決めています。
それが~のポートです。

クムクムロボットのサーボモーター

クムクムロボットに使用しているサーボモーターは0~180度回転ができるサーボモーターです。
そして、その角度におけるパルスは、500~2500となります。
そしてArduinoの標準ライブラリーとしては、0~180までの角度をして角度を決めることも500~2500までのパルスを指定して角度を決めることも可能です。
当然、0~180より500~2500までの幅のほうが角度を細かく決めることができます。

Arduinoのプログラムでサーボモータをコントロールする

メインボードとサーボモータの関係

まずはクムクム(入門モデル)のボードにおけるモータの位置を確認しておきましょう。
これはクムクムSE、プロについても全く同じ番号です。

4 右腕
5 右ふともも(右足の付け根)
6 右足
7
8 左足
9 左ふともも(左足の付け根)
10 左腕

Arduinoに用意されているサーボモーター用関数(クラス)

Arduinoのサーボモーター用の関数(クラス)は下記の通りです。

関数(メソッド) 機能
.attach(PIN) ピンとクラスを結びつけるメソッド .writeメソッドに対応
.attach(PIN,最小パルス,最大パルス) ピンとクラスを結びつけるメソッド .writeMicrosecondメソッドに対応
.detach() attachを解除する
.write(角度) 角度を指定してで回転をさせる
.writeMicrosecond(パルス) パルスで回転をさせる

クムクムロボットでのコントロールについて

クムクムロボットでは、モーターに電源を供給する・しないを別のポートからの信号によって制御する必要があります。
つまり、モータを回転させるときにはモーターに電源を供給(ON)にする制御があらかじめ必要です。
これはArduinoの標準関数 digitalWriteによって11番ピンに HIGH(ON)かLOW(OFF)を出力します。

クムクムロボットのサーボモーターを1個だけ角度で回転させるプログラム

//----------------------------------------------
// 0度と90度をパルスでいったりきたりする
//----------------------------------------------

#include<Servo.h>

Servo SV1; //サーボクラス使用

void setup()
{
  pinMode(11,OUTPUT) ; //モータ電源ピン
  SV1.attach(4) ; //4番ピン 右手のモーターを使う
  digitalWrite(11,HIGH) //電源供給
}
void loop()
{
  SV1.write(90) ; //90度の位置に回転
  delay(1000) ; //1秒まつ
  SV1.write(0) ; //0度の位置に回転
  delay(1000) ; //1秒まつ
}

クムクムロボットのサーボモータを2個パルスで回転させる

//----------------------------------------------
//0度と90度をパルスでいったりきたりする
//----------------------------------------------
#include<Servo.h>

Servo SV1; //サーボクラス使用
Servo SV2; //サーボクラス使用

void setup()
{
 pinMode(11,OUTPUT) ; //モータ電源ピン
 digitalWrite(11,HIGH) //電源供給
 SV1.attach(4,500,2500) ; //4番ピン 右手のモーターを使う
 SV2.attach(7,500,2500) ; //7番ピン 顔のモーターを使う
}
void loop()
{
 SV1.writeMicroseconds(1500) ; //90度の位置に回転
 SV2.writeMicroseconds(1500) ; //90度の位置に回転
 delay(1000) ; //1秒まつ
 SV1.writeMicroseconds(500) ; //0度の位置に回転
 SV2.writeMicroseconds(500) ; //0度の位置に回転
 delay(1000) ; //1秒まつ
}

クムクムロボットの7個のサーボモーターを90度から左右10度ずつ回転

//*************************************************************************************
// サーボモータを動かすサンプル
// モータへの電源はコントロールポート(11)のLOW HIGH でできる
//*************************************************************************************

#include <Servo.h>
Servo SV[7]; //7個のサーボクラスを配列でとる
void setup()
{
  pinMode(11,OUTPUT) ;
  for(int i=0;i<7;i++){
    SV[i].attach(4+i) ;
  }
}
//---------------------------------------------------------------------------
//モータを動かしてみる
//---------------------------------------------------------------------------
void loop()
{
  for( int i = 0; i< SV_COUNT; i++ ){ //
    SV[i].write(90); //7個を90度に
  }
  delay(1000); //1秒待つ
  for( int i = 0; i< SV_COUNT; i++ ){ //
    SV[i].write(80); //7個を80度に
  }
  delay(1000);
  for( int i = 0; i< SV_COUNT; i++ ){
    SV[i].write(100); //7個を100度に
  }
  delay(1000);
}

ArduinoLeonardo

Leonardo は、ATmega32u4 に USB 通信が組み込まれており、セカンダリ プロセッサが不要であるという点で、これまでのすべてのボードと異なります。これにより、Leonardo は、仮想 (CDC) シリアル / COM ポートに加えて、接続されたコンピュータにマウスとキーボードとして表示されるようになります。

Arduino Leonardo は、ATmega32u4 をベースにしたマイクロコントローラー ボードです。20 個のデジタル入出力ピン (そのうち 7 個は PWM 出力として使用可能、12 個はアナログ入力として使用可能)、16 MHz 水晶発振器、マイクロ USB 接続、電源ジャック、ICSP ヘッダー、およびリセット ボタンを備えています。これには、マイクロコントローラーをサポートするために必要なものがすべて含まれています。USB ケーブルでコンピューターに接続するか、AC-DC アダプターまたはバッテリーで電力を供給するだけで使用を開始できます。

出典:https://docs.arduino.cc/hardware/leonardo