Androidのメモとか

ポキオの日記です。今日も遅延してない。

あけましておめでとうございます

あけちゃいましたね。

ポキオ 2022年

ことしもよろしくおねがいします

先日からNode-REDで毎週月曜日に「来週から本気出します。」とつぶやくようにしたところ、かなり気が楽になりました(笑)

こんな感じで今年はゆるーく頑張っていく所存です。

ポキオ 2022年

おみくじも凶でしたからね・・・(笑)

というわけで、本ブログをよろしくおねがいします。

relativelayout.hatenablog.com

姉妹ブログも何卒よろしくおねがいします。

pokio-ringyo.hatenablog.com

upgti.hatenablog.com

Node-REDと余ったWebカメラを使って監視カメラを作ってみてわかったこと

いつもうまく行かない。

(本記事はIoTLTアドベントカレンダー20日目のネタでもあります)

ポキオ Node-RED Webカメラ 監視カメラ

余ったWebカメラを活用(したかった)

以前予備で買っておいたWebカメラですが、いざWFHで実戦投入しようと思ったけど画質が悪くて、結局使っておらず。いわゆる積みハード的な存在になってしまっていたので、今回はそれを使って監視カメラを作ってみようと思いました。

環境・材料

LifeCam HD-3000

よくあるフツーのWebカメラです。

Raspberry Pi Zero W

よくあるフツーのPi Zero Wです。(Amazon、なんか高すぎ?)

Node-RED (v1.0.3)

よくあるフツーのNode-REDです。Raspberry Pi OSプリインのものをそのまま使っています。

成果物

はじめにお伝えしておくと、Node-REDフローはこんな感じ。

ポキオ Node-RED Webカメラ 監視カメラ

Webカメラは非常用の飲料水にくくりつけて、外を監視させます。

ポキオ Node-RED Webカメラ 監視カメラ

Node-REDのDashboard機能をつかって、Webページを作成。

ポキオ Node-RED Webカメラ 監視カメラ

こんな感じです。

わかったこと

1:Webカメラノードは存在するが凝った使い方ができない(かもしれないけどよくわからない)

あんまり調べたわけではないですが、ライブラリにWebカメラ用のノードはいくつかあります。

flows.nodered.org

機能としては非常にシンプルですが、

  • 指定できる解像度が限られている
  • fswebcamのオプション設定ができない

などのCons.があり、結局fswebcamコマンドを直接叩いています。

fswebcam -S 15 -r 1280x800 image.jpg

ここで、2つポイントが。

  • -Sオプションで数フレームスキップさせてからキャプチャさせる(使ってるWebカメラの挙動的に、最初に露光調整が走り、画が白飛びすることがあるため)
  • -rオプションで解像度を指定(使ってるWebカメラの最大値をひとまず設定)

こんな感じで生のコマンドだと(当たり前ですが)カスタムできます。

2:Webカメラの暗所性能が悪い(やつを使ってるだけかもしれない)

見ての通り、夜間は使い物になりません。

ポキオ Node-RED Webカメラ 監視カメラ

fswebcamの露光時間(フレーム数)を伸ばしても、あまり画が変わらなかったので、まぁこんなものなのでしょう。もちろんWebカメラを責めている気は毛頭なく、もともと明るい室内で近くの顔を撮すのが最大のユースケースなので、仕方がないのかなと思っています。

3:Webカメラがたまに認識されなくなる(やつを使っているだけかもしれない)

これが一番困っているんですが、たまにWebカメラが認識されなくなります。具体的にはlsusbを打っても検出できず、Raspberry Piの電源を抜いて刺さないと検出されない現象がたまに起こりました。

 sudo sh -c "echo -n \"1-1\" > /sys/bus/usb/drivers/usb/unbind"
 sudo sh -c "echo -n \"1-1\" > /sys/bus/usb/drivers/usb/bind"

こんな感じでUSBのunbind/bindを繰り返しても検出できず…。電力が足りてなくて不安定になっているのか、長時間等間隔で撮影をしてだめになっているのか、はたまた個体が良くないのか、謎は深まるばかりですが、調査するくらいだったらビールを飲んでたほうが幸せなので、特に深追いはしていません(笑)

というわけで

監視カメラがほしいならちゃんとしたものを買ったほうが良いということです。餅は餅屋。

テレワーク用の椅子(6脚目)

まさかの6脚目。

ポキオ HHGears SM-115 テレワーク

突然の腰痛と椅子

二足歩行を得た人類の宿命である腰痛。そしてその宿命は突然やってきました。

ぎっくり腰のような症状に見舞われ、整形外科に行ってきました。そしてなぜか翌日には治ってしまったわけですが、(中略)、やっぱりテレワーク用の椅子が良くないのではと思い、新しい椅子を買ってみました。

これで6脚目(笑)

いままで色々座ってきましたが…。

relativelayout.hatenablog.com

relativelayout.hatenablog.com

昨今のゲーミングチェアブームに私も乗っかりたいなぁと思ったわけです。種々のハイエンドモデルも気にはなりますが、個人的にはコスパの高い椅子が欲しく色々物色してたところ・・・

game.watch.impress.co.jp

ほうほう、なかなかコスパが良さそうなゲーミングチェアを発見。ポイントが割と溜まっていたので、全額ポイントで購入してみました。実質無料ですね!

HHGears SM-115

じゃーん。

ポキオ HHGears SM-115 テレワーク

大きい箱で発送され、脚・座面・背面・肘置きなどがバラバラになった状態で入っていて、それを自分で組み立てて行きます。後での述べますが、リクライニング機構や肘置きの調整機能がない分、部品点数も少なく15分程度で組み立てることができました。

ポキオ HHGears SM-115 テレワーク

なんとなくWFH環境がぱっとみそれっぽい感じになってきましたね。

実際にWFHしてみた

背もたれは思った以上にフラット。左右のホールド感は少なめですが、腰のサポートは意外とちゃんとしている印象。

ポキオ HHGears SM-115 テレワーク

先述の通り、リクライニング機構や肘置きの調整機能はないですが、ロッキング機能があるためそこまで苦にはなりません。本当にリラックスしたければ、床に寝っ転がればいいですしね、WFHですから(笑)

ポキオ HHGears SM-115 テレワーク

そしてなにより個人的に好きな部分は、ゲーミングチェアでありがちな赤とか青の差し色がないこと。真っ黒なカラーリングなので、リビングに置いておいても、そこまで浮いた存在にはならないのがいいですねぇ。ロゴは刺繍でデカデカと入っててアレですが・・・。

レビュー

というわけで、HHGearsのSM-115でしたが。

Pros.

  • 安い
  • かんたんに組み立て可能
  • ロッキング機能つき
  • 意外と腰のサポートがある
  • カラバリで黒一色がある
  • 耐久性が高いPUレザー

Cons.

  • リクライニング機構・肘置き調整機構がない
  • 左右方向のホールド感が弱い
  • 通気性が悪いため、お尻の下に汗をかきがち
  • ランバーサポートなどクッションは付属していない
  • 「HHGears」っていうブランド名がちょっと「えちえち」

なんだかロゴがハイアットっぽいなぁと思ったんですが、全然違いました。

椅子遍歴

椅子1:IKEA MARIUS

椅子2:バランスボール

椅子3:Colemanの小さい椅子

椅子4:ポンコタン ハイバックチェア

椅子5:CASCADE ハイバックチェア

椅子6:HHGears SM-115

MacBook Airの調子が悪いのでmacOS Big SurをクリーンインストールしてNode.jsとPythonの環境をanyenvで整える

タイトルがながい。

ポキオ MacBook Air Big Sur anyenv Node.js Python

突然の絶不調

突然MacBook Airの調子が悪くなってしまったので、この際Big Surをクリーンインストールして、開発環境を整えてみます。

Big Surのクリーンインストール

これを参考に起動可能なボリュームを作成し、クリーンインストール

relativelayout.hatenablog.com

無心でHomebrewをインストール

「とりあえず生」みたいなノリ。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Node.jsとPythonの環境をanyenvで整える

今回はめんどくさいのでanyenvで環境を整えます。まずはインストール。

brew install anyenv

そして初期化。

anyenv init

で、なぜか怒られる。

# Load anyenv automatically by adding
# the following to ~/.zshrc:

eval "$(anyenv init -)"

言われたとおりに.zshrceval "$(anyenv init -)"を追加して、反映。

source .zshrc

そして再度初期化。

anyenv init

また怒られた。DV彼氏みたい。

ANYENV_DEFINITION_ROOT(/Users/pokiiio/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by:
> anyenv install --init

言われたとおりに初期化。

anyenv install --init

これで良いはず。

anyenv + nodenvでNode.js環境を整える

nodenvのインストール。

anyenv install nodenv
zsh -l

で、nodenvでLTSなNode.jsをインストール。

nodenv install -l
nodenv install 14.18.0
nodenv global 14.18.0
zsh -l

バージョン確認。

node -v

14.18.0が入ってるっぽいのでヨシッ。

v14.18.0

Python

pyenvもインストール。

anyenv install pyenv
zsh -l

新しめのやつをインストール。

pyenv install -l
pyenv install 3.10.0
pyenv global 3.10.0
zsh -l

念の為バージョン確認。

python3 --version

うん、大丈夫そう。

Python 3.10.0

ちなみに、pythonpipPython 3.x系になっちゃうんですね。ちょっと事故りそうで心配ですが、まぁいいです。Python 2.x系を叩きたければpython2を使えということですね。

pokiiio@pokiiio-MacBook-Air ~ % which python
/Users/pokiiio/.anyenv/envs/pyenv/shims/python
pokiiio@pokiiio-MacBook-Air ~ % which python3
/Users/pokiiio/.anyenv/envs/pyenv/shims/python3
pokiiio@pokiiio-MacBook-Air ~ % python --version
Python 3.10.0
pokiiio@pokiiio-MacBook-Air ~ % python3 --version
Python 3.10.0
pokiiio@pokiiio-MacBook-Air ~ % which pip
/Users/pokiiio/.anyenv/envs/pyenv/shims/pip
pokiiio@pokiiio-MacBook-Air ~ % which pip3
/Users/pokiiio/.anyenv/envs/pyenv/shims/pip3
pokiiio@pokiiio-MacBook-Air ~ % pip --version
pip 21.2.3 from /Users/pokiiio/.anyenv/envs/pyenv/versions/3.10.0/lib/python3.10/site-packages/pip (python 3.10)
pokiiio@pokiiio-MacBook-Air ~ % pip3 --version
pip 21.2.3 from /Users/pokiiio/.anyenv/envs/pyenv/versions/3.10.0/lib/python3.10/site-packages/pip (python 3.10)

ふーん。

pokiiio@pokiiio-MacBook-Air ~ % python2 

WARNING: Python 2.7 is not recommended. 
This version is included in macOS for compatibility with legacy software. 
Future versions of macOS will not include Python 2.7. 
Instead, it is recommended that you transition to using 'python3' from within Terminal.

Arduion関係のセットアップ

こちらを参考に。

relativelayout.hatenablog.com

台風に備えて気圧計を作る

台風がちょっと楽しくなる?

ポキオ 台風 気圧計 M5StickC BMP280

そうだ、気圧計を作ろう。

今年も台風シーズンがやってきましたね。台風が好きな人はそう多くはないと思いますし、身の安全や食料の確保などいろいろやらなければならないことは多いですよね。でもエンジニアなら、気圧計も作って設置しておきましょう。

ポキオ 台風 気圧計 M5StickC BMP280

材料はこちら。まずM5StickC。

コンパクトでディスプレイがついているマイコンで、今回はディスプレイに気圧を表示させつつ、クラウドにデータを飛ばすような実装をしてみようと思います。

そして、気圧センサーはBMP280を使います。

気圧センサーといえばおなじみのモジュールになります。モジュールのVCC、GND、SCL、SDAをそれぞれM5StickCの3.3V、GND、26、0のピンに接続しておきます。

コーディングはArduino IDE

M5StickCなのでUI FLOWでもコーディングできると思いますが、既存の豊富なライブラリを使うためにArduino IDEでコーディングしていきます。また、今回はデータをAmbientに飛ばして可視化してみようと思います。(いつもお世話になってます!)

#include <Ambient.h>
#include <Adafruit_BMP280.h>
#include <Wire.h>
#include <M5StickC.h>

#define INTERVAL 5*60*1000
#define MY_SSID "xxxxx"
#define MY_PW "xxxxx"
#define ID xxxxx
#define KEY "xxxxx"

Adafruit_BMP280 bme;
WiFiClient client;
Ambient ambient;

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);

  WiFi.begin(MY_SSID, MY_PW);
  M5.Lcd.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    M5.Lcd.print(".");
  }

  Wire.begin(0, 26);
  while (!bme.begin(0x76)) {
    M5.Lcd.println("BMP280 init fail");
  }

  ambient.begin(ID, KEY, &client);
}

void loop() {
  M5.Lcd.fillScreen(BLACK);
  float pressure = bme.readPressure();

  M5.Lcd.setCursor(0, 0);
  M5.Lcd.setTextFont(4);
  M5.Lcd.setTextSize(1);
  M5.Lcd.print("pressure[hPa]");

  M5.Lcd.setCursor(0, 26);
  M5.Lcd.setTextFont(7);
  M5.Lcd.setTextSize(1);
  M5.Lcd.printf("%4.0fhPa", pressure / 100);

  ambient.set(1, pressure / 100);
  ambient.send();

  delay(INTERVAL);
}

M5StickCはArduino IDE向けにもライブラリがあり、面倒なWi−Fi接続やディスプレイ操作が簡単にできるのでサクッとコーディングできますね。

いざ起動

こんな感じで自宅の2階の壁に貼って観察を監視します。

ポキオ 台風 気圧計 M5StickC BMP280

台風が来る前に気圧計を設置しましたが、1012hPa前後からスタートし台風接近とともにみるみる気圧が低下。

ポキオ 台風 気圧計 M5StickC BMP280

ついに994hPA前後まで到達。

ポキオ 台風 気圧計 M5StickC BMP280

今回は台風がそこまで接近しなかったこともあり994hPa止まりでしたが、2年前の台風のときは968hPaまで低下しました。

relativelayout.hatenablog.com

relativelayout.hatenablog.com

台風は恐ろしいものではありますが、こんな感じで自然現象をデータで可視化できると、ちょっと台風が楽しくなる?…なりませんね(笑)

Arduinoと3Dプリンタで4灯式信号機を作る

父は減速現示が好き。

ポキオ Arduino NeoPixel 4灯式信号機

4歳息子「信号機がほしい」

息子が日本信号の鉄道用信号機のガチャガチャを見てから、信号機がほしいと言って聞かないわけです。

まぁ、無いなら作ればいい。ということで、今回は4灯式信号機を作ってみます。

www.tomytec.co.jp

イメージはこんな感じ。進行、減速、注意、停止の現示が可能な信号機を作ります。

3Dプリンタでそれっぽい信号をつくる

なにはともあれ、信号っぽいガワを作っていきます。

ポキオ Arduino NeoPixel 4灯式信号機

Fusion 360で、信号機本体にひさしをくっつけて、それっぽくしていきます。今回は、めんどくさいので信号機の裏側や支柱などは作らないでおきます。

光源はNeoPixel

今回使用する光源はNeoPixelのLEDテープを使います。

ポキオ Arduino NeoPixel 4灯式信号機

普通のLEDを使ってもいいんですが、抵抗を挟んだりするのが面倒なのと、配線も複雑になるので、今回はこのNeoPixel系のLEDテープを使います。これだと、GND、電源、信号線の3つだけ繋げば動作させる事ができます。

全部合体させるよー

こんな感じです。

ポキオ Arduino NeoPixel 4灯式信号機

LEDテープはLED4つ分のところでハサミで切って使用しています。GND・電源・信号の線をArduinoのピンに接続していきますが、信号の線は5Vピンに近いA0ピンにさしています。

NeoPixelの特徴でもあるんですが、色をRGBで指定するため、赤は良いとしても、黄色と青(緑)色は現物を見ながら調整しています。

// 黄色
255, 128, 0

// 青色
64, 255, 0

一旦は上記のようなRGB値にしています。

光らせた様子はこちら

光を拡散させたかったので、透明のフィラメントでレンズを作り、LED部分を覆っています。

ポキオ Arduino NeoPixel 4灯式信号機

いい感じいい感じ。

ポキオ Arduino NeoPixel 4灯式信号機

信号機を綿棒の箱に輪ゴムでくっつけて、早速息子氏に遊ばせてみました。2.5秒ごとに信号が節操なく変わるようにプログラミングしてしまったので、若干ビジーかなと思ったんですが、息子的には代わる代わる信号が変わって面白そうな様子でした。

4歳息子「中継信号機と踏切がほしい」

ひとしきり遊んだあとに、息子氏が「中継信号機と踏切も」と言い出したので、おいおいそちらも着手しようと思います(笑)

コードはこちら

#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(4, A0, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
}

void loop() {
  for(int i = 0; i < 4; i++){
    switchSignal(i);
    delay(2500);
  }
}

// 0:停止 1:注意 2:減速 3:進行
void switchSignal(int i){
  long light1[4] = {pixels.Color(0, 0, 0),pixels.Color(0, 0, 0),pixels.Color(255, 128, 0),pixels.Color(0, 0, 0)};
  long light2[4] = {pixels.Color(255, 0, 0),pixels.Color(0, 0, 0),pixels.Color(0, 0, 0),pixels.Color(0, 0, 0)};
  long light3[4] = {pixels.Color(0, 0, 0),pixels.Color(255, 128, 0),pixels.Color(0, 0, 0),pixels.Color(0, 0, 0)};
  long light4[4] = {pixels.Color(0, 0, 0),pixels.Color(0, 0, 0),pixels.Color(64, 255, 0),pixels.Color(64, 255, 0)};

  pixels.setPixelColor(0, light4[i]);
  pixels.setPixelColor(1, light3[i]);
  pixels.setPixelColor(2, light2[i]);
  pixels.setPixelColor(3, light1[i]);
  pixels.show();
}

Sonos Roamことはじめ

ろーーーむ!

ポキオ Sonos Roam

Sonos Roamとは

オーディオメーカーSonosから発売されたポータブルスピーカーというやつです。

www.sonos.com

以前参加したSonosのイベントを発端に、だんだんSonosにハマってきてしまったわけですね。はい。

relativelayout.hatenablog.com

今回のRoamは最近日本で発売されたばかりなんですが…。

www.bcnretail.com

ヨドバシさんで先行販売らしく…。

ポキオ Sonos Roam

ほう…、オンラインストアでも買えるのね…。

ポキオ Sonos Roam

で、気づいたら自宅にあった、というわけです。

ひとまずUnboxing

箱に布製の「とって」みたいなものが付いてるんですよね。

ポキオ Sonos Roam

波平さんみたいで可愛いですよね(そこじゃない)。

ポキオ Sonos Roam

箱の中はこんな感じ。毎度おなじみの不織布で包まれています。

ポキオ Sonos Roam

不織布の中には、この色白の子。

ポキオ Sonos Roam

裏側にはType-Cの充電ポートと、電源ボタンっぽいやつ。

ポキオ Sonos Roam

操作系はすべてスピーカーの上側(?)にまとまっています。ボタン類は他のSonos製品と同じような感じで、UXも同じような感じなので、マニュアルを読まずに使い始められるのがいいですね。

ポータブルスピーカーを家の中で?

Roamはポータブルスピーカーであって、Wi−FiだけでなくBTにも対応しているのが特異的な部分であることは承知をしていますが、ひとまず家の中で使ってみます。あくまでもSonosのスピーカーであることには変わりないので、Wi−Fi接続をして他のSonosスピーカーと連携することもできるのがすごいところです。

ポキオ Sonos Roam

こちらは弊家のリビングの間取りと、既存のSonosスピーカーたち。普段は3つのOneを連携させて音楽を聞いています。(訳あって、PlaybarはTVと接続し、独立して使っています)

ポキオ Sonos Roam

まずはWFH中の音楽鑑賞。手元にRoamを置いて、3つのOneとRoamを連携させて音楽を聞いてみました。

ポキオ Sonos Roam

もともとWFHしている場所が部屋の端によっているため、最適なリスニングポジションではなかったものの、手元にRoamを置いたことで、

  • Roamのおかげで音楽、とくにボーカルの解像度が上がったような感じ
  • Oneが3つあることによる包まれてる感じ

上の2つがうまい塩梅で両立しているような環境となりました。また、コンパクトなRoamのおかげで、机の上に置いても邪魔にならない感じが非常に良いです。

ポキオ Sonos Roam

次に同様にOne 3つと連携させたまま、Roamをキッチンに持っていってみます。というのも、間取りの関係で、リビングの3つのOneの音楽がキッチンでは聞きづらいと常々感じていたものの、キッチンのためだけにOneを増設するのも微妙かなと思っていたわけです。

ポキオ Sonos Roam

Roamはバッテリー内蔵で、先述の通りコンパクト。しかも縦置きもできるので、我が家の狭いキッチンでも置き場に困りません。そして、コンパクトなのにパワフルな音を出せるので、意外と音がうるさい料理中もしっかり音楽に没頭(料理も頑張ってますが)できました。リビングに行っても、キッチンに戻っても、シームレスに音楽が聞ける体験は、本当に素晴らしいですねぇ。そして、必要なときだけ持っていけるのは、ポータブルスピーカーならではのメリットですね。

というわけで

  • My New Gear : Sonos Roam
  • ポータブルスピーカーだけど、まだ家の中でしか使ってないよ
  • でも、家の中でも機動性を活かして、いろいろ使えるすごいやつ
  • 既存のSonosシステムと連携ができる
  • コンパクトだけどいい音

サマるとこんな感じでしょうか。屋外でのレビューはまた今度!

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。