課題:書道ロボット

NQCを用いたプログラムの方法とロボット制作を学ぶために ロボットによって漢字を書かせる。

課題の条件は、

(1)自分の名前および住所に含まれている漢字であること

(2)4角以上の漢字であること

(3)書き順通り書くこと

(4)きれいに書くこと!

目次

ロボットの制作

ロボットの制作工程の紹介

初期設計

メンバーで検討し、ロボットの基本的な構造を以下のように決めた。 ロボットが旋回したときにペンの位置が移動すると文字が書きにくいと考えられるので、ペンの位置をロボットの中心に持ってきた。安定した上下の運動が期待できるから、ペンの上下の機構はギアとラックを用いる。

車体の制作

車体.jpg

車体はローヴァーボットの車輪セットに手を加え、中心にペンが入るスペースを確保した。車体の構造は当初から変化はしなかった。

ギアの連結部の制作

ギアの構造.jpg PA0_0017.JPG ギアボックス図 左図の下側から撮影した写真

青いギア:歯数24(大)、オレンジギア:歯数16(中)、黄色ギア:歯数8(小)

ラックとペン部分を4か所で固定しているため安定性がある。 そのうち両側の2か所を回転させ上下させている。

ペンのラックへの固定

ペン固定図2.jpg

ペンを両側からラックで挟んでいる。2本のラックとペンは輪ゴムで固定している。ペンを挟むギアの間隔は変更できないので、ペンの種類とレゴの厚さで調節した。さらにペンの脇もレゴで挟んであるのでペンがぶれることは無い。しかし、ペンをおろす衝撃でペンが上にずれてしまうという問題が発生したので、ペンの上部にL字のレゴを取り付けて問題を解決した。

ギアとラックの接続

PA0_0018.JPG ギア固定断面図.jpg ギアとラックの固定図

ラックをギア側からレゴで挟んでいるのでぶれない。

RCXの固定

重心.jpg

RCX固定図 ペンの上下の機構も完成し、いざロボットを動かそうとしたときRCXをのせる場所がないことが判明。はじめはRCXをペンを上下させているモーターが乗っているのと反対側(前方)にのせたかったが場所がなく、やむをなくペンを上下させているモーター側(後方)上にのせたが当然バランスが悪くなり、ロボットが動き始めると後ろに転ぶようになってしまった。

PA0_0013.JPG

キャスター図 そこでRCXの下にキャスターをつけることで転ばないようにした。最初は大きめのタイヤをキャスターにしていたのでキャスターが邪魔をしてロボットがまっすぐ動かなくなってしまった。キャスターのタイヤを小さいものに変更することで問題は解決した。

完成

PA0_0024.JPG

当初の設計通りペンをロボットの中心に持ってくることに成功した。 さらにペンの上下も安定した稼働を実現した。 ロボットが転ばないようにするために付けたキャスターだったが、ロボットの走行時の揺れを防ぎ文字を奇麗に書くのにも役立った。

プログラムの制作

「江」

江の書き順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  
        
        
}         

苦労・工夫

右側のサンズイの部分の角度をつける作業が難しかった。サブルーチンを使わずプログラムを書いたため 同じプログラムの連続だったが、調整をかなり加えて突き出さない所などをこだわって行うことができた。

「社」試作型と完成版プログラムの比較

社の書き順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);
}                                         }

苦労・工夫

サブルーチンを使用しているため、プログラム本文が簡潔で問題の発見や変更が容易。当初サブルーチンを9つ使用していたが、エラーのメッセージによって8つまでしか使用できないことを知った。サブルーチンは必要最低限の7つに絞った。ロボット制作と並行して書いておいたプログラムだったが、完成したロボットをプログラムで動かすと、全く目的の漢字にならなかった。

「ロボットとプログラムの連動」

PA0_0031.JPG

初期のころに書いたもの。何が書いてあるのか読めない。この後、以下のような変更を加えた。

(1)キャスターを地面にしっかり設置させることでロボットの走行を安定させ文字が破線のようになるのを防いだ。

(2)1・2角目と6・7角目が重なるのを防ぐためにペンを上げ旋回する前に若干前進する動作を加えた。

(3)文字が斜めになるのを防ぐため旋回角度を見直した。

(4)2・3角目が離れすぎていたので、書き始める前に後退させる動作を加えた。

(5)1・2角目と6・7角目の互いの左右のバランスがおかしいので移動の数値を変更した。

完成漢字

「江」

071108_1843~010001.JPG.jpg

最後の方にペンがかすれたが、微調整を加えて完成した。

「社」

PA0_0025.JPG

ロボットとプログラムを連動させたことで、ようやく読める漢字になった。

感想・考察

ペンをロボットの中心に持ってくるという考えは良かったと思うが、結果的に旋回してもペンの位置がずれないようにはならず、プログラムで微調整する必要が発生したので、思ったようにはならない難しさを感じた。プログラムも実際に動かしてみると多くの問題があり、こちらも調整しなければならず、きれいな文字を書くまでにかなりの時間を必要とした。考えていたことがうまくいかず、逆に予期しなかったことがうまくいくということが、ロボット制作の面白さであると再認識した。

コメントをお願いします

  • 江の方も期待しています。 -- まいける(TA) 2007-11-07 (水) 19:04:32
  • 江も載せました。 -- 江の人? 2007-11-08 (木) 18:57:19
  • 図を使った詳細解説が解り安くて良いと思います。 -- クノ? 2007-11-13 (火) 19:51:17
  • 社の方の苦労・工夫の(1)〜(5)はwikiの箇条書きタグを使おう。江の方は、もう少し苦労工夫についてかけるのではないでしょうか。 -- まいける(TA) 2007-11-19 (月) 12:34:52


添付ファイル: file車体.jpg 229件 [詳細] file重心.jpg 240件 [詳細] fileペン固定図2.jpg 233件 [詳細] fileギア固定断面図.jpg 242件 [詳細] file江の書き順2.jpg 226件 [詳細] fileギアの構造.jpg 264件 [詳細] file071108_1843~010001.JPG.jpg 230件 [詳細] file071108_1843~01.JPG.jpg 117件 [詳細] file社の書き順2.jpg 213件 [詳細] filePA0_0024.JPG 244件 [詳細] filePA0_0022.JPG 111件 [詳細] filePA0_0013.JPG 229件 [詳細] filePA0_0018.JPG 250件 [詳細] filePA0_0015.JPG 118件 [詳細] filePA0_0031.JPG 218件 [詳細] filePA0_0025.JPG 238件 [詳細] filePA0_0017.JPG 231件 [詳細] filePA0_1020.JPG 121件 [詳細] filePA0_0020.JPG 120件 [詳細] filePA0_0021.JPG 116件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-05-22 (木) 16:16:53 (4104d)