2024年11月18日 | EOS R7ファームウエアアップデート |
2024年11月17日 | PX-M730Fのシアンインク交換 |
2024年11月4日 | 360度モニタ不調 |
2024年11月2日 | ノート給油 |
2024年10月19日 | 腕時計のファームウエア |
2024年10月5日 | RF-S 10-18mm F4.5-6.3 IS STM購入 |
2024年10月3日 | 三菱UFJニコスカード到着 |
2024年9月28日 | 三菱UFJニコスカード申込 |
2024年9月23日 | 第10世代iPad購入 |
2024年9月17日 | iPadOS 18 |
電子工作向けのワンボードコンピュータ。 PICほど低レベルでは無く、 比較的簡単に遊べるようだ。 ブレッドボードにLM35DZを差し、 ARDUINO UNOから電源を供給し、 LM35DZの出力端子をA/Dコンパータの0番に接続。 ARDUINOで走らせるプログラムは以下の通り。
100℃で1Vの出力になるはずなので、 基準電圧は5Vではなく1.1Vにした。 多少とはいえ、精度が上がるはず。 後は0.1秒ごとに読み取った電圧を温度に変換して、 シリアルポートに流すだけ。 本当はシリアルポート経由で問い合わせがあった時だけ返事をする、 としたいところだが、 親機であるFreeBSD 12.0だと、 なぜかnode.jsにserialportがインスートルできないのだ。
サーバーであるFreeBSD 12なマシンなら24時間動いているので、 測定結果はmuninでグラフにしようかと思っていたが、 Ambientというサービスがあるので使ってみることにした。 ARDUINOとmbedとnode.jsとPythonならライブラリがある。 なので、安直にnode.jsを使うことにした。 仕様はドキュメント化されていないようだけれど、 ソースを読めってことかね。
前述のようになぜかnode.jsにserialportをインストールできなかったので、
と、shellレベルで実行した結果を送信するという、 泥臭いプログラムになった。 FreeBSD12にARDUINOをつなげると、 /dev/cuaU0として認識されるようである。 特に設定しなくても、 そのまま読み出せた。 とはいえタイミングによっては改行を取り損ねるので、 1回読み捨てるといういい加減な処理である。 後はcrontabで5分おきに実行するようにした。 javascriptならintervalで実行するのが普通なのだろうが、 手っ取り早く知っていることで済ませてしまうのだ。 これでなんだかんだと言いながら数時間でできてしまうのだから、 楽な世の中になったよなあ。
つらつらとWebを巡っていたら、 FreeBSDにserialportをインストールするには、 python 2.7とnode-gypが必要らしい。 Pythonは既にインストール済みだったので、
$ mkdir arduino $ cd arduino $ npm init -y $ npm i -D node-gyp $ npm config -D set python /usr/local/bin/python2.7 $ npm i -D serialport $ npm i -D ambient-lib $ npm i -g forever
で必要なソフトウェアをインストール。 シリアルポートから読み込んでambientに投げるには
といった感じ。 8行目にはあらかじめ取得した、 ambientのチャネルとライトキーを設定する。 残念ながら、 javascriptで5分ごとに読み出す方法がわからなかったので、 Arduino側で出力を5分ごとに変更した。
ログアウトしてもjavascriptが動くようにしたいのだが、 nohupではうまくいかなかった。 そこで、node.jsのforeverモジュールを使う。
$ forever start lm35.js
でOK。
$ forever list
で、管理しているプログラムの一覧が出る。 止めたい時は
$ forever stop uid
とする。 uidは、listするとわかるようになっている。
Johnny-Fiveを使うと、 もう少しお気楽に、さまざまなセンサーを扱えるようだ。 しかし、analogReference(INTERNAL); に相当する機能が無さそう。 これがないと温度の最小単位が0.48℃、 あれば0.11℃と結構違う。 ambientのグラフ上でも、 下のようにはっきりとわかってしまう。
離れでもBME280を使うことにした。 母屋と同じ、 秋月電子通商のモジュールである。 ただし、ESP32と違ってARDUINO UNOは5V動作なので、 同じ秋月電子通商のI2Cバス用双方向電圧レベル変換モジュールも使った。 ベースはやはり秋月電子通商のアクリルベースである。
ARDUINOには[ファイル]-[スケッチ例]-[Firmata]-[StandardFirmata]を書き込んでおく。 FreeBSD側ではnpm i -D johnny-fiveでJohnny-Fiveをインストール。 動かすべきプログラムは、以下の通り。 300秒=5分間隔でデータを読み出してambientに送信する。
なお、気圧はhPaではなくkPaで返ってきた。 なので、node_modules/johnny-five/lib/barometer.js の108行あたりを書き換えた。 1000で割っているところを、100で割るようにしただけである。 実行は前述のようにforever start bme280.jsとした。
ambientでは、時刻のずれたデータを一つのグラフにプロットすると、 折れ線グラフにはならないらしい。
なお、気圧はhPaではなくkPaで返ってきた。
johnny-fiveをアップデートする度に修正するのは面倒なので、 読み出しスクリプト側で10倍することにした。
FreeBSDを13.0にアップデートしたら、 nodeやnpmのバージョンが上がったせいかambientへのデータ転送がうまくいかない。 なのでportsからコンパイルしてnode17とnpm8をインストールした。 そしてnodeのモジュールも一旦全部削除して、 改めてインストールし直した。 するとnode-gyp無しでも、 serialportがすんなりとインストールされる。 かなりバージョンも上がっているようだ。
そして、 ambient-libもバージョンが上がって使い方が変わっている。 ドキュメントを見て少し修正して、 ようやくambientへデータを送信できるようになった。