【Scratch】chibi:bit(micro:bit)をゲームのコントローラーにする

chibi:bit(micro:bit)をScratchのコントローラーにする

chibi:bit(micro:bit)をScratch(Raspberry PiのScratch1.4)のコントローラーにするという公式サイトの作例にチャレンジしてみました。chibi:bitとScratchは直接やりとりできないので、間にPythonプログラミングを挟むことで実現しています

https://www.raspberrypi.org/learning/microbit-game-controller/

必要なハード

  • chibi:bit(micro:bit)
  • USBケーブル(USB-A と マイクロUSB-B) データ転送できるタイプ

chibi:bit(micro:bit)をScratchのコントローラーにする

ソフトウェアの準備

以下の2つをインストールします

  • mu(micro python editor)
  • Python Scratch library

まずパッケージリストを更新します

sudo apt-get update

muをインストール

chibi:bit向けのPython IDEのmuをインストールします

sudo apt-get install mu -y

Python Scratch library

Scratchと遠隔センサーで通信するためのPythonのライブラリーをインストールします

sudo pip3 install --pre scratch

chibi:bitが接続されているUSBポートを調べる

まずRaspberry Piにchibi:bitを接続していない状態で、以下のコマンドを実行します

ls /dev/ttyA*

次にchibi:bitをUSB接続した状態で同じコマンドを実行します

ls /dev/ttyA*

2回目の実行で、新たに追加されたものがchibi:bitのデバイスファイル名です
例)dev/ttyACM1

僕の環境では「dev/ttyACM0」でした
chibi:bit(micro:bit)をScratchのコントローラーにする

Pythonプログラムを実行する

メニュー –> プログラム –> Python 3(IDLE)を起動し、File -> New Fileを選んで新しいファイルを作成して、以下のコードを貼り付けて「rpi.py」という名前で保存します。(保存する場所はどこでもいいです)

import serial
from time import sleep
import scratch

scr = scratch.Scratch()
## THE NEXT LINE MIGHT NEED TO BE CHANGED - TYPE ls /dev/ttyA* into the terminal to see which port is needed.
PORT = "/dev/ttyACM1"
## 
BAUD = 115200

s = serial.Serial(PORT)
s.baudrate = BAUD
s.parity   = serial.PARITY_NONE
s.databits = serial.EIGHTBITS
s.stopbits = serial.STOPBITS_ONE

while True:
    data = s.readline().decode('UTF-8')
    data_list = data.rstrip().split(' ')
    try:
        x, y, z, a, b = data_list
        scr.sensorupdate({'x' : x})
        scr.sensorupdate({'y' : y})
        scr.sensorupdate({'z' : z})
        scr.sensorupdate({'a' : a})
        scr.sensorupdate({'b' : b})

    except:
        pass

s.close()

7行目の

PORT = "/dev/ttyACM1"

を先ほど調べたchibi:bitのデバイスファイル名に変更してください

このプログラムではchibi:bitからのデータを待ち続けて、受け取ったデータをScratchに渡す役目を果たします。プログラムの実行はもう少し後で行います

chibi:bitのプログラムを作成

次にchibi:bitのプログラムを作成します

メニュー –> プログラム –> muを起動し、エディタに以下のプログラムを貼り付けます

from microbit import *

def get_sensor_data():
    x, y, z = accelerometer.get_x(), accelerometer.get_y(), accelerometer.get_z()
    a, b = button_a.was_pressed(), button_b.was_pressed()
    print(x, y, z, a, b)

while True:
    sleep(100)
    get_sensor_data()

Flashボタンを押します

chibi:bit(micro:bit)をScratchのコントローラーにする

マウントされたchibi:bitを選んプログラムを書き込みます

chibi:bit(micro:bit)をScratchのコントローラーにする

最後にchibi:bitのリセットボタンを押せばchibi:bitの準備は完了です

Scratchの設定

Scratch 1.4を起動します。
「調べる」カテゴリにある「(スライダー)センサーの値」ブロックを右クリックして「遠隔センサー接続を有効にする」を選びます

chibi:bit(micro:bit)をScratchのコントローラーにする

Python IDEに戻って、先ほど作成したrpi.pyを実行します。Run –> Run ModuleかF5を押すと実行されます

「(スライダー)センサーの値」のメニューに「a、b、x、y、z」の値が追加されます

chibi:bit(micro:bit)をScratchのコントローラーにする

ブロックの左のチェックをクリックすれば、ステージに値が表示されます

chibi:bit(micro:bit)をScratchのコントローラーにする

ゲームを作成する

追いかけてくるUFOにぶつからないようにロケットをコントロールするゲームを作成します。Aボタンでミサイルを発射できるので、UFOを撃退することができます

素材を追加する

ロケット、ミサイル、UFOの画像からスプライトを作成します

chibi:bit(micro:bit)をScratchのコントローラーにする

chibi:bit(micro:bit)をScratchのコントローラーにする

chibi:bit(micro:bit)をScratchのコントローラーにする

ロケットとUFOはコスチュームの編集画面で90度回転させます

chibi:bit(micro:bit)をScratchのコントローラーにする

サイズを調整します。大きすぎるとすぐにぶつかるので小さめに

chibi:bit(micro:bit)をScratchのコントローラーにする

ロケットのプログラム

緑の旗が押されたら、Scoreを0にして「start」メッセージを送信します

chibi:bit(micro:bit)をScratchのコントローラーにする

ロケットの位置と方向の初期化をします。次に、xセンサーの値を元にロケットを回転させるループを作成します。xはだいたい-1000〜1000の数値なので、250で割って数値を小さくします

chibi:bit(micro:bit)をScratchのコントローラーにする

ここまで出来たら一度動作確認。chibi:bitを左右に動かすとロケットが回転すればOKです

次はyセンサー。こちらは-500で割ります

chibi:bit(micro:bit)をScratchのコントローラーにする

chibi:bitを前後左右に動かしてテストします。ちゃんとロケットが動けばOKです

UFOのプログラム

UFOはランダムな場所に登場して、ずっとロケットを追いかけるようにします

chibi:bit(micro:bit)をScratchのコントローラーにする

ミサイルに当たるとScoreをプラス、ロケットに当たるとゲーム終了です

chibi:bit(micro:bit)をScratchのコントローラーにする

ミサイルのプログラム

ミサイルはロケットと全く同じ動きをするようにします

chibi:bit(micro:bit)をScratchのコントローラーにする

Aボタンを押すとUFOに向けてミサイル発射、画面の端かUFOに当たるまで動かします

chibi:bit(micro:bit)をScratchのコントローラーにする

これで完成です!

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 – 継承 4.0 国際 ライセンスの下に提供されています。

[PR]
タイトルとURLをコピーしました