人気のラズパイ電子工作基本編、その2です。
今回のネタは、輪ゴム鉄砲砲台! 複数のサーボを組み合わせて、操作できる輪ゴム鉄砲の砲台を作ります。難しそうに見えるかもしれませんが、かみ砕いて解説してもらいました。今回の内容をマスターすると、きっと応用が利くはずです。
また、サーボモータを複数使って複雑な動きを実現することも可能です。
そこで、今回は3つのサーボモータを組み合わせて輪ゴム鉄砲をラズパイから制御できる「輪ゴム鉄砲砲台」を実現してみましょう。
制作で利用する機器、電子パーツ
●Raspberry Pi
第1回で利用したラズパイを利用できます。
また、複数のモデルが販売されていますが、Raspberry Pi/2/3、Raspberry Pi Zero/Wのいずれでも問題ありません。わからない場合は最新版の「Raspberry Pi 3 Model B+」を購入しましょう。主な購入可能なサイトは以下の通り。
・KSY
・RS
また、Raspberry Piを動作させるためのSDカード、ACアダプタ、キーボード、マウス、ディスプレイなどが別途準備する必要があります(参考記事)。
●サーボモータ(小型)
トリガーを引いて輪ゴムを発射するために利用します。ここでは、前回利用した模型などに利用されるサーボモータ「MG90D」を利用します。1個必要となります。
●サーボモータ(大型)
輪ゴム鉄砲の向きを動かすのに利用します。輪ゴム鉄砲本体や取り付け冶具、サーボモータといった複数の部品を乗せた状態で動かすのである程度のパワーが必要となります。このため、比較的パワーのあるサーボモータ「SG-5010」を利用します。2個必要となります。
●サーボモータドライバ
サーボモータを制御する電子パーツです。複数のサーボモータを一度に動作できます。また、正確なPWMを出力できるため、動作が安定します。今回はこちらを使います。
●ACアダプタ
サーボモータ駆動用の電源を供給します。ACアダプタは家庭用コンセントに差し込むと電圧を変換した直流を供給できます。変換する電圧はACアダプタによって異なります。ここでは5Vに変換するACアダプタを選択しています。
●DCジャック、ターミナル変換
ACアダプタからモータドライバに電源を供給するためにコネクタの変換が必要です。使用したのはこちら。
2つのサーボモータで向きを制御する
サーボモータはひとつの軸の対して回転するため、第1回で実現したような1軸の回転する応用ができました。しかし、複数のサーボモータを組み合わせることでより複雑な制御が可能となります。
例えば、ロボットアームであれば、各関節の部分にサーボモータが取り付けられており、腕の動きを実現しています。
同様に2つのサーボモータを使うことで、輪ゴム鉄砲の向きを自由に変化させられます。
本記事では、「ロール」と「チルト」の動作をそれぞれのサーボモータで制御できるようにします。
「ロール」とは、左右の向きを変更する動きです。本記事では、下の台座に装備して、その上を左右に回転させています。
「チルト」は上下の傾きを変化する動きです。本記事では、ロールを制御するサーボモータの上に取り付けて上、下を向けられるようにしています。
また、向きを変更するだけでなく、輪ゴムを発射するトリガー部分の操作にもサーボモータを利用します。サーボモータをトリガーの近くに設置して、サーボモータを回転させるとトリガーが引いた状態になり、輪ゴムが発射できます。
2つのサーボモータで向きを変更できるようにし、1つのサーボモータで輪ゴムを発射できるようにしてみましょう。
サーボモータドライバを使う
第1回で紹介したように、Raspberry Piに直接接続してプログラムでサーボモータを制御できます。しかし、サーボモータに送るパルス波は、数十μ秒の精度が必要となります。もし、パルス幅が変化してしまうと、サーボモータの挙動にも影響し、細かく震えたりと安定性が保てなくなります。
プログラムでパルス波を作成する場合は、他の処理などによって影響を及ぼし、パルス幅が微妙に変化します。また、パルス幅が大きく変化し、挙動がおかしくなることもあります。
第1回で利用したpigpioというライブラリはできる限り正確なパルス波を出力するような工夫をしていますが、まれに挙動がおかしくなることがあります。
このため、サーボモータを制御するにはぶれの少ないパルス波を出力できることが大切です。そこで利用できるのが「サーボモータドライバ」です。専用のICによって精度の高いパルス波を出力できるようになっており、プログラムの動作などの影響を受けないようにできます。
また、サーボモータ用の電源端子を搭載しており、電池などの電源を接続しておくことで各サーボモータに電源が供給できます。
今回は、サーボモータドライバとして「AE-PCA9685」を利用します。AE-PCA9685は16個のサーボモータを接続して同時に制御が可能となっています。また、I2Cを利用してRaspberry Piから各サーボモータの制御ができるようになっています。
サーボモータを動かしてみる
サーボモータドライバを使ってサーボモータを動かしてみましょう。次の図のようにRaspberry Piと接続します。
サーボモータはドライバの上にある「0」と記載された端子に縦向きに差し込みます。この際、茶色の線(GND)を上側にします。
なお、サーボモータを接続する端子の上に記載された数字またはアルファベットはチャンネル番号で、サーボモータを動かす際に対象のチャンネル番号を指定することになります。
サーボモータを動かすには別途電源が必要となります。今回はACアダプタを利用してコンセントから電源を取得できるようにします。ACアダプタでは100Vの交流電源を、直流の数Vの電源に変換できます。今回は5Vの直流を出力できるACアダプタを選択します。
また、ACアダプタの端子は円筒状のプラグ状になっており、直接サーボモータドライバに接続できません。そこで、変換用アダプタを利用して配線を使ってサーボモータドライバに接続できるようにしています。なお、ACアダプタには極性があるので接続する場合は注意します。変換アダプタの「+」を記載されている端子からサーボモータドライバの「+5V」と書かれている端子に接続するようにします。
サーボモータドライバは、I2Cで通信します。このため、Raspberry PiでI2Cを利用できるように設定が必要です。Raspberry Piのメニューをクリックして「設定」-「Raspberry Piの設定」を選択します。「インターフェイス」タブにある「I2C」項目を有効に切り替えます。
次にサーボモータ動作プログラム「servo_pca.py」とサーボモータ制御ライブラリ「pca9685.py」をダウンロードします。
ダウンロードしたら実際にサーボモータを動かしてみます。サーボモータを接続したチャンネル番号、パルス幅の順に指定します。例えば、チャンネル0に接続したサーボモータを1500μ秒のパルス幅で動作するには以下のように実行します。
他のパルス幅を指定してみてサーボモータが動くことを確認しましょう。
なお、他のチャンネルに接続した場合は、チャンネル番号を変更することで操作できます。ただし、チャンネル番号は16進数で表記されています。AからFはそのままでは指定できないので、「0xa」のように16進数であることを明示する必要があります(10進数に変換した値を指定してもかまいません)。
砲台のパーツを作る
砲台の本体を作成しましょう。
本記事では、手作りした輪ゴム鉄砲を取り付けて操作できるようにします。取り替えも可能なので、子供自身で手作りした輪ゴム鉄砲を取り付けて楽しめるようにできます。
サーボモータの取り付け部分を中心に説明します。
ロールを制御するサーボモータは土台に取り付けます。本記事では四角い箱を作成し、そこにねじで取り付けています。なお、箱の作成にはレーザーカッターを使いました。レーザーカッターを利用せずに、木を切ったり、段ボールを加工する、3Dプリンターで出力するなど任意の方法で作成しても問題ありません。
チルトを制御するサーボモータは、ロールのサーボモータに取り付けるホーンと直角になるように配置します。本記事では板を直角に取り付け、一方にサーボモータ、もう一方にホーンを取り付けています。三角形の板は補強するために取り付けたものです。
輪ゴム鉄砲を取り付ける部分は、長方形の板を利用します。多数の穴を開けておき、輪ゴム鉄砲の本体を結束バンドなどで固定できるようにしています。また、チルトのサーボモータを取り付けるホーンを中央配置します。トリガーを動かすためのサーボモータを輪ゴム鉄砲のトリガーの前方あたりに配置するように取り付けます。
トリガーを動かすために、ホーンに加工をしておきます。そのまま付属のホーンだけでトリガーを動かそうとすると、トリガーがホーンの外側に逃げてしまい、トリガーを正しく動かせません。そこで、ホーンの両方にガイドとなる板で挟み込み、トリガーがガイドの間にはまるようにしておきます。
砲台を仕上げる
それぞれのパーツができたら、電子回路を作成し、1つに組み上げます。
電子回路は次のように接続します。サーボモータドライバには、ロールのサーボモータを「0」チャンネル、チルトのサーボモータを「2」チャンネル、トリガーのサーボモータを「4」チャンネルに接続します。
組み上げる前にサーボモータをあらかじめ初期の状態に動かしておきます。それぞれのサーボモータをサーボモータドライバに接続します。サーボモータの動作は「servo_pca.py」を使います。
ロールとチルトを制御するサーボモータは動作範囲の中央付近に動かします。多少の違いはありますが、一般的なサーボモータはパルス幅が約1500μ秒で中央まで動くようになっています。そこで、以下のように実行してサーボモータを中央に移動しておきます。
$ python3 servo_pca.py 2 1500
トリガーを動かすには、サーボモータを90度以上動かすこととなります。しかし、今回利用するMG90Dはおおよそ120度の範囲でしか動かせません。トリガーを引いていない状態を動作範囲の中央にしてしまうと、60度程度しか回転できず、トリガーを十分動かせません。そこで、動作範囲の左端にサーボモータを動かしておきます。
第1回で調べたようにMD90Dの動作範囲は800μ秒(右側)から2300μ秒(左側)となっています。動作範囲内で左側の端より少し内側となる2200μ秒をトリガーを引いていない状態とします。以下のように実行してサーボモータを動かします。
サーボモータと砲台の準備ができたら、サーボモータにホーンを取り付けます。ホーンは取れてしまわないよう付属のねじで固定します。
トリガーはホーンが下に向くようにして取り付けておきましょう。
操作範囲を確かめる
砲台が組み上がったらサーボモータの制御範囲を確認しておきます。確認を怠ると、必要以上にサーボモータが回転してしまい、部品同士がぶつかって壊れてしまいかねません。また、トリガーを動かして輪ゴムが発射できるかの調節もしておきます。
まず、パンの制御するサーボモータを動かしてみます。制御範囲を確かめるには「servo_pca.py」を使います。組み立てた際は、おおよそサーボモータの中央となる「1500」となっています。ここからパルス幅を増やしたり減らし、パーツがぶつからない操作する範囲のパルス幅を確認します。この際、ほかのパーツがぶつからないことも確認しておきましょう。例えば、パルス幅を1800とする場合は以下のように実行します。
同様にチルトの範囲も調べます。チルトも組み立てる際におおよその中央値の「1500」としています。上下に動かす場合には、トリガーを動かすサーボモータや輪ゴム鉄砲の持ち手部分が干渉しやすいので、注意して確認しておきます。なお、チルトでパルス幅を1300とする場合は以下のように実行します。
トリガーを調節します。サーボモータを動かしてトリがが動くことを確認してみましょう。この際、サーボモータの動作範囲を超えないように注意します。例えば、第1回で調べたようにMG90Dは、800から2300の範囲で動かせます。組み立てる際にトリガーを引いていない状態を範囲内の2200としました。同様にトリガーを引く際も範囲内の900にしてみます。
これでトリガーが正しく動くかを確かめましょう。トリガがサーボモータから外れてしまう場合は、ホーンに付けるガイドを工夫する必要があります。
次にトリガーを元の状態に戻し、輪ゴムを取り付けて再度サーボモータでトリガーを引いた状態にし、輪ゴムが飛ぶことを確認しましょう。輪ゴムが飛ばない場合は、トリガーの輪ゴムを掛ける部分を削るなどして輪ゴムが飛ぶように調節します。
輪ゴムを発射する
砲台に輪ゴム鉄砲を取り付けたら実際にRaspberry Piから操作してみましょう。今回は、キーボードから操作するようにしてみます。
以下のリンクから、プログラム「gum_gun.py」をRaspberry Piにダウンロードします。
また、前のサーボモータの制御で利用した「pca9685.py」も必要となるので、ダウンロードしたファイルと同じフォルダー内に配置しておきます。
ダウンロードしたら各サーボモータの操作範囲を設定します。Raspberry Piのメニューから「アクセサリ」-「Text Editor」を選択してテキストエディタを起動し、ダウンロードしたプログラム「gum_gun.py」を開きます。
6から10行目の「pan_」から始まる変数は、パンを制御するサーボモータの設定項目です。「pan_ch」はサーボモータドライバに接続したチャンネル番号です。「pan_neutral」は中央の値の「1500」を指定し、「pan_max」と「pan_min」にサーボも動作範囲のパルス幅を指定しておきます。「pan_delta」は1回のキー操作で変化するパルスの幅を指定します。この値が大きければ速く動き、小さくすれば細かく調節できます。
同様に12から16行目の「tilt_」から始まる変数にチルトを制御するサーボモータの設定をします。
18から20行目の「trig_」から始まる変数にトリガーを制御するサーボモータの設定をします。「trig_ch」に接続したサーボモータドライバのチャンネル、「trig_off」にトリガーを引かない状態のパルス幅、「trig_on」に輪ゴムを発射する場合のパルス幅を指定します。
設定が完了したら以下のように実行します。
すると各サーボモータが初期の位置に移動し、スタンバイ状態になります。
キー操作は、「A」と「D」でパンの操作、「W」と「S」でチルトの操作します。スペースキーを押すとトリガーを動かして輪ゴムを発射します。
なお、終了する場合は必ず「Q」キーを押すようにします。「Ctrl」+「C」で強制終了してしまうと、端末の表示がおかしくなってしまいます。おかしくなった場合は、端末アプリを起動し直しましょう。
まとめ
今回はサーボモータで輪ゴム鉄砲の向きを自由に変えられるようにしました。この手法は輪ゴム鉄砲以外にも使えます。たとえばカメラを取り付ければ遠隔から制御して撮影が可能になるライブカメラや、レーザーポインタを使えば遠隔から画面を指し示すこともできます。
また、操作についても今回はキーボードを利用しましたが、ジョイスティックを接続したり、独自にスイッチを取り付ける、ネットを介して操作できるようにするなどさまざまな応用もできます。
今回の連載の流れ
第1回:サーボモータを使って指さし温度計を作ってみよう
第2回:サーボモータで制御できる輪ゴム鉄砲砲台を作る(今回)