カラーソーターの組み立てとプログラミング ~レゴマインドストームEV3~ | そう備忘録

カラーソーターの組み立てとプログラミング ~レゴマインドストームEV3~

カラーソーターとは

教育用レゴマインドストームEV3でカラーソーターを組み立ててみる。

カラーソーターはカラーセンサーでブロックの色を読み取り、色別にそれぞれの位置にコンベアでソート(並び替え)を行う装置の事。

下記の動画を見ればカラーソーターのおよそのイメージは掴める。

駆動部の説明

ブロックの色を読み取るカラーセンサー、カラーブロックをMモーターで排出する機構、ソーター部をLモーター駆動のベルトコンベアで左右に移動させる機構がある。

カラーセンサー(ポート3)カラーブロックの色の読み取り

カラーセンサーでブロックの色を読み取る

Mモーター(ポートA)Mモーターを使ってカラーブロックを排出する仕組み

写真はカラーブロックがセットされている状態

赤いブロック(ストッパー)が上昇していてカラーブロックが下に落ちないようになっている

カラーブロックがセットされている

下記の写真は上の赤のブロック(ストッパー)の下部のアップ写真

黒の楕円状のブロック(カム)が一番下にある状態=ストッパーが下がっている状態。

反時計回りに回転する事によりストッパーが上昇する(ストッパーは取り外している)

ストッパーを下げている状態

Mモーターでカムを反時計回りに回転させてストッパーを押し上げている状態

ストッパーを押し上げている状態

ストッパーを上に載せた状態(ストッパーは上がっている)

ストッパーを上に載せた

Lモーター(ポートD)Lモーターの回転を垂直方向に変換してベルトコンベアを動かしソーターを左右に移動させる

Lモーターでコンベアを動かしてソーターを左右に移動させる

ソーターの左端はタッチセンサーが押された事により判定する

タッチセンサーによる左端の判定

カラーソーターの組み立て

カラーソーターの組み立ての様子

プログラム概要

プログラムの全体の概要

一つ一つのブロックの解説は後述する。

カラーソーター プログラム概要

初期処理の後、カラーセンサーでブロックの色を連続して読み込んで変数(数値配列)に保存する。

その後、数値配列より読み取った色を順番に呼び出して色別にソーターの位置を移動してストッパーを操作してブロックを排出する。

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

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

プログラム全体

カラーセンサーで読み取ったブロックをソーターで色別にそれぞれの位置に排出するプログラム

プログラムが大きいので3枚の画像にしている

1枚目

プログラム全体その1

2枚目

プログラム全体その2

3枚目

プログラム全体その3

プログラム開始
3~39を繰り返す
カムを一番下に持ってくる
カムを一番上に持ってくる(ストッパーを上げる)
ソーターを左に移動(6まで)
タッチセンサーが押されるまで待機する
ソーターを停止する(ソーターが左端に移動される)
1秒間待機する
モーターをリセットする
10数値配列を空にする
1112~20を8回繰り返す
1213、14の条件が真になるまで繰り返す
13インテリジェントブロックの中央ボタンがおされる
14カラーセンサーで2(青)、3(緑)、4(黄)、5(赤)のいずれかの色が読み取られる
1513、14が真の時に真をデータワイヤーで12の終了条件に引き渡す
16実行音をならす
17数値配列を読み込む
18色情報を数値で配列に引き渡す
19色情報を配列に書き込む
202秒間待機する
21Ready音を再生する
22ディスプレイに”EV3”を表示する
2324~40を8回繰り返す
241秒間待機する
25ソーターを左に移動(26まで)
26タッチセンサーが押されるまで待機する
27ソーターを停止する(ソーターが左端に移動される)
28数値配列を読み込む
29読み込んだ数値配列のインデックス・ループ番目に格納されている色情報(数値)を取り出して30に渡す
30色情報により処理を4つに振り分ける
31Blue音声を再生する
32ソーターを左端に移動する
33Green音声を再生する
34ソーターを左から二番目の位置に移動する
35Yellow音声を再生する
36ソーターを左から三番目の位置に移動する
37Red音声を再生する
38ソーターを一番右まで移動する
39カムを下げてストッパーを下げる(カラーブロックが下に移動する)
40カムを上げてストッパーを上げる(カラーブロックが排出される)

使用したブロック

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

ループブロック

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

ループブロック(Loop)プログラム一番外側のループ

プログラム終了まで無条件に繰り返し

  • 番号:Loop
  • ループ:無限
ループブロック(ScanAndRecord)カラーセンサーでブロックの色を読み取って変数(数値配列)に保存する操作を8回繰り返す

  • 番号:ScanAndRecord
  • ループ:カウント、8(回)
ループブロック(Scan)カラーセンサーでブロックの色を読み取る

カラーセンサーが読み取った色が2(青)、3(緑)、4(黄)、5(赤)のいずれかで且つインテリジェントブロックの中央ボタンが押されるまで繰り返すためのループ(上記以外の色を読み取った場合は次のロジックに遷移しない)

  • 番号:Scan
  • ループ:ロジック、真
  • 終了条件:真になるまで。ロジック操作ブロックの判定結果をデータワイヤーで受け取る
ループブロック(Sort)色毎にソーターを移動してカラーブロックを排出する操作を8回繰り返す

  • 番号:Sort
  • ループ:カウント、8(回)

Mモーターブロック

軽いものを素早く動かすのが得意なモーター

今回はストッパーを上下させる事によりカラーブロックを排出する為に使用する。

Mモーター 初期設定その1弱いパワー(5)で時計回りにカムを2秒間回転させる

カムを一番下に持っていくための初期処理その1

  • Mモーター:秒数
  • パワー:5
  • 秒数:2
  • ブレーキ方法:真
Mモーター 初期設定その2カムを一番上(ストッパーを上げる)に持っていくための初期処理その2

  • Mモーター:角度
  • パワー:-30
  • 角度:190(度)
  • ブレーキ方法:真

※後述のプログラミング動画の時と角度を若干変えている。調整の結果こちらの方が安定して動作している

Mモーター ストッパーを下げるカムを下方向へ回転させてストッパーを下げる

  • Mモーター:角度
  • パワー:100
  • 角度:100
  • ブレーキ方法:真

※後述のプログラミング動画の時と角度を若干変えている。調整の結果こちらの方が安定して動作している

Mモーター ストッパーを上げるカムを上方向へ回転させてストッパーを上げる

  • Mモーター:角度
  • パワー:ー100
  • 角度:100
  • ブレーキ方法:真

ストッパーの下げ、上げによりカラーブロックが排出される

※後述のプログラミング動画の時と角度を若干変えている。調整の結果こちらの方が安定して動作している

Lモーターブロック

重いものをゆっくり動かすのが得意なモーター

今回はベルトコンベアを使ってソーターを左右に移動させる

Lモーター ソーターを左に寄せるタッチセンサーが押されるまでソーターを左端に寄せる

  • Lモーター:オン
  • パワー:-50
Lモーター ソーター停止させるソーターを停止させる

  • Lモータ:オフ
  • ブレーキ方法:真

下記はソーターを左端に寄せて止めるプログラム

ソーターを左端に寄せて止めるプログラム

Lモーター 青の位置にソーターを止める青の位置にソーターを停止させる(左端)

  • Lモーター:角度
  • パワー:50
  • 角度:10
  • ブレーキ方法:真
Lモーター 緑の位置にソーターを止める緑の位置にソーターを停止させる(左から2番目)

  • Lモーター:角度
  • パワー:50
  • 角度:132
  • ブレーキ方法:真
Lモーター 黄の位置にソーターを止める黄の位置にソーターを停止させる(左から3番め)

  • Lモーター:角度
  • パワー:50
  • 角度:360
  • ブレーキ方法:真
Lモーター 赤の位置にソーターを止める赤の位置にソーターを停止させる(右端)

  • Lモーター:角度
  • パワー:50
  • 角度:530
  • ブレーキ方法:真

待機ブロック

指定した条件になるまで待機する

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

ソーターを左端に寄せるため使用する

  • 待機:タッチセンサー、比較、状態
  • 状態:1(押された)
  • 測定値:今回は未使用
1秒間待機する1秒間待機する

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

※2秒間待機のブロックも使用している

モーター回転ブロック

モーターのリセットモーター回転をリセットする

※今回の動作には直接関係は無い。モーターの回転数等を測定する時に備えて初期処理でモーターの測定値をリセットした

  • モーター回転:リセット

変数ブロック

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

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

変数ブロック 数値配列のリセット変数A(数値配列)をリセットする

数値配列にカラーセンサーで読み取った色情報を数値で保存する

  • 変数:書き込み、数値配列
  • 値:なし
変数ブロック 数値配列の書き込み変数A(数値配列)に色情報を数値で書き込む

8回書き込むので配列にしている

  • 変数:書き込み、数値配列
  • 値:データワイヤーで配列操作ブロックの配列出力より色情報を数値で受け取る
変数ブロック 数値配列の読み込み変数A(数値配列)より色情報を数値で読み込む

  • 変数:読み込み、数値配列
  • 値:データワイヤーで配列操作ブロックの配列入力に色情報を数値で引き渡す

インテリジェントブロック ボタン

正面の 5 つのボタン(上下左右、中央)からデータを取得する。

どのボタンが押されたのか数値出力すると同時にボタンのうちの一つが押された、離れた、またはバンプの結果を比較結果としてロジック(真 or 偽)で出力する。

インテリジェントブロックボタンブロックカラーセンサーで色を読み取っている時にインテリジェントブロックボタンの中央のボタンを押す。

そのタイミングで色の情報を数値配列に格納する

  • インテリジェントブロックボタン:比較、インテリジェントブロックボタン
  • インテリジェントブロックボタンID:2(中央)
  • 状態:1(押された)
  • 比較結果:押された時に真になる。結果をデータワイヤーでロジック操作ブロックに引き渡す

カラーセンサーブロック

「色の判別」「反射光の強さの測定」「周囲の光の強さの測定」ができる。

カラーセンサー ブロックの色の読み取りカラーセンサーブロックの色を読み取る

  • カラーセンサー:比較、色
  • 色のセット:2(青)、3(緑)、4(黄)、5(赤)
  • 比較結果:色のセットとの比較結果をロジック(真 or 偽)で出力する
  • 色:読み取った色情報を数値で出力する。配列操作ブロックにデータワイヤーで値を引き渡す

ロジック操作ブロック

論理和、論理積、排他的論理和、否定を判定する為のブロック。

ロジック操作ブロックの詳細はこちらの記事を参照

ロジック操作 and条件カラーセンサーが青、緑、黄、赤を読み取っていて且つ、インテリジェントブロックボタンの中央ボタンが押されているというand条件を判定する

  • ロジック操作:and
  • a:カラーセンサーが青、緑、黄、赤を読み取っている時は真になる。それ以外は偽になる
  • b:インテリジェントブロックボタンの中央ボタンが押されている時に真になる。それ以外のボタンでは偽になる
  • 結果:a、bの条件を満たしている時に真になる。結果をデータワイヤーでループブロック(Loop)の終了条件に引き渡す

音ブロック

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

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

音ブロック 実行音の再生色を読み取った時の実行音を再生する

  • 音:トーン周波数の再生
  • 周波数:1000
  • 持続時間:0.1(秒)
  • ボリューム:100
  • 再生タイプ:1(1回再生)
音ブロック 準備完了の合図ブロック色を8回読み取った後に準備OKの意味でReady音声ファイルを再生する

  • 音:ファイルの再生
  • ボリューム:100
  • 再生タイプ:0(完了待ち)
音ブロック 青(Blue)青色のブロックをソートする前に青(Blue)音声を再生する

  • 音:ファイルの再生
  • ボリューム:100
  • 再生タイプ:0(完了待ち)
  • ファイル名:Blue
音ブロック 緑(Green)緑色のブロックをソートする前に緑(Green)音声を再生する

  • 音:ファイルの再生
  • ボリューム:100
  • 再生タイプ:0(完了待ち)
  • ファイル名:Green
音ブロック 黄(Yellow)黄色のブロックをソートする前に黄(Yellow)音声を再生する

  • 音:ファイルの再生
  • ボリューム:100
  • 再生タイプ:0(完了待ち)
  • ファイル名:Yellow
音ブロック 赤(Red)赤色のブロックをソートする前に赤(Red)音声を再生する

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

表示ブロック

インテリジェントブロックのディスプレイにテキスト、図形、イメージを表示するブロック。

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

表示ブロック EV3の表示ディスプレイ”EV3”と表示する

  • 表示:イメージ
  • 画面消去:真(画面消去してから表示する)
  • X:0(X軸表示位置)
  • Y:0(Y軸表示位置)
  • ファイル名:EV3

配列操作ブロック

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

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

配列操作ブロック 数値の追加読み取った色(数値)を配列に追加格納する

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

  • 配列操作:追加、数値
  • 配列入力:変数A(数値配列)をデータワイヤーで受け取る
  • 値:カラーセンサーで読み取った色(数値)をデータワイヤーで受け取る
  • 配列出力:変数A(数値配列)の書き込みにデータワイヤーで配列を出力する
配列操作ブロック 数値配列の読み込み数値配列に格納されている色情報をインデックスで順番に呼び出す

  • 配列操作:インデックスで読み込み、数値
  • 配列入力:変数Aよりデータワイヤーで数値配列を受け取る
  • インデックス:Sortループよりデータワイヤーでループインデックスを受け取る(0~7)
  • 値:呼び出した色情報(数値)をデータワイヤーで後続のスイッチブロックに引き渡す

スイッチブロック

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

スイッチブロック色別(青、緑、黄、赤)に処理を分岐する。

  • スイッチ:数値
  • 数値:データワイヤーで配列操作の値(色を数値化した情報)を受け取る
  • 2:青の時の処理を実行する※
  • 3:緑の時の処理を実行する
  • 4:黄の時の処理を実行する
  • 5:赤の時の処理を実行する

※色の読み上げとLモーターでのソータ移動を行う

実際に動かしてみた動画

カラーセンサーにブロックの色を読み取らせる所からソーターがカラーブロックをそれぞれの位置に配置するまでのプログラムを動画で説明している。

souichirou

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

おすすめ

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

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