Image

BLE Nanoを使ったマインクラフトの松明リモート制御

2016/08/25 17:16:00
ニャンパスでは普段、ウェブサービスやスマートフォンアプリ開発をやりつつ、コワーキングスペースHaLakeを越谷市レイクタウンにて運営していることから、IoT勉強会開催や、小学生へプログラミングを教えたりしてます。
プログラミング教室では、最近マインクラフトをつかってComputerCraftというModを導入し、遊んでもらってるんですが、何かマインクラフトでもIoT的なことをやりたいというところから、Amazonで売っていたマイクラの松明を改造してみましたのでその共有です。
改造に利用したのはこちらの松明。


この松明を改造している様子は、下記の様な感じで、写真に写っているニャンパス社員の河野くんがこの辺ガッツリ対応いただきました。






意外と一番苦労したのは松明を空けるところで、松明の中身がどのように組んであるかが分からず当たりをつけてカッターで切ってみるという方法を取りました。
開けてみての構造は、写真を見ていただくと分かりますが、LEDのある頭部は金属のフレームで囲まれていますので、側面の接着剤のある部分を繰り返して切れ目を入れていけくことで空けることが出来ました。側面同士をつないでいるツメも切ることになり、この辺はどれくらい真似される方がいるか分かりませんが自己責任でお願いします。

BLE Nano自体のプログラムはmbedを使うと、そのサンプルとして
SampleControls works with the BLEController iOS/Android Appというプロジェクトの雛形から始めると参考になります。
このプロジェクトではすでに、BLEの読み書きそれぞれのプロファイルが用意されていますので、この挙動を今回の場合は、以下のように変更しました。

  • 電源が入ったかどうか分かるよう、起動時に0.5秒、松明を点滅させる

    起動時以下のコードで点灯させています。
    PWM = 1.0;
    wait_ms(500);
    PWM = 0.0;

  • BLEとしてPWMの値を受け取り、以下のコードで松明のLEDを制御

    サンプルコード自体がPWMのデータ受信を行っていますので、GPIOのピンを調整するくらいですみます。ここを松明のLEDと繋ぎ明るさを調整できるようになります。
あとは如何ようにでも松明を制御できますので、サンプルとして作ったNode.jsのコードでは、1秒おきに明るさを変更しています。

var noble = require('noble')

var serviceUuid = '713d0000503e4c75ba943148f18d941e';
var txCharacteristicUuid = '713d0003503e4c75ba943148f18d941e';

noble.on('stateChange', function(state) {
  if (state === 'poweredOn') {
    console.log('scanning...');
    noble.startScanning([serviceUuid], false);
  }
  else {
    noble.stopScanning();
  }
})

var service = null;
var txCharacteristic = null;

noble.on('discover', function(peripheral) {
  noble.stopScanning();

  console.log('found peripheral:', peripheral.advertisement);
  peripheral.connect(function(err) {
    peripheral.discoverServices([serviceUuid], function(err, services) {
      services.forEach(function(service) {
        console.log('found service:', service.uuid);

        service.discoverCharacteristics([], function(err, characteristics) {
          characteristics.forEach(function(characteristic) {
            console.log('found characteristic:', characteristic.uuid);

            if (txCharacteristicUuid == characteristic.uuid) {
              txCharacteristic = characteristic;
            }
          })

          if (txCharacteristic) {
     setInterval(sendMessage, 1000);
          }
          else {
            console.log('missing characteristics');
          }
        })
      })
    })
  })
})

function sendMessage() {
    var data = new Buffer(2);
    data.writeUInt8(0x2, 0);
    data.writeUInt8(Math.ceil((new Date().getSeconds() % 2) * 255), 1);
    txCharacteristic.write(data, true, function(err) {
console.log("err: " + err);
    })
}

Modを作ると、実際のマインクラフトと連動するということもできますので、その方法はまた別の機会に掲載できればと思います。

今回作成した松明はHaLakeにおいていますのでご興味ある方は見にいらしてください。

コワーキングスペースHaLake