先日、夏ごろに告知させていただいた、僕たちPCNが主催する「PCNこどもプログラミングコンテスト2017夏」の表彰式を開催しました。全国の小中学生から100を超えるプログラミング作品の応募をいただき、その中から、最優秀賞、優秀賞、各協賛賞を発表・表彰するというイベントです。回を重ねる事に多くの作品があつまる嬉しさとともに、常に新しい子どもたちのアイデアに出会えるのは本当に楽しいです。
最優秀賞
優秀賞
その他各賞・協賛賞に輝いた作品など、詳細はコンテストページに公開していますので、ぜひ確認して創作活動のヒントにしてください!
さて。前回までで、距離センサーをpaprikaに接続して固定することができました。今回は、距離センサーを使って、paprikaに新しい動きをさせてみようと思います。
正面にものがあったらストップする
距離センサー=paprikaの目がついたので、paprikaの正面に物体があったら、動作を止める動きをさせてみましょう。
プログラムを作っている最中は、試しに入れたコマンドが働いて、思わぬ動きをすることがあります。それに備えるために、このように小さな箱の上にのせて試してみると良いと思います(写真の箱は、中に重しが入っています。不安定にならないように気をつけましょう)。
ANA(2) という命令を使うと、距離センサーの前に物体がどれだけの距離にあるかの値が得られましたね。40行目ではそれを使い 「40 IF ANA(2) > 600 OUT 0: GOTO 40」として「もしANA(2)の値が 600よりも大きかったら、OUT 0(モーターの動きをストップ)して、もう一度40行にいけ」という指示をしています。
使っている距離センサーは、物体が近づくほど大きな値を返します。物を近づけてみてモーターがストップする、また距離を離すと前進を始める…という動きが確認できれば完成です。もし、物体がぶつかるぐらいの距離で動きが止まるようであれば、 40行目の 600 という数字を、もう少し小さく(500とか)にして、再度確認してみてください。
うまくいったらSAVE0をして自動起動の準備。IchigoJamの電源をOFFにして、キーボードとディスプレイを外して、paprikaを床におろしましょう。
IchigoJam上の ボタンを押しながら電源をいれれば、先程SAVE0したプログラムが動作します。床で走らせて、壁の前まできたら"ピタリ"と止まりましたか?
正面にものがあったら避ける
動作を止められるなら、避けてくれたら、もっと広範囲に移動できるはず。止まる動作に避ける動作も加えて、paprikaがずーっと動き続けられるようなプログラムを作ってみましょう。
先程のプログラムを、少し改良して、物体があったら、後退して避ける動きを追加しました。
一つ目のポイントは20と40行目。20行目で、ANA(2)の値を変数Aに代入して保管します。これは過去の値として使います。そして40行目で、変数A(過去の距離)とANA(2)(今の距離)がいずれも600よりも大きい場合に、後退する動きを行うという点です。
次のような可能性を若干考慮した動きにしました。
・paprikaの足回りはキャタピラで、床にも凸凹があったりして、たまたま600を超える値が入る
・モーターを接続しているため、そこからノイズ入力が入る可能性がある
言いかえると、30行目の1/12秒(= WAIT 5) 待つ「前」と「後で」のどちらでも600を超える値がとれているのであれば、センサー入力は正しいと判断する用にしました。
次に、新しい命令 「GOSUB~RETURN」を使って、後退する動作をプログラムしています。
40行目の後半から読むと、GOSUB 100命令が最後にあります。そこから100行目にジャンプし、処理を行って RETURN命令がでてきたら、呼び出したところにブーメランのように戻ってくれる。これがGOSUB命令です。
':' (コロン)を使えば、GOSUBを使わなくても同じような処理を書くこともできますが、こちらの方が、人には優しい表現になりますね。
さあ、プログラムができたら、また paprikaを床におろして動かしてみましょう。今度は、壁があったら後退して避けてから、また前進を行います。四角い壁に囲まれた部屋であれば、ずーっと動作を続けてくれそうですね。
これで、paprikaの目を使ったプログラミングは完成です! センサーの位置をかえたり、センサー値の使い方を逆にしてみたり(物体が近づいたら前進する)、プログラムを工夫して楽しく遊んでみてください。
挑戦してみよう
今回作った paprika プログラム「前に物体があったら前進を止める」を改造して、「前に物体があったら前進する」に変更してみましょう。ちょっとした変更だけど、楽しい動きをしますよ。
まとめ
・接続した距離センサーの値はANA(2)で取得することができる
・距離センサーの値に応じて動作をかえるにはIFを使う
・GOSUB~RETURNをつかうと、少し複雑な処理をおこなって元の場所にもどることができる
挑戦してみよう(第12回の答え)
以前作ったpaprikaプログラム「三三七拍子のダンス」を、「四四八拍子のダンス」に変更してみましょう。数字を変える、もしくは記号を変えるなど、いくつか実現方法がありますよ。
最初の三拍と、後の七拍とで、わけて考えます。三拍は、22行目、32行目の二箇所で表現していて、次のように変更すればOKです。3回回していたFOR文を4回に変更。
22 FOR A, 1 TO 4 ※(元はTO 3 )
21 FOR B, 1 TO 4 ※(元はTO 3)
七拍は、51行目で表現しています。先ほどと違うのは単純に、数字7がない点。でも前回の説明を読み返すと、変数Cは、200, 180, 160, 140, 120, 100, 80…と変化します。80まではOKで、60となった段階で繰り返しをやめているので、最終到達値を -20 してやりましょう。
51 FOR C, 200 TO 41 STEP -20 ※(元は TO 61 )
著者紹介
原 秀一(はら ひでかず)
サーバー・ネットワークが得意なWebシステム系のITプロフェッショナル。福井工業高等専門学校 電子情報工学科、福井大学 情報工学科を卒業。学生時代はプログラミングから逃げ腰だったが、クラウド時代になり35歳から本格的にプログラミングを再開。IchigoJam等を用いたプログラミングを広める団体PCN(プログラミング クラブ ネットワーク)を友人と共に主宰し、主にアフリカ担当としても活動中。