象とプログラミング ~レゴマインドストームEV3~
Contents
レゴマインドストームEV3の象(Elephant)
教育用レゴマインドストームEV3の拡張セットで象(Elephant)を組み立ててみた。
象は基本セットの他に拡張セットが必要で、値段もするので躊躇していたのだけれども拡張セットを購入すると象の他にもスピナー工場やタンクボットなどを組み立てることが出来るので思い切って購入してみた。
象は1つのLモーターで4つの足を動かして前進、後退ができる。
四足歩行の具体的な仕組みは後ほど書くとして両肩を揺らして左右にバランスをとりながらの、いかにも象が歩行している感がでていて秀逸な機構だった。
また秀逸と言えば鼻の構造も素晴らしい。
鼻を持ち上げたり(象が咆哮するときによく見るシーン)、内側に丸めて物を持ち上げる(材木を運ぶ時によく見るシーン)ことができて実際の鼻の動きをかなりの精度で再現している。
これを設計できるレゴビルダーは本当にすごいと思うし尊敬する。
また足と鼻の他には頭全体を上下に動かすことができる。
Mモーターとラックギア(棒状のギア)の組み合わせで頭を上げながら鼻を持ち上げながらの象の咆哮(音声ファイルの再生)は象を作ったらやってみたい、ある意味お約束の動きだと思う。
2019年1月23日 追記
象がバーベルを持ち上げて歩く動画を追加した
象(Elephant)の組み立て動画
拡張セットで象を組み立てた時の動画。
駆動部・センサー類の説明
四足歩行、頭の上下、鼻の動きについての説明。
四足歩行 Lモーター(ポートA) | 象の足は1つのLモーターで四足を動かしている また足の構造は以下の様になっている。 中心にある小さいギアがLモーターで反時計回りに回転すると両側のギアは時計回りに回転する 支点は1~4の4ヶ所 1と3、1と4は白い曲線状のブロックで接続されている
この時、4が一番左にあるのは1が時計の8時ぐらいの位置にある時で、逆に一番右にあるのは1が2時ぐらいの位置にある時となる 同様に3が一番左にあるのは1が時計の10時ぐらいの位置にある時で、逆に一番右にあるときは1が4時ぐらいの位置にある時になる 1が時計回転をしている場合、先に4が左端に達して少し遅れて3が左端に達する 詳しくは動画を見て欲しいがこの若干のズレ(遅れ)によって左前足はオールを漕ぐ様な動作をして前進する 左後ろ足も前足とほぼ同じ様な動きをするが違うのはタイミング 前足が後方にある時は後ろ足は前方、逆に前足が前方にある時は後ろ足は後方にある また右側の足も同様の動きをするのだが対角線にある左前と右後ろ、左後ろと右前は同じ動きをする※ ※左前足が前の時は右後ろ足も前 こうして4足で交互に漕ぐような動きをして象は前進する またモーターを逆回転させると象の足は逆に漕ぐような動きをして後退する |
頭の上下運動 Mモーター(ポートD) | 象の頭部は1を中心に回転する事で頭を持ち上げることができる Mモータの回転をラックギア(棒状のギア)を使って前後運動に変換して2、3を前後(写真上では左右)に動かして頭部を持ち上げる Mモータ周辺の機構 Mモータの回転運動をaの部分の前後(写真上では左右)運動に変換する
|
頭の動きとカラーセンサー(ポート4) | 頭部を持ち上げると赤いブロックがカラーセンサーに近づく カラーセンサーで色を判定して赤色が判別されたらこれ以上上昇させない様にストップさせる安全装置としての役割がある カラーセンサーで赤を判定した状態 |
鼻の動き Lモーター(ポートB) | 鼻は多数のギアが連なって構成されている Lモーターで頭部付近のギアを回転させると連なったギアにより鼻の先端のギアまで回転が伝わる 先端ではギアが回転しない様に固定されているので回転運動がブロック(鼻)の運動に変換されて鼻が持ち上がったり逆に丸まったりする 尚、鼻を持ち上げる方向にはL字型のストッパーが付いているので一定以上には持ち上がらない構造になっている 鼻を持ち上げる動きをした時の簡易的な図 |
鼻の動きとタッチセンサー(ポート1) | 鼻も頭部と同様ストッパー機能がついている 鼻が持ち上がって黒いブロックがタッチセンサーに触れるとそれ以上上昇させない様に制御をする事ができる タッチセンサーが押されている状態 |
しっぽ | 可動すると言えばしっぽも可動する ユニバーサルジョイントブロックをつかってしっぽが左右に振れるようになっている |
プログラム概要
まずはプログラムの全体構造、細かいブロック毎の機能やロジックは後述する。
また今回はマイブロックを使って複数のブロックに分けているのでブロック毎の説明とする。
尚、記事の最後にプログラミングと実際の動きの動画を載せているので確認してみて欲しい。
main | メインのブロック ここから条件に応じてReset、Lift_and_Roar、grabを呼び出してコントロールする main |
Reset | 初期処理の役割のブロック、頭、鼻を定位置に戻す Reset |
Lift_and_Roar | 鼻を持ち上げて咆哮した後、Resetを呼び出して頭、鼻を定位置に戻す Lift_and_Roar |
grab | Resetを呼び出して頭、鼻を定位置に戻した後、鼻を内側に丸めてバーベルを持ち上げる grab バーベル |
プログラム全体
mainブロック
全体の制御をするメインプログラム。
1 | プログラム開始 |
2 | Resetブロック呼び出す |
3 | プログラム終了まで4~21を繰り返す |
4 | int変数にゼロをセットする |
5 | インテリジェントブロックボタンが押されるまで待機する |
6 | 押されたボタンにより処理を振り分ける 上:7~9 下:10~12 左:13 右:14 中央:15 |
7 | int変数を読みこむ |
8 | 1を加算する |
9 | int変数に書き込む(int変数は1になる) |
10 | int変数を読みこむ |
11 | 1を減算する |
12 | int変数に書き込む(int変数はー1になる) |
13 | Lift_adn_Roarマイブロックを呼び出す |
14 | grabマイブロックを呼び出す |
15 | 象の鳴き声(咆哮)音声を再生する |
16 | int変数を読みこむ |
17 | int変数が0で無いかどうかを比較する 0以外:真(7~12の処理を通ってきている) 0:偽 |
18 | 真の時19~21の処理を行う 偽の時は何もしない |
19 | int変数を読みこむ |
20 | -5を掛ける |
21 | 掛けた値を回転数として前進/後退歩行する マイナス:前進する プラス:後退する |
Reset(マイブロック)
象の頭と鼻を初期状態に設定する。
1 | プログラム開始 |
2 | 頭を上げる |
3 | カラーセンサーが赤色を判定する(頭が上限に達する)まで待機 |
4 | 頭を上げるのを停止する |
5 | 鼻を持ち上げる |
6 | タッチセンサーが押されるまで(鼻が上限に達する)まで待機 |
7 | 鼻を持ち上げるのを停止する |
8 | 象の鳴き声(咆哮)音声を再生する |
9 | 1秒間待機する |
10 | 頭を所定の位置まで下げる |
11 | 0.1秒待機 |
12 | 頭の駆動用モーターの測定値をリセットする |
13 | 鼻を所定の位置まで下げる |
14 | 0.1秒待機 |
15 | 鼻の駆動用モーターの測定値をリセットする |
Lift_and_Roar(マイブロック)
鼻を持ち上げて咆哮する。
1 | プログラム開始 |
2 | 鼻を持ち上げる |
3 | タッチセンサーが押されるまで(鼻が上限に達する)まで待機 |
4 | 鼻を少しだけ下げる |
5 | Resetブロックを呼び出す |
grab(マイブロック)
バーベルを持ち上げる。
1 | プログラム開始 |
2 | Resetブロックを呼び出す バーベルを持ち上げる前に頭と鼻が所定の位置にある必要があるのでResetを呼び出している |
3 | 頭を上げる |
4 | 鼻を上げる |
5 | 頭をゆっくり下げる(3の前の位置まで戻す) |
6 | 更に弱いパワーで頭を1秒間下げる(下限まで下げる) |
7 | 鼻を下げる |
8 | 頭を上げる ※8と9は同時並行で行う |
9 | 鼻を内側に曲げる ※頭を上げながら鼻を内側に曲げることによりバーベルを持ち上げる |
使用したブロック
今回使用したブロックは以下の10種類。
Mモーターブロック
軽いものを素早く動かすことに適したモーター。
象の頭を上下に動かす為に使用している。
Lモータブロック
重いものをゆっくり動かすのが得意なLモータ。
前進、後退の歩行と鼻を曲げる動作に使用している。
待機ブロック
指定された条件に一致するまで待機するブロック。
カラーセンサーで赤色を検出した、タッチセンサーが押された等の条件に一致するまで待機する。
音ブロック
様々な音を再生する為のブロック。
Resetブロック 象の鳴き声(咆哮)音声ファイルを再生する
|
モーター回転ブロック
モーター回転ブロックで測定値をリセットする。
尚、モーター回転ブロックの詳細についてはこちらの記事を参照。
Resetブロック ポートB(鼻)とD(頭)のモーターの測定値をリセットする 尚、この処理は必ずしも必須では無い 初期処理の一貫として測定値をリセットしている
|
ループブロック
指定した条件に一致するまでループ(同じ処理を繰り返す)する。
mainブロック プログラム終了まで繰り返す ※インテリジェントブロックボタンによりそれぞれの処理を実行した後、ループして最初に戻る
|
変数ブロック
プログラム中の数値や文字列、ロジック(”真” or ”偽”)を保存することができる。
スイッチブロック
入力された条件により処理を分岐するブロック。
今回はインテリジェントブロックボタンにより実行する処理を分岐する。
数学ブロック
数学計算を行って結果を出力するブロック。
比較ブロック
2つの数値を比較して結果をロジック(”真” or ”偽”)で出力するブロック。
mainブロック 変数intがゼロで無い時にボタンの上か下が押されたと判断する
※ボタンの上か下が押された時にだけ前進/後退の処理をしたいので比較している |
プログラミングと実際に動かしてみた時の動画
象のプログラミングと実際に動かしてみた時の動画。
歩行の様子や鼻の動きなど動画で見るとより分かりやすいので見て欲しい。
このページを真似しながら一個ずつ理解していって、さきほどようやく象を動かすことができました。
Resetで頭と鼻を戻すとき、770度では戻り過ぎるみたいで、そこだけ調整が必要でした。
すごく参考になりました。ありがとうございます。
追伸:バーベルをなかなか掴んでくれないことにやきもきしますね(笑)
都落ちさん
コメントありがとうございます。
参考になったとのコメント嬉しいです。
自分も試行錯誤の中で色々なサイトを参考にしたので少しでも誰かの参考になればと思い記事して残しておきました。
役に立ったのであれば幸いです。
バーベルを掴む前に鼻がぶつかってしまうのですよね(笑)