#contents
*ロボットの構造説明 [#l825ec4e]
**setpowerを使用せずに減速 [#u20f4f8d]
モーター自体の力が弱いため、本体全ての重さがかかっている車輪(モーター)にsetpowerを使うと、どうしても床等の環境に依存してしまいます。フローリング等の硬い床でしたらsetpowerは可能ですが、絨毯等の弾力性のあるものでは、setpower3以下は全く動きません。その為、時間での回転角定義が曖昧となってしまいます。

そのような欠点がある以上、車輪プログラムにsetpower避けることが必須でした。

#ref(./001.JPG,40%)

***車輪ののギア比 [#ibb67537]

+モーターの回転部分に歯数12の歯車を付け、次の棒(2番目)に歯数40の歯車を付けます。ここでギア比は12:40=3:10(回転数が3/10になる)です。
+また、同じ棒(2番目)に歯数8の歯車を付け、大きな歯車(歯数40)が1回転すると小さな歯車(歯数8)も一回転します。
+歯数8と車輪についている歯数24の歯車が噛むことになるので、ここでのギア比は8:24=1:3(回転数が1/3になる)です。

よって、以上の(1.)(2.)を掛け合わせたもの{(3/10)*(1/3)=(1/10)}がギア比になります。
つまり、モーターが10回転すると1回車輪が回転し終えるということです。

**ペンを垂直にあげるために [#s7d3fef1]

字の太さに差をつけるため、垂直に上下動させることを考えました。
また、そこでどのようなペンでも使用できるよう考慮し、キャタピラを取り付けることにしました。

ペンは比較的軽いため、setpowerが可能です。ですが、あまりにも回転数が早いと微調整が難しい上、弱いsetpowerで起きる誤作動を防ぐため、LOWPOWERが4でも済むようここでもギア比を用いて調整しました。

作成後の収穫として、キャタピラならではの利点がありました。ペンの位置調整がずれてもペンが前後に動きやすいため、柔軟に対応できるということです。つまり、紙に近い位置にペンを着ければ、高さやキャタピラを動かす時間をそれほど意識しなくてよいということです。

&ref(./005.JPG,20%);
ここでのギア比は、一回目に歯数8と歯数40が噛み(1/5)、歯数40と同じ棒に歯数8が付き、その歯数8が歯数24と噛み合っている(1/3)ため、{(1/5)*(1/3)=1/15)}となります。すなわち、モーターが15回転するとキャタピラの車輪が1回転します。

**後輪のキャスター [#j53f84ca]

重心が前方に位置するため、移動速度が遅いとは言え転倒することが考えられました。前輪が四方滑らかに動くためにはキャスターが必要ですが、キャスターは垂直でなくては機能しません。

#ref(./002.JPG,40%)

重心を少しでも中心へ移動させるには、上の写真のように後輪が少し下がっている必要があります。その微調整が今回のロボット作成で一番の苦労点でした。


*プログラミング[#f224a4ad]
**プログラミングの説明 [#yc494bf1]
まずは今回の書道ロボットのプログラム全てを記載します。

 #define HIPOWER 7
 #define LOWPOWER 4
 #define WAIT Wait(50);
 #define set_power_pH SetPower(OUT_B,HIPOWER);
 #define set_power_pL SetPower(OUT_B,LOWPOWER);
 #define turn_left(t) OnFwd(OUT_A); OnRev(OUT_C); Wait(t); Off(OUT_AC); WAIT;
 #define turn_right(t) OnRev(OUT_A); OnFwd(OUT_C); Wait(t); Off(OUT_AC); WAIT;
 #define go_forward(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC); WAIT;
 #define go_back(t) OnRev(OUT_AC); Wait(t); Off(OUT_AC);
 #define TURN_TIME 190  //垂直回転時間
 #define TURN_TIME2 180  //左右でモーターの強さが異なるため時間で補正

 sub pen_up_fast()
 { set_power_pH OnFwd(OUT_B);
   Wait(49);
   Off(OUT_B);
   WAIT;
 }
 sub pen_up_slow()
 { set_power_pL OnFwd(OUT_B);
   Wait(55);
   Off(OUT_B);
 }
 sub pen_down()
 { set_power_pH OnRev(OUT_B);
   Wait(50);
   Off(OUT_B);
 }

 task main ()
 {
   pen_down();
   go_forward(60);
   pen_up_fast();  //一画目
   go_back(70);
   WAIT;
   turn_left(130);
   go_forward(150);
   turn_right(270);
   pen_down();
   OnFwd(OUT_AC);
   Wait(60);
   pen_up_slow();
   Off(OUT_AC);  //二画目
   WAIT;
   go_back(20);
   WAIT;
   turn_right(100);
   go_forward(100);
   pen_down();
   go_back(170);
   pen_up_fast();  //三角目
   repeat(2){
     turn_left(TURN_TIME);
     go_forward(50);
     turn_right(TURN_TIME2);
     go_forward(150);
     pen_down();
     go_back(150);
     pen_up_fast();
    }  //四・五画目
   turn_left(TURN_TIME);
   go_forward(50);
   turn_right(TURN_TIME2);
   go_forward(180);
   pen_down();
   go_back(230);
   pen_up_fast();  //六画目
   go_forward(150);
   turn_right(TURN_TIME);
   go_forward(135);
   pen_down();
   go_back(125);
   pen_up_fast();  //七画目
   turn_left(40);
   go_forward(30);
   turn_right(110);
   pen_down();
   OnRev(OUT_AC);
   Wait(160);
   pen_up_slow();
   Off(OUT_AC);  //八画目
   WAIT;
   go_forward(215);
   turn_left(140);
   go_back(25);
   pen_down();
   go_back(120);
   OnRev(OUT_AC);
   Wait(50);
   pen_up_slow();
   Off(OUT_AC);  //九画目
 }

**上記のプログラムで実際に書いたもの [#o1792b59]

#ref(./004.JPG,20%)

**書き順 [#md1c0d73]

(編集中)

**プログラムからのロボット動作観点 [#x70e3026]

(編集中)

*細かい動作制御、利用 [#z7b0141b]
今回使用したRISのモーターは左右で出力に差があり、直進することができませんでした。機械の性質上仕方のないことですので、その欠点を時間定義でカバーするようにしました。

例えば、左に90°回転、少し進んで右に90°回転、その後真っ直ぐ進みたいとした時、直進できないという性質上、その後の真っ直ぐでは少しカーブを描きます。それを補う為に、右旋回90°を85°程度で止め、直進させることによって、目的の場所へ辿り着かせるというプログラムを作りました。バックはそれほど左右に差がなかった為、ほとんど考慮せずに済みました。

**裏ワザ [#l60c2627]

***文字(払い) [#b1cfbb27]

文字の払いを表現するために、二画目・九画目に以下のような設定をしています。

  pen_down();
  OnFwd(OUT_AC);
  Wait(60);
  pen_up_slow();
  Off(OUT_AC); 

ペンを上げながら車輪を動かすということです。移動速度の関係から、極端に長い払いは難しいですが、ある程度の払いはこれとペンのsetpowerで表現できました。

***止め払い [#nef8f00d]

プログラムを見ると、一番最後の九画目のプログラミングが不自然であることに気が付きます。

  pen_down();
  go_back(120);
  OnRev(OUT_AC);
  Wait(50);
  pen_up_slow();
  Off(OUT_AC);  //九画目

go_backで一度後進しているはずなのに、OnRevで再び後進する指示を出しています。それは、ペンの向きを微妙に変え、払う方向を少し平らにもってくる、という動作をさせるためです。本来なら指示は同じですので、何もずれることなく真っ直ぐ後進するはずです。

この現象はこのRIS特有なのかは定かではありませんが、同じ指示を繰り返すと少しですが一定の角度のずれが生じます。おそらく左右に指示を出す速さが異なるのではないのか、と考えています。このロボットの構造上、中心点がペン先とは異なるため、回転させて止め払いは出来ません。回転させると、左右どちらかにずれてしまうからです。本来欠点と思われる現象ですが、止め払いをする上で大変有用なものとなりました。

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS