#contents

*課題1 書道ロボット [#u47aa8b9]

今回は、漢字を書かせるための書道ロボットを作成した。

3人の住所から『玉』『田』『中』を選び、それぞれプログラミングを行った。

(製作者:クノピー、ハネウマ、たまちゃん)
''(製作者:クノピー、ハネウマ、たまちゃん)''
**作成の過程 [#f1128ea7]

***ロボットの機構を考える。 [#s4780483]

前回までの講義で作成した車型のロボットに、ペンを上下させる機構を取り付け、それによって車型ロボットの軌道により文字を書く機構を考えた。が、この取り付け方ではうまくいかないと後に判明し、ペンを上下させる機構以外の車部分は改良される。

写真はペンを上下させる機構。
モーターの回転を洗濯板のようなパーツにより上下移動に変換し、モーターの回転の正負を調整することによりペンを上下させる機構。

#ref(070524_2251~02.jpg)

ペンを持たせる。
当初はブロックで挟み込むことでペンを固定しようとしたが、うまくいかなかった。そのためシンプルに輪ゴムで固定するという方法をとることにした。
 
#ref(070531_1737~02.jpg)

***文字を書くためのロボの動きを考える [#y210da64]

10cm×10cmの正方形を基本にして、実際に文字を書いてみて、ロボットにどのよう動きをさせれば良いか考えた。

写真は『中』を考えているところ。

#ref(robotics02.JPEG)

当初は最短距離を移動させるためtanの値を利用して角度を求め、ターンの秒数を調整して文字を書かせる予定だったが、下の問題のため調整のたびに値を変化させるより、まず、縦方向に移動させてから、横方向に移動させるというような方法で目標となる次点の座標を目指す方法のほうが、ターンの角度を一定と考えることができるため、良いと判断し、そちらを採用した。

***ペンの取り付け位置を考える [#z76f2cf5]

1、最初はロボの先頭に取り付けた。
しかし、ロボの回転中心とペン先の位置が違うため、コンパスのようにペン先の位置が変わり、それぞれの画がバラバラになってしまったり、綺麗な折れ線が書けなかったりした。

#ref(070524_2257~05.jpg)

2、この失敗を受け、ペン先はロボットの回転中心と位置が一致していなければならないという結論に達した。そのため、ロボットの中心に開いていた穴を利用し、そこからペンを出すことにより回転中心とペン先を一致させる実験を開始した。しかし、いくらペン先をずらしても誤差は無くならず、重量バランスは悪くなる一方(後部に重量が偏りすぎたため、ウイリーのような状態になってしまう)であった。そのため、既存の穴を利用することに限界を感じ、大々的な改造を決意した。

#ref(070524_2255~02.jpg)

3、以上から、回転中心とペン先が一致するロボットを作成。画像だけではわかりづらいが、中心部の穴を大きくするために大胆なパーツの除去などが行われている。そのため、ところどころ外れやすくなるという欠陥はあるが、文字を書く途中で外れてしまうほどではないので、少々の補強を加えておく程度にとどめておいた。

#ref(070526_2329~03.jpg)

ペンを出す部分の改良点。本来は後輪(太いタイヤの方)のシャフト上には固定するパーツがついていたが、回転中心はまさにその部分にあると予測ができたので、固定していたパーツを除去した。また、穴のあいている必要のなくなった車の中心部には補強のパーツを取り付けることにした。

#ref(070531_1737~01.jpg)

***プログラムを考える [#s950bc68]
1、『中』と書かせるためのプログラム。(初めにペンは接地している。)


 task main()
 {
 OnFwd(OUT_A+OUT_C);      //1画目 直進 [上の画像では(1)]
 Wait(40);
 
 OnFwd(OUT_B);               //ペンを上げる
 Wait(5);
 
 OnRev(OUT_A+OUT_C);      //後退(ペンが上がっているので線は引かれない) [画像では(2)]
 Wait(40);
 
 OnFwd(OUT_A);        //左に90°回転
 OnRev(OUT_C);
 Wait(92);
 
 OnRev(OUT_B);        //ペンを下げる
 Wait(5); 
 
 OnFwd(OUT_A+OUT_C);     //2画目 直進 [上の画像では(3)]
 Wait(100);
 
 OnRev(OUT_A);        //右に90°回転
 OnFwd(OUT_C);
 Wait(92);
 
 OnFwd(OUT_A+OUT_C);      //直進 [上の画像で(4)]
 Wait(40);
 
 OnFwd(OUT_B);         //ペンを上げる
 Wait(5);
 
 OnRev(OUT_A);        //右に90°回転
 OnFwd(OUT_C);
 Wait(92);
  
 OnFwd(OUT_A+OUT_C);      //直進(ペンが上がっているので線は引かれない) [画像では(5)]
 Wait(100);
 
 OnRevOUT_B);           //ペンを下げる
 Wait(5);
 
 OnRev(OUT_A+OUT_C);       //3画目 線を引きながら後退 [上の画像では(6)]
 Wait(100);
 
 OnFwd(OUT_B);         //ペンを上げる
 Wait(5); 
 
 OnRev(OUT_A);         //右に90°回転 
 OnFwd(OUT_C);
 Wait(92);
 
 OnFwd(OUT_A+OUT_C);       //直進(ペンが上がっているので線は引かれない) [画像では(7)]
 Wait(60);
 
 OnFwd(OUT_A);        //左に90°回転
 OnRev(OUT_C);
 Wait(92);
 
 OnFwd(OUT_A+OUT_C);      //直進(ペンが上がっているので線は引かれない) [画像では(8)]
 Wait(50);
 
 OnFwd(OUT_A);        //左に90°回転
 OnRev(OUT_C);
 Wait(92);
 
 OnRev(OUT_B);        //ペンを下げる
 Wait(5);
 
 OnFwd(OUT_A+OUT_C);     //4画目 直進 [上の画像では(9)]
 Wait(100);
 
 Off(OUT_A+OUT_C+OUT_B);
 
 }

2、『田』を書かせるためのプログラム。(初めにペンは接地している。) 

 task main()
 {
 OnFwd(OUT_A+OUT_C);          //一画目 直進
 Wait(100);
 
 OnFwd(OUT_B);                //ペンを上げる
 Wait(5);
 
 OnRev(OUT_A+OUT_C);         //後退(ペンが上がっているので線は引かれない)
 Wait(100);
 
 OnFwd(OUT_A);               //左に90度ターン
 OnRev(OUT_C);
 Wait(92);
 
 OnRev(OUT_B);                //ペンを下げる
 Wait(5);
 
 OnFwd(OUT_A+OUT_C);           //二画目 直進
 Wait(100);
 
 OnFwd(OUT_A);               //右に90度ターン
 OnRev(OUT_C);
 Wait(92);
 
 OnFwd(OUT_A+OUT_C);           //直進
 Wait(100);
 
 OnFwd(OUT_B);                //ペンを上げる
 Wait(5);
 
 OnRev(OUT_A+OUT_C);         //後退(ペンが上がっているので線は引かれない)
 Wait(100);
 
 OnFwd(OUT_C);               //右に90度ターン
 OnRev(OUT_A);
 Wait(92);
 
 OnFwd(OUT_A+OUT_C);          //直進(ペンが上がっているので線は引かれない)
 Wait(50);
 
 OnFwd(OUT_A);               //左に90度ターン
 OnRev(OUT_C);
 Wait(92);
 
 OnRev(OUT_B);                //ペンを下げる
 Wait(5);
 
 OnFwd(OUT_A+OUT_C);          //直進
 Wait(100);
 
 OnFwd(OUT_B);                //ペンを上げる
 Wait(5);
 
 OnRev(OUT_A+OUT_C);         //後退(ペンが上がっているので線は引かれない)
 Wait(50);
 
 OnFwd(OUT_A);               //左に90度ターン
 OnRev(OUT_C);
 Wait(92);
 
 OnRev(OUT_A+OUT_C);         //後退(ペンが上がっているので線は引かれない)
 Wait(50);
 
 OnRev(OUT_B);                //ペンを下げる
 Wait(5);
 
 OnFwd(OUT_A+OUT_C);          //四画目 直進
 Wait(100);
 
 OnFwd(OUT_B);                //ペンを上げる
 Wait(5);
 
 OnRev(OUT_A+OUT_C);         //後退(ペンが上がっているので線は引かれない)
 Wait(100);
 
 OnFwd(OUT_C);               //右に90度ターン
 OnRev(OUT_A);
 Wait(92);
 
 OnFwd(OUT_A+OUT_C);         //直進(ペンが上がっているので線は引かれない)
 Wait(50);
 
 OnFwd(OUT_A);               //左に90度ターン
 OnRev(OUT_C);
 Wait(92);
 
 OnRev(OUT_B);                //ペンを下げる
 Wait(5);
 
 OnFwd(OUT_A+OUT_C);         //五画目 直進
 Wait(100);
 
 Off(OUT_A+OUT_B+OUT_C);    
 
 }

3、『玉』を書かせるためのプログラム。(初めにペンは接地している。) 

 task main()
 {
 OnFwd(OUT_A+OUT_C);          //1画目 直進
 Wait(80);
 
 OnFwd(OUT_B);                //ペンを上げる
 Wait(5);
 
 OnRev(OUT_A+OUT_C);          //後退(ペンが上がっているので線は引かれない)
 Wait(40);
 
 OnFwd(OUT_C);                //右に90度
 OnRev(OUT_A);
 Wait(92);
 
 OnRev(OUT_B);               //ペンを下げる
 Wait(5);
 
 OnFwd(OUT_A+OUT_C);         //2画目 直進
 Wait(100);
 
 OnFwd(OUT_B);               //ペンを上げる
 Wait(5);
 
 OnFwd(OUT_C);               //右に90度
 OnRev(OUT_A);
 Wait(90);
 
 OnFwd(OUT_A+OUT_C);        //直進(ペンが上がっているので線は引かれない)
 Wait(30);
 
 OnFwd(OUT_C);               //右に90度
 OnRev(OUT_A);
 Wait(92);
 
 OnFwd(OUT_A+OUT_C);         //直進(ペンが上がっているので線は引かれない)
 Wait(50);
 
 OnFwd(OUT_C);               //右に90度
 OnRev(OUT_A);
 Wait(92);
 
 OnRev(OUT_B);               //ペンを下げる
 Wait(5);
 
 OnFwd(OUT_A+OUT_C);          //3画目 直進
 Wait(60);
 
 OnFwd(OUT_B);               //ペンを上げる
 Wait(5);
 
 OnFwd(OUT_C);               //右に90度
 OnRev(OUT_A);
 Wait(92);
 
 OnFwd(OUT_A+OUT_C);          //直進(ペンが上がっているので線は引かれない)
 Wait(50);
 
 OnFwd(OUT_C);               //右に90度
 OnRev(OUT_A);
 Wait(92);
 
 OnFwd(OUT_A+OUT_C);          //直進(ペンが上がっているので線は引かれない)
 Wait(70);
 
 OnRev(OUT_B);                //ペンを下げる
 Wait(5);
 
 OnRev(OUT_A+OUT_C);          //4画目 後退
 Wait(80);
 
 OnFwd(OUT_B);                //ペンを上げる
 Wait(5);
 
 OnFwd(OUT_A+OUT_C);          //直進(ペンが上がっているので線は引かれない)
 Wait(20);
 
 OnFwd(OUT_C);                //右に90度
 OnRev(OUT_A);
 Wait(92);
 
 OnFwd(OUT_A+OUT_C);          //直進(ペンが上がっているので線は引かれない)
 Wait(30);
 
 OnFwd(OUT_C);                //右におよそ120度
 OnRev(OUT_A);
 Wait(110);
 
 OnRev(OUT_B);                //ペンを下げる
 Wait(5);
 
 OnFwd(OUT_A+OUT_C);          //5画目 直進
 Wait(10);
  
 Off(OUT_A+OUT_B+OUT_C);
 }

なおターンの秒数は床によって調整しなければならないので、数値はカーペット上のものにな統一した。


**工夫した点 [#z370056e]

1、初めに直面したペン先と回転中心のズレという問題点を解消するため、ロボットの中心部からペンを出すことにした。

2、そのために、本体を後部に移動させる必要があった。しかし、後部の重量バランスが悪化したため、後部の重量を支えるために抵抗の少ない足をつけた。

3、そして、重量バランスを支えるためにつけた足の抵抗による誤差を軽減するため、本体を立てに取り付けることにより、重心が後方に行きすぎないように改良を加えたこと。

**苦労した点 [#vbfe8c8a]

やはり、ペン先と回転中心のズレを解消することが大きな課題だった。ペンの位置を確保するため、本体の位置を変更すると重心も若干変わり、誤差も変化してしまう。また、床の状況によりターンの角度が異なるので、やわらかいカーペット上で調整したものでは、硬い板の上での実践と結果が変わってしまう。これらの調整に大変な労力を費した。

**感想 [#c4b58be5]

(たまちゃん) 調整・改造が難しく、友達に頼ってしまう部分もあったが、ホームページ作成、ロボ製作など、それぞれの得意分野を生かしてチーム一体となって作業できたので、良かったと思う。紙を置く床の材質の違いによってもロボの動きが変化したので、その調整が大変だった。

(ハネウマ) ロボの重心がずれたときにどのパーツを移動すれば良いのかを考えて調整するのに苦労した。また、字を書く上での微妙なズレの改善が難しかしく、場合によっては改悪になってしまった時もあったが、この課題で苦労した経験を次の課題でも活かしていきたい。

(クノピー) 自分なりに最善を考えて考案した改造でも、改善するたびに問題が発生して、その都度調整や改善が必要となり、開発の大変さの片鱗を見た気がした。私は工学部なので良い経験をしたと思う。しかし、初めの課題でこれほど苦労するということは今後の課題はどうなってしまうのか不安が残る。

コメントをどうぞ
-もう少し細かな説明があるとよいと思う。3人チームならば、感想は3人分書かれているのが妥当ではないだろうか。 -- [[ヒロヤ]] &new{2007-05-24 (木) 01:17:46};
-↑遅ればせながら、コメントありがとうございました。レポート直してみましたのですが、まだ駄目でしょうか?コメントをお願いします。 -- [[A9L]] &new{2007-05-31 (木) 17:38:58};
-遅くなりました。丁寧な説明と、「中」を考えるプロセスが良いと思います。 -- [[ヒロヤ]] &new{2007-06-06 (水) 22:40:52};

#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS