Znapを作ってみた ~レゴマインドストームEV3~ | そう備忘録

Znapを作ってみた ~レゴマインドストームEV3~

Znap

教育用レゴマインドストームEV3(拡張版)で組立説明書に載っていたZnapを作った時の備忘録。

znap全体

そもそもZnapという名前の意味が分からなかったのでネットで検索をしたのだがモバイル決済サービスが検索されてしまい、結局znapの意味は分からなかった。

恐らくこの噛み付くウサギの様な耳を持った動物(?)の愛称がZnapなんだと思う。

必要なセット

Znapは教育用レゴマインドストームEV3の基本セットだけでは組み立てることが出来ず、拡張セットが必要になる。

必要なセットは以下の通り。

基本セット

教育用レゴマインドストームEV3基本セット。

Amazonで並行輸入品を購入することも可能だが結局自分は正規代理店のアフレルのサイトで購入した

その時の記事はこちら

拡張セット

基本セットを拡張する為のセット。

上記のアフレルのサイトでも購入するができるがAmazonでも購入可能。

機構

Znapの主な機構は以下の通り。

駆動系

左右のLモータで駆動輪、キャタピラを回転させて前進、後退、左右への移動を行う。

中央にあるのは超音波センサー

Lモータ2つでキャタピラを駆動

キャタピラは3点で支えている

キャタピラなのでちょっとした段差であれば乗り越える事ができる

キャタピラ

Mモーターを使って顎全体(顔?)を前方に移動してマジックハンドの様な動きで噛み付く動作をする

あご

噛み付く動作の様子

噛み付く動作の様子

結構なスピードでエイリアンみたいに顎が飛び出してきてガシッと噛み付くので迫力がある

またちょっと見づらいのだが奥にMモーターがあり、ベベルギアで顎全体を動かしている

Mモーターとベベルギア

超音波センサー

顎の下に超音波センサーが設置されており顎周辺の物体との距離を計測している

40cm以内に物体が近づくと噛み付く動作をするようにプログラミング(後述)されている

超音波センサー

プログラム

全体

プログラムは2つの非同期で動作する処理群から成り立っている。

  1. 超音波センサーで40cm以内にモノが近づくと噛み付く動作する処理群
  2. 右回転、左回転、前方に動き回る動作をする処理群

尚、こちらは教育用レゴマインドストーム公式サイトのサンプルプログラムを参考にしている。

この後、このプログラムをベースに若干の変更を加えているがそれについては後述する。

プログラム全体

処理群1の詳細

処理群1の詳細

1.Znapループ

ループブロックでループを繰り返す

  • 終了条件:無限

2.

CHK変数の取り出し

変数ブロックよりCHKを読み出して4.データワイヤーで出力する

  • 変数名:CHK
  • 読み込み、ロジック

尚、CHK変数は処理群2にて”真”に設定される

つまり処理群2(左右回転、前進動作)を実行していないうちは後続の処理(噛み付く動作)を実行しない様に制御している

3.

超音波センサー、比較、距離

超音波センサーブロック使ってモノが40cm以内に検出されると”真”を出力する

  • 超音波センサー:比較、距離(cm)
  • 比較タイプ:4(<)
  • しきい値:40(cm)
  • 比較結果:データワイヤーで4.に出力する
  • 距離:使用しない

4.

ロジック操作

ロジック操作ブロックでAとBが共に”真”の時に結果に”真”を出力する

どちらか一方が”真”で無い時は”偽”を出力する

  • ロジック操作:AND(両方が”真”の時だけ”真”を出力する)
  • A:処理3の出力結果
  • B:処理2の出力結果
  • 結果:処理5にデータワイヤーで出力する

5.

スイッチ

スイッチブロックで条件分岐する

4.の結果が”真”の場合は上の処理群、”偽”の時は下の処理群(何もしない)を処理する

  • スイッチ:ロジック

6.

Mモーターで顎を閉じる

Mモーターブロックで噛み付く動作を行う

  • Mモーター:オン
  • パワー:-100※

※マイナスは噛み付く動作、プラスは顎が引っ込んで元に戻る動作をする

7.

音の再生

音ブロックで音声を再生する

  • 音:ファイルの再生
  • ボリューム:100
  • 再生タイプ:0(完了待ち)
  • ファイル名:T-rex roar※

※T-rex(ティラノザウルス)のroar(叫び声)を指定している

8.

0.25秒待機する

待機ブロックで0.25秒待機する

  • 待機:時間
  • 秒:0.25(秒)

0.25秒間待機することにより顎が伸び切るのを待っている

9.

Mモーター、ストップ

Mモーターを停止する

  • Mモーター:オフ
  • ブレーキ方法:ブレーキ(惰性運転を行わない)

10.

待機ブロックで1秒間待機する

待機ブロックで1秒間待機する

  • 待機:時間
  • 秒:1(秒)

11.

Mモーターで顎を元に戻す

Mモーターブロックで顎を元に戻す動作を行う

  • Mモーター:秒数
  • パワー:-100※
  • 秒:1(秒)
  • ブレーキ方法:ブレーキ(惰性運転を行わない)

※プラスは顎が引っ込んで元に戻る動作をする

12.

待機ブロックで1秒間待機する

  • 待機:時間
  • 秒:1(秒)

処理群2の詳細

処理群2

1.MNループ

ループブロックでループを繰り返す

  • 終了条件:無限

2.ROLループ

ループブロックでループを繰り返す

  • 終了条件:無限※

※サンプルプログラムでは終了条件が無限になっていたが、ここの意味がイマイチ分からない

ここが無限だと10以降の処理が実行される事が無いのでLモータが停止されない

ひとまずこのロジックで実行してみるが、後ほど噛み付く動作をしたら一旦止まって10秒間待機するロジックに変更してみる

3.

CHK変数に真を書き込む

 

変数ブロックを使用してCHK変数に”真”を書き込む

  • 変数:書き込み、ロジック
  • 値:真

これにより処理群1の2.で呼び出される値が”真”になる

 

4.

ランダムブロックで1~3の数値を発生させる

ランダムブロックで1~3の数値をランダムに発生させる

  • ランダム:数値
  • 下限:1
  • 上限:3
  • 値:データワイヤーで処理5.の回転数に出力する

処理5(右旋回)の車輪の回転数を1~3までランダムに発生させて毎回異なる量の旋回をするようにしている

 

5.

Lモータで右旋回

ステアリングブロックで左右のLモータを駆動して右旋回する

車輪の回転数は処理4.の出力結果

  • ステアリング:回転数
  • ステアリング:100(右旋回)
  • パワー:100
  • 回転:処理4.の出力結果を受け取る
  • ブレーキ方法:ブレーキ(惰性運転を行わない)

6.、7.

4.、5.と同様の方法にて左旋回を行う

8.、9.

4.、5.と同様の方法にて前進を行う

10.

変数CHKに偽を書き込み

変数CHKに”偽”を書き込む

  • 変数:書き込み、ロジック
  • 値:”偽”

ROLループ終了時に噛み付く動作をしないようにするための処理

ただ前述した通り、ROLループの終了条件が無限なのでこのロジック自体が実行される事は通常では無いので10.以降の処理はあまり意味が無いように思う

11.

動作の停止

ステアリングブロックを使用して動作を停止する

  • ステアリング:オフ
  • ブレーキ方法:ブレーキ(惰性運転を行わない)

12.

待機ブロックで10秒間待機する

待機:時間
秒:10(秒)

プログラム修正

処理群2の10以降の処理が気になったのでプログラムを修正する。

噛み付く動作をしたら10秒間停止をして、その後再び動作を開始するようにプログラムを修正してみる。

全体

修正プログラム

変更点は以下の3ヶ所。

stop変数を新規に作成して初期値(”偽”)をセットすると同時にCHK変数にも初期化(”偽”)をセットした

初期のサンプルプログラムにはCHK変数の初期化が行われていなかったので念の為、初期化を行った

噛み付く動作行ったらstop変数に”真”をセットして10秒間待機した後、再び”偽”をセットする

この10秒間だけ処理群2の左右旋回や前進処理が停止される

一番外側のループ(MN)を削除してstop変数が”偽”の時は今まで通りの処理、”真”の時はステアリングブロックでLモータを停止する

結果

実際に動かしてみた所、おおよそイメージ通りの動きはするのだが処理群1と2が非同期で動作しているのでタイミングによっては噛み付く動作をした後、すぐに止まらない事がある。

例えば処理群2で右旋回中にstop変数が”真”になっても後続の処理が実行されてしまう。

厳密に噛み付く動作をしたらすぐにLモータを止めたいのであれば旋回処理ごとに条件分岐を入れるなどの工夫が必要になると思う。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。