Arduinoその他工作

Arduinoを制御デバイスにしてさまざまなモノを動かそう!

第5回:Arduinoでサーボモータを制御して楽器を演奏する!

arduino-control-clipmotor-05-01

Arduinoを使った簡単工作を通して、電子工作の原理や基本を学ぶこの企画。教えてくれるのは、メディアアートの分野で、また「ちょっと深い仕組み」を解説する書籍の世界で活躍している、伊藤尚未さんです。最終回となる第5回はサーボモータをArduinoで制御していきたいと思います。

 

目次

  1. はじめに
  2. サーボモータとは?
  3. Arduinoと接続する
  4. Arduinoで制御して楽器を演奏してみる!

 

1. はじめに

こんにちは、伊藤尚未です。Arduinoでいろいろ動かそうという今回の連載ですが、自分もまだ触っていない部材がありこれを機会に使ってみることにしました。それは「サーボモータ」です。

「マイコン+動く」といえばロボットがありますが、私の場合、これまでもタミヤ社製のギアやマブチ社製のモータなどプリミティブなものを使って構成してきました。ですが、もちろん現代のロボットと言えば、使っている可動部品はサーボモータです。子供のころ、電動ラジコンカーのブームがあり、友人たちとよく遊んだ思い出があります。

もちろんスーパーカーブームの時代でもありますので、車種はランボルギーニ、ランチア、ポルシェでの豪華なカーチェイスでしたね。このラジコンのハンドル、アクセルはサーボモータを使っていましたので、プロポのレバーの動きに合わせて動くのが不思議にも思っており、この頃からサーボモータの動きはよくできているなぁ…と感心した覚えがあります。

その頃は「そういう仕組みだからそう動く」としか理解できませんでしたが、今となっては「そういう仕組み」をフシギに思うことが大切なんだと痛感しています。

さて、近年のロボットにも使われているものは四角い筐体に円盤や矩形のリンク軸(サーボホーン)がついている形で、昔とほとんど変わらないので、一目見て分かります。とはいえ、その中身をよく知っているわけではないので改めて見つめ直したいと思います。

 

2. サーボモータとは?

広義では軸の回転を検知する機構があり、回転角や回転位置、速度などを制御できるような機能を備えているものだということで、重機や工場の生産ラインなどにも使われているものも含まれるでしょう。

とはいえ、ラジコンや模型ロボットなどで使われているタイプのものが我々「ものづくり」に関わるモノとしては身近です。もちろん、Arduinoなどのマイコンでロボットのように可動部分を動かそうとするものも、一般的なサーボモータを使うことにします。

さて、モータの回転を検知する機構と言っても具体的にどうなっているのでしょう?

構造図からするとこのように示される場合が多いのですが、なんとなく知っているつもりでいました。

 

arduino-control-clipmotor-05-02

 

とりあえず実物を確認しようということで、分解してみました。手ごろな大きさのGWS社製のS03T/2BBMG/FUTABAを検体にしています。

arduino-control-clipmotor-05-03

 

まずはサーボホーンを外し、4隅のネジを外すとケースが外れます。ケースは3段になっているので、一番上のカバーを外すとギアが出てきます。

メタルのギアで軸受けはベアリングを使っており、結構しっかりした造りになっています。4段の減速ギアになっているようですが、グリスがたっぷりと塗ってあり、何となくトルクが大きいのだろうと想像がつきます。

arduino-control-clipmotor-05-04

 

下段のカバーを外すとモータが見えてきました。写真右側の金属の円筒がモータ、左側がコントローラ部分です。こちら側にサーボホーンの軸があるので、ここで回転を検知するものと推察できます。

arduino-control-clipmotor-05-05

 

サーボホーンの軸を外すと軸自体が回転センサになっています。指で回すと回転角度、感触から多分物理的な回転スライド接点による抵抗値変化=可変抵抗器、ポテンションメータだと分かります。サーボホーンの回転位置をこれで検出できるようになっているわけです。やはり構造図の通りでしたね。

arduino-control-clipmotor-05-06

 

このポテンションメータ下部には回路があり、その抵抗値を読み取り、入力される信号と比較算出し、その釣り合うところで止めるという仕組みにすることで、思い通りの角度に回転させられるということなのでしょう。

ですので、端子は3本あり、1本がGND、1本がプラス電源、そしてもう1本が信号線でGNDとプラス電源との間の電圧差(比)によって制御できるわけです。この仕組みであれば、電池の状態などによる多少の電圧変動でも問題なく回転角度を制御することができるわけです。

さて、Arduino側からサーボモータを動かすには、すでにライブラリがあるので、迷わずこれを使いますが、その出力信号はPWMです。PWMは1周期のなかでパルスの幅を変化させることで結果的に電圧変化のように見せているものです。

 

arduino-control-clipmotor-05-07

 

ここで子供のころの記憶を思い出します。当時のラジコンはマイコンを積んでいたのでしょうか?そのころ市場に出ていたのはワンボードマイコンなど大きなものでした。プロポの中身がどうなっているのか知りたくて開けた覚えがありますが、そのようなものは記憶にないですね。そうアナログでしたから。

もしPWMを使っているとしたらハードウエアでの処理でしょう。と、考えるとサーボモータはPWMだけではなくアナログでも動かすことができるわけで、先の制御信号がGNDとプラス電源間の電圧比と考えるともちろんアナログでも問題ないはずで、サーボモータ自体は昔からのアナログ入力とほぼ変わっていないということにもなります。

変わっていないというのは「古いモノ」ですが、ここでは「古いモノ」=「悪いモノ」ではなく、「安定したモノ」ということで、技術的には評価が高くなります。

とはいえ、ICも小型化しているのでサーボモータの制御回路部分は進化し、PWMを適切に処理しているかもしれません。

 

3. Arduinoと接続する

それではArduinoとつなげてみます。GNDと電源、信号はそれぞれのサーボモータによってピン配列が異なるようですので、確認してみます。

今回使ったのは分解でも使ったGWS社製のS03T/2BBMG/FUTABAです。ピン配列はこうなります。

arduino-control-clipmotor-05-08

 

写真左から黒、赤、白のリード線になっていますが、それぞれGND、5V(プラス電源)、信号線という並びになります。

Arduinoとのつなぎ方は以下のようになります。

 

arduino-control-clipmotor-05-09

 

ライブラリを使って、試しにこんなスケッチを描いてみました。

#include <Servo.h>

Servo myServo;  

void setup() {
  myServo.attach(9); 
}

void loop() {
  
  myServo.write(90);
    delay(1000);
  myServo.write(45);
    delay(1000);
  myServo.write(135);
    delay(1000);

}

 

サーボモータのライブラリを読み込み、9番ピンに出力をします。myServe.writeのカッコの中が角度なので、90で中立位置、ここから左右45度振るようにしました。サーボモータの機能としては中立位置から左右に90度ずつ首を振ることができるようですが、数値を変えてみて0、180というように角度をいっぱいにし過ぎると、ブルブルと震えてしまいました。原因は分かりませんが、回転センサがアナログなので、数値的に不具合があるかと想像します。影響しない範囲で使うことにします。

 

サーボホーンにアームをつけると振れ幅も大きくなるので、このアームの先に既出の自作アクチュエータを取り付けてみました。ストローにエナメル線を巻き、コイルを作り、内部に釘を入れて電気が流れると釘がピョコンと出る仕組みです。自作ソレノイドですね。

このアクチュエータを動かすのには既出同様トランジスタでドライブすることを考えローム製「2SD1866」を使いました。ベースへは20kΩの抵抗を通し、ArduinoからON-OFFさせています。アクチュエータ駆動を外部電源として乾電池2個で3Vを別に供給しています。

これで、ある特定部分で何かを軽くたたくことができます。

arduino-control-clipmotor-05-10

 

arduino-control-clipmotor-05-11

 

全体の回路図としては上記のようになります。13番ピンで自作アクチュエータを動かし、9番ピンでサーボモータを動かします。

外付けの回路は自作アクチュエータをドライブさせるトランジスタと抵抗器だけですので、小さなブレッドボードに組み込みました。

arduino-control-clipmotor-05-12

 

スケッチを先ほどのものに加え、アクチュエータの動作を足してみました。サーボモーターが動いた角度で釘が飛び出る形になります。

#include <Servo.h>

Servo myServo;  

void setup() {
  myServo.attach(9); 
  pinMode(13, OUTPUT);
}

void loop() {
  
  myServo.write(90);
    delay(500);
  digitalWrite(13, HIGH);  
  delay(100);               
  digitalWrite(13, LOW);    
  delay(1000);      
  
  myServo.write(45);
    delay(500);
  digitalWrite(13, HIGH);  
  delay(100);               
  digitalWrite(13, LOW);    
  delay(1000);      
  
  myServo.write(135);
    delay(500);
  digitalWrite(13, HIGH);  
  delay(100);               
  digitalWrite(13, LOW);    
  delay(1000);      
}

 

 

実際に動かしてみるとアームの移動時間を考えなければいけないので角度が大きなときはタイミングが難しいですね。

 

4. Arduinoで制御して楽器を演奏してみる!

さて、これでやってみたかったのは楽器の演奏です。100円ショップでこんな鉄琴を見つけたのでこれを改造します。

arduino-control-clipmotor-05-13

 

まずは鉄片を外し、別の枠に取り付けます。

arduino-control-clipmotor-05-14

 arduino-control-clipmotor-05-15

 

叩いた後の振動が止まらないようにゴムで吊るように固定し、下部に今回のアーム付きアクチュエータを取り付ける構成にしました。Arduinoでサーボモータと共にアクチュエータも動かします。

arduino-control-clipmotor-05-01

 

この枠だとドレミファソラシドの位置がそれぞれ122、112、102、95、85、77、67、57の角度になりますので、これに合わせて、サーボモータを回転させ、叩くようにします。
これも実物調整での値になります。あとはどのように演奏するか…。とりあえず位置調整し、ドレミファソラシドを鳴らしてみました。

 

こうなるとやっぱり1曲弾かせてみたくなります。

 

おっと、何とか弾けましたが、まぁ、自分に似てリズム感がないですな(笑)。音を楽しめるのだから良しとしましょう!

今回はArduinoでサーボモータを制御して、楽器の演奏をおこなってみました。この連載ではArduinoを使ってさまざまなデバイスを制御する方法をご紹介してきましたがいかがでしたでしょうか?

身近なデバイスも、Arduinoを使って制御することでさらに面白い電子工作ができることがお分かり頂けたと思います。ぜひ皆さんもさまざまなアイデアを考えて、電子工作をこれからも楽しんでください!

【動画で解説】ラズパイZeroで小型AIカメラを作ろう!
伊藤 尚未

日本電子工作普及推進委員会代表、メディアアーティスト。サイエンスライター、動物園の飼育員のフリした電気工事士、理科実験教室講師、ワークショップ講師、教材開発など、幅広く活動中。 月刊「子供の科学(誠文堂新光社)」で電子工作の連載を続けて19年、代表的な書籍は「電子工作大図鑑」「電子工作パーフェクトガイド」があります。