【Raspberry Pi】GPIOで操作するMinecraft Pi EditionをCoderDojo用に試してみた話

はじめに

こんにちは、がんがんです。
GW1日目にこちらの勉強会に参加してきました。
coderdojo-kagoshima.connpass.com


CoderDojoとは小学生や中学生向けに行われているプログラムの勉強会です。
今回はメンターとして参加してきました。


何か見せれるものがあったほうがいいかなと思って、GPIOからマイクラを操作してみました。
今回はそのときの備忘録です。

目的

  • GPIOとマイクラの接続を試す
  • タクトスイッチを押すとマイクラ上でブロックが表示される

実験

今回はRaspberry Piの特徴であるGPIOとMinecraft Pi Editionを接続できないかなと模索しました。
物理ボタンの作用が画面上に反映されたら、ちびっこの自分ならワクワクしますから。

内容としては以下の通りです。

  1. タクトスイッチを押す
  2. Minecraft上でブロックを置く
  3. LEDが光る

回路はこんな感じです。
f:id:gangannikki:20190516015042j:plain

STEP1 まずはスイッチを押したらLEDが光るようにする

Minecraftと接続する前に、まずはタクトスイッチを押したらLEDが光るようにします。
コードはGitHubにも挙げています。

#  coding: utf-8
#  =====  ボタンが押されたらLEDを点灯させる  =====
import RPi.GPIO as GPIO
import time as t

#  設定値
LED = 15
BUTTON = 18

#  ボタンを押したときの関数
def button_pushed(channel):
    print("Pushed!!")
    flag = GPIO.input(BUTTON)
    if flag:
        GPIO.output(LED, 1)
    else:
        GPIO.output(LED, 0)
    t.sleep(0.5)

GPIO.setmode(GPIO.BCM )
#  Ledの設定
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW )
#  Buttonの設定
GPIO.setup(BUTTON, GPIO.IN, pull_up_down=GPIO.PUD_DOWN )
GPIO.add_event_detect( BUTTON, GPIO.BOTH, callback = button_pushed,
bouncetime = 200 )

try:
    while True:
        print("Please push the button.")
        t.sleep(1 )

except KeyboardInterrupt:  #  Ctrl + Cの入力時
    print("STOP")
    GPIO.remove_event_detect( BUTTON )
    GPIO.cleanup()

STEP2 スイッチ押したらマイクラでブロックを置く

次にスイッチ押したらTNTブロックが画面上に現れLEDを光らせてみます。

コードの変更はbutton_pushed()関数のみです。
全体のコードはこちらにあります。

from mcpi.minecraft import Minecraft

#  ボタンを押したときの関数
def button_pushed(channel):
    print("Pushed!!")
    mc = Minecraft.create()
    mc.postToChat("Hello world")
    flag = GPIO.input(BUTTON)

    if flag:
        GPIO.output(LED, 1)
        x, y, z = mc.player.getPos()
        mc.setBlock( x+1, y, z+1, 46, 1)
        mc.setBlock( x+1, y+1, z+1, 50)
    else:
        GPIO.output(LED, 0)
    t.sleep(0.5)

画面の結果はこんな感じです。ちゃんと動いてますね。
f:id:gangannikki:20190516011807p:plain

まとめ

今回はGPIOとマイクラを接続してみました。
個人的には、スイッチを押すとマイクラ上のTNTが爆発するというものがやりたかったのですが
本家のようにレッドストーン回路とかも作成できず現状は手詰まりです。

今回はここまでにして、また今度気が向いた時にでもいろいろいじってみます。