Znapを作ってみた ~レゴマインドストームEV3~
Contents
Znap
教育用レゴマインドストームEV3(拡張版)で組立説明書に載っていたZnapを作った時の備忘録。
そもそもZnapという名前の意味が分からなかったのでネットで検索をしたのだがモバイル決済サービスが検索されてしまい、結局znapの意味は分からなかった。
恐らくこの噛み付くウサギの様な耳を持った動物(?)の愛称がZnapなんだと思う。
必要なセット
Znapは教育用レゴマインドストームEV3の基本セットだけでは組み立てることが出来ず、拡張セットが必要になる。
必要なセットは以下の通り。
基本セット
教育用レゴマインドストームEV3基本セット。
Amazonで並行輸入品を購入することも可能だが結局自分は正規代理店のアフレルのサイトで購入した
その時の記事はこちら
拡張セット
基本セットを拡張する為のセット。
上記のアフレルのサイトでも購入するができるがAmazonでも購入可能。
機構
Znapの主な機構は以下の通り。
駆動系 | 左右のLモータで駆動輪、キャタピラを回転させて前進、後退、左右への移動を行う。 中央にあるのは超音波センサー キャタピラは3点で支えている キャタピラなのでちょっとした段差であれば乗り越える事ができる |
顎 | Mモーターを使って顎全体(顔?)を前方に移動してマジックハンドの様な動きで噛み付く動作をする 噛み付く動作の様子 結構なスピードでエイリアンみたいに顎が飛び出してきてガシッと噛み付くので迫力がある またちょっと見づらいのだが奥にMモーターがあり、ベベルギアで顎全体を動かしている |
超音波センサー | 顎の下に超音波センサーが設置されており顎周辺の物体との距離を計測している 40cm以内に物体が近づくと噛み付く動作をするようにプログラミング(後述)されている |
プログラム
全体
プログラムは2つの非同期で動作する処理群から成り立っている。
- 超音波センサーで40cm以内にモノが近づくと噛み付く動作する処理群
- 右回転、左回転、前方に動き回る動作をする処理群
尚、こちらは教育用レゴマインドストーム公式サイトのサンプルプログラムを参考にしている。
この後、このプログラムをベースに若干の変更を加えているがそれについては後述する。
処理群1の詳細
1.Znapループ | ループブロックでループを繰り返す
|
2. | 変数ブロックよりCHKを読み出して4.データワイヤーで出力する
尚、CHK変数は処理群2にて”真”に設定される つまり処理群2(左右回転、前進動作)を実行していないうちは後続の処理(噛み付く動作)を実行しない様に制御している |
3. | 超音波センサーブロック使ってモノが40cm以内に検出されると”真”を出力する
|
4. | ロジック操作ブロックでAとBが共に”真”の時に結果に”真”を出力する どちらか一方が”真”で無い時は”偽”を出力する
|
5. | スイッチブロックで条件分岐する 4.の結果が”真”の場合は上の処理群、”偽”の時は下の処理群(何もしない)を処理する
|
6. | Mモーターブロックで噛み付く動作を行う
※マイナスは噛み付く動作、プラスは顎が引っ込んで元に戻る動作をする |
7. | 音ブロックで音声を再生する
※T-rex(ティラノザウルス)のroar(叫び声)を指定している |
8. | 待機ブロックで0.25秒待機する
0.25秒間待機することにより顎が伸び切るのを待っている |
9. | Mモーターを停止する
|
10. | 待機ブロックで1秒間待機する
|
11. | Mモーターブロックで顎を元に戻す動作を行う
※プラスは顎が引っ込んで元に戻る動作をする |
12. | 待機ブロックで1秒間待機する
|
処理群2の詳細
1.MNループ | ループブロックでループを繰り返す
|
ループブロックでループを繰り返す
※サンプルプログラムでは終了条件が無限になっていたが、ここの意味がイマイチ分からない ここが無限だと10以降の処理が実行される事が無いのでLモータが停止されない ひとまずこのロジックで実行してみるが、後ほど噛み付く動作をしたら一旦止まって10秒間待機するロジックに変更してみる | |
3.
| 変数ブロックを使用してCHK変数に”真”を書き込む
これにより処理群1の2.で呼び出される値が”真”になる
|
4. | ランダムブロックで1~3の数値をランダムに発生させる
処理5(右旋回)の車輪の回転数を1~3までランダムに発生させて毎回異なる量の旋回をするようにしている
|
5. | ステアリングブロックで左右のLモータを駆動して右旋回する 車輪の回転数は処理4.の出力結果
|
6.、7. | 4.、5.と同様の方法にて左旋回を行う |
8.、9. | 4.、5.と同様の方法にて前進を行う |
10. | 変数CHKに”偽”を書き込む
ROLループ終了時に噛み付く動作をしないようにするための処理 ただ前述した通り、ROLループの終了条件が無限なのでこのロジック自体が実行される事は通常では無いので10.以降の処理はあまり意味が無いように思う |
11. | ステアリングブロックを使用して動作を停止する
|
12. | 待機ブロックで10秒間待機する 待機:時間 |
プログラム修正
処理群2の10以降の処理が気になったのでプログラムを修正する。
噛み付く動作をしたら10秒間停止をして、その後再び動作を開始するようにプログラムを修正してみる。
全体
変更点は以下の3ヶ所。
1 | stop変数を新規に作成して初期値(”偽”)をセットすると同時にCHK変数にも初期化(”偽”)をセットした 初期のサンプルプログラムにはCHK変数の初期化が行われていなかったので念の為、初期化を行った |
2 | 噛み付く動作行ったらstop変数に”真”をセットして10秒間待機した後、再び”偽”をセットする この10秒間だけ処理群2の左右旋回や前進処理が停止される |
3 | 一番外側のループ(MN)を削除してstop変数が”偽”の時は今まで通りの処理、”真”の時はステアリングブロックでLモータを停止する |
結果
実際に動かしてみた所、おおよそイメージ通りの動きはするのだが処理群1と2が非同期で動作しているのでタイミングによっては噛み付く動作をした後、すぐに止まらない事がある。
例えば処理群2で右旋回中にstop変数が”真”になっても後続の処理が実行されてしまう。
厳密に噛み付く動作をしたらすぐにLモータを止めたいのであれば旋回処理ごとに条件分岐を入れるなどの工夫が必要になると思う。
この記事が何処かで誰かの役に立つことを願っている。
尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
最近のコメント