前進をしながらカラーブロックの色を読み取るプログラム~レゴマインドストーム~ | そう備忘録

前進をしながらカラーブロックの色を読み取るプログラム~レゴマインドストーム~

前進しながらカラーブロックを読み取る

レゴマインドストームEV3で「停止をせずに前進をしながらランダムに置かれた4色のカラーブロックを読み取るプログラムはどの様に書くのか?」との質問が来たので試してみた時の備忘録。

以下の前提条件とする。

  • カラーブロックは4色(赤、青、黄、緑)
  • 置かれる順番はランダム
  • 停止せずに前進をしながらカラーブロックを読み取る
  • 4色を読み取った後に読み取った順番でカラーを読み上げる
2020年7月21日 追記

黒ライントレースをしながらカラーブロックを読み取るプログラムの記事を書いた

本体

本体はトレーニングロボットをベースに組み立てた。

地面に置かれたカラーブロックを前方中央のカラーセンサーで読み取る前提としている。

※カラーセンサーを横に付ければトレーニングロボット横のカラーブロックを読み取る事も可能

前進をしながらカラーブロックを読み取る

プログラム

全体図

プログラムの全体図は以下の通り。

プログラム全体図

  • 処理群1:トレーニングロボットが4色読み取るまで前進させる。4色読み取ったら順番に読み上げる
  • 処理群2:カラーセンサーにてカラーブロックを読み取った順番に数値配列に格納する

処理群1

処理群1

処理スタート(処理群2とは非同期で同時に実行される)

ループブロック

処理5の結果(Count変数が4以上)が真になるまで繰り返す

  • ループ:ロジック
  • 終了条件:処理5の出力結果をデーターワイヤーで受け取る

ステアリングブロック

ステアリングブロックで前進する

  • ステアリング:オン
  • ステアリング:0(直進)
  • パワー:10(低速で試している)

変数ブロック Count

Count変数を呼び出して処理5にデーターワイヤーで出力する

尚、Count変数は処理群2でカウントアップされている

  • 変数:読み込み、数値
  • 値:処理5のaにデーターワイヤーで出力
  • 変数名:Count

比較ブロック

処理4の値 >= 4の結果(”真” or ”偽”)を処理2のループの終了条件に出力する

  • 比較:>=(以上)
  • a:処理4の出力結果(Count変数の値)
  • b:4
  • 結果:処理2のループの終了条件にデーターワイヤーで出力

ステアリングブロック

ステアリングブロックでトレーニングロボットを停止させる

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

ループ 4回繰り返す

4回繰り返す

  • 終了条件:カウント
  • カウント:4

ループインデックス(0からの連番)を処理9の配列操作ブロックのインデックスに出力する

ループインデックスの出力

color変数を読み込む

Color数値配列を読み込む

  • 変数:読み込み、数値配列
  • 値:データーワイヤーで処理9に出力する
  • 変数名:color

配列操作ブロック

Color数値配列を処理7のループインデックス(0→1→2→3)の順番で取り出して中の値を処理10のスイッチの数値に出力する

  • 配列操作:インデックスで読み込み、数値
  • 配列入力:処理8の出力結果をデーターワイヤーで読み込む
  • インデックス:処理7のループインデックスの出力結果をデーターワイヤーで読み込む
  • 値:処理10のスイッチブロックにデーターワイヤーで出力する

10

スイッチブロックで4つに分岐

数値の値に応じて4つの処理に分岐する

  • スイッチ:数値
  • 値:処理9の出力結果をデーターワイヤーで受け取る

11

音声ブロックで色を再生

数値が2の時に音声ブロックで「Blue」と再生する

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

12

数値が3の時に音声ブロックで「Green」と再生する

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

13

数値が4の時に音声ブロックで「Yellow」と再生する

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

14

数値が5の時に音声ブロックで「Red」と再生する

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

15

待機ブロック

1秒間待機する

  • 待機:時間
  • 秒:1

処理群2

処理群2 カラーセンサーで色を読み取る

処理スタート(処理群1とは非同期で同時に実行される)

Count変数ブロック

Count変数をゼロリセットする

  • 変数:書き込み、数値
  • 値:0
  • 変数名:Count

数値配列Colorを空にする

color数値配列を空にする

  • 変数:書き込み、数値配列※
  • 値:[](空)
  • 変数名:color

※数値配列についての詳細はこちらの記事を参照

ループブロック

処理18の出力結果(Count変数が4以上か)が真になるまで繰り返す

  • ループ:ロジック
  • 終了条件:処理18の出力結果をデーターワイヤーで受け取っている

Count変数が4以上になるとループを終了する

スイッチカラーセンサー

カラーセンサーで読み取った色毎に5パターンに分岐する

  • スイッチ:カラーセンサー、測定、色
  • 色の条件:青、緑、黄、赤、その他※の5パターン

※その他の色を初期条件に設定しておく

初期条件

変数Color数値配列の読み込み

color数値配列変数を読み込む

  • 変数:読み込み、数値配列
  • 値:処理8の配列操作ブロックの配列入力にデーターワイヤーで出力する

変数Countの読み込み

Count変数を読み込む

  • 変数:読み込み、数値
  • 値:処理8の配列操作ブロックのインデックスにデーターワイヤーで出力する
  • 変数名:Count

配列操作

配列操作ブロックでcolor数値配列にインデックス指定で色(数値)を書き込む

  • 配列操作:インデックスで書き込み、数値
  • 配列入力:処理6の出力結果(color数値配列)
  • インデックス:処理7の出力結果(Count変数)
  • 値:2(青色を表す数値)
  • 配列出力:データーワイヤーで処理9に出力する

青、緑、黄、赤の色をカラーセンサーで検知する度にCount変数は0→1→2→3とカウントアップされている

例えば最初に検知された色が青の場合、color数値配列の0番目に2(青色)がセットされる

次に検知された色が赤の場合、color数値配列の1番目に5(赤色)がセットされる

数値配列colorにセットする

color数値配列にカラーセンサーで検知した色を数値で書き込む

  • 変数:書き込み、数値配列
  • 値:処理8の出力結果をデーターワイヤーで受け取る
  • 変数名:color

10

該当の色以外が検知されるまで待機する

青色以外が検知されるまで待機する

  • 待機ブロック:カラーセンサー、比較、色
  • 色のセット:青以外を全てチェックする
  • 色:未使用

青以外を全てチェックする

トレーニングロボットが青のブロックの上を通過するまで待機する

このブロックを入れないと連続で青(2)がcolor数値配列に書き込まれてしまう

11

変数Countブロック

Count変数をカウントアップする為に読み込む

  • 変数:読み込み、数値
  • 値:現在の値を処理12にデーターワイヤーで出力する
  • 変数名:Count

12

数学ブロック

数学ブロックでCount変数に1を加算する

  • 数学:足し算
  • a:処理11の出力結果をデーターワイヤーで受け取る
  • b:1
  • 結果:加算結果をデーターワイヤーで処理13に出力する

13

変数Countに書き込み

Count変数にカウントアップ結果を書き込む

  • 変数:書き込み、数値
  • 値:処理12の出力結果をデーターワイヤーで受け取る
  • 変数名:Count

14

処理5で緑を検知した時の処理群

処理6~13と色の指定以外は同じなので説明は割愛する

15

処理5で黄を検知した時の処理群

処理6~13と色の指定以外は同じなので説明は割愛する

16

処理5で赤を検知した時の処理群

処理6~13と色の指定以外は同じなので説明は割愛する

17

処理5で青、緑、黄、赤以外が検知された時の処理群

色ブロックを検知していない時はこの分岐が実行されて何も処理は行わない

18

変数Countの読み込み

Count変数を読み込む

  • 変数:読み込み、数値
  • 値:処理19にデーターワイヤーで出力する
  • 変数名:Count

19

比較ブロック

比較ブロックでCount変数が4以上かどうかを判定する

  • 比較:>=(以上)
  • a:処理18の出力結果(Count変数)をデーターワイヤーで受け取る
  • b:4
  • 結果:比較結果(真 or 偽)をデーターワイヤーで処理4のループの終了条件に出力する

動作結果(動画)

プログラムの動作の様子を動画にしているので確認してみて欲しい。

動画ではうまく動作したものだけを編集しているが実際にはカラーセンサーの真下にカラーブロックが無い場合(走行ラインがずれている)などは正しく動作しなかった。

終わりに

以上で走行しながらカラーセンサーで色を読み取るプログラムを終了する。

もう一つカラーセンサー追加して追加したカラーセンサーで黒ライントレースをしながカラーブロックを読み取るプログラムもそのうち挑戦したい。

最後に

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

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

souichirou

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

おすすめ

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

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