カラーボックスでトレーニングロボットに指示を与えるプログラム ~レゴマインドストームEV3~ | そう備忘録

カラーボックスでトレーニングロボットに指示を与えるプログラム ~レゴマインドストームEV3~

色でトレーニングロボットに指示を与えるとは

教育用レゴマインドストームのトレーニングロボットにカラーセンサーを取り付ける。

カラーセンサーで読み取った色によってトレーニングロボットを制御するプログラムを作成する。

  • 青:前進
  • 赤:後退
  • 緑:左回り
  • 黄:右回り

上記の色以外は読み込まない。

またその際に色を読み取って直ぐにトレーニングロボットを動かすのではなく一旦配列に蓄えた後にまとめて保存した色にしたがってコマンドを実行するプログラムにする。

プログラムの全体イメージ

色によるトレーニングロボットの制御

プログラム全体イメージ

プログラムは

  • 色を読み取って配列に蓄える
  • 読み取った色別に異なる動作をさせる

の2つのロジックから構成されている。

尚、記事の最後にプログラミングと実際に動かした時の動画を載せているので確認してみて欲しい

プログラム全体イメージ

プログラム全体イメージ

プログラム全体とそれぞれの処理内容は以下の通り

プログラム全体図

1 

プログラムを開始する

3~8を4回ループする

タッチセンサーが押されるまで待機

カラーセンサーで青、緑、黄、赤の色が読み取られまで待機

変数を用意

4で読み取った色(数値)を数値配列に書き込む

書き込まれる数値配列

クリック音の再生

Ready音の再生

10

11~17を4回ループする

11

7で数値を保存した数値配列を読み込む

12

11の数値配列を順番に読み込んで値を13に出力する

13

12の出力結果によって処理を4種類に分岐する

14

13の値が2の時、トレーニングロボットを前進させる

15

13の値が3の時、トレーニングロボットを左旋回させる

16

13の値が4の時、トレーニングロボットを右旋回させる

17

13の値が5の時、トレーニングロボットを後退させる

使用したブロック

今回使用したブロックは以下の8種類。

ループブロック

ループ内に配置されたブロックを右側の条件に一致するまで繰り返す。

ループブロック 4回

ループを4回繰り返す

  • 番号:01
  • ループ:カウント
  • カウント:4

ループインデックス※をデータワイヤーで出力する。

※ループインデックスにはループ回数がセットされている

インデックスは0から始まるので1回目=0になるので注意

待機(タッチセンサー)ブロック

指定された条件になるまで待機するブロック。

今回は「タッチセンサーが押されるまで」待機する事によりプログラムの”一時時停止”的な意味合いで使っている。

待機(タッチセンサー)

タッチセンサーがバンプ(押される)まで待機する

  • 待機:タッチセンサー、比較、状態
  • 状態:2(バンプ)
  • 測定値:状態を出力する(今回は未使用)

待機(カラーセンサー)ブロック

指定された条件になるまで待機するブロック。

今回は「カラーセンサーが特定の種類の色を読み取るまで」待機する為に使っている。

待機(カラーセンサー)

カラーセンサーが青、緑、黄、赤の4種類いずれかの色を読み取るまで待機する

  • 待機:カラーセンサー、比較、色
  • 色のセット:2(青)、3(緑)、4(黄)、5(赤)にチェック
  • 色:カラーセンサーで読み取った色が数字で出力されるのでデータワイヤーで配列操作ブロックに出力する

変数ブロック

テキスト、数値、ロジック、数値配列、ロジック配列を格納(書き込み)、読み込みする事ができる。

今回は読み取った色を合計4つまで数値配列として保存する。

数値配列のイメージ図

数値配列イメージ図

尚、変数ブロックの機能詳細についてはこちらの記事を参照

変数 数値配列の読み込み

数値配列を変数(colorarray)から読み込む

  • 変数:読み込み、数値配列
  • 値:データワイヤーで配列入力に接続する

変数 数値配列の書き込み

数値配列を変数(colorarray)に書き込む

  • 変数:書き込み、数値配列
  • 値:配列操作ブロックの配列出力からデータワイヤーで数値配列を受け取る

配列操作ブロック

配列の操作を行うためのブロック。

今回はループインデックス(0~3)をインデックスとして値にカラーセンサーで読み取った色(数値)を書き込み/読み込みをする。

尚、配列操作ブロックの機能詳細についてはこちらの記事を参照

配列操作 インデックスで書き込み

配列にカラーセンサーで読み取った色(数値)を書き込む

  • 配列操作:インデックスで書き込み、数値
  • 配列入力:空の変数(数値配列)をデータワイヤーで受け取る
  • インデックス:ループインデックスをデータワイヤーで受け取る
  • 値:カラーセンサーで読み取った色(数値)をデータワイヤーで受け取る
  • 配列出力:変数(数値配列)にデータワイヤーで出力する

配列操作 インデックスで読み込み

数値配列からカラーセンサーで読み取った色(数値)を読み込む

  • 配列操作:インデックスで読み込み、数値
  • 配列入力:データワイヤーで数値配列(colorarray)を受け取る
  • インデックス:ループインデックスをデータワイヤーで受け取る
  • 値:数値配列(colorarray)のインデックス番目の色(数値)が得られるのでデータワイヤーでスイッチブロックに出力する

音ブロック

様々な音を再生する為のブロック。

音ブロックの詳細な機能についてはこちらの記事を参照

クリック音を再生する

クリック音を再生する

カラーセンサーで色を読み取った後、何の操作音も無いと読み取り処理が実行されたかどうかが分かりにくいためクリック音を再生している

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

 Ready音を再生する

Ready音を再生する

カラーセンサーで色を4回読み取った後、色の読み取りループが終了した事が分かる様にReady音を再生している

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

スイッチブロック

条件によって処理を分岐することができるブロック。

センサーの測定値やロジック(”真” or ”偽”)など様々な条件を指定する事ができるが今回は数値(#)での分岐を使用する。

スイッチブロック 色による分岐

数値配列から出力された色(数値)を元に色別に処理を分岐する

  • スイッチ:数値
  • 分岐:2、3、4、5の4パターンに分岐する

タンクブロック

Lモータを使ってトレーニングロボットの前進、後退、右回り、左回りを制御するブロック。

タンクブロック 直進

トレーニングロボットをタイヤ1回転分だけ前進させる

  • タンク:回転数
  • 左側パワー:50
  • 右側パワー:50
  • 回転:1
  • ブレーキ方法:真
タンクブロック 左回り

トレーニングロボットを左旋回させる

  • タンク:回転数
  • 左側パワー:0(停止)
  • 右側パワー:50
  • 回転:1
  • ブレーキ方法:真
タンクブロック 右回り

トレーニングロボットを右旋回させる

  • タンク:回転数
  • 左側パワー:50
  • 右側パワー:0(停止)
  • 回転:1
  • ブレーキ方法:真
タンクブロック 後退

トレーニングロボットをタイヤ1回転分だけ後退させる

  • タンク:回転数
  • 左側パワー:ー50(逆回転)
  • 右側パワー:ー50(逆回転)
  • 回転:1
  • ブレーキ方法:真

実際に動かしてみた動画

プログラミングの様子と実際にカラーブロックで色を読み込んで正しく動作するかどうかを試してみた動画。

souichirou

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

おすすめ

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

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