Scratch x RaspberryPi で子供たちに身近なもののしくみを教える

# 自己紹介
- 初めまして、3人の子の母をしています、自称おばさんエンジニアです。
- 普段は保険会社のSEとして働いていますが、高校の教員免許（数学・情報）を隠し持っています。
- 好きな技術はSeleniumです。（今日はSelenium関係ありません）
- アドベントカレンダーには初参加です。よろしくお願いします。

# 何をするのか
- Scratch x RaspberryPiで身近なものを作ってみます
    - トイレの水を流すアレ（TOTO社のカタログより）
    
     <img width="30%" alt="トイレのアレ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74969/e9c10c26-50a1-d1ae-9208-9088621ebf1f.png"/>

- 技術的には難しいことはなくn番煎じな内容です。

## Scratchってなんぞや
- https://scratch.mit.edu/
- 日本語（ひらがな）でプログラミングができます
    - ひらがなが読めればプログラミングできます。始めるハードルが低いです。
- 基本的には、スプライト（デフォルトはネコですが、他のものも使えます）と呼ばれるオブジェクトに対して、見た目を変えたり移動させたりと、動きをプログラミングしていきます。
- 作ったものを公開して他の人に遊んでもらうことができます。
- Remix（他の人の作品を流用して、アレンジすること）ができます。
    - アレンジしたらクレジット書こうね、公開するならわかりやすいような説明を書こうね、というようなリテラシ教育もできます。
- **個人的には、子供用Githubだと思っています。**

# なぜするのか
- 子供達（3人）に身近なものの仕組みを考える機会を与えたい。
    - いつも使ってるScratchとセンサーを組み合わせられるんだよ、と興味の幅を広げたい。
    - 子供達3人とも、Scratchのオレンジのネコさんにはお世話になっているので、馴染みやすいのです。

# どのようにするのか？
- 具体的には、RaspberryPiのセンサを使って、Scratch(on RaspberryPi)でプログラミングします。
- 人感センサが反応したら、Scratchのネコが流される仕様とします。
![スクリーンショット 2020-11-27 15.44.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74969/08169b04-543b-a39e-cb0d-91567bdfe818.png)

## RaspberryPiの初期設定
読んでる方はご存知の方が多いとは思いますが一応書きます。

- 持っているラズパイ（RaspberryPi3、2017年購入）のOSが古かったので、入れ直しました。
    - [2020年8月20日リリースのDesktop版（with recommended softwareじゃない方）](https://www.raspberrypi.org/software/operating-systems/)を入れました。
    - [ApplePiBaker](https://www.tweaking4all.com/software/macosx-software/macosx-apple-pi-baker/)を使って、SDカードに入れています。
    - [SSH接続と、Wifi接続ができるよう設定](https://dev.classmethod.jp/articles/raspberrypi-remote-connect/)をしました。

## Scratch3 on RaspberyPiの環境整備
- Scratch3（オフライン版）をRaspberryPiにインストールします。
    - RaspberryPiの、「設定」→「RecommendedSoftware」→「Scratch3」でインストールします。
    - [こちらのサイト](https://buralog.jp/raspberry-pi-scratch3-install/)が参考になります
    　
- GPIO拡張
    - Scratch3を起動して左下の＋ボタンから、拡張モジュールの画面を表示し、「Raspberry Pi GPIO」を選択すると、左のバーにラズパイのマークと「Raspberry Pi GPIO」が現れます。
    ![Slide 6 of 無題のプレゼンテーション (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74969/075bd05c-9209-aaa2-5f95-566f89c1471e.png)



## RaspberryPi（ハード）側の準備
- 材料
    - RaspberryPi3
    - ケーブル数本
    - ブレッドボード
    - [人感センサー](http://www.umek.topaz.ne.jp/mameduino/pir_howto/)
    
- 接続（シンプルです！）
    - GPIOピン（４番を使用）に人感センサーの出力
    - ５V電源ピン
    - Groundピン 
    ![Slide 2 of 無題のプレゼンテーション (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74969/1d42f9f7-f5dc-dde1-cff6-6e64f101db77.png)
    - GPIOピンの配置や電源・Groundピンは[こちらのサイト](http://igarashi-systems.com/sample/translation/raspberry-pi/usage/gpio.html)を参考にしています。
    - ブレッドボードの使い方は[このサイト](https://denshi-kousaku.nazotoki-k.com/kiso/eic-801.htm)を参考にしています。
 
## Scratchでプログラミング
### GPIOピン(4)の出力に合わせて猫が流されるようプログラミング
 ![Slide 5 of 無題のプレゼンテーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74969/dca5b590-4b02-428e-8226-51a98bf887ff.png)

- 左側のバーの「Raspberry Pi GPIO」とラズパイマークが表示されている部分をクリックすると、GPIO用のScratchブロックが出てきて、プログラムを書くのに使えます。
- ここでは、４番GPIOピンの出力を分岐用のブロックの条件に入れることで分岐しています。
 （水のスプライトもネコのスプライトと同じようにmoveを受け取ったときに流すプログラムを作っています）

### 詳細
- ネコのスプライト
    - 「コスチューム」のタブから、通常のネコと、流されて焦ってるネコのコスチュームを2種類用意します。
    - 「move」イベントを受け取った時、「initialize」イベントを受け取った時の処理を書きます
        - moveイベント
            - 見た目を、焦ったコスチュームにして、右端の座標まで流します
        - initializeイベント
            - 見た目を通常に戻して、元の座標に戻します
- 雲のスプライト
    - 「コスチューム」のタブから色を変えて、複製して水っぽく変更します
    - 「move」イベントを受け取った時、「initialize」イベントを受け取った時の処理を書きます
        - moveイベント
            - スプライトを表示し、右端の座標まで流します
        - initializeイベント
            - スプライトを非表示にし、元の座標に戻します
- （どのスプライト・背景に書いてもいい）
    - 緑フラッグを押した場合の処理を書きます（いわゆるmain文です）
        - 4番ピンの情報を取得
        - 4番ピンの電圧と、現在の状態(changeflg、ダメな変数名の典型。ずっと近くにいるときに流され続けないように状態を持っておく※後述)による分岐
        - 上記により、move(流す）と、initialize(元の位置に戻す)を呼び分ける



※再掲。上記プログラミングで下記のような感じで流されてくれます。

![スクリーンショット 2020-11-27 15.44.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74969/08169b04-543b-a39e-cb0d-91567bdfe818.png)

# なにがわかったか

## ハマったところ
- 常時、近くにいると反応
    - 最初は、３メートル以内に8秒居たら反応する設定になっていましたが、どちらも目的に対して長すぎたため、調整しました。
- ネコがずっと流される
    - ラズパイの近くで作業してたので、ずっと「近くにいる」という反応をして、ネコが延々と流されるので、「近くにいる」⇄「遠くにいる」の、状態変化が起きたときに猫を流すようにプログラミングしました。（changeflg変数を用意して使用）
    
## 子供達の反応
- 長女(9)
    - 人感センサーが何に反応するかパソコンに近づけてみたり窓に近づけてみたり派生実験を行っていました。
    - ネコのスプライトをう○こに変えて欲しいとの要望を挙げてきました。小学生は好きですね。小学生に教える時のつかみにはそちらの方がいいかもしれないです。
- 長男(7)
    - 何度も何度もくり返しネコを流して面白がる。
- 次男(3)
    - センサーの基盤を直に触りそうになって慌てて母が止める。

## 他に作れそうなもののアイデア
- 人感センサ
    - 自動ドア
    - CD持ったまま通り抜けようとするとピーっていうやつ
- LED、光センサ
    - コンセントに刺しておいて、暗くなったら光るやつ
- 光センサ、人感センサ
    - 夜暗い中光る玄関ポスト付近のアレ
    
## 感想
- 特に長女(9)に対して、狙った効果が得られたように思います。新しいもの(RaspberryPi)に興味を持ったみたいです。
- 今回は私がScratchのプログラムを作成しましたが、子供達に作らせる方がよりイメージがわきそうです。
    - 「ハマったところ」と書いたものを、子供達に体験させて工夫させたいです。
    - センサーだからこそのハマりどころも多そう。

# 結論
- Scratch x RaspberryPiで、気軽にセンサーを使ったプログラミングができました。
    - トイレのアレ、などのイメージも、実際のものを用意しなくても、気軽にScratchのアニメーションの動きでイメージを伝えることができました。

# おわりに
- 2020年度から、小学校でプログラミング教育が必修化されました。
- 論理的思考能力を鍛えるため、など言われることがありますが、個人的には、プログラミングを学んで欲しいというよりも、下記のようなことを期待する毎日です。
    - プログラミングというツールを使って、自分の興味があるものを気軽に作ってみる
    - 作ったものの見せ合って興味の幅を広げる
    - 人に説明して同じことに興味がある・高めあえる仲間を見つける
- RaspberryPiもScratchも、（私が）子供達に学ばせたいことを実現できる素晴らしいツールだと思います！