[[2018a/Member]]

目次

#contents
*課題1 [#d3ecc1ea]
これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上のものを選び、それをA4の紙を書くロボットを製作せよ。
**選んだ文字 [#zd51e3c8]
出身地の長野県塩尻市にある「広丘」という地区名を選んだ。
*ロボットの説明 [#jb16d39f]
**全体の構造 [#n7737033]
比較的プログラムを簡単にできるXY方式を採用した。
以下の三つの機構を組み合わせる方法を考えた。

�.蹈椒奪帆澗里鯀宛�(Y軸方向)に動かす機構

�▲撻鵑良�分を左右(X軸方向)に動かす機構

��ペンを上げ下げさせる機構

下の写真がロボット全体の様子である。

#ref(IMG_0029[1].jpg)
**�.蹈椒奪帆澗里鯀宛�(Y軸方向)に動かす機構 [#g6f88288]
一つのモーターに二つのタイヤをつけ、ロボット全体を前後に動かせるようにした。ただこのモーターの上にモーター二つと操作盤を乗せることになってしまったため、全体のバランスが悪くなってしまった。下の機構部分の上に�△筬�の機構が乗る形になる。

#ref(IMG_0026[1].jpg)
**�▲撻鵑良�分を左右(X軸方向)に動かす機構 [#aad820ac]
�,竜々修両紊望茲擦觀舛妊撻鵑鮑険Δ貌阿�せるようにした。ギアを利用し一つのモーターでできるだけ長く横に伸ばせるように工夫した。二つのギアが内側に回転することでペンを右方向に伸ばし、外側に回転することで左方向に縮むという構造をしている。しかし、�∩澗里竜々修�ペンを足すとかなり重くなってしまったため、��を動かすモーターに大きな負荷をかけてしまうことになってしまった。

#ref(IMG_0028[1].jpg)
**��ペンを上げ下げさせる機構 [#i9b54208]
�△汎韻犬��,竜々修両紊望茲察↓△離�ア部分の柱を回しペンが上下できるようにした。ギア部分の柱が上向きに回転されることによって、�△竜々汁澗里眇緤燭�ら上方向に回転しペンが上がる仕組みになっている。しかし、�△竜々修糧紳仟Δ貌韻犬茲Δ棒瀉屬靴燭燭瓠�柱を回転させるための接続が十分にできずモーターに大きな負荷をかけることになってしまった。

#ref(IMG_0025[1].jpg)
*メインプログラムへの準備 [#z1244a05]
今回のプログラムでは、NXTロボットの最大の特徴である、タイヤの角度を指定できる関数を利用することにした。角度を指定できるのでcm単位でのロボットの動きの制御が可能となる。良かった点、問題点は後で記述する。
**ペンを上げ下げするプログラム [#r38da943]
��の機構(プログラム上ではモーターC)を角度、スピードを指定して回転させるプログラムを書く。
 #define up RotateMotor(OUT_C,-30,30);Off(OUT_C);Wait(100); //筆を上げる(30%の速さで30°)
 #define down RotateMotor(OUT_C,15,28);Off(OUT_C);Wait(100); //筆を下ろす(15%の速さで28°)
**ロボットを前後(Y軸方向)に移動させるプログラム [#gbb7a48f]
�,竜々宗淵廛蹈哀薀狆紊任魯癲璽拭�A)を角度、スピードを指定して回転させるプログラムを書く。タイヤが一周回ると移動できる距離は17.5cmとわかったので、0.5cm刻みで指定できるように予めプログラムに入れる距離の数字に360/35をかけておくようにした。
 #define str(X,Y) RotateMotor(OUT_A,X,Y*360/35);Off(OUT_A);Wait(100); //ロボットを上下に動かす X:モーターの速さ Y:回す角度 
**ペンを左右(X軸方向)に移動させるプログラム [#f21e1f99]
�△竜々宗淵廛蹈哀薀狆紊任魯癲璽拭�B)を角度、スピードを指定して回転させるプログラムを書く。ギアによって機構の運動する角度ががモーターの回転角の20%になっているので、�,竜�離の数字にかける数をを5倍した360/7をかけるようにした。
 #define LR(X,Y) RotateMotor(OUT_B,X,Y*360/7);Off(OUT_B);Wait(100); //ペンを横に動かす X:モーターの速さ Y:回す角度
**モーターの運動を角度で指定できる関数を用いたことの良い点と問題点 [#c4084700]
以下のような良かった点、問題点があったが、問題点に関しては時間の関数でも起こることや、解決できそうなことであったので角度の関数を採用した。
***良かった点 [#m9403c53]
・モーターを動かす距離を時間ではなく長さで決めることができる。

・距離に入れる数を分数にすればより細かく距離を定められる。
***問題点 [#j05c953b]
・時間の関数のように2つの関数を同時に実行させて斜めにペンを移動させることができない。→この問題は重大なため新しい角度関数(RotateMotorEx:2つのモーターを同期させて回転)を使用し問題解決を図った。

・電池の消耗によって角度が正確でなくなってしまう。
**「広」の字を書くためのプログラム[#e0ab314c]
上の機構のところで定義した名前を用いて、広丘の「広」の文字を書くプログラムを作る。

以下、用いたプログラム
 sub Hir()
 {
      str(30,2);     //�仝紊�30%の速さで1cm進む
      up;       //�▲撻鵑鮠紊欧�
      LR(-60,2);    //��左に60%の速さで1cm進む
      down;      //�ぅ撻鵑魏爾欧�
      LR(60,7);    //�ケΔ�60%の速さで3.5cm進む
      up;       //�Ε撻鵑鮠紊欧�
      LR(-60,7);    //�Ш犬�60%の速さで3.5cm進む
      down;      //�┘撻鵑魏爾欧�
      RotateMotorEx(OUT_AB,30,675/7,-100,true,true); //��左斜め後ろに30%の速さで約5cm進む
      Wait(100);    //0.1秒待つ
      up;       //��ペンを上げる
      LR(30,2);    //��右に30%の速さで1cm進む
      str(-30,2);   //��上に30%の速さで1cm進む
      down;      //��ペンを上げる
      RotateMotorEx(OUT_AB,30,450/7,100,true,false); //��右斜め前に30%の速さで約4cm進む
      Wait(100);    //0.1秒待つ
      up;       //��ペンを上げる
      str(30,4);    //�芦爾�30%の速さで2cm進む
      LR(-30,1);    //�浦犬�30%の速さで0.5cm進む
      down;      //�殴撻鵑魏爾欧�
      LR(30,4);    //�咳Δ�30%の速さで2cm進む
      str(-30,3/2);  //�款紊�30%の速さで0.75cm進む
      str(30,3);     //21下に30%の速さで1.5cm進む
      up;       //22ペンを上げる 広終了
 }

#ref(図1.jpg)

上のプログラムに説明として書かれている数字は、上図の数字と連動している。図をわかりやすくするため、実際の大きさと上図は異なる。水色の矢印が線を書いているときの動作、赤い矢印はペンをあげて移動しているときの動作、黒丸はペンの上げ下げを表している。

**「丘」の字を書くためのプログラム [#eff1f97c]
同様に広丘の「丘」の文字を書くプログラムを作る。

以下、用いたプログラム
 sub Oka()
 {
      str(30,2);      //�_爾�30%の速さで1cm進む
      LR(-30,3);   //�∈犬�30%の速さで1.5cm進む
      down;      //��ペンを下げる
      LR(30,4);    //�けΔ�30%の速さで2cm進む
      up;       //�ゥ撻鵑鮠紊欧�
      LR(-30,4);   //��左に30%の速さで2cm進む
      down;      //�Д撻鵑魏爾欧�
      str(30,8);   //�┣爾�30%の速さで4cm進む
      up;       //��ペンを上げる
      str(-30,5);   //��上に30%の速さで2.5cm進む
      down;      //��ペンを下げる
      LR(60,4);    //��右に60%の速さで2cm進む
      up;       //��ペンを上げる
      LR(-60,2);   //��右に60%の速さで1cm進む
      down;      //��ペンを下げる
      str(30,5);   //�芦爾�30%の速さで2.5cm進む
      up;       //�吋撻鵑鮠紊欧�
      LR(-30,4);      //�穏犬�30%の速さで2cm進む
      down;           //�灰撻鵑魏爾欧�
      LR(30,10);      //�官Δ�30%の速さで5cm進む
      up;             //21ペンを上げる 丘終了
 }

#ref(図2.jpg)

上のプログラムに説明として書かれている数字は、上図の数字と連動している。図をわかりやすくするため、実際の大きさと上図は異なる。水色の矢印が線を書いているときの動作、赤い矢印はペンをあげて移動しているときの動作、黒丸はペンの上げ下げを表している。
*メインプログラム [#f23237d4]
上で書いた二つのサブのプログラムを用いることでメインのプログラムを短いものにすることができた。また、開始時はペンが下がった状態である。

以下、用いたプログラム
 task main()
 {
       Hir();    //「広」の字を書くためのプログラム
       Wait(100);    //0.1秒待つ
       Oka();    //「丘」の字を書くためのプログラム 
 }
*できた文字 [#b8d7479e]
#ref(IMG_0001.JPG)
かろうじて読むことはできるが、かすれてしまったり、ペンを下げたときの反動で、書きたい場所よりも手前から横の線が書かれてしまったりした。
*課題1の反省・感想 [#c893a732]
最初は字を書くことぐらいなら難しくないだろうと思っていたが、予想以上に発想力やプログラミング力を必要とすることがわかった。

また、角度の関数を用いてしまったことで斜めに字を書くことが非常に難しくなってしまった。機械の構造上モーターを同期させても、特に左右が一定の角度で同じ距離を動くわけではないので、曲がってしまったり角度が小さくなってしまうところがあった。

ロボットも特に�△竜々修如▲�アを一本の柱で固定したことによって回転できる角度が制限されてしまい、長く左右方向に書くことができなくなってしまった。XY軸のロボットにしたことでプログラムは比較的簡単になったが、ロボットの構造を考えるのがとても難しかった。

ペンの筆圧についてほとんど対策ができず、少しでも紙に強く当たるとペンが浮いてしまうことがあった。

次回の課題では今回の反省を生かし、よく考えて少しでも簡単に、かつ効率よく動くことのできるロボット、プログラムを作成していきたい。

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