ロボットの目をつくろう
目は表情やコミュニケーションを行う上で重要です。動物やロボットが周りをキョロキョロ見回していると、可愛いですよね。そこでロボットの「目」を作っていきたいと思います。
ちなみに今回作るのはカメラやセンサではなく、アニメキャラクターのように動く「目玉」です。
動物や架空の生物などの動きを再現するロボットを作成するアニマトロニクスと呼ばれる分野があります。そうした分野で目玉の動きを実現するデバイスを考案されている方がいます。
一方でこうしたデバイスはリアルな動作な反面、動作箇所が多く作成、制御の難易度が高くなります。
そこで機能を限定し、ほぼ全てのパーツを3Dプリンタで印刷でき、組み立ても簡単にできるものを作りました。今回作成したものは、利用するサーボモータは2つだけなので制御もメンテナンスも簡単です。
3Dプリンタで作る!目玉モジュール
今回作成する目玉モジュールはほぼ全てのパーツを3Dプリンタで作成します。3Dプリンタで印刷するパーツのSTLファイルは下記サイトで販売しています。また必要なサーボモータも2つだけです。
Cults 3D: https://cults3d.com/en/3d-model/gadget/simple-eye-module-for-robots
ダイジェスト動画
作り方のダイジェスト動画はこちらです。合わせてご覧ください。
用意するもの
必要なものを以下に列挙します。
- Simple Eye ModuleのSTLファイルを印刷したものすべて
- SG90サーボモータ 2個
- ネジ M2 8mm 2本
- ネジ M2 10mm 4本
- ネジ M2 15mm以上 8本
- ナット M2 14個
- 動作させるためのマイコンボード(Arduinoなど)
Simple Eye Module for Robotsに含まれているSTLファイルは以下になります。
- arm1.stl
- arm2.stl
- base.stl
- eye_L.stl
- eye_R.stl
- eyelid.stl
- front_base.stl
- gear_eye.stl
- iris_L.stl
- iris_R.stl
- rear_base.stl
これらをすべて3Dプリンタで印刷したものを用意してください。
またSG90サーボモータが2つ必要になります。
ネジ、ナットはホームセンターなどで購入してください。
その他、サーボの位置の指定と、実際のコントロールにArduinoなどのマイコンボードが必要となります。
本記事ではArduinoで利用する場合を想定しますが、Raspberry Piなどサーボモータを制御できるマイコンボードなら何でも利用可能です。
作り方
まずはパーツを一通り印刷しましょう。図1が印刷したものです。
次にサーボモータSG90を2つとも、90度の位置に合わせておきましょう。Arduinoでは、以下のコードで90度に設定することができます。下記のコードを利用する際は、サーボモータの信号線を11ピンに接続してください。SG90の場合、GNDを茶、Vccを赤、信号線を黄色の線に接続します。
#include <Servo.h>
Servo servo;
void setup() {
servo.attach(11);
}
void loop() {
servo.write(90);
delay(1000);
}
サーボ位置を90度にしたら、2つともrear_baseに取り付けます。(図2,3)
ネジはM2 8mmと10mmを2本ずつ使います(図4)。反対側からM2ナットで固定してください(図5,6)。サーボの向きにも注意しましょう。
ギアを取り付けます。SG90に付属のサーボホーンをgear_eyeにはめ込みます(図7、8)。向きに注意しましょう。
サーボホーンをrear_baseに取り付けた下向きのサーボモータSG90に固定します。これも向きに注意しましょう。図9を参考に取り付け、SG90に付属のネジで固定します。サーボホーンの先端が後方になるように取り付けます。
では、目玉パーツを組み立てましょう。eye_Lとiris_L、eye_Rとiris_Rそれぞれに対し、所定の位置にはめ込んでください(図10、11)。きつすぎる、ゆるすぎる場合はヤスリで削ったり、接着剤を利用するなどして調整してください。
組み立てた目玉パーツをbaseに取り付けます。baseの2つの柱にeye_L, eye_Rをそれぞれはめ込みます(図12)。
次に目玉パーツに歯車の歯が噛み合うようにrear_baseを取り付けます(図13)。baseの後ろ側から歯車が噛み合うように入れ込みます(図14)。
歯車同士が噛み合うようにrear_baseを入れる事ができたら、ネジM2 15mm以上で4箇所固定します。裏側からはナットM2で固定してください(図15)。また後述しますが、長いネジを用意し、寸法を合わせた固定パーツを自作してその固定パーツに固定することも可能です。
ここまで組み立てると図16のようになります。
では続いてまぶたを組み立てて行きます。eyelidとfront_baseを用意します(図17)。
まず図18のようにeyelidとfront_baseをあわせます。図18の状態だと、まだ少しずらすと外れてしまいます。
これを、baseの前方からはめ込みます(図19)。少しきつい場合は、しっかりと押し込む必要があります。しっかりとはめ込んだら、eyelidは外れなくなっているはずです。
ここまでできたら、front_baseをネジM2 15mm以上で固定します(図20)。裏側からはM2ナットを使うなどして固定してください。
eyelidを動かすためのアームを取り付けます。図21のように、SG90付属のサーボホーンとarm2を合わせます。
これをもう片方の横向きのSG90に取り付けます。このとき、arm2の向きが図22の角度になるようにSG90付属ネジで固定します。サーボホーンの先端が水平になるようにします。
次にarm1を取り付けますが、図23のようにarm1には向きがあります。切れ込みが深い方をarm2側に取り付けます。また両方の穴にM2ナットを入れておき、ナットを入れた側を内側に向けます。
アーム部分は先ほど固定したSG90のサーボホーン、arm1とarm2、arm1とeyelidの計三か所固定します。arm1とarm2の固定はM2ネジ10mmのものを使用します(図24)。このときarm1とarm2が滑らかに動く程度にし、締め付けすぎないようにしましょう。
同様にeyelidとarm1をM2ネジ 10mmで固定します。こちらもきつく締めすぎないようにしましょう(図25)。
これで完成です。baseとfront_base, rear_baseの固定位置は、図26の寸法で定めています。これに合わせて別の固定パーツを作成すれば、M2ネジ の長いもので固定することが可能です(図27)。
動作テスト
では実際に動かしてみましょう。このモジュールは、目玉を動かす水平方向のサーボモータSG90の動作角度が45°~135°(図28)、まぶた(eyelid)を動かす方のサーボモータの動作角度が40°~100°です(図29)。取り付け時のずれによって多少変動しますので、調整してお使いください。
Arduino用サンプルプログラムがこちらです。(こちらからも取得できます。Github)
#include <Servo.h>
// Servo
Servo servo_eyelid, servo_eye;
// Servo angles
int eyelid_min = 40, eyelid_max = 100;
int eye_min = 45, eye_max = 135;
// Current time and previous time
unsigned long prev = 0, current = 0, elapsed = 0;
// Time interval
unsigned long interval_milli_sec = 150;
unsigned long eye_interval_milli_sec = 1000;
unsigned long current_eye_interval = 0;
unsigned long eyelid_interval_milli_sec = 3000;
unsigned long current_eyelid_interval = 0;
int eyelid_basepos = eyelid_max;
int eye_motion_number = 0;
int blink_motion_number = 0;
void setup() {
servo_eye.attach(11);
servo_eyelid.attach(13);
}
void loop() {
// Get the current time in milliseconds
current = millis();
// Calculate the time elapsed since the previous loop iteration
elapsed = (current - prev);
// Execute control of the eye and eyelid servos each time interval_milli_sec elapses
if(elapsed >= interval_milli_sec){
///servo for eyes
current_eye_interval += elapsed;
if(current_eye_interval >= eye_interval_milli_sec){
int angle = 90;
if(eye_motion_number == 0){
angle = eye_min;
eye_motion_number++;
}else if(eye_motion_number == 1){
angle = eye_max;
eye_motion_number++;
}else{
eye_motion_number = 0;
}
servo_eye.write(angle);
current_eye_interval = 0;
}
///servo for eyelid
current_eyelid_interval += elapsed;
if(blink_motion_number == 1){
servo_eyelid.write(eyelid_basepos);
blink_motion_number = 0;
}
if(current_eyelid_interval >= eyelid_interval_milli_sec){
if(blink_motion_number == 0){
servo_eyelid.write(eyelid_min);
blink_motion_number++;
}
current_eyelid_interval = 0;
}
prev = current;
}
}
このとき、配線は図30のようにします。目玉を動かす水平方向のサーボモータをピン11,まぶたを動かす方のサーボモータをピン13に接続します。今回はArduino Leonardoとの接続例ですが、別のArduinoの場合はpwmに対応したピンであればどこでも使えます。ピンを変える場合は、setup()内のattach()のピン番号を変えてください。
これでダイジェスト動画のように動作するはずです。
またArduino以外のボード(Raspberry Pi, M5Stackなど)でも同様に利用可能です。