からくり技術研究所では、「ロボット製作に使える機械工学のメカニズムを実際に動かしてみよう!」ということで、地道に短めの記事でやっていくコーナーです。
主に、ロボット製作で使うための機械的な仕組みを実際に作って、動かして、測定してみます。
この連載記事では、タミヤ模型さんの「楽しい工作キット」をメインに使って仕組みを組み立てています。
気になる方は、次の記事で楽しい工作キットを紹介していますので合わせてご覧ください。
今回は「平行リンク」を使ったロボットアームの製作記事です。
じゃあ、試作をしてみるか。
動かす部品が必要だな。
3つの軸ということはサーボモーターも3つ必要だな。
効率よく制御命令をコントロールする必要がある
実際に使ってみるぞ。
平行リンクの3軸と3つの角度
(z軸とy軸の表現が逆の場合もありますが、前回の説明の流れから、y軸を縦にしています。)
サーボモーターって何?
サーボモーターは、「モーター」の一種です。
一般のモーターと異なるのは、モーターの軸の回転角度を180度、または360度の範囲で位置決めすることができるモーターです。
図で表すと次のようになります。
サーボモーターへのケーブルは3本あり、以下のような構成になっています。
ケーブル色 | 用途 |
茶色 | GND 電力(-) |
赤 | VCC 電力(+) |
オレンジ | 回転制御用信号(PWM) |
回転制御信号は、PWMを使います。PWMについては、次の記事で説明しています。
この記事では、M5StickCと冷却ファンを使って回転速度制御をしていきます。 M5StickCから冷却ファンの回転を制御できれば、扇風機のように、自由に風量を変えることができます! 今回の冷却ファンは次のものを使います。パソコン用[…]
サーボモーターは、PWMのパルス幅を変更することによって回転角度が変わります。
今回使うサーボモーターでは、400~2200msで0°➡180°まで軸を移動することができます。
また、基本的に同じパルス幅で信号を出している間は、同じ角度で維持されます。
ということは、3つのサーボモーターに対して、マイコンや、コンピュータから回転制御信号を送ることで、先ほどの3つの角度(α、β、σ)を作り、制御することができそうです。
3つのサーボモーターを同時に操作する
複数のサーボモーターを使う場合に注意しないといけないのは、次の2点です。
- サーボモーターへの電力供給
- 回転制御信号の送信
サーボモーターへの電力供給
マイコンや、Raspberry Piなどの5Vピンからサーボモーターへ電力を供給しているとモーターに負荷がかかったり、複数同時に動いた場合など、コンピュータ側の許容量を超える電流が流れ、破損する可能性があります。
複数のサーボモーターへの電力供給は、コンピュータ側ではなく他の外部電源から供給する必要があります。
回転制御信号の送信
一般にコンピュータ側でPWM信号に対応しているGPIO(ポート)は限られているので、複数のサーボモーターへ回転制御信号の送信を行うことを考えると、コンピュータだけでは実装できない場合が多いです。
上記の2点を補うための回路基板として「サーボモータードライバ」があります。
サーボモータードライバは外部電源からの供給回路を持ち、コンピュータからの複数のサーボモータへの制御命令をI2Cという通信規格で行うことができるようになっています。
今回は、サーボモータードライバとして、Adafruit社の 「Servo Bonnet for Raspberry Pi」を使います。
サーボモータードライバ(Servo Bonnet for Raspberry Pi)
サーボモータードライバ基板のセットです。Raspberry PiのGPIO配列に対応したコネクタがついているので、Raspberry Piに直接指して利用することができます。最大16個までのサーボモーターを制御できます。電源は5Vを外部から接続するために、DCJackか端子台のどちらかを取り付けることができます。Amazonで確認
Servo Bonnet for Raspberry Pi のセット内容
最大16個のサーボモーターを接続して制御することができ、多関節なロボットに使用することもできます。
その名の通り、Raspberry PiのGPIOピンに対応したもので、写真の黒いコネクタ部分にRaspberry Piを指すことができます。
電源(DCJackまたは端子台)と、サーボモーターのコネクタピンは、セットとして入っているので、各部品をはんだ付けすれば利用することができます。
複数サーボモーターを接続すると電源が不安定になるので、使用するサーボモーターの数により自分でコンデンサを別途準備して、はんだ付けする必要があります。
この商品の推奨は、サーボモーター1個で100μFなので、大きなコンデンサが必要な場合があります。
Servo Bonnet for Raspberry Pi のはんだ付け
サーボモータードライバの基板を裏返すと次のように部品の設置面があります。
※サーボモーター接続用のピンをはんだ付けする際には、次のようにブレッドボードにあらかじめさしてから基板を合わせて固定してはんだ付けすると便利です。
はんだ付けが終わった状態のイメージは次の通りです。
サーボモーターを動かしてみる
それでは簡単にサーボモーターを動かしてみます。
Raspberry Piの準備
今回は「Raspberry Pi Zero WH」に「Servo Bonnet for Raspberry Pi」を接続して使ってみます。
Raspberry Pi Zero WH
小型のRaspberry Pi製品です。メモリは少ないですが、IoT機器内に実装するにはちょうどいい大きさです。
Wi-FiやBluetoothモジュールも実装されているので、リモートから操作することもできます。スイッチサイエンスさんで確認
Raspberry Piで必要になる電源や、OSのインストール方法などについては、次の記事でご紹介しています。
合わせてご確認くださいね!
合わせて読みたい!
こんな悩みありませんか? 「Raspberry Pi はじめたいけど、何があれば遊べるの? いくらかかるの?」 そんなご質問に答えるべく、購入品リストをまとめてみました。 本記事は以下の記事「Raspberry Piのはじ[…]
すけろく 「ラズベリーパイ」を買ってきたぞ! げんろく 「お!もしかして、有名店のおいしいやつか!」って ベタな反応はしないぞ。Raspberry Piだろ? すけろく チッ、[…]
すけろく Raspberry Pi は、OSの書き込みも簡単で すぐに使いはじめられるな! げんろく 初期設定はちゃんとしたのか? まさか、初期設定のまま使っていることはないよな? […]
サーボモーターの準備
サーボモーターは、当サイトで使用したのは、「Adeept社 AD002」ですが、最近Amazonでも在庫なしが続いているようです。同じサイズ感のサーボモーターを使っていただければ大丈夫かと思います。
※ただし、サーボモーターの回転角度(180°~360°)や、パルス幅についてはサーボモーター毎に違いがあるので今回のサーボモータードライバにつなぎながら、調整していってくださいね!
調整の仕方は、本記事で紹介します!
マイクロサーボモーター SG90
小型のサーボモーターです。大きさは: 22mm×11.5mm×27mmで、 重さ 9gほどの小さいものです。
トルクは1.8kg/cm (4.8Vのとき)です。
回転制御パルス幅:0.5ms~2.4ms、制御角:±約90°(180°)Amazonで確認
サーボモータードライバをRaspberry Piに取り付ける
サーボモータードライバに電力を供給する
Raspberry Pi以外の電源をサーボモータードライバに接続します。サーボモータードライバもサーボモーターも5Vで駆動しますので、5Vの電源を接続します。
次の写真は、サーボモータドライバに端子台(ネジで電源を固定できるもの)をはんだ付けした場合の取付例になります。ブレッドボード経由で5Vを供給しています。
※DCJackをはんだ付けすれば、次のような電源アダプターから直接供給できます。
5V電源
サーボモーターを接続する
サーボモーターをサーボモータードライバに接続します。
サーボモーターには3つの色のケーブルがあるとお話ししましたが、サーボモータドライバの端子もその3種類のケーブルに対応した並びになっています。
左から「0」、「1」・・・「15」という順番になっています。
Raspberry PiでI2C接続を確認
1
コマンドプロンプトを起動して、Raspberry Pi にSSHで「pi」ユーザを使ってログインします。
$ ssh pi@raspberrypi.local -p 12345
※「pi」はユーザ名になります。別のユーザに変更した場合はそちらを使います。
※「raspberrypi.local」はホスト名です。
OSインストール(書き込み)時にホスト名を変更した場合は、そちらのホスト名を入力します。
※「-p 12345」はRaspberry PiのSSH接続用のポートです。標準の「22」から変更した場合は指定します。
2
パスワードを聞いてきますので初期パスワードを入力します。
$ raspberry Linux raspberrypi 5.10.17-v7l+ #1414 SMP Fri Apr 30 13:20:47 BST 2021 armv7l ......
$
※OSのインストール(書き込み)時にSSH接続設定でパスワードを設定した場合は、
そちらのパスワードを入力します。
3
接続が完了したら以下のコマンドを実行し、管理画面を表示させます。
パスワードを聞いてくる場合は、入力します。
$ sudo raspi-config
[sudo] password for "UserName":
4
画面が次のように表示されますので、「3.Interface Options」を選択し、Enterキーを押します。
5
次に「P5 I2C」を選択してEnterキーを押します。
6
有効にするか聞いてきますので、「Yes」を選択し、Enterキーを押します。
7
有効になった旨の画面が表示されますので、「Ok」を選択し、Enterキーを押します。
8
最初の画面に戻りますので、「Finish」を選択し、Enterキーを押します。
9
プロンプトに戻りますので、以下のとおり入力します。
$ sudo pip3 install smbus2, i2c-tools
10
インストールが終了したら、以下のとおり入力します。
$ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- --
上記のとおり出力されるはずです。今回使用するサーボモータードライバのI2C通信用アドレスは初期値では上記のとおりになってます。
これでサーボモータードライバへ命令が出せるようになりました。
Python3でサーボモーターを動かしながら調整する
最後にサーボモーターの制御を行うための調整を行います。
調整を行う点としては、以下の2つになります。
- サーボモーターのパルス幅の調整
- サーボモータの0°位置の特定(物理的な位置の設定)
それではまず、サーボモータードライバを利用するためのライブラリをインストールします。
1
コマンドプロンプトを起動して、Raspberry Pi にSSHで「pi」ユーザを使ってログインします。
$ ssh pi@raspberrypi.local -p 12345
※「pi」はユーザ名になります。別のユーザに変更した場合はそちらを使います。
※「raspberrypi.local」はホスト名です。
OSインストール(書き込み)時にホスト名を変更した場合は、そちらのホスト名を入力します。
※「-p 12345」はRaspberry PiのSSH接続用のポートです。標準の「22」から変更した場合は指定します。
2
パスワードを聞いてきますので初期パスワードを入力します。
$ raspberry Linux raspberrypi 5.10.17-v7l+ #1414 SMP Fri Apr 30 13:20:47 BST 2021 armv7l ......
$
※OSのインストール(書き込み)時にSSH接続設定でパスワードを設定した場合は、
そちらのパスワードを入力します。
3
以下のコマンドを実行します。
$ sudo pip3 install adafruit-circuitpython-servokit
4
Python3を起動します。
$ python3
Python 3.9.2 (default, Mar 12 2021, 04:06:34)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
5
以下の内容を入力します。
from adafruit_servokit import ServoKit kit = ServoKit(channels=16) kit.servo[0].set_pulse_width_range(400, 2200) kit.servo[0].angle = 0
※上記の「set_pulse_width_range(400, 2200)」で設定している値がパルス幅です。
この値はサーボモーター毎に違うので、注意が必要です。
ここでは一度400ms~2200msに設定します。
※上記の「kit.servo[0].angle = 0」を実行するとサーボモーターが動きます。
動き終わったらサーボモーターに耳を近づけて、空回り音が聞こえないか確認します。
空回り音が聞こえる場合、先ほど400に設定した値を増やして再度試してみてください。
6
上記「5」の結果、サーボモーターが止まった位置を0°とする場合、サーボモータの回転部分にサーボホーンと呼ばれる部品をサーボモーター本体と水平になるように設置します。
※サーボホーンはサーボモーターに付属しているはずです。
7
サーボホーンをつけた状態で以下の通り入力し、実行します。
kit.servo[0].angle = 180
8
サーボホーンが回り、反対側(180°)の位置に移動すればOKです。
※180°付近よりも小さい角度で止まる場合、上記「5」で入力した「set_pulse_width_range(400, 2200)」の最大値(2200)を大きくします。調整幅は50msずつ行いましょう。いきなり大きくするとサーボモーターが壊れる場合があります。
※調整を行った場合は、再度「7」を実行してサーボホーンの位置を確認してください。
3つのサーボモーターを同時に動かす
それぞれのサーボモーターの調整が終わったら、いよいよ3つ同時に接続して動作させてみます。
サーボモータードライバの接続ピンに次のようにサーボモーターを接続し、設定します。
- servo[0].set_pulse_width_range(400, 2200)
- servo[1].set_pulse_width_range(400, 2200)
- servo[2].set_pulse_width_range(400, 2200)
※設定値は個別で調整してください。
それでは3つ同時に動かしてみます。
1
コマンドプロンプトを起動して、Raspberry Pi にSSHで「pi」ユーザを使ってログインします。
$ ssh pi@raspberrypi.local -p 12345
※「pi」はユーザ名になります。別のユーザに変更した場合はそちらを使います。
※「raspberrypi.local」はホスト名です。
OSインストール(書き込み)時にホスト名を変更した場合は、そちらのホスト名を入力します。
※「-p 12345」はRaspberry PiのSSH接続用のポートです。標準の「22」から変更した場合は指定します。
2
パスワードを聞いてきますので初期パスワードを入力します。
$ raspberry Linux raspberrypi 5.10.17-v7l+ #1414 SMP Fri Apr 30 13:20:47 BST 2021 armv7l ......
$
※OSのインストール(書き込み)時にSSH接続設定でパスワードを設定した場合は、
そちらのパスワードを入力します。
3
Python3を起動します。
$ python3
Python 3.9.2 (default, Mar 12 2021, 04:06:34)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
4
以下のプログラムを記述して実行します。
import time from adafruit_servokit import ServoKit kit = ServoKit(channels=16) kit.servo[0].set_pulse_width_range(400, 2200) kit.servo[1].set_pulse_width_range(400, 2200) kit.servo[2].set_pulse_width_range(400, 2200) for i in range(10): kit.servo[0].angle, kit.servo[1].angle, kit.servo[2].angle = 180*(i%2),180*(i%2),180*(i%2) time.sleep(1)
プログラムを実行すると次の動画のように3つのサーボが同時に動作します。
(投稿用に動画のフレームを落としているので早く見えています。。。)
いかがだったでしょうか。
ロボットアーム試作のため、サーボモーターを3つ同時に動作させるところまでを記事にしました。
これで動作させる土台はできたことになります。
後は、平行リンク機構を使った3軸のロボットアームを実際に組み上げるだけですね。
次回は、実際にロボットアームを組んでみたいと思います。
ご期待ください!
サーボモータードライバ(Servo Bonnet for Raspberry Pi)
サーボモータードライバ基板のセットです。Raspberry PiのGPIO配列に対応したコネクタがついているので、Raspberry Piに直接指して利用することができます。最大16個までのサーボモーターを制御できます。電源は5Vを外部から接続するために、DCJackか端子台のどちらかを取り付けることができます。Amazonで確認
Raspberry Pi Zero WH
小型のRaspberry Pi製品です。メモリは少ないですが、IoT機器内に実装するにはちょうどいい大きさです。
Wi-FiやBluetoothモジュールも実装されているので、リモートから操作することもできます。スイッチサイエンスさんで確認
マイクロサーボモーター SG90
小型のサーボモーターです。大きさは: 22mm×11.5mm×27mmで、 重さ 9gほどの小さいものです。
トルクは1.8kg/cm (4.8Vのとき)です。
回転制御パルス幅:0.5ms~2.4ms、制御角:±約90°(180°)Amazonで確認