https://blog.with2.net/link/?1965529

四足歩行ロボット

https://blog.with2.net/link/?1965529

四本の脚を交互に動かして歩行しようというロボットがあります。

英語ではQuadruped Robot というらしい。

車輪もしくはクローラで動くロボットばかりを製作してきたので足で歩くロボットというものは新味があって面白い。

製作してみようと思い立ったきっかけとなったサイトはこちらです。

https://makezine.com/2016/11/22/robot-quadruped-arduino-program/

・開発構想

1.四本足とし一本当たり3個のサーボモータを使用する。

2.距離センサにより障害物を検知し回避運動をとること。

さてどうやって歩行するのかですが色々な方式があるようです。参考にしたサイトでは「CreepGait」と呼ばれる方式を使っていて、常に三本の足を地面につけて一本の足を伸ばして移動するので常に地面に着いている三本の足で安定を保てるメリットがある。簡単そうなのでこの方式を採用することにしました。

図は今回採用した歩行パターンです。六つのパターンを繰り返すことになります。

set1:これは静止状態。片側の2本の足が広がり、もう片側の2本の足は内側に閉じている。

step1:右上の足を浮かせて前方に伸ばす。

move1:すべての足が地面についた状態ですべての足を同じ角度だけ後ろに回転させ、本体を前方に押し出す。

set2:左後ろの足を浮かせて引き寄せる。これで最初の静止状態の左右対称形になる。

step2:左上の足を浮かせて前方に伸ばす。

move2:すべての足が地面についた状態ですべての足を同じ角度だけ後ろに回転させ、本体を前方に押し出す。次に右後ろの足を浮かせて引き寄せ、本体の脇に置く。これでset1に戻ることになる。あとはこの繰り返しです。

・主要な部品類

個数の多いサーボモータはSG90という安価なサーボを使う、アリババで一個120円程度です。

距離センサにはSHARPのGP2Y0A21Kを使うことにする。

Arduinoは基板を搭載するスペースが非常に狭いので小型のProMiniを使用する。

電源はいつものリチウムイオン電池CR123A、3.7Vを二個直列としてArduino ProMiniの電源とし、センサ電源はArduinoから供給する。

サーボモータの駆動電源としては定格2AのDC-DCコンバータで5Vに降圧したものを供給する。

・回路図

配線がやたら多い以外は実に簡単な回路です。

・構想図

まずはいつものように構想図を三次元CADにて描く。

特に初めて手掛ける機体でもあるのでこの段階で時間をかけて吟味しておかないと後になって手直しが増えてしまう。画面上で各部を動かして干渉するところがないかよく吟味しておく。

構想図はDesignSpark Mechanicalにより作図している。部品図もこのソフトで作図出来る。

脚の稼働範囲をCAD上でチェックしてみる。

・工作

まずは脚を先に製作していく。1.5㎜のプラ板を貼り合わせて、所々に補強材を入れて強度をもたせるように製作していく。

サーボを格納するボックスは三個とも同一形状

この後、脚先端の補強のために一部部材を追加している

最後はヤスリで仕上げる。完成した四本の脚本体である。これにサーボモータを取り付ける。

完成した四本の脚

本体は同じくプラ板からΦ84㎜円板を切り出して難なく完成である。

基板は秋月電子で片面丸型ユニバーサル基板50.8mm径を購入。部品を実装し本体に取り付ける。電源、スイッチおよび距離センサは上面の円板に取り付ける。

サーボモータのリード線がやたらに長いので格納に苦労する。サーボモータを分解してリード線を切り詰めることも出来るが12個となるとさすがにやる気はでない。

基板そのものはProMiniとコネクタだけの簡単なものです。

基板を取り付ける

一通り工作は終了したので組み立てにとりかかる。

完成した機体。

サーボモータの取り付け位置調整のためにゼロ点を指示するプログラムを作り(以下にzipファイルを添付しておきます)角度90度で作動させた状態で写真のような位置ですべてのサーボモータを取り付ける。

leg_initial_position

ゼロ点位置での機体の状態。

プログラム開発の間は電池節約のためにサーボモータの電源は上の写真のように外部から供給している。

・スケッチ開発

Arduinoでサーボモータを制御するには標準ライブラリにあるServo.hを使うのが一般的だが、Servo.hはサーボモータの回転速度が制御できずフルスピードで動いてしまう。

任意の速度で動かしたい場合にはVarSpeedServo.h というライブラリを使う。これを使うとサーボの回転スピードを制御しながら動かすことが可能となる。

ただし、制限があるようで仕様欄では「Supportsup to 8 servos」となっている点。意味がよくわからないが今回の四足歩行ロボットでは12個のサーボモータを使うので問題がおきそうです、しかし結果的には特に不具合もなく制御できている。多分同時に制御できるのは8個までという意味であろう。

setup()までのスケッチは以下のようになる。

#include <VarSpeedServo.h>

VarSpeedServo servo[4][3];

//define servos’ ports
const int servo_pin[4][3] = { {2, 3, 4}, {5, 6, 7}, {8, 9, 10}, {11, 12, 13} };
//{elbow, wrist, shoulder} {{R-F} {R-R} {L-F} {L-R}}

//speed range 1-255
const float move_speed = 100;
const float lift_speed = 75;

//赤外線距離センサ(GP2YOA21)を定義
const int value = A3;
int distance = 0;

void setup() {
Serial.begin(9600);
servo_attach();
warming_up();
shaking();
set_up();
}

void servo_attach(void){
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
servo[i][j].attach(servo_pin[i][j]);
delay(100);
}
}
}

冒頭の歩行パターンのスケッチは以下のようになる。

void move_forward(){
//set1
servo[1][0].write(120,lift_speed); //RR elbow
servo[1][1].write(90,move_speed); //RR wrist
servo[1][2].write(140,move_speed); //RR shoulder
delay(200);
servo[1][0].write(90,lift_speed); //RR elbow

//step1
servo[1][2].write(140,move_speed); //RR shoulder
servo[0][0].write(120,lift_speed); //RF elbow
servo[0][2].write(140,move_speed); //RF shoulder
servo[0][1].write(110,move_speed); //RF wrist
delay(200);
servo[0][0].write(90,lift_speed); //RF elbow
delay(100);

//move1
servo[0][1].write(110,move_speed); //RF wrist
servo[1][2].write(90,move_speed); //RR shoulder
servo[2][2].write(140,move_speed);//LF shoulder
servo[3][2].write(140,move_speed); //LR shoulder
servo[3][1].write(110,move_speed); //LR wrist
delay(100);

//set2
servo[3][0].write(120,lift_speed); //LR elbow
servo[3][1].write(90,move_speed); //LR wrist
servo[3][2].write(40,move_speed); //LR shoulder
delay(200);
servo[3][0].write(90,lift_speed); //LR elbow
delay(100);

//step2
servo[2][0].write(120,lift_speed); //LF elbow
servo[2][2].write(50,move_speed); //LF shoulder
servo[2][1].write(110,move_speed); //LF wrist
delay(200);
servo[2][0].write(90,lift_speed); //LF elbow
delay(100);

//move2
servo[0][2].write(50,move_speed); //RF shoulder
servo[1][0].write(90,lift_speed); //RR elbow
servo[1][1].write(110,move_speed); //RR wrist
servo[2][1].write(90,move_speed); //LF wrist
servo[3][2].write(90,move_speed); //LR shoulder
delay(200);
}

試行錯誤の結果目標にしていた前進、障害物検知、回避旋回の一連の動きは完成した。

このままでは味気ないので背伸びから脚伸縮をイメージしたウオーミングアップモードを追加した。

以下にスケッチのzipファイルを添付しておきます。特殊なプログラム手法はもちいず力業で作成しています。

Quadruped_Robot

歩行はまだまだ改良の余地があるが、障害物回避などの動作はうまくいっているようだ。

これで今回のモデルの製作は一応終了である。

今後の課題としては、

  • さらに歩行パターンを滑らかに
  • 遠隔操作をやってみたいがWiFiモジュールを載せる場所がない。機体の裏面を使えばなんとかなりそうではあるが。
  • 後退、左旋回パターンを追加しなければならない

シェアする

フォローする