チームメイトの似顔絵を描くロボットを製作しなさい。以下の点に注意すること。
マクロや関数、サブルーチンなどを使い、main関数がなるべく単純になるようにプログラムを作ること。
変数名、定数名、関数名、マクロ名などは分かりやすい名前を用いること
余裕をもってA4の紙の中に収まる大きさにすること。いくら小さくてもよい。
ペン以外はキットの部品を使うこと キットに付属の輪ゴムは切れやすく高価なので、輪ゴムを使う場合は別途支給する輪ゴムを使うこと。
僕はプログラミング初心者でPythonを使ったプログラミングははじめてでした。
ですからこの課題1ではあまり凝ったプログラミングはできませんでした。そのかわりハード面を工夫しました。
このロボットはペン先がタイヤとタイヤの中心に位置するように設計したので、その分タイヤとペン先の距離を考えないで済むので、プログラムを簡単にすることができました。
またこのロボットについてるペンを接地面に対して寝かせて固定したので、摩擦が少なく、書いた時にガタガタしないようにしました。
ペンはモータによって上げ下げでき、ペンを紙に着けたり離したりできるので一筆書きにならないようにできています。
ペンの固定部分にはレゴで固定する以外にゴムでも固定して、ペンが書いている際にずれないようにしました。
プログラミングがあまりできなかったので、角度だけをつかって似顔絵を描きました。
ロボットの前進後進、ロボットの回転をすべてタイヤをどれだけの角度動かすかで完成させました。
動きとしては、直進する、ロボットを回転させる、ペンの上げ下げ、という3つの動きを組み合わせて描くようにしています。
プログラムでコメントをもっと利用すれば綺麗に見えたと思う。
以下のプログラムは輪郭部分と顔のパーツ部分で一応分けています。
from ev3dev2.motor import MoveTank, OUTPUT_B, OUTPUT_C from ev3dev2.motor import MediumMotor, OUTPUT_D tank_drive = MoveTank(OUTPUT_B,OUTPUT_C) motor_center = MediumMotor(OUTPUT_D)
以下は顔の輪郭を描くプログラムです。 輪郭となる線を書いて角度変え、また輪郭となる線を描くを繰り返しています。
#!face line tank_drive.on_for_degrees(5,5,124.8)//線を書く tank_drive.on_for_degrees(-5,5,87)//角度を変える tank_drive.on_for_degrees(5,5,145.6)//線を書く tank_drive.on_for_degrees(-5,5,175)//角度を変える tank_drive.on_for_degrees(5,5,145.6)//線を書く tank_drive.on_for_degrees(-5,5,87)//角度を変える tank_drive.on_for_degrees(5,5,124.8)//線を書く tank_drive.on_for_degrees(-5,5,87)//角度を変える tank_drive.on_for_degrees(5,5,145.6)//線を書く tank_drive.on_for_degrees(-5,5,175)//角度を変える tank_drive.on_for_degrees(5,5,145.6)//線を書く tank_drive.on_for_degrees(-5,5,255)//角度を変える tank_drive.on_for_degrees(5,5,212)//線を書く motor_center.on_for_degrees(-15,45)
以下は顔のパーツ部分を書くプログラムです。 はじめに目を書き、次に鼻を書き、最後に口を書くというプログラムです。
#!eyes tank_drive.on_for_degrees(5,-5,175)//描く部分までの移動 tank_drive.on_for_degrees(5,5,62.4) tank_drive.on_for_degrees(5,-5,175) tank_drive.on_for_degrees(5,5,42)//描く部分までの移動 motor_center.on_for_degrees(15,45)//ペンをつける tank_drive.on_for_degrees(5,5,42)//目の線を描く motor_center.on_for_degrees(-15,45)//ペンを離す tank_drive.on_for_degrees(5,5,42)//描く部分までの移動 motor_center.on_for_degrees(15,45)//ペンをつける tank_drive.on_for_degrees(5,5,42)//目の線を描く motor_center.on_for_degrees(-15,45)//ペンを離す tank_drive.on_for_degrees(-5,5,175)//描く部分までの移動 tank_drive.on_for_degrees(5,5,42) tank_drive.on_for_degrees(-5,5,175) tank_drive.on_for_degrees(5,5,62.4) tank_drive.on_for_degrees(-5,5,175)//描く部分までの移動 motor_center.on_for_degrees(15,45)//ペンをつける tank_drive.on_for_degrees(5,5,62.4)//鼻の線を描く motor_center.on_for_degrees(-15,45)//ペンを離す tank_drive.on_for_degrees(-5,-5,83.2)//描く部分までの移動 tank_drive.on_for_degrees(-5,5,175) tank_drive.on_for_degrees(-5,-5,20.8)//描く部分までの移動 motor_center.on_for_degrees(15,45)//ペンをつける tank_drive.on_for_degrees(5,5,41.6)//口の線を描く
できた似顔絵がこちらです。輪郭を丸くしたかったのですが、プログラミングが未熟でカクカクでしか表現できませんでした。
今回の課題では勉強足らずで文法などが全然理解できていなかった。 その結果このような単純なプログラムしかできなかったので次は頑張りたい。
今回は角度を使ったコマンドを使用したが思うような角度で動かなかった。 これはロボットの電圧などに影響しているのではないかと思う。ですから次回からは角度を使う場合には検討したい。