2021年5月7日金曜日

電源回路を改良しよう!

今回は電源回路の改良に挑戦したいと思います。

ロボットの稼働にはエネループを使用していますが、たまにロボットの動きがギクシャクするときがあります。

そこで、ロボット歩行時の電源回路の3.3V端子の電圧を計測してみました。以下がその結果です。

エネループ満充電後のロボット直進歩行時の3.3V端子電圧を100Hzで10秒間計測しています。

これをみると所々電圧低下が見られます。一応、使用しているマイコンのデータシートを確認すると電源電圧は3.0Vから3.6Vの範囲内であれば動くようですが、満充電直後にもかかわらず一瞬とはいえ3.0Vを下回るのはよろしくありません。これではマイコンが安定してロボットの制御が出来なくなるのも納得です。

使用している三端子レギュレーターはNJM2391というものでドロップアウト電圧が1.1Vもあります。つまり、3.3Vを保つためには電池が常に4.4V以上の電圧を出力する必要があります。

しかし、既に紹介したようにサーボモータに大電流が流れると電池の内部抵抗のため電圧低下が起こりますので「常に4.4V以上」というのは厳しそうです。

そこで、ドロップアウト電圧が0.18Vという低損失のNJM2845を使ってみようと思います。

ロボットを分解してNJM2391三端子レギュレーターを基板から取り外し、代わりにNJM2845を半田付けします(サラッと書いていますが、作業はとても大変でした...)。

再び、ロボット歩行時の電源回路の3.3V端子の電圧を計測してみます。結果は以下の通りです。

非常に電圧が安定するようになりました!

ロボットのギクシャクした動きもなくなり、そのため、一回の充電での稼働時間が大幅に伸びました。

皆様もよろしければ参考にして頂ければと思います。

次回は今のところ未定です。

2021年5月3日月曜日

起き上がり動作をさせよう!

今回はロボットに起き上がり動作をさせます。

ちなみに、「よさイチつくロボ」本にはp.181にざっとした説明があるだけで、正直、これだけで起き上がり動作を完成させることは難しそうでした。

そこで、本の著者のページを探してみると起き上がり動作について詳細な解説が載っていました。以下のページを参考にしながら進めていきます。ソースコードもダウンロードして「mr6-1」のプログラムを参照します。

予算1万円でつくる二足歩行ロボット | cog | Meuse Robotics

足のネジを短いものに変える件については既にこのブログでも紹介していますので割愛します。

手先を延長するために付ける部品ですが、これは余った基板があるはずですのでそこから調達します。具体的にはロボットの手先についている部品と全く同じものを先端に接着します(私はエポキシ系の接着剤を使いました)。

上記の著者のページに「Hip Pitch軸をより前方に曲げられるようにサーボホーンの取り付けセンターを前側にひと歯ずらす」とありますが、ひと歯だけだと著者ページの写真と比較して十分な角度が得られない感じだったのでふた歯ずらしました。ずらした分、プログラム中のオフセットを調整します(私の場合、offset[1]の値が-32、offset[10]の値が+32変わりました)。

次は、プログラムの変更です。前回まで作成したソースコードをエディットしていきます。

具体的には、

  • 「mr6-1」から「#define STDUP  7」をコピペ。
  • 「mr6-1」からint16_t stdupの値を初期化している部分をコピペ。
  • 足を曲げた際になるべく前方に足が来るように(ロボットのボディ前面のプレートに足がギリギリ接触しない位置になるように)Hip Pitch軸を調整。具体的には、stdupの[5][1]、[6][1]、[5][10]、[6][10]4つの値を変更。デフォルトではそれぞれ220と-40が入っている。
  • 「mr6-1」からリモコンの「↘」に反応する部分(case 129:)をコピペして、さらに処理の中に「nextKeyFrame = 1;」を加える。
  • // サウンド出力 のコメントの1行上に、 if(action[nextKeyFrame][12] == 127)actionMode=STOP; を加える。

ちなみに、私の場合上記の220と-40はそれぞれ195と-15になりました。足を曲げすぎてボディに接触してしまうと過電流が流れてマイコンが落ちる可能性がありますし、逆に曲げが足りないとちゃんと起き上がれませんので頑張ってベストな値を探しましょう。

以上の変更後、ロボットを起動してうつ伏せ状態にしてからリモコンの「↘」キーを押します。

はい、上手く起き上がれました。

若干、真っ直ぐ起き上がれていないのは腕のオフセットを全く調整していないためと思われますが、とりあえず起き上がれたのでこのままで良しとします。

次回は、ロボットの電源回路の改良を行う予定です。

2021年4月27日火曜日

ロボットを完成させよう!

いよいよ仕上げです。

本ではp.181に「リスト5-19のプログラムまでで一応の完成」と書かれているので今回はリスト5-19を動かすところまでいきます。

ちなみに、今回ロボットを本格的に動かすにあたって乾電池を「EVOLTA NEO」から「エネループ」に変更しました。というのも、本格的に動かし始めると結構すぐに電池がなくなってしまい何回も交換することになったからです。エネループは充電器等初期投資がかかりますが長い目で見ればお得なのではないかと思いました。

「エネループ」に切り替える際に心配だったのが電池の起電力です。アルカリ乾電池は1.5Vと書かれていますが「エネループ」は1.2Vです。電圧が足りなくなるとマイコンが暴走してしまうのでこのロボットの場合、4本で4.4V保てるかどうかが重要になってきます。パナソニックのウェブサイトから抜粋した以下のグラフによると単3形電池のデータではありますが500mA流れていても1.2V以上キープできるようなので問題無さそうでした。

では、早速リスト5-19をロボットに書き込みます。基本的に前回のリスト5-6が動くところまで出来ていればリスト5-19を動かせる状態になっているはずです。自分のロボット用に求めたオフセット値の書き込みを忘れないようにしましょう。

そのまま動かせば完成!...となれば良かったのですが今回も幾つか注意すべき点がありますので箇条書きします。

  • rtrn(右旋回)のモーションデータを見ると左足首のロール軸が90度のままで固定されてしまっています。左旋回のデータを参考にしてrtrnの[5][3]を90から100に変更します。
  • 各モーションは独立して勝手に動く(モーション間の遷移動作無し)ので実際にロボットをリモコンで動かすときは各モーションとモーションの間に直立姿勢を挟んで動かすことになると思います。各モーションの途中の姿勢から直立姿勢へと遷移する際(およびその逆動作時)に、姿勢によってはサーボモータが高速で動いて電圧不足でロボットが落ちることがあります。これを避けるためにソースコードを変更しました。サーボモータの動作を補間してゆっくり動かすようにします。具体的には、
    • リモコンからの信号を処理しているswitch文のSTOP時の処理(case 32:)中でkeyFrameとnextKeyFrameとdivCounterに0を代入。およびtempAngles[i] = 90;としている処理をコメントアウト。
    • // サーボ角度計算 のコメントが書かれているところから // サーボ信号出力 のコメントが書かれているところまで以下のように変更
      // サーボ角度計算
      if(keyFrame == 0 && nextKeyFrame == 0){//STOPからの最初のモーション
        for(int i=0; i<12; i++) {
          tempAngles[i] = 90 + int8_t((action[nextKeyFrame][i] - 90) * divCounter / action[nextKeyFrame][12]);
        }
      }else{
        for(int i=0; i<12; i++) {
          tempAngles[i] = action[keyFrame][i] +
               int8_t((action[nextKeyFrame][i] - action[keyFrame][i])
                    * divCounter / action[nextKeyFrame][12]);
        }
      }
    }else{
      //STOPモード
      for(i = 0; i < 12; i++) {
        if(tempAngles[i] < 90) tempAngles[i]++;
        if(tempAngles[i] > 90) tempAngles[i]--;
      }
    }
 

  • リスト5-18には書かれているのですが、なぜかリスト5-19ではSTOP時に音を消す処理が抜けていますので、上記STOP時の処理(case 32:)中に ledcDetachPin(audPin); を挿入します。
  • 足首のロール軸動作時にロボットのフレーム同士がぶつかることがあったので足の方のフレームを削りました(下写真赤丸部分)。

という感じで、結構苦労しました...

結果、以下のように

LEDオン→前進→後退→左横歩行→右横歩行→左旋回→右旋回→LEDオフ

で動作させることが出来ました。

一応、これで一通り完成ですが、次回は起き上がり動作に挑戦してみたいと思います。

2021年4月21日水曜日

ロボットを歩かせよう!

ではいよいよ、ロボットを歩かせます。

といっても、今回は「簡易歩行」であって最終的な歩行とは異なるモーションとなります。

まずは本のリスト5-1のプログラムを動かしてサーボ1台ずつのオフセットをざっくり見つけていきます。

次にリスト5-2のプログラムを動かして全体でオフセットの微調整を行います。両脚の位置が左右対称に揃って両方の足裏が全体で偏りなく接地していればOKです。

とりあえず、上半身のサーボ(sv4~sv7)はオフセット0のままで問題ないと思います。

ここまで出来たら途中を飛ばしてリスト5-6のプログラムを動かせるはずです。

ちなみに、上手くいかないときはネジの緩みがないか確認すると良いと思います。私の場合はサーボをフレームにネジ1本で止めている箇所(足首と股関節のピッチ軸)が緩んでいたので締め直しました。締めすぎるとネジがバカになるので慎重に。

はい、動きました。

この歩き方だと机の上だと滑って上手く進まないのでノートパソコンのカバーの上で歩かせました。

若干右寄りに進んでいますがとりあえずこのまま先に進みます。

次回は、ロボットを完成させるところまで行く予定です。


2021年4月18日日曜日

ロボットを組み立てよう!

今回はロボットの筐体部分を組み立てていきます。

まず、パーツを切り出します。


ひとつひとつニッパーで切り離してヤスリで仕上げる作業は結構大変でした。

組立に際して幾つか注意が必要だった箇所を箇条書きしておきます。

  • 本のp.137に脚部の組み立てについて書かれていますが、ここでサーボホーンに使用するネジを長いものではなく短いものに変更(どちらもサーボに付属のもの)しておくと後々p.181でネジを交換する必要が無くなります。

  • 本のp.139で肩の組み立てについて書かれていますが、ここもサーボホーンに使用するネジをネジを長いものではなく短いものに変更した方が良いと思います。長いままだと肩を回転させたときにサーボのケーブルが絡みやすくなりますので。

  • 本のp.141で両脚の取り付けについて書かれていますが、基板上のターミナルブロックの側面の突起とサーボモータが干渉してそのままでははまりませんでした。ターミナルブロックの突起をニッパーで切り取ったらはまりました。

  • 本のp.143のフロントプレートの取り付けの際に気がついたのですが、サーボからケーブルが出ている位置が本のもの(ほぼ底面から出ている)と異なり側面の途中から出ているため(下の秋月電子通商の商品ページからの写真参照)フロントプレートのデフォルトの穴ではケーブルを逃げさせるのに大きさが足りません。これだけのためにもう一回基板を発注するのはしんどいし、穴を広げるのも大変そうだったので無理矢理(多少プレートが反りますが)ネジ止めしてしまいました。余裕がある方は基板の発注前にCADの図面上で穴を広げることをおすすめします。

  • フロントプレートに頭部と腰部のプレートを固定する方法が本には明示されていませんでしたが、5mmの樹脂スペーサーを挟んで両側からM2.6の小ねじで固定すれば良いようです。

というわけで、なんとか組み立て完了しました!

差し込みのパーツではまりが緩いところはエポキシ系接着剤で接着しました。

ちなみに私はタッピングネジを回しているときに(結構な力が必要)、手が滑ってドライバーが自分の手に刺さってしまいました。

皆さんも怪我の無いように注意して下さいね。

次回はサーボの角度調整&簡易歩行をする予定です。

2021年4月13日火曜日

サーボの動作確認をしよう!

 前回までにマイコンにプログラムを書き込んで動かすところまで出来ました。

今回は、サーボを接続してプログラムから動かしてみます。

「よさイチつくロボ」の本ではp.132でsv0端子に接続されたサーボの角度を90度にするプログラムが紹介されています。ただ、これだとsv0端子の確認しか出来ず(端子はsv0~sv11まで12個あります)、また同時に複数のサーボを動かすことが出来るかどうかのチェックが出来ません。

そこで本のp.156のリスト5-7のプログラムを使って歩行(左足へ重心を移す→右足を前に動かす→右足へ重心を移す→左足を前に動かす)時の動きがちゃんと出来るかどうか確認しました。


はい、ちゃんと動きました!歩行動作ではsv0とsv11を使用しないので、この2つは別途動かして動作確認をしました。

...と、これで終わりだったら簡単だったのですが、残念ながら思わぬ事態が発生しました。しばらく動かしているとサーボが暴走し始めたのです。ロボット組立後にこの暴走が起こっていたらサーボやフレームを壊していたかもしれませんので、この段階で発見できて良かったと思います。

最初は原因が分からず途方に暮れましたが、試しに本のp.134のプログラムを参考にしながらサーボの角度を0度→90度で往復運動するようにしてみました。この場合、上記の歩行プログラムと異なりサーボは最高速度で動くことになります。

すると、サーボ1個および2個まではちゃんと動作していたのですが3個同時に動かすと暴走することが分かりました。そこで電源の端子電圧を計測してみるとサーボ駆動時にかなりの電圧低下が起こっていました。どうやら、

サーボを複数動かす

大電流が流れる

電池の内部抵抗のため起電力が大きく落ちる

三端子レギュレーターが3.3Vを発生できなくなる

マイコンが暴走

という流れのようです。

これは困った...

マイコンの暴走を防ぐため三端子レギュレーターの出力側に1000μFの電解コンデンサーを取り付けたりしましたが恒常的な電力不足には通じませんでした。

結局、内部抵抗の低い高級アルカリ乾電池「EVOLTA NEO」に交換したら暴走しなくなりました。安物のアルカリ乾電池では力不足だったようです。

「EVOLTA NEO」の場合、上記歩行プログラムは問題なく動きますし、サーボを最高速度で動かしても3個までは大丈夫です。ただ、4個だと暴走するのでロボットのモーションをつくるときは「なるべく少数のサーボでゆっくりの動き」を心がけた方が良さそうです。

いやいや、今回はかなり焦りました。

皆さんも安物の乾電池は使わないようにしましょうね。

最後に、次回以降の組立に入る前にサーボの角度を全部90度に合わせておきました。

次回はロボットのフレームを組み立てていく予定です。

2021年4月7日水曜日

電子回路の動作確認をしよう!

 さて、前回半田付けをした基板の電子回路の動作確認を行います。

ドキドキしますね。

半田付けが得意でない私は動作確認の瞬間はいつも緊張します。

本のp.125からの説明に従ってPCにAdruinoIDEをインストールすれば基板上で動くソフトウェアの開発環境の構築は完了です。

では、基板とPCを接続します。

あれ?

購入した「USBシリアル変換モジュール」のピンが細くてブレッドボード用の「ジャンパーワイヤ」がちゃんとはまらない...スカスカだ...

これじゃ、基板と接続できないじゃん...

どうしましょう...


はいっ!

たまたま家にブレッドボードと両端オスのジャンパーワイヤが落ちていたので、これで接続しましょう。


こんな感じです。

あれ?

接続するケーブルは6本なのに、本のp.121のパーツリストで指定されているピンソケットの端子数は8。

うーん、これは6ピンの間違いでしょうかね。

まあ、上記の写真のように「大は小を兼ねる」状態なので今回は大丈夫ですが。

あと、パーツリストには載っていませんが「USBシリアル変換モジュール」とPCを接続するUSBケーブルが一般的な「Aオス-マイクロBオス」ではなくて若干マイナーな「Aオス-ミニBオス」となりますので、持っていない人は購入するのを忘れずに。


ようやく準備が整ったので、本のp.128に従ってLEDを点滅させるLチカをインストールして走らせてみます。

はい、ちゃんと動きました!

これで一安心です。


今回は結構トラブルが多かったですね。

今後の皆様のご参考のためにまとめますと、

・ブレッドボード買いましょう

・ジャンパーワイヤは両端オスを買いましょう

・ピンソケットは8ピンではなく6ピンのものを買いましょう

・(持って無ければ)Aオス-ミニBオスUSBケーブルを買いましょう

ですね。

次回はサーボの動作確認を行う予定です。