目次

課題1:お絵描きロボット

LargeMotorを2つとMediumMotorを1つのモーター3つを使用して相方の似顔絵を作るロボットを作成する。

ロボットについて

絵を描く方法

ロボットにペンを使って絵を描かせる方法は最初は2つ思いつきました。1つ目の方法は車のようなロボットにペンをつけて絵を描かせる自走型。2つ目は横軸と縦軸にそれぞれ動けるようにして絵を描くクレーン型の2つを思いつきました。ですが、この2つの方法を試したところ自走型は左右のタイヤが別々で動いているためズレが生じてしまいプログラムでの微調整が必要になってしまう。クレーン型はモーターにはコードがついており大きく動かすことはあまりできません。そのためモーターの回転を何かしらの方法で伝えなくてはなりませんが、その設計が難しい事やパーツの数による制限もあります。このように、2つの方法は改善すべき点が存在します。

ロボットの構造について

今回作成したロボットは先ほど述べた2つの方法を組み合わせたものです。縦軸をタイヤによって移動させ、横軸は自作したパーツによってモーターの回転を伝えるといった方法で絵を描くことにしました。下の写真は1枚目が今回作成したロボットの全体像、2枚目は横軸にモーターの回転を伝えるために自作したパーツです。

ロボットの全体像 自作した横軸にモーターの回転を伝えるパーツ

ロボットの改善点

今回は私は忙しくロボット構造については少し考えましたが、最終的に作成は相方が行ってくれたので構造についての改善点は書けませんが、自作したパーツについての改善点をまとめます。

1つ目はモーターにつけた3つ歯の歯車と自作した梯子のようなパーツがしっかりとかまないこと

2つ目は長さが短く横のかける幅が狭くなってしまったこと

ロボットについてのまとめ

今回はあまりロボットにかかわることができませんでした。そんな中このようなロボットを作ってくれた相方に感謝しつつ次の課題からはしっかりとロボットにかかわっていきたいと思いました。

プログラムについて

プログラムのシステムについて

今回絵を描くにあたってロボットの構造的も踏まえて座標平面で考えることにしました。また、線を描くシステムを一般化し線を引くたびに新たにプログラムしなくて済むようにしました。

今回座標平面として考えるときに1メモリをどのようにするか考えなくてはいけません、最初は普通にモーターの回転距離にしようとしましたが縦横で仕組みが違うため1メモリの長さが同じになりません。次に考えたのが回転数を基準にメモリを考える方法で取り組みましたがこれも仕組みの問題から細かな調整が必要になってしまいます。

そこで今回はモーターの回転速度と回転している時間の2つを基準にメモリを作ることにしました。この方法はモーターのそれぞれの調整が簡単であり、回転角などよりも考えやすいなどといったメリットもありこの方法でプログラムのシステムを考えることにしました。

プログラムの工夫点

#!/usr/bin/env python3
from ev3dev2.motor import *
Mall = MoveTank(OUTPUT_D,OUTPUT_A)
pen=MediumMotor(OUTPUT_B)
class MMD: #線を描くための自作クラス
    def __init__(self,a,b,c):
        self.Mm1=a*6 #横軸の1メモリの長さの調整
        self.Mm2=b*1.5 #縦軸の1メモリの長さの調整
        self.PP=c
        self.basetime=0.5 #各工程にかける時間
        self.timec()
    def timec(self):
        self.M1=self.Mm1/self.basetime
        self.M2=self.Mm2/self.basetime
def PUD(a): #ペン先の上げ下げ
    if a==1 : 
        pen.on_for_degrees(5,30) 
    else:
        pen.on_for_degrees(5,-30)
Drw=[MMD(0,3,0),MMD(1,3,1),MMD(2,2,1),MMD(1,0,1),MMD(2,-1,1),MMD(1,-3,1),MMD(-1,-2,1),MMD(-2,-1,1),MMD(-1,0,1),MMD(-2,1,1),MMD(-1,2,1),MMD(3,0,1),MMD(3,0,1),MMD(1,0,1),MMD(0,1,0),MMD(-2,0,0),MMD(-1,0,1),MMD(-1,0,0),MMD(-1,0,1),MMD(0,2,0),MMD(1,0,0),MMD(1,0,1),MMD(1,0,1)] #絵を描くためのデータ
for i in range(23): #線を描く
    if Drw[i].PP==0:
        PUD(0)
    Mall.on_for_seconds(Drw[i].M2,Drw[i].M1,Drw[i].basetime)
    if Drw[i].PP==0:
        PUD(1)

上記なようなプログラムを作成し、縦横の移動距離とその移動の際のペン先の状態の3つを指定すれば絵を描けるようにしました。

工夫点の1つ目は毎回移動のプログラムを書かないようにした点です。自作のクラスで縦横の進むメモリ数とペン先の状態を0と1で示せるようにしました。こうすることで線を描くプログラムはfor文を用いたループ文だけで行うことができるようになっています。

工夫点2つ目は1メモリの長さ調整ができるようにした点です。今回のロボットは縦と横の進み方が違っています。ですがそれを毎回メモリ単位で調整するのは大変ですのでクラス内で一括で調整できるようにしました。

工夫点3つ目は線を描く移動と線を描かない移動を0と1で指定できるようにした点です。これにより一筆書きの考え方でも一筆書きに縛られない絵を描けるようにしました。

こうして完成した絵が次の写真です

完成した絵

今回の改善点

改善点1つ目は作成したロボットに適したプログラムにする点

改善点2つ目は連続移動の際ペンが各工程ごとに上下してしまっている点です。これは前後の工程のペンの状態を考慮してないために起こってしまっているのでそれを考慮したプログラムにする必要があります。

プログラムのまとめ

ロボット同様作成時間が短かったためプログラムの最適化ができませんでした。今回の改善点を踏まえて次回以降の課題ではプログラムは自分が満足いくまで調整していこうと思います。


添付ファイル: fileS__70811656.jpg [詳細] fileS__70811655.jpg 2件 [詳細] fileS__70811654.jpg 1件 [詳細] fileS__70811653.jpg 1件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-11-10 (日) 16:52:48