アフレル スプリングカップ2019向けロボット ~レゴマインドストームEV3~
Contents
アフレルスプリングカップ2019について
アフレル社が主催するアフレルスプリングカップ2019の競技規則が公開されていたので試しにロボットを組み立ててプログラミングした時の備忘録。
アフレルスプリングカップ2019は3月26日に東京、28日に大阪で開催される予定のロボットコンテストでWRO(World Robot Olympiad)を簡易にした競技内容で初めての人でも参加しやすい大会になっている。
部門は、
- 小学生・中学生・高校生ミドル部門
- 小学生エキスパート部門
- 中学生エキスパート部門
- 高校生エキスパート部門
- ARCミドル部門
- ARCエキスパート部門
に分かれていた。
小学生・中学生・高校生ミドル部門の競技規則を見た所、面白そうだったので挑戦してみることにした。
尚、自分は実際に出場するわけでは無いのと今回の記事のロボットとプログラミングではまだまだ詰めが足りない部分があるのでその辺はご承知おきください。
この記事ではカラーセンサーを2つ使用していますが実際の大会ではカラーセンサーは1つしか使えません。
大会ではレゴ・マインドストームEV3の基本セットの部品のみが使用できます。
自分は他のセットと混在していたのでうっかりカラーセンサーを2つ使ってしまっています。
競技規則
ミドル部門の詳しい競技規則はこちらを参照して欲しいのだが、ざっくり説明すると以下のルールになっている。
- スタートして最初に2色(赤または黄)、4枚のラベルを読む
- ラベルの並び順はランダム(下記の図では赤、黄、黄、赤)
- ラベルが赤の場合は手前(画面下)のT字型のブロックを奥(画面上)の枠ブロック内に移動させる
- ラベルが黄の場合は奥(画面上)のT字型のブロックを手前(画面下)の枠ブロック内に移動させる
- ブロックの移動を合計4回繰り返す
- ゴールする
T字型ブロック | |
枠ブロック |
コースの制作
まずはコースの制作。
模造紙、ビニールテープは100円ショップで購入、後はえんぴつとハサミとのりで”できるだけ”正確にコースを再現した。
この”できるだけ”というがミソで実は自作のコースは本番とかなり出来が違う。
例えば、
- 100円ショップのビニールテープが本番は中川ケミカル製のカッティングシート
- 黒ライン(ビニールテープ)が本番は印刷
- 外枠は緑のビニールテープでつくったが本番は茶色(茶色のテープが無かった)
- 模造紙を張り合わせたのでコースの所々が浮いている
等々。
そして最大の違いはコースの左半分しか無いこと。
机のサイズの都合で左半分しか作れなかったけど、まぁこれでもプログラミングの基本的なところは組めるので良しとした。
実際の大会では試走の時間がとれるので、そこで本番環境との違いを調整する必要がある。
カラーセンサーは外部環境(屋外、屋内、昼、夜、照明など)によって測定値が変わってくるので、これだけ材質が違うと仮に実際に大会に出場するのならばかなりの調整が必要になるのだろうけど、今回は遊びなので良しとした。
機体の説明
機体のベースはトレーニングロボットとした。
機動性を考慮すると改良の余地はあると思うが、まずは基本的な機体で試してみることにする。
T字ブロックを持ち上げるアーム | Mモーターでワームギアー>24枚ギアを使ってアームを上下させる 下限に達するとタッチセンサーが押されるようにした アームが上がっている時 アームが下がってタッチセンサーが押された状態 |
カラーセンサー | カラーセンサーはボディ下部に2つ 黒ラインのトレースと赤、黄ラベルの判断に使用する 車体を下からみた所 |
Mainプログラム概要
Mainプログラムの概要は以下の通り
尚、実際の動きとプログラミングの様子の動画を記事の最後に載せているので参考にして欲しい。
- 初期処理
- 最初の4枚のラベルの色を読んで数値配列に保存した後、右ターン
- 黒ラインまで前進した後、色(赤、黄)によって右または左ターンして赤ラベルまでライントレースしながら前進する
- T字型ブロックを持ち上げて反転、逆サイドの赤ラベルまでライントレースした後、T字型ブロックを枠内に下ろす
- バックして中央付近に戻った後、ラベルの色(赤、黄)によって右または左ターンして3に戻る
マイブロックは以下の4種類を作った。
Initial | 初期処理用のマイブロック |
LineTrace | 黒ライントレース用のマイブロック 以前に作成したカラーセンサー2つでライントレースするプログラムを参考にしている |
ColorStock | カラーセンサーで読み取った色を数値配列に保存するマイブロック 数値配列についてはこちらの記事を参照 |
LiftDown | アームを下げてT字型ブロックを枠内に下ろすマイブロック |
Mainプログラム
Mainのプログラム。
量が多いので4枚に分けている
1 | プログラム開始 |
2 | 初期処理(Initial)変数等の初期設定を行う |
3 | 4~10までを4回繰り返す |
4 | カラーセンサーが赤(5)または黄(4)を感知するまで5を繰り返す |
5 | 黒ライン上をトレースする(LineTrace) |
6 | 止まる |
7 | 0.1秒待機する |
8 | カラーセンサーで色を読み取って数値配列に保存する(ColorStock) |
9 | カラーセンサーが赤(5)または黄(4)以外を感知するまで10を繰り返す |
10 | 黒ライン上をトレースする(LineTrace) |
11 | 止まる |
12 | 右に90度旋回する |
13 | 14~37を2回繰り返す(本番では4回繰り返す必要がある) |
14 | カラーセンサーの反射光の強さが20以下になるまで(黒ラインを検出するまで)15を繰り返す |
15 | 直進する |
16 | 数値配列(Color)から保存した色を読み込む |
17 | 数値配列(Color)からループインデックスに対応する色情報を取り出して18に引き渡す |
18 | 17からの色情報が5(赤)の時は19、4(黄)の場合は20に分岐する |
19 | 右旋回する |
20 | 左旋回する |
21 | カラーセンサーが赤を検出するまで22を繰り返す |
22 | 黒ライン上をトレースする(LineTrace) |
23 | 止まる |
24 | アームを上げてT字型ブロックを持ち上げる |
25 | その場で180度旋回する |
26 | カラーセンサーが赤を検出するまで27を繰り返す |
27 | 黒ライン上をトレースする(LineTrace) |
28 | 止まる |
29 | 少しだけ前進する(T字型ブロックを下ろす位置の調整) |
30 | アームを下げてT字型ブロックを下ろす |
31 | 中央付近まで後進する |
32 | 止まる |
33 | 数値配列(Color)から保存した色を読み込む |
34 | 数値配列(Color)からループインデックスに対応する色情報を取り出して35に引き渡す |
35 | 33からの色情報が5(赤)の時は36、4(黄)の場合は37に分岐する |
36 | 右旋回する |
37 | 左旋回する |
Mainで使用しているブロック
Mainで使用しているブロックは以下の11種類。
Initialブロック(マイブロック)
初期処理を行うマイブロック。
変数などを初期化する |
ループブロック
指定した条件に一致するまでループ(同じ処理を繰り返す)する。
LineTraceブロック(マイブロック)
黒ライン上のトレースを行うマイブロック。
左右のカラーセンサーの反射光の強さの差分から左右の車輪のパワーを調整して黒ライン上のトレースを行うマイブロック |
ステアリングブロック
左右のLモーターを同時に制御するブロック。前進、後退の他に旋回などの制御も可能。
待機ブロック
指定された条件に一致するまで待機するブロック。
0.1秒待機する
カラーセンサーで色を読み取る時など正確性を増すために0.1秒待機する 待機させる事により誤動作が減ったので待機させている |
ColorStockブロック(マイブロック)
カラーセンサーで読み取った色の情報を数値配列に保存するブロック |
変数ブロック
プログラム中の数値や文字列、ロジック(”真” or ”偽”)を保存する事ができる。
数値配列(Color)から保存されている色情報を読み取る
ColorStockブロックで保存されたラベルの色(赤 or 黄)の情報を取り出すために使用する |
配列操作ブロック
数値配列やロジック配列の操作(追加、読み込み)を行うブロック。
数値配列(Color)に保存されている色情報をインデックス順に読み込む
ループインデックスは0、1、2、3・・・と0から始まりカウントアップされる |
スイッチブロック
入力された条件により処理を分岐するブロック。
読み込んだ数値(色情報)により処理を分岐する
赤の時は上の処理、黄の時は下の処理を行う |
Mモーターブロック
軽いものを素早く動かすのが得意なMモーター。
Mモーターでアームを上げてT字型のブロックを持ち上げる
|
LiftDownブロック(マイブロック)
Mモーターを使ってアームを下げるマイブロック |
Initialマイブロック
Initialは初期化をするマイブロック。
1 | ブロック開始 |
2 | 変数Powerに18をセットする Powerはライントレースの時の左右のLモーターのベースとなるパワー |
3 | 数値配列Colorを空にする |
4 | ポート1(左側)のカラーセンサーを反射光の強さのモードにする |
5 | ポート4(右側)のカラーセンサーを反射光の強さのモードにする |
Initialで使用しているブロック
使用しているブロックは以下の2種類。
変数ブロック
プログラム中の数値や文字列、ロジック(”真” or ”偽”)を保存する事ができる。
変数(Power)に18をセットする
ライントレースする時のベースとなる車輪のパワーを18に設定する この値を変えるとライントレースしている時のスピードが変わる | |
数値変数(Color)を空にする
カラーセンサーで読み取った色情報を格納する為の数値配列 最初に空にしておく |
カラーセンサーブロック
カラーセンサーのモードを反射光の強さを測定するモードにする
カラーセンサーには3種類のモードがある。
このプログラムでは反射光の強さと色の判定の両方のモードを使用しているが初期処理ではまずは反射光の強さを測定するモードにしている |
LineTraceマイブロック
LineTraceは黒ライン上をトレースするマイブロック。
1 | ブロック開始 |
2 | ポート1(左側)のカラーセンサーで反射光の強さを読み取る |
3 | ポート4(右側)のカラーセンサーで反射光の強さを読み取る |
4 | 左右のカラーセンサーの反射光の強さの差分から補正値を算出する |
5 | Power変数からベースのパワー(18)を読み取る |
6 | ベースのパワーに補正値を加算する |
7 | 左車輪のLモーターに6の値をセットする |
8 | ベースのパワーから補正値を減算する |
9 | 右車輪のLモーターに8の値をセットする |
LineTraceで使用しているブロック
使用しているブロックは以下の4種類。
カラーセンサーブロック
ポート1(左)と4(右)のカラーセンサーの反射光の強さを読み取る
|
変数ブロック
Initialマイブロックで設定した変数Powerの値を読み込む
|
数学ブロック
数学計算を行って結果を出力するブロック。
左右のカラーセンサーの反射光の強さの差から補正値を計算する
※aーbの値をそのまま左右の車輪のパワーに加・減算してしまうと値が大きすぎて蛇行してしまうので、適当な数値で割っている また計算の考え方の詳細はこちらの記事を参照 | |
ベースのパワー(18)と上記の補正値を合算して左車輪のパワーに代入する
| |
ベースのパワー(18)から補正値を減算して右車輪のパワーに代入する
|
Lモーターブロック
左右のパワーの計算結果をデータワイヤーで受け取って制御する。
左車輪のパワーを制御する
| |
右車輪のパワーを制御する
|
ColorStockマイブロック
ColorStockはカラーセンサーで読み取った色を数値情報として数値配列(Color)に保存するマイブロック。
1 | ブロック開始 |
2 | 数値配列(Color)を読み込む |
3 | ポート1(左側)のカラーセンサーから色を読み込む ※同じカラーセンサーでも個体差があり、ポート1に接続したカラーセンサーの方が色を正確に読み取るのでポート1のカラーセンサーを使う事にした |
4 | 数値配列に3で読み込んだ値を追加する(一番最後に追加される) |
5 | 数値配列にセットする |
6 | 3で読み込んだ値が5(赤)なら上、4(黄)なら下のロジックに分岐する 6以降の処理は競技としては必須では無いが読み取った色やタイミングが音で明示的に分かった方がご動作を検証しやすくなる |
7 | 1760Hzのトーン周波数を再生する |
8 | 440Hzのトーン周波数を再生する |
ColorStockで使用しているブロック
使用しているブロックは以下の5種類。
変数ブロック
数値配列(Color)に値を保存するために読み込む
| |
数値配列(Color)に値を書き込む
|
カラーセンサーブロック
ポート1(左側)のカラーセンサーを使って色を読み取る
|
配列操作ブロック
数値配列やロジック配列の操作(追加、読み込み)を行うブロック。
カラーセンサーで読み取った色情報を順に数値配列に追加していく
|
スイッチブロック
入力された条件により処理を分岐するブロック。
読み込んだ数値(色情報)により処理を分岐する
赤の時は上の処理、黄の時は下の処理を行う |
音ブロック
様々な音を再生する為のブロック。
読み込んだ色が赤の時に1760Hzのトーン周波数の再生を行う
| |
読み込んだ色が黄の時に440Hzのトーン周波数の再生を行う
|
LiftDownマイブロック
LiftDownはMモーターでアームを下限まで下げるためのマイブロック。
下限はタッチセンサーが押された事で判断する。
1 | ブロック開始 |
2 | 3をタッチセンサーが押されるまで繰り返す |
3 | Mモーターを使ってアームを下げる |
4 | Mモーターを停止する |
LiftDownで使用しているブロック
使用しているブロックは以下の2種類。
ループブロック
指定した条件に一致するまでループ(同じ処理を繰り返す)する。
タッチセンサーが押されるまでループする
アームが下限まで達するとタッチセンサーが押される構造になっている |
Mモーターブロック
軽いものを素早く動かすのが得意なMモーター。
Mモーターでアームを下げる
タッチセンサーが押されるまで下げ続ける | |
Mモーターを止める(アームを止める)
|
プログラミングと実際に動かしてみた時の動画
プログラミングと実際に動かしてみた時の動画。
ロボットがT字型のブロックを反対側まで運ぶ様子を動画で確認してみて欲しい。
最近のコメント