徒然なるままにMake:

Fusion360 3Dプリンタ 電子工作 面白そうなモノづくりをやっていくブログ

3Dプリンターでロボット作ってみる 多脚ロボット編14

前回

something-make.hatenablog.com

このロボットの3Dデータは下のリンクのものを使用しています

www.thingiverse.com

このロボットをある程度歩かせることに成功したので、これからは電源を内臓して独立して動けるようにしていきます。f:id:something-make:20180911222609j:plain

まずは電源として電池の搭載

サーボモータの電源としてエネループ4本、Arduino駆動用に9V電池をマジックテープのベルトで搭載します。

 

サーボモータを動かすときにガタつく傾向があったので電解コンデンサーをサーボモータ電源に追加します。

f:id:something-make:20180911222608j:plain

 

基板とArduinoを搭載するスペースが無いので、搭載用のパーツをつくります。

まずロボットのネジの間隔を定規で測ってFusion360で設計、このときネジ穴はM3なので余裕をみてφ4mmで設計します。

 f:id:something-make:20180911222618p:plain

それを3Dプリンターで出力します。f:id:something-make:20180911222615p:plain

 

完成したものは特に問題なくロボットに取り付けることができました。

f:id:something-make:20180911222612j:plain

 

これで問題無く動くはずなのですが・・・


3Dプリンターでロボット作ってみる 多脚ロボット編14

 

どうやら電池を搭載したことで重心の位置が変わってしまったようです。

サーボモータの動きにも不審な点があるので、今後は煮詰めて行きます。

3Dプリンターでロボット作ってみる 多脚ロボット編13

something-make.hatenablog.com

このロボットの3Dデータは下のリンクのものを使用しています

www.thingiverse.com

makezine.jp昨日から引き続き上のサイトを参考に逆運動学をプログラミング

そしてようやく前足が動きました


3Dプリンターでロボット作ってみる 多脚ロボット編13 逆運動学の実装

逆運動学を解いて、右前足を一直線に動かしています。

サーボモータのガタが大きいですが、これで逆運動学をしっかり実装できていることがわかります。

f:id:something-make:20180910181658p:plain

なかなか動かなかったのでExcelで検証したりしたかいがありました。

問題は左足です。

左足はロボット右側をx軸の基準にすると180度付近をロボットの足が動きます。

すると角度を計算するときに逆三角関数Asin Acos Atanが180度を超えたところで負の値に切り替わってしまい、プログラミングが難しくなります。

そこで座標系を右側と左側で変えることにしました。

f:id:something-make:20180910182254p:plain

これなら三角関数の問題は生じません。

これでようやくロボットが歩くようになりました。


3Dプリンターでロボット作ってみる 多脚ロボット編13 テスト歩行

 

まだ基板や電源がロボットに載っていませんし、足先が滑っています。またサーボモータの制御が甘いせいで動きがガタついています。

しかしこれで一つの山を越えることができました。

今後は基板と電源をロボットに搭載することと、制御を滑らかにすることを目標にします。

 

3Dプリンターでロボット作ってみる 多脚ロボット編12

 

something-make.hatenablog.com

このロボットの3Dデータは下のリンクのものを使用しています

www.thingiverse.com

昨日の続きでArduinoをいじってて気付きました。

昨日Arduinoにはアークコサインが実装されていない。

なんて大嘘書きました。

されてました。

avr-libc: <math.h>: Mathematics

Arduinoの解説ページArduino - Hにはアークタンジェントしか説明が無いのですが、そこからさらにリンクでArduinoのベースになってるAVRマイコンのページに、アークコサインがしっかり書いてありました。

こんなことに気付くのにこれまた時間を随分浪費してしまいました。反省です。

3Dプリンターでロボット作ってみる 多脚ロボット編11

something-make.hatenablog.com

このロボットの3Dデータは下のリンクのものを使用しています

www.thingiverse.com

ハードウェアが形になったのでソフトウェアをつくっていきます。

とりあえずの目標は、「スイッチを入れたらロボットが前進する」という動作ができることにします。

ロボットの歩かせ方で参考にしたのはこのサイト

makezine.jp

とりあえずこのサイトを参考にする場合に必要なのが運動学と逆運動学。ロボット系の書籍には大体書いてありますが、要は手足の先の位置と関節の角度の関係を表す方法です。

 

こういう図を見たことがある人も多いと思います。

f:id:something-make:20180908225544p:plain

関節が二つあるロボットの腕、又は脚をモデルにしたもので、

  x = l 1 cos θ 1 + l 2 cos θ 1 + θ 2

  y = l 1 sin θ 1 + l 2 sin θ 1 + θ 2

という数式で表すことができます。これをこのまま逆にしてxとyを入力すると関節の角度が出てくる方程式を作ってもいいのですが、結構ややこしいので今回は簡略化します。

f:id:something-make:20180908231729p:plain

右端が足先、左が脚の根元として、この問題は脚の根元から足先までの距離Lを求め、距離Lを実現するための角度θ1を求める問題になります。

足先までの距離Lは

  L = x 2 + y 2 + z 2

で座標から簡単に求めることができます。

ここでLをl1,l2で表すと

  L = l 1 + l 2 cos θ 2 2 + l 2 sin θ 2 2

  = l 1 2 + 2 l 1 l 2 cos θ 2 + l 2 2 cos 2 θ 2 + l 2 2 sin 2 θ 2

sinとcosが消えて

L = l 1 2 + l 2 2 + 2 l 1 l 2 cos θ 2

これを変形して

  cos θ 2 = L 2 - l 1 2 - l 2 2 2 l 1 l 2

足先の位置と脚の長さがあれば、角度を表せることがわかりました。あとはこれを逆三角関数に入力すれば角度を求めることができます。

ここまでやってさて実装してみようとArduinoIDEを開いたのですが、重大な問題に気付きました。Arduinoにはアークコサインが実装されていない。

Arduino 日本語リファレンス

通常の三角関数はあるのですが、逆三角関数が無いんですね。

無いものは作るしかありません。

cos関数は実装されているので数値を比較することで段々目的の角度に近づけるアルゴリズムをわざわざ実装してつくりました。

Acos 0.5 = 60deg
top 0.00 , buttom 180.00
top 0.00 , buttom 90.00
top 45.00 , buttom 90.00
top 45.00 , buttom 67.50
top 56.25 , buttom 67.50
top 56.25 , buttom 61.88
top 59.06 , buttom 61.88
top 59.06 , buttom 60.47
top 59.77 , buttom 60.47
top 59.77 , buttom 60.12
top 59.94 , buttom 60.12
top 59.94 , buttom 60.03
top 59.99 , buttom 60.03
top 59.99 , buttom 60.01
top 60.00 , buttom 60.01
top 60.00 , buttom 60.00
top 60.00 , buttom 60.00
top 60.00 , buttom 60.00
top 60.00 , buttom 60.00
top 60.00 , buttom 60.00
top 60.00 , buttom 60.00
top 60.00 , buttom 60.00
top 60.00 , buttom 60.00
60.00deg

結構計算を無駄にやっている感じがしますが、実際に答えを出力してくれるようになったので問題ありません。

 

この関数ができた後、ふと数学は専用のヘッダーファイルとかがあるのでは?という考えにようやく至り、検索してみたした。

Arduino - H

ありましたアークタンジェント

これがあるならアークサインもアークコサインも出せますね。

結局ほぼ丸一日棒に振ってしまいました。

3Dプリンターでロボット作ってみる 多脚ロボット編10

something-make.hatenablog.com

このロボットの3Dデータは下のリンクのものを使用しています

www.thingiverse.comどうにもサーボモータの一つの動きがおかしい

ネクターの辺りを触ると動いたり動かなかったり

これはひょっとしてコネクターがガタガタになってるのかなと思ってコネクターを交換してみました

f:id:something-make:20180907223530j:plain

でも直らない

 

いろいろ試しても直らず、これはもうサーボモータを交換するしかないかと思って配線を外している最中に基板を裏返したらこの通り

f:id:something-make:20180907223556j:plain

f:id:something-make:20180907224033j:plain

GNDの線のハンダが外れているだけでした

 

たったこれだけのトラブルですが、解決に何時間もかかってしまいました。

「基板のハンダはそうそう簡単に外れたりしない」という思い込みのせいで随分時間を無駄にしてしまいました。

思い込みはダメですね。あとハンダ付けはしっかりしないといけません。

3Dプリンターでロボット作ってみる 多脚ロボット編9

something-make.hatenablog.comこのロボットの3Dデータは下のリンクのものを使用しています

www.thingiverse.com前回はArduino 日本語リファレンスを参考にサーボモータ制御プログラムを書いたのですが、サーボモータが二つ動いていませんでした。

どうにもおかしいのでいろいろと調べた結果、出てきたのは

Arduinoのデジタル出力は0番と1番のRX TXを極力使用しないこと

要はこの0番と1番はチップの書き込みなんかに使用したりもしているので、使用すると不具合が生じる可能性が高いということ。

実際0番と1番の使用をやめて2~13番のデジタル出力を使うようにしたら問題は解決しました。リファレンスに書いてなかったんですが、界隈では常識みたいですね。

 

f:id:something-make:20180906204118j:plain

まさかこんなに簡単に解決できるとは思っていませんでした。

これでプログラムを書いていくことができます。

3Dプリンターでロボット作ってみる 多脚ロボット編8

something-make.hatenablog.comこのロボットの3Dデータは下のリンクのものを使用しています。

www.thingiverse.com

サーボモータと基板とArduinoを接続します。

とりあえず適当な角度で電源を投入してみました。


3Dプリンターでロボット作ってみる 多脚ロボット編8

サーボモータが二つほど動いていません。

他のサーボモータはしっかり動いているのに謎です。

明日は原因を探っていきたいと思います。