課題1(書道ロボット)目次
#contents

* 課題 [#x2ec4f7e]

書道ロボットの製作。
詳細は[[課題のページ>2015a/Mission1]]を参照。

* 書道ロボットの概観 [#hc24607c]

3つのモーターを
-車体の前後方向移動 (モータA)
-アームによるペンの左右方向移動 (モータB)
-ペンの上下 (モータC)

に用いて、ペンで文字を書くロボットを製作した。

&ref(./mission1-01.jpg,nolink);
&ref(./mission1-02.jpg,nolink);

車体を前後に動かしながらラックギア(平たいギア)を
使用したアームを左右に動かすことで斜めの線も書くことができる。

移動するアームの左右でバランスをとるため、ペン固定Assyとペン上下モーターAssyを分離し、
アームの左右に配置、モーターの動力をチューブ(紫色)で伝達するようにした。

筆ペンを使用したおかげで味のある文字を書くことができる。

* 製作上の問題点と工夫した点 [#c1a6afdb]

** ゆっくりと動かす [#x24ad1c6]

あまり速く動くロボットだと調整が難しい。
そこでこのロボットでは本体の前後の動きもアームの左右の動きもかなり減速している。

*** 車体駆動部 (前後方向) [#redb9e92]

前後方向については、(8/24)×(8/40)=1/15 で2段の減速。

&ref(./mission1-03.jpg,nolink);
&ref(./mission1-04.jpg,nolink);

*** アーム部分 [#hddc0b72]

アームの移動は、一段(8/24=1/3)減速したものでラックギアを駆動。

&ref(./mission1-05.jpg);

** アームのバランスを保つ [#l8c285d8]

最初は、ペン固定部とペン上下モーターを同じ側につけていたのだが、
これだとアームの片方だけ重たくなり、アームが動いた時かなりバランスが悪くなってしまう。
そこで重心を車体の近くに取り安定させるため、ペン上下モータとペン固定部をアームの
反対側に配置した。
その結果、かなり遠い距離に駆動力を伝えなければならないという新たな問題が出てきたが、
これはチューブ(紫色のホース)を使うことで解決できた。

伝達にこのホースと軸の接続は力がかかりすぎると空回りするが、
モータ側の減速比やプーリの径を調節することで適度な力を伝達するクラッチのような役割を
果たすことができ、結果として味のある字になった。
また、ホースを使うことで正確にモータ軸の延長直線上になくても(多少曲がっていても)力を伝達できる簡易ユニバーサールジョイントとしても機能する。

&ref(./mission1-06.jpg,nolink);
&ref(./mission1-07.jpg,nolink);

アームを駆動するためのギアだけでアームを上から押えてもアームはグラグラするので、
写真のようにもう一つアーム押え用のギアを配置した。


** 適度な筆圧を得る [#aa707373]

下記の写真はペン上下モーターAssyである。写真の青いピンだけで脱着できる。

&ref(mission1-08.jpg,nolink);

筆の接地角度や固定方法は、いろいろ試した結果、現在のシンプルな形に落ち着いた。ペン接地後さらにモーターを回し続けても、ペンによって車体が持ち上がることなくプーリーが空回りするようにすることもできた。

筆を上げたところ
&ref(mission1-09.jpg,nolink);

筆を下げたところ
&ref(mission1-10.jpg,nolink);

//&ref(mission1-11.jpg,nolink);
//&ref(mission1-12.jpg,nolink);

** アームの移動幅を制限する [#n0309d1e]

アームが先端まで来たとき、アームと本体の部品が当たるようになっていて、
それ以上動かないようになっている。
しかしこのようにするとモータが回転しすぎた場合、
ロボットが壊れるかモータに負荷がかかりすぎてしまう。
そこでトルクギア(力がかかり過ぎると空回りする白い特殊なギア)をアーム駆動に使用することで、
この問題を解決した。

http://yakushi.shinshu-u.ac.jp/robotics-photo/2006a/2006-05-23/dscn2529_Small.jpg
中央の白いギアがトルクギア(クラッチギア)

** 分解と組み立てを容易にする [#y5a62e40]

特に筆の取り付け部など改良を重ねなければならない箇所は、
なるべく独立させて本体から容易に取り外しできるようにした。

http://yakushi.shinshu-u.ac.jp/robotics-photo/2006a/2006-05-23/dscn2530_Medium.jpg
http://yakushi.shinshu-u.ac.jp/robotics-photo/2006a/2006-05-23/dscn2531_Medium.jpg

写真のように簡単に分解できるので持ち運びの時も便利である。

http://yakushi.shinshu-u.ac.jp/robotics-photo/2006a/2006-05-23/dscn2532_Medium.jpg
http://yakushi.shinshu-u.ac.jp/robotics-photo/2006a/2006-05-23/dscn2536_Medium.jpg


** プログラムの保守性を高める [#ma99094c]

ペンの上下やペンの移動・移動量等をマクロ化し、
モーターA/B/Cや具体的なモーター回転時間を気にすることなくプログラムが書けるように工夫した。
そのおかげで、当初の「水木」だけでなく「達筆」を書くプログラムも容易に作成できた。

** その他 [#t960d277]

*** 動力伝達のための補強 [#xfe62e6c]

http://yakushi.shinshu-u.ac.jp/robotics-photo/2006a/2006-05-23/dscn2533_Small.jpg
ギアが浮かずに滑らかに回るように縦方向をビームで補強(反対側も補強してある)。

*** 筆の取り付け方法の工夫 [#w3a690da]

http://yakushi.shinshu-u.ac.jp/robotics-photo/2006a/2006-05-23/dscn2534_Small.jpg
すぐに外したり、角度を容易に調整できる。

* プログラム [#nb11fbc7]
** 「水木」を書くプログラム [#neb79952]

モータAとBを制御することで、横、縦、左払い、右払いなどの画をマクロとして定義した。
筆の上げ下げはモータCで行い、これは他モータと動きと独立している。
より達筆なロボットにするためには、筆の上げ下げと移動を連動させる必要があるが、これは今後の課題である。

 /* 各モータの役割     */
 /* 前進/後退 : OUT_A */
 /* アーム制御 : OUT_B */
 /* ペンの上下 : OUT_C */
 
 #define UNITTIME 13  // 単位時間を定義
 
 /* ペンの上げ下げのためマクロ定義 */
 #define pen_down_wait           OnFwd(OUT_C); Wait(100)
 #define pen_up                  OnRev(OUT_C)
 #define pen_up_wait             OnRev(OUT_C); Wait(100)
 
 /* 本体とアームを使って前後左右にペンを動かすためのマクロ定義 */
 
 #define move_left(t)            Off(OUT_A); OnRev(OUT_B); Wait(UNITTIME*t)
 #define move_right(t)           Off(OUT_A); OnFwd(OUT_B); Wait(UNITTIME*t)
 #define move_up(t)              OnRev(OUT_A); Off(OUT_B); Wait(UNITTIME*t)
 #define move_down(t)            OnFwd(OUT_A); Off(OUT_B); Wait(UNITTIME*t)
 #define move_leftup(t)          OnRev(OUT_A); OnRev(OUT_B); Wait(UNITTIME*t) // 左上がり
 #define move_leftdown(t)        OnFwd(OUT_A); OnRev(OUT_B); Wait(UNITTIME*t) // 左下がり
 #define move_rightup(t)         OnRev(OUT_A); OnFwd(OUT_B); Wait(UNITTIME*t) // 右上がり
 #define move_rightdown(t)       OnFwd(OUT_A); OnFwd(OUT_B); Wait(UNITTIME*t) // 右下がり
 #define move_left(t)            Off(OUT_A); OnRev(OUT_B); Wait(UNITTIME*t);
 #define move_right(t)           Off(OUT_A); OnFwd(OUT_B); Wait(UNITTIME*t);
 #define move_up(t)              OnRev(OUT_A); Off(OUT_B); Wait(UNITTIME*t);
 #define move_down(t)            OnFwd(OUT_A); Off(OUT_B); Wait(UNITTIME*t);
 #define move_leftup(t)          OnRev(OUT_A); OnRev(OUT_B); Wait(UNITTIME*t); // 左上がり
 #define move_leftdown(t)        OnFwd(OUT_A); OnRev(OUT_B); Wait(UNITTIME*t); // 左下がり
 #define move_rightup(t)         OnRev(OUT_A); OnFwd(OUT_B); Wait(UNITTIME*t); // 右上がり
 #define move_rightdown(t)       OnFwd(OUT_A); OnFwd(OUT_B); Wait(UNITTIME*t); // 右下がり
 
 #define move_wait(t)            Wait(UNITTIME*t)
 #define move_stop               Off(OUT_A); Off(OUT_B)
 #define move_wait(t)            Wait(UNITTIME*t);
 #define move_stop               Off(OUT_A); Off(OUT_B);
 
 #define move_left_stop(t)       Off(OUT_A); OnRev(OUT_B); Wait(UNITTIME*t); move_stop
 #define move_right_stop(t)      Off(OUT_A); OnFwd(OUT_B); Wait(UNITTIME*t); move_stop
 #define move_up_stop(t)         OnRev(OUT_A); Off(OUT_B); Wait(UNITTIME*t); move_stop
 #define move_down_stop(t)       OnFwd(OUT_A); Off(OUT_B); Wait(UNITTIME*t); move_stop
 #define move_leftup_stop(t)     OnRev(OUT_A); OnRev(OUT_B); Wait(UNITTIME*t); move_stop
 #define move_leftdown_stop(t)   OnFwd(OUT_A); OnRev(OUT_B); Wait(UNITTIME*t); move_stop
 #define move_rightup_stop(t)    OnRev(OUT_A); OnFwd(OUT_B); Wait(UNITTIME*t); move_stop
 #define move_rightdown_stop(t)  OnFwd(OUT_A); OnFwd(OUT_B); Wait(UNITTIME*t); move_stop
 
 
 task main()
 {
     SetPower(OUT_A,1);
     SetPower(OUT_B,7);
     SetPower(OUT_C,2);
     
     // 水 - 1画目
     pen_down_wait;
     move_down(10);
     pen_up;
     move_wait(1);
     move_leftup_stop(3);
     pen_up_wait;
     
     // 水 - 2画目
     move_leftup(1);
     move_up_stop(3);
     pen_down_wait;
     move_right_stop(3);
     pen_up;
     move_wait(1);
     move_leftdown_stop(3);
     pen_up_wait;
     
     // 水 - 3画目
     move_rightup(6);
     move_right_stop(1);
     pen_down_wait;
     pen_up;
     move_leftdown_stop(3);
     pen_up_wait;
     
     // 水 - 4画目
     pen_down_wait;
     move_rightdown(4);
     pen_up;
     move_wait(1);
     move_right_stop(2);
     pen_up_wait;
     
     // 移動
     move_leftdown(8);
     move_left_stop(2);
     
     // 木 - 1画目
     pen_down_wait;
     move_right_stop(8);
     pen_up;
     move_left_stop(1);
     pen_up_wait;
     
     // 木 - 2画目
     move_leftup(3);
     move_left_stop(1);
     pen_down_wait;
     move_down_stop(9);
     pen_up_wait;
     
     // 木 - 3画目
     move_up_stop(6);
     pen_down_wait;
     move_leftdown(2);
     pen_up;
     move_leftdown_stop(3);
     pen_up_wait;
     
     // 木 - 4画目
     move_rightup_stop(5);
     pen_down_wait;
     move_rightdown(3);
     pen_up;
     move_rightdown(2);
     move_right_stop(1);
     pen_up_wait;
     
     move_down(5);
     Off(OUT_ABC);
 }


* 書道ロボットによる作品 [#z5923b82]

** 作品写真 [#y6f9ee2e]
&ref(2006a/D7/課題1右/Suimoku.jpg,nolink, 「水木」);

** ロボットが書いているところの動画 [#g711a945]
&ref(2006a/D7/課題1右/Suimoku.mpg);

*未解決の問題 [#se52dca0]

-ラックギアを使用して直接アームを動かしているため、ラックギアの長さ以上の幅の字は書けない。
もっと長いアームを作成して現在のアームと(比例して)連動するようにすれば、
もっと大きな字を書くことができるだろう。
-車体を前後するスピードとアームを左右に動かすスピードがほぼ一定なので、
斜めの線を書く際に角度を調整するのが難しい。
縦横どちらかのモータのON・OFFを細かく繰り返してスピードを調節する(PWM)などの
プログラム上の工夫をすれば任意の角度の斜め線を書けるようになるだろう。
(現在でもSetPowerで全体のスピードは調整している)
-現在のプログラムではスタート時のアームの位置を手動で調整しなければならない。
ここはプログラムを改良して定位置からスタートし、定位置でストップするようにすべきであろう。

*今回の製作時間と費用 [#w8d8f70c]
-製作時間(授業時間含まず)
--ロボット製作…約4時間
--プログラム製作…約3時間
--ホームページ…約2時間
-費用
--筆ペン(ぺんてる筆・中字)…約400円。
--練習用紙…数十円
--単3乾電池…今回は最初に支給されたもので間に合ったので購入せず。

*まとめと反省 [#mff335f6]
-ペンの細かな制御、ペン先の乱れの対処等、問題点もたくさんありましたが、
逆に一つ一つの課題を精査することでよりロボット本体もプログラムもより洗練されたものになった。

2015年6月5日からのこのページのだいたいの訪問者数:
本日&counter(today);
昨日&counter(yesterday);
合計&counter(all);

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