M5CameraXを買ってみたが、Wifi接続しなきゃならんってのが不便極まりない。ググったらステーションモードにできるらしいと分かったので、早速、先人の方々の情報を参考に、ArdinoIDE(1.8.13)のCameraWebSerberのスケッチを書き込んでみた。
書き込み自体はあっさり成功したが、シリアルモニタが文字化けしてて、アクセス先が分からない…通信速度を「115200bps」にしないとアカンのね。
M5CameraXを買ってみたが、Wifi接続しなきゃならんってのが不便極まりない。ググったらステーションモードにできるらしいと分かったので、早速、先人の方々の情報を参考に、ArdinoIDE(1.8.13)のCameraWebSerberのスケッチを書き込んでみた。
書き込み自体はあっさり成功したが、シリアルモニタが文字化けしてて、アクセス先が分からない…通信速度を「115200bps」にしないとアカンのね。
中古のバランスwiiボードを貰ったので、なんかに活用できないかと色々調べてみたが、微妙に情報が古かったり環境の設定が結構面倒なものばかりだった。
…が、「wii-balance-board-pi」って気になるNode.jsのモジュールがあったのでラズパイ4入れてみたところサクッと使えた。
【検証環境】
【設定方法】
基本的には、Githubのページに書いてある通りにするだけ。
サンプルスクリプトもシンプルだが、これだけで十分な内容。
npm i -s wii-balance-board-pi
sudo apt-get --assume-yes install bluez python-bluez python-gobject python-dbus
sudo reboot
const BalanceBoard = require("wii-balance-board-pi"); var balanceBoard = new BalanceBoard(); balanceBoard.connect(); balanceBoard.on("data", data => { console.log(data); });
{ connected: boolean, topLeft: float, topRight: float, bottomLeft: float, bottomRight: float, totalWeight: float, buttonPressed: boolean, buttonReleased: boolean }
4角にあるセンサ値と全体の重さ(kg)、前面にあるボタンの状態がJSONで取得できるので、あとは好きに料理するだけ!
これはお手軽で便利だ。
Chromeのアップデートに伴い、Node.jsでオレオレ認証のサーバに完全にアクセスできなくなってしまった。
ちょっと前までは、リクス覚悟で見るか?ってリンクが出てたので、それでアクセスできたけれど、そのリンクも出なくなった…
クリアできる証明書の作り方もある様だが、こちらの技量ではお手上げレベルなので困ってたが、アクセスをブロックしてる旨のページのどこでも良いので、
ページ内の適当な箇所をクリックして、「thisisunsafe」とタイプ & Enterで、見事にアクセスできた!
それにしても、G社のおかげで、こっちの世界もどんどん面倒臭くなるな。
HEROKUを使えば、サクッとMQTTサーバができるらしいが、色々自前でやりたいので調べてみたら、「mosca」ってのを使えば、Node.jsでサーバ作れるし、「mqtt.js」を使えば、クライアント側もできるらしいので、早速やってみた。
Node.jsはすごいねぇ。
npm install mosca
var mosca = require('mosca'); var server = new mosca.Server({ port: <サーバのポート番号>, }); /*準備完了*/ server.on('ready', function(){ console.log('Server is ready.'); }); /*クライアントが接続された*/ server.on('clientConnected', function(client){ console.log('broker.on.connected.', 'client:', client.id); }); /*クライアントが切断されrた*/ server.on('clientDisconnected', function(client){ console.log('broker.on.disconnected.', 'client:', client.id); }); /*Subscriberからデータの配信要望が来た*/ server.on('subscribed', function(topic, client){ console.log('broker.on.subscribed.', 'client:', client.id, 'topic:', topic); }); /*Subscriberからデータの配信停止要望が来た*/ server.on('unsubscribed', function(topic, client){ console.log('broker.on.unsubscribed.', 'client:', client.id); }); /*Publisherからデータが送信された*/ server.on('published', function(packet, client){ if (/\/new\//.test(packet.topic)){ return; } if (/\/disconnect\//.test(packet.topic)){ return; } console.log('broker.on.published.', 'client:', client.id); }); /*MQTTサーバをHTTP サーバに結びつける*/ var http = require('http'); var httpServer = http.createServer(); server.attachHttpServer(httpServer); httpServer.listen(<サーバのポート番号>);
npm install mqtt
※ブラウザから実行する場合は埋め込み利用も可
<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
const mqtt = require('mqtt'); var client = mqtt.connect({ host: '', port: , clientId: '<自分のID>' //任意(無しの場合は自動設定) }); /*Brokerサーバに接続*/ client.on('connect', function(){ console.log('publisher.connected.'); });
/*データ配信*/ client.publish('<任意のTOPIC>',<送信データ>);
/*購読希望リクエスト*/ client.subscribe('<購読希望TOPIC>'); /*データ受信*/ client.on("message", (topic, payload) => { console.log(topic); var message = payload.toString('utf-8'); //var message = String.fromCharCode.apply(null, payload); console.log(message); });
無事MQTTサーバができたので、micro:bitとHalocodeを双方向で通信させてみた。
ブラウザでお手軽BLEをするのに、BlueJellyがすごく便利なんだが、Peripheral化させたラズパイ(Node.js + bleno)とデータのやり取りする時に、Byte Arrayとかなんとかメンドクサイのが出て来て訳が分からんので、とりあえず簡単に使う方法を整理。
Peripheral側から飛んできたデータはArray Bufferになってるので、文字列に戻す
//Bluejelly イベント ble.onRead = function (data, uuid){ let xVal = buffToString(data.buffer); console.log(xVal); } /*ArrayBufferから値を読んで文字列に変換*/ const buffToString = function(xBuffer) { let xArrayBuffer = new Uint8Array(xBuffer); let xRes = String.fromCharCode.apply(null,xArrayBuffer); return xRes; }
Peripheralにデータを送るには文字列をArrayBufferにして、送る。
let xSendVal = "送信データ"; //文字列をArrayBufferに変換 let arrayBuffe = new TextEncoder().encode(xSendVal); ble.write('UUID名',arrayBuffe);
//xVal = writeされたデータ let xVal = Buffer.from(Uint8Array.from(Buffer.from(data))).toString();
ラズパイのカメラで撮影した画像を楽に確認する方法を探してたら、ターミナルに画像を表示するって素敵な方法がありました!MacでiTerm2を使ってる人限定だけど、コマンド2行書くだけで、導入も超簡単!
こりゃ便利だわー!
Peripheral(ペリフェラル)ってのは送信側の事だそうな。ちなみに、受信側はセントラル(Central)だって。
で、本題。
とりあえず、OS入れて初期設定だけ済ませたクリーンな環境で作業開始。(出たてで怖いので、あえてOSはStretchを利用。)
apt-getで node と npm入れる → npm で n 入れる → aptで入れた node と npm 消す。
…って方法が一般的っぽいけど、入れて消すってのが気持ち悪いのと、これだと色々面倒な事になるっぽいので、apt方式はやめて、n-install を使って、先に n をインストールする。
$curl -L https://git.io/n-install | bash
無事インストールできたら、インストーラの指示に従ってエイリアス設定を再読み込み。(これをしないと、n コマンドが通らない)
$source ~/.bashrc
n コマンドが通るのを確認したら、bleno 用にnode 8.xをインストール(今回は8.15.0を利用)
$n 8.15.0
$which node
$ sudo ln -s /home/pi/n/bin/node /usr/bin/node $ sudo ln -s /home/pi/n/lib/node /usr/lib/node $ sudo ln -s /home/pi/n/bin/npm /usr/bin/npm $ sudo ln -s /home/pi/n/bin/node-waf /usr/bin/node-waf *もしあったら
sudo node -v sudo npm -v
(参考サイト:日々精進「EC2でsudo nodeを実行するとcommand not found」)
この二つの条件が整ったら、いよいよblenoをインストール!
$ sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev $ npm install bleno
詳しいやり方等は、親切丁寧で分かりやすいページがありましたので、そちらをご覧ください。
極力ローコスト ロボット製作 ブログ「Node.jsとblenoでRaspberry PiとiPhoneをBLEでつなげてみる」
Raspberry Pi Zeroとカメラモジュールを入手したので、Node.jsで制御させてみた。
コマンドラン叩く系とかは面倒くさいのので敬遠してたが、「pi-camera」ってモジュール入れたら、簡単にできた。
npm install pi-camera
モジュールを入れたらサイトにあるサンプルスクリプトを参考に、JavaScriptファイルを作成して書いて実行。
const PiCamera = require('pi-camera'); const myCamera = new PiCamera({ mode: 'photo', output: `${ __dirname }/test.jpg`, width: 640, height: 480, nopreview: true, }); myCamera.snap() .then((result) => { // Your picture was captured }) .catch((error) => { // Handle your error });
撮影完了までに5秒くらいの待つけど、これは仕様らしいので、諦めるしか無いっぽい。
動画にも対応してる様なので、次は動画にチャレンジ。
Xcodeに入ってるiPhoneエミュレータみたいに、Androidエミュレータも単体起動させたかったので、色々調べた結果のメモ。
(2020.12.16修正)
/Users/ユーザー名/Library/Android/sdk/emulator/emulator -list-avds
/Users/ユーザー名/Library/Android/sdk/emulator/emulator -avd エミュレータイメージ名