* 目次 [#le4cb517]
#contents
* 課題 [#e29025d0]
書道ロボットの製作(NXC:マインドストーム)
* ロボットの仕組み [#vc9c7a41]
3つのモーターを使い
- モーターAはペンの上げ下げ
- モーターBは右タイヤ
- モーターCは左タイヤ

を動かすようにつなげた

#ref(IMG_01391.jpg)
#ref(IMG_01401.jpg)

車体を前後に動かしたり、左右のタイヤを逆回転させることで、その場で曲がる。

ペンを上げ下げすることで、書き始めの位置をずらすことなく書くことができる。

* 問題点と工夫点 [#o7c6ee76]
** 速度 [#pf455a43]
速度が速いと調整が難しいとのことだったので、全体的に出力を30に統一し、ゆっくり動くようにした。

また、1回1回止まるようにし、1文字1文字丁寧に書くよう心掛けた。
** アーム [#ed8216bc]
#ref(unnamed21.jpg)
↑改善前

ペンを横方向に上げ下げすると、書き始めの位置がずれていたので、

ロボットの前方につけることで、ペンによる書き始めの位置のずれをなくした。

↓改善後
#ref(unnamed12.jpg)

** 旋回 [#t77b5f53]
摩擦で曲がる角度に違いが出ることが多かったため、後輪を車体から離したところにつけることで、
より摩擦を減らし曲がる角度の違いが減るようにした。

#ref(unnamed.jpg)
** ペンの取り付け方 [#p593bd5e]
上下を固定することで、ペンを下げた時、机にあたってずれたり、書いてる最中にずれないようにした。

#ref(unnamed123.jpg)

* プログラム [#qa3cfbe3]
** 『皓』を書くプログラム [#ae4e55b4]
「白」や「口」の部分など直角の多い字なので、モーターBとモーターCのタイヤをそれぞれ逆回転させる旋回で90度に回転するよう定義した。

ペンの位置と車体の位置が若干離れているため、ペンが車体の位置まで戻るよう前後に動く定義もした。

今回の定義では、電池残量によるロボットの出力の違いに対処しにくかったので、そこに対処できる定義作りが今後の課題である。

 #define penup OnFwd(OUT_A,30);Wait(150);Off(OUT_A);\
  Wait(1000);//ペンを上げる
 #define pendown OnRev(OUT_A,30);Wait(140);Off(OUT_A);\
  Wait(1000);//ペンを下げる
 #define back OnRev(OUT_BC,30);Wait(1300);Off(OUT_BC);\
  Wait(1200);//戻る
 #define tyokaku OnFwd(OUT_B,30);OnRev(OUT_C,30);\
  Wait(1200);Off(OUT_BC);Wait(1000);//90度旋回
 #define mae OnFwd(OUT_BC,30);Wait(1400);Off(OUT_BC);\
  Wait(1000);//進む
 #define ma_e OnFwd(OUT_BC,30);Wait(1350);Off(OUT_BC);\
  Wait(1300);//進む_その2
 #define tyo_kaku OnFwd(OUT_B,30);OnRev(OUT_C,30);\
  Wait(1300);Off(OUT_BC);Wait(1000);//90度旋回_その2
 task main()
 {
        OnFwd(OUT_BC,30);//1画目
        Wait(1500);
        Off(OUT_BC);
        Wait(1000);
        penup;
        mae;
        tyokaku;
        back;
        pendown;
        OnFwd(OUT_BC,30);//2画目
        Wait(500);
        Off(OUT_BC);
        Wait(1000);
        penup;
        mae;
        tyokaku;
        back;
        pendown;
        OnFwd(OUT_BC,30);//3画目
        Wait(1000);
        Off(OUT_BC);
        Wait(1000);
        penup;
        mae;
        tyokaku;
        back;
        pendown;
        OnFwd(OUT_BC,30);//4画目
        Wait(500);
        Off(OUT_BC);
        Wait(1000);
        penup;
        mae;
        tyokaku;
        OnFwd(OUT_BC,30);
        Wait(500);
        Off(OUT_BC);
        Wait(1000);
        OnFwd(OUT_B,30);
        OnRev(OUT_C,30);
        Wait(1200);
        Off(OUT_BC);
        Wait(1000);
        OnRev(OUT_BC,30);
        Wait(1400);
        Off(OUT_BC);
        Wait(1000);
        pendown;
        OnFwd(OUT_BC,30);//5画目
        Wait(1700);
        Off(OUT_BC);
        Wait(1000);
        penup;
        mae;
        tyokaku;
        OnFwd(OUT_BC,30);
        Wait(400);
        Off(OUT_BC);
        Wait(1000);
        OnFwd(OUT_B,30);
        OnRev(OUT_C,30);
        Wait(1200);
        Off(OUT_BC);
        Wait(1000);
        OnRev(OUT_BC,30);
        Wait(1200);
        Off(OUT_BC);
        Wait(1000);
        pendown;
        OnFwd(OUT_BC,30);//6画目
        Wait(600);
        Off(OUT_BC);
        Wait(1000);
        penup;
        mae;
        OnFwd(OUT_BC,30);
        Wait(300);
        Off(OUT_BC);
        Wait(1000);
        OnFwd(OUT_B,30);
        OnRev(OUT_C,30);
        Wait(500);
        Off(OUT_BC);
        Wait(1000);
        OnRev(OUT_BC,30);
        Wait(1200);
        Off(OUT_BC);
        Wait(1000);
        pendown;
        OnRev(OUT_BC,30);//7画目
        Wait(500);
        Off(OUT_BC);
        Wait(1000);
        penup;
        OnFwd(OUT_BC,30);
        Wait(1500);
        Off(OUT_BC);
        Wait(1000);
        OnFwd(OUT_C,30);
        OnRev(OUT_B,30);
        Wait(1800);
        Off(OUT_BC);
        Wait(1000);
        back;
        pendown;
        OnRev(OUT_BC,30);//8画目
        Wait(600);
        Off(OUT_BC);
        Wait(1000);
        penup;
        OnFwd(OUT_C,30);
        OnRev(OUT_B,30);
        Wait(2200);
        Off(OUT_BC);
        Wait(1000);
        back;
        OnFwd(OUT_BC,30);
        Wait(200);
        Off(OUT_BC);
        Wait(1000);
        OnFwd(OUT_C,30);
        OnRev(OUT_B,30);
        Wait(800);
        Off(OUT_BC);
        Wait(1000);
        OnRev(OUT_BC,30);
        Wait(2000);
        Off(OUT_BC);
        Wait(1000);
        pendown;
        OnFwd(OUT_BC,30);//9画目
        Wait(500);
        Off(OUT_BC);
        Wait(1000);
        penup;
        ma_e;
        tyo_kaku;
        back;
        pendown;
        OnFwd(OUT_BC,30);//10画目
        Wait(300);
        Off(OUT_BC);
        Wait(1000);
        penup;
        ma_e;
        tyo_kaku;
        back;
        pendown;
        OnFwd(OUT_BC,30);//11画目
        Wait(500);
        Off(OUT_BC);
        Wait(1000);
        penup;
        ma_e;
        tyo_kaku;
        back;
        pendown;
        OnFwd(OUT_BC,30);//12画目
        Wait(300);
        Off(OUT_BC);
        Wait(1000);
        penup;
  }

字を書いてるうちに若干ずれてくるので、「白」と「口」の直角や位置を直すための前進の秒数を変えた。
* 書いた字 [#ya86edf0]
** 完成品 [#df528811]
#ref(unnamed51.jpg)
** 書き順 [#z10ce3ba]
#ref(unnamed41.jpg)
* まとめ [#q12e6eee]
思ったようにロボットが動かない、思ったようなプログラムができない、班員がなかなか集まれず前日に作業することが多かったので、機械トラブルの対処で作業が進まなかったり等、問題点は最後までつきなかったが、1つ1つ直しながら作業していくことで、この授業を始める前よりは格段にプログラミングについての知識や経験を身に着けることができたように思う。
思ったようにロボットが動かない、思ったようなプログラムができない、班員がなかなか集まれず前日に作業することが多かったので、

機械トラブルの対処で作業が進まなかったり等、問題点は最後までつきなかったが、1つ1つ直しながら作業していくことで、

この授業を始める前よりは格段にプログラミングについての知識や経験を身に着けることができたように思う。


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