人の役に立つしくみを作ろう

7.もっと便利に!

もっと便利な「しくみ」を作ってみよう!


Challenge.1
もし、 人感センサが人を検知した なら、 振動モーターを動かす

・IN2に人感センサをつなげます
・OUT5に振動モーターをつなげます。
人の動きを検知したら、振動モーターをブルブルさせます。
たとえば、人感センサを自分の後ろに向けておき、振動モータを手で握っていれば、こっそり近づいてくる人がわかりますね。

10 ?IN(2)
20 IF IN(2)=0 LED0:OUT5,0
30 IF IN(2)=1 LED1:OUT5,1
40 WAIT10
50 GOTO10


Challenge.2
もし、 人感センサが人を検知した なら、 LEDを点ける
 そのとき、もし、 暗い なら、 警報(音声)を鳴らす

暗いときに人(不審者?)を検知したら警報が鳴るしくみです。
「もし」の条件が二つ組み合わさります。
 一つは、人を検知したときにLEDが光る状態です。人が居なければLEDは消します。これは、明るさに関係なく動作させます。
 もう一つは、人を検知したときに暗ければ、LEDを光らせて、警報(音声)を鳴らします。

10 ?IN(1),ANA(2)
20 OUT5,0:LED0
30 IF IN(1)=1 LED1
40 IF ANA(2)>300 GOTO10
50 IF IN(1)=0 GOTO10
60 ?”フシンシャ、ハッケン!”
70 OUT5,0:OUT5,1
80 IF BTN()=1 GOTO10
90 WAIT60:GOTO60


・IN1に人感センサー、IN2に光センサを接続します
・OUT5に音声録音再生ボードを接続します
10行目 人感センサと光センサの値を表示する
20行目 警報を止めて、LEDを消す
30行目 もし、人がいるなら、LEDを点ける
40行目 もし、明るいなら、10行目に行く(警報は必要ないので、以後の処理も実行しない)
     300は明るさによって値を調整します
50行目 人がいないなら、10行目に行く
60行目 人がいるので、「不審者発見!」を表示する
70行目 警報(音声再生)を鳴らす
80行目 もし、タクトスイッチが押されたなら、10行目に行く
90行目 60行目に行く(警報を繰り返す)


Challenge.3
もし、 人感センサが人を検知した なら、 せんぷう機を回す
 また、
もし、 人がいない時間が5分以上 なら、 せんぷう機を止める

電気を効率よくつかうためのしくみです。
これも、「もし」の条件が二つ組み合わさります。
 まず、人を検知して最初にせんぷう機を回すときは、1回だけBEEP音を鳴らしましょう。これがスタートの合図です。
 つぎに、人が居なくなってからの経過時間を測りますが、これにはTICK命令を使用します。
この命令は、IchigoJamの電源を入れたときか、CLT命令を実行したときに、0から1/60秒ごとに1づつ値を増やしていく動きをします。
したがって、1秒で60、1分で3600(60×60)になるので、5分の18000(60×60×5)を過ぎるまで、人のいない状態が続けば、せんぷう機を止めればよいのです。
 この間にもし人を検知すれば、経過時間をCLT命令で0に戻せばよいのです。

 WAIT18000だけでもIchigoJamは5分待ちますが、待っている間は、人を検知することができません。
実際に試してみると、うまく動かないことがわかるでしょう。

10 LED0:OUT5,0
20 IF IN(2)=0 GOTO20
30 BEEP
40 LED1:OUT5,1
50 IF IN(2)=1 GOTO50
60 CLT:LED0
70 IF IN(2)=1 GOTO40
80 IF TICK()<60*60*5 GOTO70
90 BEEP20,120
100 WAIT120
110 GOTO10


・IN2に人感センサーをつなぎます
・OUT5にせんぷう機をつなぎます
10行目 LEDを消して、せんぷう機を止める
20行目 もし、人がいなければ待つ(人を検知していない間、20行目を繰り返す。せんぷう機も止めている状態)
30行目 BEEPを鳴らす(人を検知した合図)
40行目 LED を点けて、せんぷう機を回す
50行目 もし、人がいれば待つ(人を検知している間、50行目を繰り返す)
60行目 経過時間をゼロに初期化して、LEDを消す(せんぷう機は止めない)
70行目 もし、人がいれば、40行目に行く
80行目 もし、時間経過が5分より小さいなら、70行目に行く
90行目~110行目
   人を検知しない時間が5分を超えたので、低く長いBEEP音を鳴らして、10行目にいく(せんぷう機を止める)


Challenge.4
ボリュームセンサの変化に応じて、せんぷう機の回転速度を4段階に変える
もし、 ボリューム値が100未満 なら、 停止 する
もし、 ボリューム値が100以上400未満 なら、 低速回転 する
もし、 ボリューム値が400以上800未満 なら、 中速回転 する
もし、 ボリューム値が800以上 なら、 高速回転 する

IN2にボリュームセンサ、OUT5にせんぷう機をつなげます。
モータの回転速度をボリュームで制御するしくみです。
この場合の「もし」の条件は複数ありますが、いずれかの条件に合ったときだけ、処理をするように考えなければなりません。

 ボリュームはアナログ値では、0から1023まで変化します。これを4段階にわけて、それぞれの範囲内のときに、指定の回転数を出力するようにします。
IF命令の最後にある、GOTO命令が重要なことに気付いてください。

10 A=ANA(2)
20 ?”ANA(2)=”;A,”PWM5,”;
30 IF A<100 PWM5,0 :?0:GOTO70
40 IF A<400 PWM5,1000:?1000:GOTO70
50 IF A<800 PWM5,1400:?1400:GOTO70
60 PWM5,2000:?2000
70 WAIT10
80 GOTO10


Challenge.5
ボリュームセンサの変化に応じて、せんぷう機の回転速度を無段階に変える
もし、 ボリューム値が300以下 なら、 停止 する
もし、 ボリューム値が300以上 なら、 
         低値に応じて低速から高速まで回転 する

IN2にボリュームセンサ、OUT5にせんぷう機をつなげます。
モータの回転速度をボリュームで無段階に制御します。
 ボリュームの値である300から1023の範囲を、PWMの回転数に合うように計算します。
IF命令は、せんぷう機を止めるか、回すかの判断だけおこないます。

10 A=ANA(2)
20 ?”ANA(2)=”;A,”PWM5,”;
30 IF A<=300 PWM5,0: ?0
40 IF A<400 PWM5,A*2-50: ?A*2-50
70 WAIT10
80 GOTO10


Challenge.6
反射神経ゲーム(反応スピード測定)
もし、 LEDが光ったときにボタンが押された なら、
         反応速度を計算して表示 する
もし、 LEDが光っていないのにボタンが押された なら、 
         フライングなので、エラー表示 する

IN2にボタンセンサかタッチセンサを付けます。
 LEDが光るタイミングを乱数(RND命令)で作ります。
今回は、1000分の1の確立にしました。
WAITの値を乱数で決める方法もありますが、それではフライング(不正)をIchigoJamが検知することができません。
 反応速度はTICK命令で測定します。

10 ?”ボタンハヤオシ2 by NEXTDAY2020
20 G=0:LED0:WAIT120
30 IF RND(1000)=0 LED1:G=1:CLT
40 IF IN(2)=0 GOTO30
50 IF G=0 BEEP50.-1:?”フライング”:END
60 T=TICK()
70 BEEP2
80 ? “ハンノウソクド=”T/60;”.”;T%60;”ビョウ!”


Challenge.7
反射神経ゲーム2
もし、 LEDが光ったときにボタンかタッチが押された なら、
         どちらが早いか(勝ちか)表示 する
もし、 LEDが光っていないのに押された なら、 
         フライングなので、負けた方を表示 する

IN2にボタンセンサ、IN1にタッチセンサを付けます。
どちらが早く押したか、競争するプログラムです。

10 ?”ボタンハヤオシ2 by NEXTDAY2020
20 G=0:LED0:WAIT120
30 IF RND(1000)=0 LED1:G=1:CLT
40 A=IN(1):B=IN(2)
50 IF A=0 AND B=0 GOTO30
60 IF G=1 AND A=1 ?”IN1ノカチ”
70 IF G=1 AND B=1 ?”IN2ノカチ”
80 IF G=0 AND A=1 ?”IN1ノマケ(フライング)”
90 IF G=0 AND B=1 ?”IN2ノマケ(フライング)”

100 T=TICK()
110 ? “ハンノウソクド=”T/60;”.”;T%60;”ビョウ!”
120 IF G=1 BEEP2 ELSE BEEP90,50


Challenge.8
人数カウンター(入室した人数を数える)
もし、 タッチセンサがタッチされた なら、
         入室した人数を+1して表示 する

IN2にタッチセンサを付けます。
 条件はひとつなのですが、タッチして離すところまでを、1つの処理として考えなければうまく動きません。
 つまり、タッチされていなければ待つ、タッチしていれば待つという、2つの条件が必要です。

10 G=0
20 IF IN(2)=0 GOTO20
30 BEEP
40 G=G+1
50 ?G
60 IF IN(2)=1 GOTO60
70 GOTO20


Challenge.9
人数カウンター(入退室した人数を数える)
もし、 タッチセンサがタッチされた なら、
         部屋の人数を+1して表示 する
もし、 ボタンセンサが押された なら、
         部屋の人数を-1して表示 する

IN2にタッチセンサ、IN1にボタンセンサを付けます。
 部屋に入るときはタッチセンサ、出るときはボタンセンサを押すルールにして、部屋に出入りした人数をカウントします。
部屋に誰もいない(0人)ときに、ボタンセンサを押したときは、エラー音を鳴らします。

20 G=0
30 IF IN(1)=0 AND IN(2)=0 GOTO30
40 IF IN(1)=1 C=1 :GOTO40
50 IF IN(2)=1 C=-1:GOTO50
60 G=G+C
70 IF G<0 BEEP50,60:G=0 :GOTO100
80 IF G>=0 AND C=1 BEEP :GOTO100
90 IF G>=0 AND C=-1 BEEP20:GOTO100
100 ?G,C
110 GOTO30


Challenge.10
IDカードをもっている人だけ鍵を開ける(LEDを点ける)
もし、 IDカードを3秒間検知した なら、
              BEEPを1秒間鳴らす
もし、 BEEPを鳴らしている間にIDカードを抜いた なら、
              鍵を開ける(LEDを点ける)

IN2にカードセンサを付けます。鍵の代わりにIchigoJam基板のLEDを使います。
鍵を開けるには、カードを検知させてBEEPが鳴っている間にカードを抜く必要があります。
したがって、BEEPが鳴る前にIDカードを抜いたり、BEEPが鳴り終わってもIDカードが検知なら、鍵は開けません。

10 LED0:BEEP0
20 IF IN(2)=0 GOTO20
30 WAIT180
40 IF IN(2)!=1 GOTO10
50 BEEP20,-1
60 WAIT60
70 IF IN(2)=1 GOTO10
80 LED1:BEEP
90 WAIT120
100 GOTO10



この教材は「Creative Commons — CC BY-SA 4.0」の下に提供されています。