ラズパイをBLEのPeripheralにするためにNode.js + bleno で環境作成

Peripheral(ペリフェラル)ってのは送信側の事だそうな。ちなみに、受信側はセントラル(Central)だって。

で、本題。
とりあえず、OS入れて初期設定だけ済ませたクリーンな環境で作業開始。(出たてで怖いので、あえてOSはStretchを利用。)

■環境
ハード:Raspberry Pi Zero WH
OS:Raspbian Stretch
■n のインストール
使い勝手が良いので、Node.jsのヴァージョン管理には n を使う事にする。

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
■node を sudo で実行させる
実行できるなら、この項は無視してOK。
  1. nodeのパスを確認
    $which node
  2. シンボリックリンクを作成
    (上記1で調べたパスが「/home/pi/n」だった場合の例)
    $ 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 *もしあったら
  3. とりあえず、ラズパイを再起動して、ちゃんとヴァージョン番号が表示されるのを確認できたら、作業完了!
    sudo node -v
    sudo npm -v

    (参考サイト:日々精進EC2でsudo nodeを実行するとcommand not found」)

■blenoのインストール
・Node.js ver8.x が動いてる。
・sudo node が実行できる。

この二つの条件が整ったら、いよいよblenoをインストール!

$ sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
$ npm install bleno

詳しいやり方等は、親切丁寧で分かりやすいページがありましたので、そちらをご覧ください。

極力ローコスト ロボット製作 ブログNode.jsとblenoでRaspberry PiとiPhoneをBLEでつなげてみる

Node.jsでラズパイのカメラモジュールを使う

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秒くらいの待つけど、これは仕様らしいので、諦めるしか無いっぽい。
動画にも対応してる様なので、次は動画にチャレンジ。

参考サイト
Pi-Camera(npm)
pi-camera(GitHub)

Google謹製Androidエミュレータを単体起動させるまで for Mac

Xcodeに入ってるiPhoneエミュレータみたいに、Androidエミュレータも単体起動させたかったので、色々調べた結果のメモ。

  1. Android SDKをインストール
  2. なんでも良いので、適当に空プロジェクトを作って、プロジェクトウィンドを開く。
  3. AVD Managerを起動する。
  4. 任意のエミュレータイメージを作成する。(かなり時間がかかる)
  5. イメージができたら、一応起動テスト
  6. Android SDKを終了
  7. コマンドプロンプトを起動
    注) Android SDKには「emulator」が2つあって面倒なので、よく分からない人は、パスを通さない方が無難かも。
  8. 「emulator -list-avds」で作成したエミュレータイメージ名を確認
    /Users/ユーザー名/Library/Android/sdk/tools/emulator -list-avds
  9. 「emulator -avd」で上記で調べたエミュレータ名を指定すると、エミュレータが起動
    /Users/chikao/Library/Android/sdk/emulator/emulator -avd エミュレータイメージ名
  10. Automaterで上記コマンドをシェルアプリ化。
参考サイト:
Webフロントエンド開発者のためのAndroidエミュレータ活用術
“Missing emulator engine program for ‘x86’ CPU”が発生する場合の対処法

ffmpegの作業色々

雑多な動画処理でよく使うffmpegのメモ

■SNSやyoutubeに動画をアップする際、余計な生活音がはいっているので削除したい。

ffmpeg -i hoge.mp4 -vcodec copy -map 0:0 out.mp4

■容量の大きすぎる動画を適当にサイズ指定して圧縮する。

ffmpeg -i hoge.mp4 -bufsize 20000k -maxrate 25000k -acodec copy -aspect 16:9 -s 1280x720 out.mp4

■他の作業に与えない程度にCPUの使用割合を下げてエンコードする。
※別途「cpulimit」をインストールしておく。

cpulimit -l 400 -- ffmpeg -i hoge.mp4 out.mp4

Core i7クアッドコアの場合はフルで使って800なので、上記は約半分の値となる。

RM Mini 3(黒豆)をGogole home miniで使う。

RM Mini 3(黒豆)を設定しようと「e-control」ってアプリ入れて普通に使おうとすると「正規品ではないため日本国内で利用できません」って出てきて、どうにもできない。

  1. スマホの言語設定を日本語にしてやる。
  2. ヴァージョン3.7.8以前のe-controlアプリを入れる。

ネットで調べると、上記の2種類の方法があり、どちらでも黒豆の設定や制御は可能だった。
だが、せっかく対応した筈のGoole Home miniが認識してくれない。

どうも、ユーザー登録データがLinkJapan側に行っちゃう様で、Google homeのデバイス登録時に、IDとPWがちゃんと認証されないっぽい。

….という訳で、e-conrolの利用は諦めてIntelligent Home Center(IHC)ってアプリを入れてみたら、すべての問題がすんなり解決した。以下、その手順。

  1. BroadLinkオフィシャルサイトからIHCのapkをダウンロード
    日本のGoogle Playからはダウンロードできない。
  2. すでに黒豆をあれこれ設定してたら、リセットボタンを押して一旦初期化。
  3. IHCを起動して、Wifiの設定とユーザー登録を行う。
  4. 照明やエアコンなどのリモコンを、どんどん登録していく。
  5. Goole Homeアプリから > メニュー > スマートホーム > デバイス追加(プラスボタン) > BroadLink Smart Homeを選択
  6. 上記2で登録したユーザーIDとPWを入力
  7. 上記4で設定したデバイスが表示されたら、成功!

これで、Google homeから黒豆を操作する事ができた!
なお、Goole Homeはなぜかエアコンと照明だけしか認識してくれないので、テレビとかのリモコンも照明として設定しないと行けないので、ご注意を!

ejsでテンプレートのパスが通らない件

Node.js + express + ejsの環境で、下記みたいに書いてたが、ejsのテンプレートファイルが見つからないって、エラー(Error: Cannot find module ‘views/’)になる。

app.get("/", function(req, res) {
    res.render('./views/temp.ejs', { title: 'SAMPLE'});
});

で、どうしたもんかと2日ばかり悩んだが、express.staticで、ルートのパスを指定すれば、動いた。

app.use(express.static('./views'));

app.get("/", function(req, res) {
    res.render('temp.ejs', { title: 'SAMPLE'});
});

…ただ、これが正解かどうかは怪しいので、どなたか正解プリーズ!

ラズパイ3にgoogle-home-notifierを入れるメモ

Raspberry Pi 3 にgoogle-home-notifier入れようと思ったら微妙に手間取ったので、メモ。

$ npm init
$ npm install google-home-notifier

※「fatal error: dns_sd.h: そのようなファイルやディレクトリはありません」 ってエラーが出た場合は下記を実行してから、再度インストールする。
$ sudo apt-get install libavahi-compat-libdnssd-dev

Goome homeのアドレスをサクッと調べるために、「multicast-dns」も入れとく。
$ npm install multicast-dns
参考サイト:
Raspberry PiからGoogle Homeを喋らせる
Google Homeの名前とIPアドレスを検出する方法

DialogflowでGoogle Home用アプリを作ってみた結果報告

Google Home miniが事務所に来たので、色々な参考サイトを見ながら、Dialogflowで早速アプリを作ってみた。
が、実際の画面と参考サイトの説明にズレが出てたので、苦労した点をメモ。

●intents作成画面に、「User Says」って項目が無い!
「Training phrases」って項目に変更になった模様。
●Integrations画面に「Google Assistant」のon/offボタンがない
デフォルトでon状態になってて、切り替え不要になった模様。
●intents作成画面の「FulfilIntent」項目に、「Use webhook」ってチェックボックスが無い!
“Enable webhook call for this intent”って表記に変更になった模様。
●FulfilIntentのinline Editorにサンプルスクリプト入れても、エラーで動かない!
インスタンスの作成方法やパラメータの取得方法が、かなり変わってる模様。
とりあえず、シンプルなテンプレソースはこんな感じ。(オレンジの部分は、良くわからんのでそのまま使う。)

'use strict'; const functions = require('firebase-functions'); const {WebhookClient} = require('dialogflow-fulfillment'); const {Card, Suggestion} = require('dialogflow-fulfillment'); process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response });
function yourFunctionHandler(agent) { //Actionで取得したパラメータを取得 let paramVal = agent.parameters['PARAMETER NAME']; //ログにトレースする console.log("PARAMETER NAME = " + paramVal); //結果を喋らせる agent.add(paramVal + 'です'); } let intentMap = new Map(); //ファンクションをintentに登録する intentMap.set('INTENT_NAME', yourFunctionHandler); agent.handleRequest(intentMap); });

Monacaデバッカーがコケる件

Android版のMonacaデバッカーを7.0.2にアップデートしたら、プロジェクトの再生で急にコケる様になった。

●端末が縦固定に設定されてる。
●プロジェクトがLandscape(横)設定にしてる。

この組み合わせの場合に発生するっぽい。
ちなみに、アプリにしたらこの問題は発生しない。

ついでに、ダッシューボードにログインする度にアカウントの言語設定がリセットされちゃうのも、地味に困る