Raspberry PiのIPアドレスをMicro:bit(chibi:bit)で通知する。
Raspberry Piに動的に割り当てられたIPアドレスを、chibi:bitに通知して確認できるスクリプトを作りました。
raspberry pi のipアドレスをchibi:bitで通知するようにしてみた。#microbit pic.twitter.com/UqpqmmL57y
— 清水正行 (@_shimizu) February 9, 2017
DHCPで配布されたアドレスを確認するときなどに使えます。
Raspberry Piとchibi:bit間の通信にはBLEをつかっています。
前準備
BLEを通じてchibi:bitをコントロールするために、Raspberry Piにnode.jsと
今回使用したRaspberry Pi 3にはデフォルトでnode.jsがインストールされていますがバージョンが古かったので、公式サイトのヘルプを参考にver.6.xのnode.jsを再インストールしています。
Installing Node.js via package manager | Node.js
1 2 |
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install -y nodejs |
node.jsのインストールが終わったら、micro:bitのBLEモジュールをインストールします。
node-bbc-microbitはnobleモジュールを利用するのですが、このモジュールをRaspberry Pi を利用できるようにするために、必要なライブラリを先にインストールしてください。
1 |
sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev |
node-bbc-microbit: Control a BBC micro:bit from Node.js using BLE
1 |
npm install bbc-microbit |
chibi:bit側では、node-bbc-microbitのREADMEに掲載されている「Flashing micro:bit firmware」の工程を済ませておいください。
サンプルコード
chibi:bitのAボタンを押すと、LEDにRaspberry PiのIPアドレスが表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
var os = require('os') var BBCMicrobit = require('bbc-microbit') var BUTTON_VALUE_MAPPER = ['Not Pressed', 'Pressed', 'Long Press'] console.log('chibi:bitを検索しています') var discoverMcrobit = new Promise(function(resolve, reject){ BBCMicrobit.discover(function(microbit) { console.log('\tchibi:bitを発見しました: id = %s, address = %s', microbit.id, microbit.address) microbit.on('disconnect', function() { console.log('\t接続エラー!:chibi:bitに接続できませんでした') process.exit(0); }) resolve(microbit) }) }) var subscribeButtons = function(microbit){ return new Promise(function(resolve, reject){ microbit.connectAndSetUp(function() { console.log('\t接続しました') microbit.subscribeButtons(function() { console.log('\tボタン入力を受付中') resolve(microbit) }) }) }) } var onClickButtons = function(microbit){ return new Promise(function(resolve, reject){ microbit.on('buttonAChange', function(value) { console.log('\ton -> button A change: ', BUTTON_VALUE_MAPPER[value]) if (BUTTON_VALUE_MAPPER[value] === "Pressed") microbit.writeLedText(getLocalAddress().ipv4[0].address, function() { console.log('テキスト送信: "%s"', getLocalAddress().ipv4[0].address) }) }) microbit.on('buttonBChange', function(value) { console.log('\ton -> button B change: ', BUTTON_VALUE_MAPPER[value]) if (BUTTON_VALUE_MAPPER[value] === "Pressed") microbit.writeLedText(getLocalAddress().ipv6[0].address, function() { console.log('テキスト送信: "%s"', getLocalAddress().ipv6[0].address) }) }) resolve(microbit) }) } //ipアドレスを取得する function getLocalAddress() { var ifacesObj = {} ifacesObj.ipv4 = [] ifacesObj.ipv6 = [] var interfaces = os.networkInterfaces() for (var dev in interfaces) { interfaces[dev].forEach(function(details){ if (!details.internal){ switch(details.family){ case "IPv4": ifacesObj.ipv4.push({name:dev, address:details.address}) break; case "IPv6": ifacesObj.ipv6.push({name:dev, address:details.address}) break; } } }) } return ifacesObj } discoverMcrobit.then(subscribeButtons).then(onClickButtons) |