2文字以上のものを選び、かつ合計10画以上のものを選び、それをA4の紙に書くロボットを製作せよという課題であった。私たちは令和という時代に住んでいるので「令和」にした。(地区名という条件忘れてました。することができる機体に上下させることができるアームを取り付けただけの非常にシンプルなロボットである。speed_sp=500)のように時間とスピードを入力する。時間3000,スピード500と言われてもどれだけ進むか分らないので調べてみた。今後、スピードは500で統一してプログラムしていく。実験の結果、時間300で75cm前進することが分かった。同様に回転についても実験した結果、744と入力すると360°回転することが分かった。写真の通り、機体の回転の中心はタイヤにあるため、回転中心がペンと離れている。(図では回転中心を赤ダイヤで表現した。)この機体で「口」の2辺を書くことを考える。「口」の2辺を書くためには、�直線を引く�90°時計回りに回転する。いう手順で書くことが出来ると考えるかもしれない。図のように、回転中心とペンが離れているため2直線が1点で交わらず、書くことが出来ない。正しく書くにはどうしたらよいか。回転中心とペンの距離だけ余計に動かす必要がある。�直線を引く�回転中心とペンの距離だけ前進する�90°回転する�回転中心とペンの距離だけ後進する。�直線を引くこれで2直線が1点で交わる事ができた。このようにペンを中心に回転させるときは回転の前後に前進後進させる必要がある。実験をしていく中で反時計回りの回転がこの機体は苦手だということが分かった。同じ値を入力して回転させても角度がバラバラになってしまう。時計回りの回転ではこのような事が起こらず毎回入力した値までしっかり回ってくれた。このことから文字を書くときは極力時計回りで回転させるようにした。実験では距離の測定に手持ちの定規を使ったり、角度の測定にタイルに合わせて目分量で測ったりしており正確性には欠ける。よってプログラムして機体を動かすときには入力する値は細かく微調整してより文字に見えるようにしていった。最初私は同じ値を入力すれば、前進も後進も同じ距離進むと思い込んでいた。文字を書かせてから気づいたのだが、同じ値でも後進の方が前進より長く進むことが分かった。そのため、前進して同じ距離後進させるプログラムでも前進後進で違う値が入力されている。短い距離だけ後進させようとするとその距離分だけ後進せずほとんど動かないことも分かった。そのため、後進はある程度長い距離動かすときのみ使用した。†”不具合”で述べた事を意識しながら書きやすくなる書き順を決めた。書き始めは図の位置からとする。令の6画目が下から上へ書くようになっているのは正に”不具合”で述べた「反時計回りに極力回らない」を意識した結果である。6画目を上から下へ書くようにするには4,5の道を後戻りするように進む。すると図のように反時計回りに回転してしまうところが出てしまう。90°反時計回りに回るところを270°、もしくは450°時計回りに回転させることも出来るが回転させる角度が大きくなるほど字を書く時間も延びてしまい動作も不安定になる。6画目を下から上に書くようにすれば90°時計回り2回と180°時計回り1回で書くことができ、動作を安定させ、書く時間も短くすることが出来る。禾が令和の中で最も難易度が高かった。難易度を上げている所が「2辺のはらいを一点で交わらせる」�「はらいを縦線に合わせる」�である。正しい書き順の通りに書くと�は解決できる。�が達成できそうにない。図の状態からはらいの2辺目の書き始めに移動する方法はないことはないのだがとんでもなく複雑な動きを重ねる事になってしまう。はらいを令の1,2画目のように書くことによって�は解決することが出来る。これは図のように縦線を先に書くかはらいを先に書くかの2パターンが考えられる。�を達成するためにはどちらが良いのだろうか。�を達成させるためには曲がる角度や進む距離を微調整しなくてはならない。その微調整するべきポイントは少ない方が簡単で良い。2つのパターンで微調整するべきポイントを見てみる。左は図のように距離2つ角度1つ微調整するべきポイントがある。それに対し、右は距離1つしかない。はらいを縦線に合せるより縦線をはらいに合わせるほうが簡単である事が分かる。反時計回り回転をしないと言う点から考えても縦線は下から上に書く方が良い。禾の横線2本ははらい、縦線の後に書いている。禾の横線1本目だけバックしながら書いているがこれは”不具合”で述べたようにこの機体に短い距離だけバックさせようとするとほとんど動かない為である。始めにev3dev用に書かれたpythonライブラリやsleep関数などを導入する。MediumMotor("outC")mLは左側の車輪を動かすモーター、mRは右側の車輪を動かすモーター、mCはペンを上げ下げさせるアームのモーターを表している。様々な関数を定義する。動作の直後にsleepを入れ、動きを止めることで動作を安定させている。今回は止める時間を2秒で統一した。penupで、ペンを上げ、pendownでペンを下げる。下げる角度を大きくしすぎるとペンが紙に引っかかり動かなくなるので気をつける。sleep(2)run_by_mm(mm)で進みたい距離まで前進させる。”実験”で得た結果をここで利用している。sleep(2)turnRでペンが回転中心になるように時計回りに回転、turnLで反時計回りに回転する。(position_sp)に回転したい角度を入力するとそれだけ回転する。前進後進関数と同じように”実験”の結果をここで利用している。”回転について”で述べたように回転の前後に前進後退が入っている。”不具合”で述べたようにturnLは今回は2回しか用いていない。run_back_mm(115)機体をそのまま反時計回りに回転する。実際に動かすプログラムを載せる。pendownの横にある#�は一画目の書き始めを表す。penupでその画の書き終わりを表す。#�run_by_mm(95)penup()「令」の書き終わりから「和」を書き始めるポジションへ移動させる。run_by_mm(155)tturn(175)turnR(90)run_back_mm(40)run_by_mm(140)turnR(130)「和」の禾を書く。最後に「口」を書き始めるポジションに移動するためtturnとrun_back_mmを入れている。#�run_by_mm(90)penup()tturn(175)run_back_mm(200)最後に「和」の「口」を書く。線を書き、90°回転させる。これを4回繰り返せばよいのでfor文でループさせる。4本線を書いてから90°回転させる意味はないので今回は3回ループさせる。以上のプログラムで書いた「令和」がこれである。下の写真は「令」の3画目と4画目の距離を短くしすぎてしまった場合である。それ以外は上のコードと何一つ変わらないのだがこっちの方が「令和」っぽく見える気がする。†このロボットはペンと機体が同時に動いてしまうので曲線どころか折り曲がりさえも上手くかけなかった。難しかったのは3辺以上が一点で交わる所、つまり「令」の5画目(プログラムでは6画目)と「和」の禾である。禾の4,5画目(プログラムでは7,8画目)の部分が難しかった。本来の書き順通り3画目の縦線を書いてから、4,5画目を書こうとしたがそこの始点が縦線に全く合わない。そこで4,5画目を始めに書いてしまい、その始点に縦線を突き刺すようにして書くことで「禾」に近づける事ができた。(実際始点と縦線を合わせることは出来なかったが。)人文字、一パーツなら上手く書けてもそれをまとめて書こうとすると上手くいかくなるのも苦労した。「口」を書くプログラムもそれ単体で実行するとわりときれいな四角形になったのだが全体で通すとずれてしまった。(原因がいまいち分からなかった。EV3のモーターの問題?reset()メソッドを入れなかったから?それらの原因を突き止め、修正したかったが時間が無かった。)ただプログラムするだけでは上手くいかないロボットの難しさを感じる事ができた。機体が止まるときに慣性力が働いて後輪が浮いてしまった。それが原因で書き終わりが乱れたり、少し傾きがずれてしまい、思った通りに字が書けなくなったと考えられる。後ろに重りかなにかをつけると慣性力で浮き上がることは無くなると思われる。そもそも動かすスピードが速すぎた。速く動く、それだけでロボットは安定しない。スピードを500で統一したのも特に深い理由は無かった。スピードを落とすべきだった。するともう一度実験し直す必要があり、これまで決めた値も全て無駄になってしまいそうするだけの時間も残っていなかった。始めに書き始めるポジションを人の感覚で決めていた。始めに置いた角度で文字の形が大きく変わってしまう気がする。「紙の何センチ下から何度傾けて置いてスタートする」といった事を始めに決めておくべきだった。