1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

4足歩行ロボを作って、うまくいかなくてやめた、って話

Last updated at Posted at 2020-08-14

サーボモータ8個とArduinoを使った4足歩行ロボット(挫折)🥺

#概要

4足歩行ロボットは大きく分けて2種類ある。ソフトバンクホークスをPepper君と応援して話題になった、Boston Dynamics社のSpot君のような、逆関節で4足歩行する哺乳類的なロボと、強襲突撃型トーマスのような、足を上げてから本体に対して回転させて歩行するクモ型ロボである(クモ型ロボは6本足のものも多い)。この中で、前者のようなロボを作ろうとした。
ボディを3Dプリンタで印刷したサーボを保持するパーツ(マウント)と、タミヤのユニバーサルプレート、およびユニバーサルアームを模した3Dプリンタ製パーツなどで制作、Arduino nanoと16chサーボドライバ(PCA9685)で8個のマイクロサーボを動かすまでには至った。
しかし、座る←→立つ、歩くといった動作がうまくいかずに挫折した。
改善するべき点はいくつかあるし、わかってもいるが、一旦打ち切りにしようと思った。
失敗の原因と思しきものなどを記録として残すことにした。

#材料・使用器具

Arduino nano 中華製互換品
16chサーボモータドライバ PCA9685
マイクロサーボ(SG-90) 中華製互換品
QIDI Tech 3Dプリンタ QIDI X-Smart
タミヤ ユニバーサルプレート(2枚セット)
タミヤ ユニバーサルアームセット(オレンジ)←3Dプリンタで模したパーツに換装
アクリサンデー
Nintendo SwitchのJoy-Conのスティックのカバー(足先の滑り止め)
M3なべネジ 10mm 12mm ワッシャー 六角ナット
ブレッドボード
ジャンパワイヤ
単三電池 4本
単三電池ボックス
(途中で挫折したため、Arduino本体の外部電源は不使用。モバブか9V電池を使用予定だった。)

#外観

見た目はよくできてると思う







#動画

#制作過程メモ

ArduinoスケッチはPCA9685_test1~7
サーボモータの番号は、右前足の腰が0、膝が1、左前足の腰が2、膝が3、右後ろ足の腰が4、膝が5、左後ろ足の腰が6、膝が7。
腰が90°、膝が180°で座る。腰が0°、膝が0°で立つ。(←腰が0°までだと腿を前に出す動作はできない。Spot君みたいな動作を目指すしかない。)
足の角度メモは↓

#コード
PCA9685_test_7.ino(歩かせるプログラム。↑の動画のやつ)を載せるが、これを使っても歩けない。もっとうまいやり方があるはず。

PCA9685_test_7.ino(クリックして展開)
PCA9685_test_7.ino
// PCA9685(サーボモータドライバ)テスト7
// 歩かせようとしたけど、トルク不足か強度不足か、足が浮かず歩かなかった

#include <Wire.h>
#include <PCA9685.h>            //PCA9685用ヘッダーファイル(秋月電子通商作成)

PCA9685 pwm = PCA9685(0x40);    //PCA9685のアドレス指定(アドレスジャンパ未接続時)

#define SERVOMIN 150            //最小パルス幅 (標準的なサーボパルスに設定)
#define SERVOMAX 600            //最大パルス幅 (標準的なサーボパルスに設定)

void setup() {
  pwm.begin();                   //初期設定 (アドレス0x40用)
  pwm.setPWMFreq(60);            //PWM周期を60Hzに設定 (アドレス0x40用)

  // 立つ
  servo_write(0, 180);  // 右前腿を真下に
  servo_write(2, 0);    // 左前腿を真下に
  servo_write(4, 180);  // 右後ろ腿を真下に
  servo_write(6, 0);    // 左後ろ腿を真下に

  servo_write(1, 0);    // 右前すねを180°開く
  servo_write(3, 180);  // 左前すねを180°開く
  servo_write(5, 0);    // 右後ろすねを180°開く
  servo_write(7, 180);  // 左後ろすねを180°開く
  delay(2000);
}

void loop() {
  // 右足シーケンス1
  servo_write(0, 180);  // 右前腿を真下に
  servo_write(2, 0);    // 左前腿を真下に
  servo_write(4, 180);  // 右後ろ腿を真下に
  servo_write(6, 0);    // 左後ろ腿を真下に

  servo_write(1, 10);   // 右前すねを
  servo_write(3, 180);  // 左前すねを180°開く
  servo_write(5, 0);    // 右後ろすねを180°開く
  servo_write(7, 170);  // 左後ろすねを
  delay(250);

  // 右足シーケンス2
  servo_write(0, 180);  // 右前腿を真下に
  servo_write(2, 20);   // 左前腿を
  servo_write(4, 160);  // 右後ろ腿を
  servo_write(6, 0);    // 左後ろ腿を真下に

  servo_write(1, 10);   // 右前すねを
  servo_write(3, 180);  // 左前すねを180°開く
  servo_write(5, 0);    // 右後ろすねを180°開く
  servo_write(7, 170);  // 左後ろすねを
  delay(250);

  // 右足シーケンス3
  servo_write(0, 180);  // 右前腿を真下に
  servo_write(2, 10);   // 左前腿を
  servo_write(4, 170);  // 右後ろ腿を
  servo_write(6, 0);    // 左後ろ腿を真下に

  servo_write(1, 0);    // 右前すねを180°開く
  servo_write(3, 180);  // 左前すねを180°開く
  servo_write(5, 0);    // 右後ろすねを180°開く
  servo_write(7, 180);  // 左後ろすねを180°開く
  delay(250);

  // 左足シーケンス1
  servo_write(0, 180);  // 右前腿を真下に
  servo_write(2, 0);    // 左前腿を真下に
  servo_write(4, 180);  // 右後ろ腿を真下に
  servo_write(6, 0);    // 左後ろ腿を真下に

  servo_write(1, 0);    // 右前すねを180°開く
  servo_write(3, 170);  // 左前すねを
  servo_write(5, 10);   // 右後ろすねを
  servo_write(7, 180);  // 左後ろすねを180°開く
  delay(250);

  // 左足シーケンス2
  servo_write(0, 160);  // 右前腿を
  servo_write(2, 0);    // 左前腿を真下に
  servo_write(4, 180);  // 右後ろ腿を真下に
  servo_write(6, 20);   // 左後ろ腿を

  servo_write(1, 0);    // 右前すねを180°開く
  servo_write(3, 170);  // 左前すねを
  servo_write(5, 10);   // 右後ろすねを
  servo_write(7, 180);  // 左後ろすねを180°開く
  delay(250);

  // 左足シーケンス3
  servo_write(0, 170);  // 右前腿を
  servo_write(2, 0);    // 左前腿を真下に
  servo_write(4, 180);  // 右後ろ腿を真下に
  servo_write(6, 10);   // 左後ろ腿を

  servo_write(1, 0);    // 右前すねを180°開く
  servo_write(3, 180);  // 左前すねを180°開く
  servo_write(5, 0);    // 右後ろすねを180°開く
  servo_write(7, 180);  // 左後ろすねを180°開く
  delay(250);
}
void servo_write(int ch, int ang) { //動かすサーボチャンネルと角度を指定
  ang = map(ang, 0, 180, SERVOMIN, SERVOMAX); //角度(0~180)をPWMのパルス幅(150~600)に変換
  pwm.setPWM(ch, 0, ang);
  delay(1);
}

#失敗した原因?

  • サーボのトルク不足
    立つ動作さえできない。歩く時も足が浮かない。
    でもこれより大きいトルクが出せるサーボは秋月で1個1300円、Amazonでも安くて1500円とかするし、重量がかさむ

  • 足が長すぎ
    もっと短ければトルクの小さいマイクロサーボでもいける?

  • 本体が重い
    電池がね……単4電池に変えれば電池の重量と容量は半分に減る。有線接続も視野に入れるべきか?

  • プログラミング
    足が立つような順序、足が浮いて歩くような角度を研究すべき

  • バランスが悪い
    そもそもうまく立たない。前か横に倒れる。サーボとマウントの角度がそろってない。それぞれの足の角度が違うからバランス崩れる?

  • サーボの軸からマウントが外れて回転する
    付属のねじ止め(M2タッピング)も限界がある。3Dプリンタ製パーツの嵌めあいも微妙なところ。付属のサーボホーンを利用してどうにかするのがベターか?

#改良したい点・案

  • サーボマウントの設計
    軸から外れて回転しないようにしたいのと、アームとマウントは別、かつ、ネジ一本で簡単に分離できるような設計にしたい(挟みこむ形にしているので、分離が大変←調整やメンテ性の低下)

  • 足の向きの変更
    足をSpot君みたいに前足・後ろ足を両方逆関節にするのではなく、前足は順関節(人間の膝的な)にするとか?前後方向に機体が大きくなるけど安定性は増しそう。

  • 計画性のなさ
    全体の設計図を考えてから作ったほうがいい

#結果と考察

上に示した諸原因により、座る←→立つ、歩くといった動作ができなかった。疲れたし萎えたのでいったんこのプロジェクトはやめにして、別のロボットなどに着手することにする。
何事もうまくいくとは限らないのだ……失敗を糧に次に繋げよう。🥺

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?