2007b/A2/課題1右
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*課題:書道ロボット [#gf55e4ae]
NQCを用いたプログラムの方法とロボット制作を学ぶために
ロボットによって漢字を書かせる。
課題の条件は、
~(1)自分の名前および住所に含まれている漢字であること
~(2)4角以上の漢字であること
~(3)書き順通り書くこと
~(4)きれいに書くこと!
**目次[#sbc06266]
#contents
*ロボットの制作[#k76753af]
ロボットの制作工程の紹介
**初期設計[#x109ef97]
メンバーで検討し、ロボットの基本的な構造を以下のように決めた。
ロボットが旋回したときにペンの位置が移動すると文字が書きにくいと考えられるので、ペンの位置をロボットの中心に持ってきた。安定した上下の運動が期待できるから、ペンの上下の機構はギアとラックを用いる。
**車体の制作[#f9c3df3d]
#ref(車体.jpg)
車体はローヴァーボットの車輪セットに手を加え、中心にペンが入るスペースを確保した。車体の構造は当初から変化はしなかった。
**ギアの連結部の制作[#ib52b49b]
&ref(ギアの構造.jpg); &ref(PA0_0017.JPG);
ギアボックス図 左図の下側から撮影した写真
青いギア:歯数24(大)、オレンジギア:歯数16(中)、黄色ギア:歯数8(小)
ラックとペン部分を4か所で固定しているため安定性がある。
そのうち両側の2か所を回転させ上下させている。
**ペンのラックへの固定 [#be438938]
&ref(ペン固定図2.jpg);
ペンを両側からラックで挟んでいる。2本のラックとペンは輪ゴムで固定している。ペンを挟むギアの間隔は変更できないので、ペンの種類とレゴの厚さで調節した。さらにペンの脇もレゴで挟んであるのでペンがぶれることは無い。しかし、ペンをおろす衝撃でペンが上にずれてしまうという問題が発生したので、ペンの上部にL字のレゴを取り付けて問題を解決した。
**ギアとラックの接続[#qe67c024]
&ref(PA0_0018.JPG,left); &ref(ギア固定断面図.jpg,right);
ギアとラックの固定図
ラックをギア側からレゴで挟んでいるのでぶれない。
**RCXの固定 [#n417f68d]
#ref(重心.jpg)
RCX固定図 ペンの上下の機構も完成し、いざロボットを動かそうとしたときRCXをのせる場所がないことが判明。はじめはRCXをペンを上下させているモーターが乗っているのと反対側(前方)にのせたかったが場所がなく、やむをなくペンを上下させているモーター側(後方)上にのせたが当然バランスが悪くなり、ロボットが動き始めると後ろに転ぶようになってしまった。
#ref(PA0_0013.JPG)
キャスター図 そこでRCXの下にキャスターをつけることで転ばないようにした。最初は大きめのタイヤをキャスターにしていたのでキャスターが邪魔をしてロボットがまっすぐ動かなくなってしまった。キャスターのタイヤを小さいものに変更することで問題は解決した。
**完成 [#v1daeeb4]
#ref(PA0_0024.JPG)
当初の設計通りペンをロボットの中心に持ってくることに成功した。
さらにペンの上下も安定した稼働を実現した。
ロボットが転ばないようにするために付けたキャスターだったが、ロボットの走行時の揺れを防ぎ文字を奇麗に書くのにも役立った。
*プログラムの制作 [#y8337dd8]
**「江」[#oc12f9db]
#ref(江の書き順2.jpg)
task main ( )
{
OnRev ( OUT_B ) ; Wait ( 10 ) ; // 1画目
Off ( OUT_B ) ; // B stop
OnFwd ( OUT_A+OUT_C ) ; Wait ( 30 ) ; // 前進
Off ( OUT_A+OUT_C ) ; // A and C stop
OnFwd( OUT_B ) ; Wait ( 10 ) ; // pen up
Off ( OUT_B ) ; // B stop
OnFwd ( OUT_A ) ; OnRev ( OUT_C ) ; Wait ( 80 ) ; // 90度 右に回転
OnFwd ( OUT_A+OUT_C ) ; Wait ( 30 ) ; // 前進
OnFwd ( OUT_A ) ; OnRev ( OUT_C ) ; Wait ( 80 ) ; // 90度 右に回転
OnFwd ( OUT_A+OUT_C ) ; Wait ( 5 ) ; // 前進
Off ( OUT_A+OUT_C ) ; // A and C stop
OnRev ( OUT_B ) ; Wait ( 10 ) ; // 2画目
Off ( OUT_B ) ; // B stop
OnRev ( OUT_A+OUT_C ) ; Wait ( 30 ) ; // 後退
Off ( OUT_A+OUT_C ) ; // A and C stop
OnFwd( OUT_B ) ; Wait ( 10 ) ; // pen up
Off ( OUT_B ) ; // B stop
OnFwd ( OUT_C ) ; OnRev ( OUT_A ) ; Wait ( 80 ) ; // 90度 左に回転
OnFwd ( OUT_A+OUT_C ) ; Wait ( 30 ) ; // 前進
OnFwd ( OUT_A ) ; OnRev ( OUT_C ) ; Wait ( 50 ) ; // 70度 右に回転
OnFwd ( OUT_A+OUT_C ) ; Wait ( 10 ) ; // 前進
Off ( OUT_A+OUT_C ) ; // A and C stop
OnRev ( OUT_B ) ; Wait ( 10 ) ; // 3画目
Off ( OUT_B ) ; // B stop
OnRev ( OUT_A+OUT_C ) ; Wait ( 30 ) ; // 後退
Off ( OUT_A+OUT_C ) ; // A and C stop
OnFwd( OUT_B ) ; Wait ( 10 ) ; // pen up
Off ( OUT_B ) ; // B stop
OnFwd ( OUT_C ) ; OnRev ( OUT_A ) ; Wait ( 50 ) ; // 70度 左に回転
OnRev ( OUT_A+OUT_C ) ; Wait ( 80 ) ; // 後退
OnFwd ( OUT_A ) ; OnRev ( OUT_C ) ; Wait ( 90 ) ; // 95度 右に回転
OnRev ( OUT_A+OUT_C ) ; Wait ( 10 ) ; // 後退
Off ( OUT_A+OUT_C ) ; // A and C stop
OnRev ( OUT_B ) ; Wait ( 10 ) ; // 4画目
Off ( OUT_B ) ; // B stop
OnRev ( OUT_A+OUT_C ) ; Wait ( 50 ) ; // 後退
Off ( OUT_A+OUT_C ) ; // A and C stop
OnFwd( OUT_B ) ; Wait ( 10 ) ; // pen up
Off ( OUT_B ) ; // B stop
OnFwd ( OUT_A+OUT_C ) ; Wait ( 30 ) ; // 前進
OnFwd ( OUT_A ) ; OnRev ( OUT_C ) ; Wait ( 85 ) ; // 92度 右に回転
Off ( OUT_A+OUT_C ) ; // A and C stop
OnRev ( OUT_A+OUT_C ) ; Wait ( 20 ) ; // 後退 ←突き出さないように調整
Off ( OUT_A+OUT_C ) ; // A and C stop
OnRev ( OUT_B ) ; Wait ( 10 ) ; // 5画目
Off ( OUT_B ) ; // B stop
OnRev ( OUT_A+OUT_C ) ; Wait ( 80 ) ; // 後退
Off ( OUT_A+OUT_C ) ; // A and C stop
OnFwd( OUT_B ) ; Wait ( 10 ) ; // pen up
Off ( OUT_B ) ; // B stop
OnFwd ( OUT_A+OUT_C ) ; Wait ( 10 ) ; // 前進 ←離れ過ぎなように調整
OnFwd ( OUT_C ) ; OnRev ( OUT_A ) ; Wait ( 90 ) ; // 90度 左に回転
OnFwd ( OUT_A+OUT_C ) ; Wait ( 20 ) ; // 前進
Off ( OUT_A+OUT_C ) ; // A and C stop
OnRev ( OUT_B ) ; Wait ( 10 ) ; // pen down 6画目
Off ( OUT_B ) ; // B stop
OnRev ( OUT_A+OUT_C ) ; Wait ( 100 ) ; // 後退
Off ( OUT_A+OUT_C ) ; // A and C stop
OnFwd( OUT_B ) ; Wait ( 10 ) ; // pen up
Off ( OUT_B ) ; // B stop
}
***苦労・工夫 [#wa413f42]
右側のサンズイの部分の角度をつける作業が難しかった。サブルーチンを使わずプログラムを書いたため
同じプログラムの連続だったが、調整をかなり加えて突き出さない所などをこだわって行うことができた。
**「社」試作型と完成版プログラムの比較 [#j678603e]
#ref(社の書き順2.jpg)
「社」の書き順を表した図(ロボットとの連動後) 下にある右側のプログラムでのロボットの動作を示す
↓当初制作したプログラム・・・・・・・・・・・・・・・・↓ロボットの動きと連動させたプログラム(詳しくは苦労と工夫を参照のこと)
#define TURN_TIME90 75 #define TURN_TIME90 80 //90°回転:調節し80に変更
#define TURN_TIME50 42 #define TURN_TIME50 42
#define TURN_TIME130 104 #define TURN_TIME130 145 //130°回転:調節し145に変更
sub turn_left90() //サブルーチンに変更はなし
{
OnRev(OUT_A); OnFwd(OUT_C); //左90°旋回
Wait(TURN_TIME90);
Off(OUT_A+OUT_C);
}
sub turn_right90()
{
OnFwd(OUT_A); OnRev(OUT_C); //右90°旋回
Wait(TURN_TIME90);
Off(OUT_A+OUT_C);
}
sub turn_left50()
{
OnRev(OUT_A); OnFwd(OUT_C); //左50°旋回
Wait(TURN_TIME50);
Off(OUT_A+OUT_C);
}
sub turn_right50()
{
OnFwd(OUT_A); OnRev(OUT_C); //右50°旋回
Wait(TURN_TIME50);
Off(OUT_A+OUT_C);
}
sub turn_left130()
{
OnRev(OUT_A); OnFwd(OUT_C); //左130°旋回
Wait(TURN_TIME130);
Off(OUT_A+OUT_C);
}
sub pen_up() //ペンを上げる
{
OnFwd(OUT_B);
Wait(10);
Off(OUT_B);
}
sub pen_down() //ペンを下げる
{
OnRev(OUT_B);
Wait(10);
Off(OUT_B);
}
task main() task main()
{ {
//1 //1 //1角目:最初のプログラムではペンを下した状態からスタート
OnRev(OUT_A+OUT_C); Wait(20); //冒頭に動きを加えることで、1角目からはっきり書けるようにした
Off(OUT_A+OUT_C);
pen_down();
OnFwd(OUT_A+OUT_C); Wait(36); OnFwd(OUT_A+OUT_C); Wait(36);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnFwd(OUT_A+OUT_C); Wait(15); //文字の重なりを解消
Off(OUT_A+OUT_C);
turn_right90(); turn_right90();
OnFwd(OUT_A+OUT_C); Wait(28); OnFwd(OUT_A+OUT_C); Wait(15); //1角目がバランスよく配置されるように変更
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_down(); pen_down();
//2 //2
OnRev(OUT_A+OUT_C); Wait(48); OnRev(OUT_A+OUT_C); Wait(55); //文字のバランスを調整
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnFwd(OUT_A+OUT_C); Wait(10); //文字の隙間を解消
Off(OUT_A+OUT_C);
turn_left50(); turn_left50();
OnRev(OUT_A+OUT_C); Wait(10); //文字の隙間を解消
Off(OUT_A+OUT_C);
pen_down(); pen_down();
OnFwd(OUT_A+OUT_C); Wait(84); OnFwd(OUT_A+OUT_C); Wait(84);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnRev(OUT_A+OUT_C); Wait(44); OnRev(OUT_A+OUT_C); Wait(44);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
turn_left50(); turn_left50();
OnRev(OUT_A+OUT_C); Wait(15); //文字の隙間を解消
Off(OUT_A+OUT_C);
pen_down(); pen_down();
//3 //3
OnFwd(OUT_A+OUT_C); Wait(84); OnFwd(OUT_A+OUT_C); Wait(84);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnRev(OUT_A+OUT_C); Wait(84); OnRev(OUT_A+OUT_C); Wait(80);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
turn_left50(); turn_left50();
pen_down(); pen_down();
//4 //4
OnFwd(OUT_A+OUT_C); Wait(44); OnFwd(OUT_A+OUT_C); Wait(44);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
turn_left130(); turn_left130();
OnFwd(OUT_A+OUT_C); Wait(48); OnFwd(OUT_A+OUT_C); Wait(20);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
turn_right90(); turn_right90();
OnRev(OUT_A+OUT_C); Wait(10); //ネと土の距離を近づけた
Off(OUT_A+OUT_C);
pen_down(); pen_down();
//5 //5
OnFwd(OUT_A+OUT_C); Wait(72); OnFwd(OUT_A+OUT_C); Wait(65);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnRev(OUT_A+OUT_C); Wait(30); //5〜6角目へバックして移動
Off(OUT_A+OUT_C);
turn_left90(); turn_right90();
OnFwd(OUT_A+OUT_C); Wait(48); //5〜6角目へ左90°旋回を3回行って移動
Off(OUT_A+OUT_C);
turn_left90();
OnFwd(OUT_A+OUT_C); Wait(36);
Off(OUT_A+OUT_C);
turn_left90();
OnRev(OUT_A+OUT_C); Wait(48);
Off(OUT_A+OUT_C);
pen_down(); pen_down();
//6 //6
OnFwd(OUT_A+OUT_C); Wait(132); OnFwd(OUT_A+OUT_C); Wait(100); //土の縦棒を縮小
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnFwd(OUT_A+OUT_C); Wait(8); //文字の重なりを解消
Off(OUT_A+OUT_C);
turn_right90(); turn_right90();
OnFwd(OUT_A+OUT_C); Wait(44); OnFwd(OUT_A+OUT_C); Wait(30); //文字のバランスを調整
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_down(); pen_down();
//7 //7
OnRev(OUT_A+OUT_C); Wait(84); OnRev(OUT_A+OUT_C); Wait(110); //土の下の横棒を延長
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnRev(OUT_A+OUT_C); Wait(50); OnRev(OUT_A+OUT_C); Wait(50); //ロボットが文字から退く
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
} }
***苦労・工夫 [#tbdecd58]
サブルーチンを使用しているため、プログラム本文が簡潔で問題の発見や変更が容易。当初サブルーチンを9つ使用していたが、エラーのメッセージによって8つまでしか使用できないことを知った。サブルーチンは必要最低限の7つに絞った。ロボット制作と並行して書いておいたプログラムだったが、完成したロボットをプログラムで動かすと、全く目的の漢字にならなかった。
「ロボットとプログラムの連動」
#ref(PA0_0031.JPG)
初期のころに書いたもの。何が書いてあるのか読めない。この後、以下のような変更を加えた。
~(1)キャスターを地面にしっかり設置させることでロボットの走行を安定させ文字が破線のようになるのを防いだ。
~(2)1・2角目と6・7角目が重なるのを防ぐためにペンを上げ旋回する前に若干前進する動作を加えた。
~(3)文字が斜めになるのを防ぐため旋回角度を見直した。
~(4)2・3角目が離れすぎていたので、書き始める前に後退させる動作を加えた。
~(5)1・2角目と6・7角目の互いの左右のバランスがおかしいので移動の数値を変更した。
*完成漢字 [#p4066d29]
「江」
#ref(071108_1843~010001.JPG.jpg)
最後の方にペンがかすれたが、微調整を加えて完成した。
「社」
#ref(PA0_0025.JPG)
ロボットとプログラムを連動させたことで、ようやく読める漢字になった。
*感想・考察[#e1c943a0]
ペンをロボットの中心に持ってくるという考えは良かったと思うが、結果的に旋回してもペンの位置がずれないようにはならず、プログラムで微調整する必要が発生したので、思ったようにはならない難しさを感じた。プログラムも実際に動かしてみると多くの問題があり、こちらも調整しなければならず、きれいな文字を書くまでにかなりの時間を必要とした。考えていたことがうまくいかず、逆に予期しなかったことがうまくいくということが、ロボット制作の面白さであると再認識した。
***コメントをお願いします[#k14d6428]
-江の方も期待しています。 -- [[まいける(TA)]] &new{2007-11-07 (水) 19:04:32};
-江も載せました。 -- [[江の人]] &new{2007-11-08 (木) 18:57:19};
-図を使った詳細解説が解り安くて良いと思います。 -- [[クノ]] &new{2007-11-13 (火) 19:51:17};
-社の方の苦労・工夫の(1)〜(5)はwikiの箇条書きタグを使おう。江の方は、もう少し苦労工夫についてかけるのではないでしょうか。 -- [[まいける(TA)]] &new{2007-11-19 (月) 12:34:52};
#comment
終了行:
*課題:書道ロボット [#gf55e4ae]
NQCを用いたプログラムの方法とロボット制作を学ぶために
ロボットによって漢字を書かせる。
課題の条件は、
~(1)自分の名前および住所に含まれている漢字であること
~(2)4角以上の漢字であること
~(3)書き順通り書くこと
~(4)きれいに書くこと!
**目次[#sbc06266]
#contents
*ロボットの制作[#k76753af]
ロボットの制作工程の紹介
**初期設計[#x109ef97]
メンバーで検討し、ロボットの基本的な構造を以下のように決めた。
ロボットが旋回したときにペンの位置が移動すると文字が書きにくいと考えられるので、ペンの位置をロボットの中心に持ってきた。安定した上下の運動が期待できるから、ペンの上下の機構はギアとラックを用いる。
**車体の制作[#f9c3df3d]
#ref(車体.jpg)
車体はローヴァーボットの車輪セットに手を加え、中心にペンが入るスペースを確保した。車体の構造は当初から変化はしなかった。
**ギアの連結部の制作[#ib52b49b]
&ref(ギアの構造.jpg); &ref(PA0_0017.JPG);
ギアボックス図 左図の下側から撮影した写真
青いギア:歯数24(大)、オレンジギア:歯数16(中)、黄色ギア:歯数8(小)
ラックとペン部分を4か所で固定しているため安定性がある。
そのうち両側の2か所を回転させ上下させている。
**ペンのラックへの固定 [#be438938]
&ref(ペン固定図2.jpg);
ペンを両側からラックで挟んでいる。2本のラックとペンは輪ゴムで固定している。ペンを挟むギアの間隔は変更できないので、ペンの種類とレゴの厚さで調節した。さらにペンの脇もレゴで挟んであるのでペンがぶれることは無い。しかし、ペンをおろす衝撃でペンが上にずれてしまうという問題が発生したので、ペンの上部にL字のレゴを取り付けて問題を解決した。
**ギアとラックの接続[#qe67c024]
&ref(PA0_0018.JPG,left); &ref(ギア固定断面図.jpg,right);
ギアとラックの固定図
ラックをギア側からレゴで挟んでいるのでぶれない。
**RCXの固定 [#n417f68d]
#ref(重心.jpg)
RCX固定図 ペンの上下の機構も完成し、いざロボットを動かそうとしたときRCXをのせる場所がないことが判明。はじめはRCXをペンを上下させているモーターが乗っているのと反対側(前方)にのせたかったが場所がなく、やむをなくペンを上下させているモーター側(後方)上にのせたが当然バランスが悪くなり、ロボットが動き始めると後ろに転ぶようになってしまった。
#ref(PA0_0013.JPG)
キャスター図 そこでRCXの下にキャスターをつけることで転ばないようにした。最初は大きめのタイヤをキャスターにしていたのでキャスターが邪魔をしてロボットがまっすぐ動かなくなってしまった。キャスターのタイヤを小さいものに変更することで問題は解決した。
**完成 [#v1daeeb4]
#ref(PA0_0024.JPG)
当初の設計通りペンをロボットの中心に持ってくることに成功した。
さらにペンの上下も安定した稼働を実現した。
ロボットが転ばないようにするために付けたキャスターだったが、ロボットの走行時の揺れを防ぎ文字を奇麗に書くのにも役立った。
*プログラムの制作 [#y8337dd8]
**「江」[#oc12f9db]
#ref(江の書き順2.jpg)
task main ( )
{
OnRev ( OUT_B ) ; Wait ( 10 ) ; // 1画目
Off ( OUT_B ) ; // B stop
OnFwd ( OUT_A+OUT_C ) ; Wait ( 30 ) ; // 前進
Off ( OUT_A+OUT_C ) ; // A and C stop
OnFwd( OUT_B ) ; Wait ( 10 ) ; // pen up
Off ( OUT_B ) ; // B stop
OnFwd ( OUT_A ) ; OnRev ( OUT_C ) ; Wait ( 80 ) ; // 90度 右に回転
OnFwd ( OUT_A+OUT_C ) ; Wait ( 30 ) ; // 前進
OnFwd ( OUT_A ) ; OnRev ( OUT_C ) ; Wait ( 80 ) ; // 90度 右に回転
OnFwd ( OUT_A+OUT_C ) ; Wait ( 5 ) ; // 前進
Off ( OUT_A+OUT_C ) ; // A and C stop
OnRev ( OUT_B ) ; Wait ( 10 ) ; // 2画目
Off ( OUT_B ) ; // B stop
OnRev ( OUT_A+OUT_C ) ; Wait ( 30 ) ; // 後退
Off ( OUT_A+OUT_C ) ; // A and C stop
OnFwd( OUT_B ) ; Wait ( 10 ) ; // pen up
Off ( OUT_B ) ; // B stop
OnFwd ( OUT_C ) ; OnRev ( OUT_A ) ; Wait ( 80 ) ; // 90度 左に回転
OnFwd ( OUT_A+OUT_C ) ; Wait ( 30 ) ; // 前進
OnFwd ( OUT_A ) ; OnRev ( OUT_C ) ; Wait ( 50 ) ; // 70度 右に回転
OnFwd ( OUT_A+OUT_C ) ; Wait ( 10 ) ; // 前進
Off ( OUT_A+OUT_C ) ; // A and C stop
OnRev ( OUT_B ) ; Wait ( 10 ) ; // 3画目
Off ( OUT_B ) ; // B stop
OnRev ( OUT_A+OUT_C ) ; Wait ( 30 ) ; // 後退
Off ( OUT_A+OUT_C ) ; // A and C stop
OnFwd( OUT_B ) ; Wait ( 10 ) ; // pen up
Off ( OUT_B ) ; // B stop
OnFwd ( OUT_C ) ; OnRev ( OUT_A ) ; Wait ( 50 ) ; // 70度 左に回転
OnRev ( OUT_A+OUT_C ) ; Wait ( 80 ) ; // 後退
OnFwd ( OUT_A ) ; OnRev ( OUT_C ) ; Wait ( 90 ) ; // 95度 右に回転
OnRev ( OUT_A+OUT_C ) ; Wait ( 10 ) ; // 後退
Off ( OUT_A+OUT_C ) ; // A and C stop
OnRev ( OUT_B ) ; Wait ( 10 ) ; // 4画目
Off ( OUT_B ) ; // B stop
OnRev ( OUT_A+OUT_C ) ; Wait ( 50 ) ; // 後退
Off ( OUT_A+OUT_C ) ; // A and C stop
OnFwd( OUT_B ) ; Wait ( 10 ) ; // pen up
Off ( OUT_B ) ; // B stop
OnFwd ( OUT_A+OUT_C ) ; Wait ( 30 ) ; // 前進
OnFwd ( OUT_A ) ; OnRev ( OUT_C ) ; Wait ( 85 ) ; // 92度 右に回転
Off ( OUT_A+OUT_C ) ; // A and C stop
OnRev ( OUT_A+OUT_C ) ; Wait ( 20 ) ; // 後退 ←突き出さないように調整
Off ( OUT_A+OUT_C ) ; // A and C stop
OnRev ( OUT_B ) ; Wait ( 10 ) ; // 5画目
Off ( OUT_B ) ; // B stop
OnRev ( OUT_A+OUT_C ) ; Wait ( 80 ) ; // 後退
Off ( OUT_A+OUT_C ) ; // A and C stop
OnFwd( OUT_B ) ; Wait ( 10 ) ; // pen up
Off ( OUT_B ) ; // B stop
OnFwd ( OUT_A+OUT_C ) ; Wait ( 10 ) ; // 前進 ←離れ過ぎなように調整
OnFwd ( OUT_C ) ; OnRev ( OUT_A ) ; Wait ( 90 ) ; // 90度 左に回転
OnFwd ( OUT_A+OUT_C ) ; Wait ( 20 ) ; // 前進
Off ( OUT_A+OUT_C ) ; // A and C stop
OnRev ( OUT_B ) ; Wait ( 10 ) ; // pen down 6画目
Off ( OUT_B ) ; // B stop
OnRev ( OUT_A+OUT_C ) ; Wait ( 100 ) ; // 後退
Off ( OUT_A+OUT_C ) ; // A and C stop
OnFwd( OUT_B ) ; Wait ( 10 ) ; // pen up
Off ( OUT_B ) ; // B stop
}
***苦労・工夫 [#wa413f42]
右側のサンズイの部分の角度をつける作業が難しかった。サブルーチンを使わずプログラムを書いたため
同じプログラムの連続だったが、調整をかなり加えて突き出さない所などをこだわって行うことができた。
**「社」試作型と完成版プログラムの比較 [#j678603e]
#ref(社の書き順2.jpg)
「社」の書き順を表した図(ロボットとの連動後) 下にある右側のプログラムでのロボットの動作を示す
↓当初制作したプログラム・・・・・・・・・・・・・・・・↓ロボットの動きと連動させたプログラム(詳しくは苦労と工夫を参照のこと)
#define TURN_TIME90 75 #define TURN_TIME90 80 //90°回転:調節し80に変更
#define TURN_TIME50 42 #define TURN_TIME50 42
#define TURN_TIME130 104 #define TURN_TIME130 145 //130°回転:調節し145に変更
sub turn_left90() //サブルーチンに変更はなし
{
OnRev(OUT_A); OnFwd(OUT_C); //左90°旋回
Wait(TURN_TIME90);
Off(OUT_A+OUT_C);
}
sub turn_right90()
{
OnFwd(OUT_A); OnRev(OUT_C); //右90°旋回
Wait(TURN_TIME90);
Off(OUT_A+OUT_C);
}
sub turn_left50()
{
OnRev(OUT_A); OnFwd(OUT_C); //左50°旋回
Wait(TURN_TIME50);
Off(OUT_A+OUT_C);
}
sub turn_right50()
{
OnFwd(OUT_A); OnRev(OUT_C); //右50°旋回
Wait(TURN_TIME50);
Off(OUT_A+OUT_C);
}
sub turn_left130()
{
OnRev(OUT_A); OnFwd(OUT_C); //左130°旋回
Wait(TURN_TIME130);
Off(OUT_A+OUT_C);
}
sub pen_up() //ペンを上げる
{
OnFwd(OUT_B);
Wait(10);
Off(OUT_B);
}
sub pen_down() //ペンを下げる
{
OnRev(OUT_B);
Wait(10);
Off(OUT_B);
}
task main() task main()
{ {
//1 //1 //1角目:最初のプログラムではペンを下した状態からスタート
OnRev(OUT_A+OUT_C); Wait(20); //冒頭に動きを加えることで、1角目からはっきり書けるようにした
Off(OUT_A+OUT_C);
pen_down();
OnFwd(OUT_A+OUT_C); Wait(36); OnFwd(OUT_A+OUT_C); Wait(36);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnFwd(OUT_A+OUT_C); Wait(15); //文字の重なりを解消
Off(OUT_A+OUT_C);
turn_right90(); turn_right90();
OnFwd(OUT_A+OUT_C); Wait(28); OnFwd(OUT_A+OUT_C); Wait(15); //1角目がバランスよく配置されるように変更
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_down(); pen_down();
//2 //2
OnRev(OUT_A+OUT_C); Wait(48); OnRev(OUT_A+OUT_C); Wait(55); //文字のバランスを調整
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnFwd(OUT_A+OUT_C); Wait(10); //文字の隙間を解消
Off(OUT_A+OUT_C);
turn_left50(); turn_left50();
OnRev(OUT_A+OUT_C); Wait(10); //文字の隙間を解消
Off(OUT_A+OUT_C);
pen_down(); pen_down();
OnFwd(OUT_A+OUT_C); Wait(84); OnFwd(OUT_A+OUT_C); Wait(84);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnRev(OUT_A+OUT_C); Wait(44); OnRev(OUT_A+OUT_C); Wait(44);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
turn_left50(); turn_left50();
OnRev(OUT_A+OUT_C); Wait(15); //文字の隙間を解消
Off(OUT_A+OUT_C);
pen_down(); pen_down();
//3 //3
OnFwd(OUT_A+OUT_C); Wait(84); OnFwd(OUT_A+OUT_C); Wait(84);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnRev(OUT_A+OUT_C); Wait(84); OnRev(OUT_A+OUT_C); Wait(80);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
turn_left50(); turn_left50();
pen_down(); pen_down();
//4 //4
OnFwd(OUT_A+OUT_C); Wait(44); OnFwd(OUT_A+OUT_C); Wait(44);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
turn_left130(); turn_left130();
OnFwd(OUT_A+OUT_C); Wait(48); OnFwd(OUT_A+OUT_C); Wait(20);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
turn_right90(); turn_right90();
OnRev(OUT_A+OUT_C); Wait(10); //ネと土の距離を近づけた
Off(OUT_A+OUT_C);
pen_down(); pen_down();
//5 //5
OnFwd(OUT_A+OUT_C); Wait(72); OnFwd(OUT_A+OUT_C); Wait(65);
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnRev(OUT_A+OUT_C); Wait(30); //5〜6角目へバックして移動
Off(OUT_A+OUT_C);
turn_left90(); turn_right90();
OnFwd(OUT_A+OUT_C); Wait(48); //5〜6角目へ左90°旋回を3回行って移動
Off(OUT_A+OUT_C);
turn_left90();
OnFwd(OUT_A+OUT_C); Wait(36);
Off(OUT_A+OUT_C);
turn_left90();
OnRev(OUT_A+OUT_C); Wait(48);
Off(OUT_A+OUT_C);
pen_down(); pen_down();
//6 //6
OnFwd(OUT_A+OUT_C); Wait(132); OnFwd(OUT_A+OUT_C); Wait(100); //土の縦棒を縮小
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnFwd(OUT_A+OUT_C); Wait(8); //文字の重なりを解消
Off(OUT_A+OUT_C);
turn_right90(); turn_right90();
OnFwd(OUT_A+OUT_C); Wait(44); OnFwd(OUT_A+OUT_C); Wait(30); //文字のバランスを調整
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_down(); pen_down();
//7 //7
OnRev(OUT_A+OUT_C); Wait(84); OnRev(OUT_A+OUT_C); Wait(110); //土の下の横棒を延長
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
pen_up(); pen_up();
OnRev(OUT_A+OUT_C); Wait(50); OnRev(OUT_A+OUT_C); Wait(50); //ロボットが文字から退く
Off(OUT_A+OUT_C); Off(OUT_A+OUT_C);
} }
***苦労・工夫 [#tbdecd58]
サブルーチンを使用しているため、プログラム本文が簡潔で問題の発見や変更が容易。当初サブルーチンを9つ使用していたが、エラーのメッセージによって8つまでしか使用できないことを知った。サブルーチンは必要最低限の7つに絞った。ロボット制作と並行して書いておいたプログラムだったが、完成したロボットをプログラムで動かすと、全く目的の漢字にならなかった。
「ロボットとプログラムの連動」
#ref(PA0_0031.JPG)
初期のころに書いたもの。何が書いてあるのか読めない。この後、以下のような変更を加えた。
~(1)キャスターを地面にしっかり設置させることでロボットの走行を安定させ文字が破線のようになるのを防いだ。
~(2)1・2角目と6・7角目が重なるのを防ぐためにペンを上げ旋回する前に若干前進する動作を加えた。
~(3)文字が斜めになるのを防ぐため旋回角度を見直した。
~(4)2・3角目が離れすぎていたので、書き始める前に後退させる動作を加えた。
~(5)1・2角目と6・7角目の互いの左右のバランスがおかしいので移動の数値を変更した。
*完成漢字 [#p4066d29]
「江」
#ref(071108_1843~010001.JPG.jpg)
最後の方にペンがかすれたが、微調整を加えて完成した。
「社」
#ref(PA0_0025.JPG)
ロボットとプログラムを連動させたことで、ようやく読める漢字になった。
*感想・考察[#e1c943a0]
ペンをロボットの中心に持ってくるという考えは良かったと思うが、結果的に旋回してもペンの位置がずれないようにはならず、プログラムで微調整する必要が発生したので、思ったようにはならない難しさを感じた。プログラムも実際に動かしてみると多くの問題があり、こちらも調整しなければならず、きれいな文字を書くまでにかなりの時間を必要とした。考えていたことがうまくいかず、逆に予期しなかったことがうまくいくということが、ロボット制作の面白さであると再認識した。
***コメントをお願いします[#k14d6428]
-江の方も期待しています。 -- [[まいける(TA)]] &new{2007-11-07 (水) 19:04:32};
-江も載せました。 -- [[江の人]] &new{2007-11-08 (木) 18:57:19};
-図を使った詳細解説が解り安くて良いと思います。 -- [[クノ]] &new{2007-11-13 (火) 19:51:17};
-社の方の苦労・工夫の(1)〜(5)はwikiの箇条書きタグを使おう。江の方は、もう少し苦労工夫についてかけるのではないでしょうか。 -- [[まいける(TA)]] &new{2007-11-19 (月) 12:34:52};
#comment
ページ名: