6.モータの動かし方

2020年5月26日

サーボモーターとは

サーボモーターは、扇風機などに使われているモーターとは異なり、角度や速度などを指定して、好きな場所まで自由な速度で回転して止めることができるモーターです。

クムクムロボットでは、顔、両腕、足の付け根、足 の合計7個のサーボモーターがあり、これらの一つ一つを個別の角度、速度で回転して止めることができます。

サーボモーターのイメージ

黒…GNDライン
赤…電源
橙…回転角度(パルス)

制御方法

Arduinoなどマイコンから指定角度に回転させるには、その角度に該当するパルスをプログラムから出力します。
この方法をPWMと呼び、クムクムロボットでは0~180度の回転角度に対して500パルス~2500パルスを与えて制御します。

配線

一般的に、Arduinoとの接続は下記のようにします。
下記の図で、モーターを回転させるために大きな電流が必要なため、モーターの電源をArduinoの5Vピンに接続せず、電池の+に接続している点に注意してください。
もしArduinoの5Vピンからモーターの電源を取った場合、ArduinoのCPUが壊れてしまします。
必ず、モーター用の電源を用意します。
※GNDは必ず共通にしてください

サーボモーターの接続と関数

Arduinoとしてのポート 部位
4 右腕
5 右足の付け根
6 右足
7
8 左足
9 左足の付け根
10 左腕
11 モーターへの電源供給制御

プログラミング

Arduinoでは、多くのサーボモーターを制御させるためのライブラリーがありますが、ここでは標準的な Servoクラスを使ってみます。

また、クムクムロボットでは、モータへの電源のON/OFFをプログラムからコントロールできる仕組みがあり、サーボモーターを駆動させる前には、電源供給をONにしなくてはなりません。
逆に、使わない場合はOFFにしてもいいのですが、万が一足が斜めでそこに全体重をかけている状態で電源をOFFにしてしまうと、モーターが突っ張れなくなってクムクムロボットが転倒してしまうこともあります。

電源のON/OFFのタイミングは気を付けて使います。

関数 機能
サーボ.attach(PIN) 出力ピンとモータークラスの結び付け
0~90度指定で回転させる場合に使用
サーボ.attach(PIN,最小パルス,最大パルス) 出力ピンとモータークラスの結び付け
パルス指定で細かく回転させる場合に使用
サーボ.detach() 結び付けを解除
サーボ.write(角度) 0~90度指定で回転させる
サーボ.writeMicrosecond(パルス) 指定パルスを出力し回転させる

モーターを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秒まつ
}

モータを1個だけパルスで回転させる

//---------------------------------------------- 
//0度と90度をパルスでいったりきたりする 
//---------------------------------------------- 
#include<Servo.h> Servo SV1; //サーボクラス使用 
void setup() 
{ 
  pinMode(11,OUTPUT) ; //モータ電源ピン 
  SV1.attach(4,500,2500) ; //4番ピン 右手のモーターを使う 
  digitalWrite(11,HIGH) //電源供給 
} 
void loop() 
{ 
  SV1.writeMicroseconds(1500) ;  //90度の位置に回転 
  delay(1000) ; //1秒まつ 
  SV1.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); 
}