小学生でもOK？Raspberry piでScratchにチャレンジしてみた。（Lチカ）

# 目的
2020年の教育改革で、小学生からプログラミング思考に関する教育が始まります。

プログラミングの言語を習得するというよりは、プログラミング的な論理思考を身に着けることを目的としており、PythonやC言語などといった言語の理解を促すものではありません。

本格的なプログラミング言語ではありませんが、小学生が実際にプログラミングを体験するための“Scratch”という学習ツールがあり、NHKでは”Why プログラミング”という番組まで放映されている人気のツールです。

小学生向けとはいえ、本格的にゲームが作れるため、中学生くらいになると驚くようなゲームを作成しているツワモノもいます。

この“Scratch”、実は以前よりRaspberry piにも搭載されており、GPIO端子操作しLEDを点滅させることなどできるようです。また、自作のライブラリを追加することができるようです。GPIOに接続したLEDやモーター等の操作ができるようになれば、小学生でも組み込みプログラミング体験できるかも？そう考えて、”Scratch”でどこまでできるのかを調査してみることにしました。

# “SCRATCH”とは？
米国マサチューセッツ工科大学（MIT）メディアラボが開発した、初心者向けプログラミング学習ツールです。無償で利用登録・開始することができます。

“Scratch”とはどういうものか？については、本家のサイトに詳しく説明されていますので、ここでは割愛します。
　　本家のサイト：https://scratch.mit.edu/about

# 準備
まず、Raspberry Piを準備します。
以下の順序で準備をしていきます。

## 必要機材の確認
・Raspberry pi本体
　Raspberry pi 3でも2でもよいと思いますが、念のため最新のRaspberry pi 3を準備します。Raspberry pi ZeroではCPUスペックが足らないかも。（試していないのでわかりませんが）
　本体ケースは必須ではありませんが、誇りやゴミをある程度ブロックできますので準備することをお勧めします。

・Micro SDカード 
　Raspberry pi起動ディスクとして使用します。 16GB以上のものを推奨します。

・USBマウス、USBキーボード
　Raspberry piへの入力デバイスとして使用します。

・HDMI入力ディスプレイ（リビングのテレビでOK）
　Raspberry piからの出力画面を表示します。

・HDMIケーブル
　HDMI入力ディスプレイとRaspberry piとを接続します。

・Raspberry pi用電源
　USBケーブルでPCに接続して、PCからの電源供給でも構いませんが、その場合PCが必要になるので電源を準備することをお勧めします。

必要物の全体図は以下のようになります。

<img width="300" alt="Raspi_1_small.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/2c0d77ab-3035-997b-2547-012e2a50785d.jpeg">

## RASPBERRY PI 用SDカードの書き込み、SDカード装着、電源投入から立ち上げまで
準備したSDカードに、Raspberry pi起動用データを書き込みます。
WEBサイトから最新の起動用データをダウンロードして書き込みます。

書き込む方法、SDカードや各種ハードウェアの装着、そして電源投入から立ち上げまでについては、いろいろなWEBサイトで解説されています。
ここでは（きちんと解説し切る自信がないので）、割愛します。すみません。


起動完了すると。左上にあるメニューを左クリックしてみてください。
”Programing”メニュー内に”Scratch”が入っているのがわかります。

<img width="300" alt="Setup5.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/e5b4f68c-d845-5211-b881-9812f0835b1e.jpeg">
 
#SCRATCHを動かす 
##SCRATCH起動
2019年7月現在、Raspberry piにはScratch1.4とScratch2.0がインストールされていますが、ハードウェア操作にはScratch1.4が向いているようです。

Scratch1.4：GPIO端子操作可能、その他超音波センサ用クラス等、拡張性が高い。https://www.raspberrypi.org/documentation/usage/gpio/scratch1/README.md

Scratch 2.0：GPIOをLEDとボタンとして操作するなら簡単だが拡張性低い。https://www.raspberrypi.org/documentation/usage/gpio/scratch2/README.md

したがって、ここでは、Scratch1.4を使用することにします。
メニューから、Scratchを起動してください。

<img width="300" alt="scratch13_1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/2e37f863-4586-2a8b-5143-6eb7a71c2b50.jpeg">

Scratchが起動します。

<img width="300" alt="Scratch-1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/c5a58f5a-e510-6b5b-d21f-ac2d89925f24.jpeg">

##言語を にほんご にする。（注：日本語ではなく、にほんご　にしてみました。）
表示言語について、“日本語“だけでなく”にほんご“が選択できます。これなら小学校低学年でもよめちゃいます。

<img width="300" alt="Scratch-2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/6b42eb41-3646-1a5d-0a37-0d917648ca14.jpeg">

<img width="300" alt="Scratch-3.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/b1b03255-b0e6-d01c-5c74-1039bd9fe37c.jpeg">


こうなりました。

<img width="300" alt="Scratch-4.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/0165c4d7-1b3c-e1c1-1b22-3e8605512b2a.jpeg">

かわいい。

##SCRATCH実行
手始めに、右横の猫を動かしてみましょう。
まず、 “スクリプト“エリアに、左からブロックを引っ張ってきて並べます。
<img width="300" alt="Scritp_1_1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/e222853f-388a-48c6-d535-c775fb0a18f8.jpeg">

右上の旗をクリックすると、猫が動きます。

<img width="150" alt="Script1_2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/b1427709-faba-4bc7-4a40-c3c4d8e028cc.jpeg">


ここまでできたところで、一旦Scratchを終了し、Raspberry piをシャットダウンします。Scratch終了時に、作成したスクリプトに名前を付けてRaspberry pi内フォルダに保存することができます。
Raspberry piのシャットダウン時、必ずメニューから“Shutdown”を実行した後、電源を切ってください。Raspberry pi本体のLED点滅が終了すれば電源を切っても構いません。


# GPIO端子操作 – LED点滅
## LED接続
まず、どのGPIOが操作できるのか調べましょう。以下WEBサイトに記載されています。
https://www.raspberrypi.org/documentation/usage/gpio/

このサイトから画像を引用させて頂きます。
<img width="370" alt="pinout.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/4675b900-45f8-1b9a-80f3-256a0452760b.jpeg">

Raspberry pi 2と記載されていますが、Raspberry pi 3でも同様です。

黄色い〇がGPIO端子を示しており、〇の中の番号がGPIO端子番号を示しています。Scratchのスクリプト内では、この番号をGPIO端子の名前として使います。

では、試しに、GPIO4にLEDと抵抗を接続します。

LEDの接続用回路は以下WEBサイトの絵を参考にしてください。抵抗はLEDのアノード側でもカソード側でも構いません。
https://www.raspberrypi.org/documentation/usage/gpio/scratch1/README.md

LEDのアノード側（長い方）をGPIO4に、カソード側（短い方）をGroundに接続します。

接続した時の写真は以下のようになりました。

<img width="370" alt="LED1.JPG]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/4c633041-9a2b-9407-3c65-918dbe76310e.jpeg">


## スクリプト作成
LEDが接続できれば、Raspberry piの電源を入れ、Scratchを起動します。

まず、GPIO端子の操作を有効にする必要があります。
“へんしゅう”メニューから、“GPIOサーバをかいし”を選択してください。

<img width="200" alt="1.JPG]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/1e4683dd-c7db-818f-2b94-db4ca60f7188.jpeg">

ここから、GPIOを操作するブロックをつなげていきます。
“せいぎょ”カテゴリーから、“「」をおくる”を選択します。
このブロックは、英語で言うところのBroadcastで、すべてにこのメッセージが配信されます。
<img width="200" alt="2.JPG]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/62e8558e-33c8-6c85-7288-435b9085a8b6.jpeg">

次に、送るメッセージを記入します。
今回、GPIO番号４からLEDに対しonを出力しますので、まず、“出力“できるよう端子を設定する必要があります。この設定のため、“config4out“をメッセージとして送る必要があります。

また、“出力“できるよう端子を設定した後、実際にhighを出力するには、”gpio4high”メッセージを配信します。GPIO端子の電圧レベルをHighにするということです。
同様に”gpio4low”メッセージを配信するためのブロックも準備します。

<img width="200" alt="4.JPG]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/8b64c761-8403-4e57-b943-5c74ada4c190.jpeg">

それでは、これらの制御ブロックをつなげてみます。

GPIO端子の制御の間は、1秒間待つ操作を入れています。こうすることによって、LEDが光っている時間、消えている時間を1秒間にすることができます。
<img width="200" alt="5.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/025255db-d8f6-8d9f-51ae-6a95ccf4524b.jpeg">

このスクリプトを実行すると、LEDが点滅を繰り返します。
<img width="300" alt="6.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/37fa12e8-a9f7-9432-2c02-dee2d17af686.jpeg">
<img width="300" alt="7.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/5b06fd4f-9f84-e43a-1abb-609f6750178c.jpeg">

すごい！すごいです！ひらがなでLチカができてしまいました！