トップ > 興味のあること > コンピュータ > ハードウェア > マイクロコンピュータ

更新情報

2024年3月17日 グランドセイコー
2024年2月9日 防水温湿度計
2024年2月12日 Bluetoothマウス切断
2024年2月11日 ANKER SoundCore
2024年2月10日 ノート給油
2024年2月8日 ハクキンカイロ発熱量
2024年1月28日 出勤セット
202年1月7日 バイク保険更新
2024年1月2日 M-CR612購入
2023年12月26日 モバイルディスプレイ

ARDUINO

ARDUINO

2019年3月16日

ARDUINO

電子工作向けのワンボードコンピュータ。 PICほど低レベルでは無く、 比較的簡単に遊べるようだ。 ブレッドボードにLM35DZを差し、 ARDUINO UNOから電源を供給し、 LM35DZの出力端子をA/Dコンパータの0番に接続。 ARDUINOで走らせるプログラムは以下の通り。

100℃で1Vの出力になるはずなので、 基準電圧は5Vではなく1.1Vにした。 多少とはいえ、精度が上がるはず。 後は0.1秒ごとに読み取った電圧を温度に変換して、 シリアルポートに流すだけ。 本当はシリアルポート経由で問い合わせがあった時だけ返事をする、 としたいところだが、 親機であるFreeBSD 12.0だと、 なぜかnode.jsにserialportがインスートルできないのだ。

Ambient

サーバーである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で実行するのが普通なのだろうが、 手っ取り早く知っていることで済ませてしまうのだ。 これでなんだかんだと言いながら数時間でできてしまうのだから、 楽な世の中になったよなあ。

画面:ambient

2019年5月5日

つらつらと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のグラフ上でも、 下のようにはっきりとわかってしまう。

グラフ:0.11℃
グラフ:0.48℃

2019年5月8日

離れでも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では、時刻のずれたデータを一つのグラフにプロットすると、 折れ線グラフにはならないらしい。

2019年7月12日

なお、気圧はhPaではなくkPaで返ってきた。

johnny-fiveをアップデートする度に修正するのは面倒なので、 読み出しスクリプト側で10倍することにした。

2022年2月14日

FreeBSDを13.0にアップデートしたら、 nodeやnpmのバージョンが上がったせいかambientへのデータ転送がうまくいかない。 なのでportsからコンパイルしてnode17とnpm8をインストールした。 そしてnodeのモジュールも一旦全部削除して、 改めてインストールし直した。 するとnode-gyp無しでも、 serialportがすんなりとインストールされる。 かなりバージョンも上がっているようだ。

そして、 ambient-libもバージョンが上がって使い方が変わっている。 ドキュメントを見て少し修正して、 ようやくambientへデータを送信できるようになった。