このページは、以下に引っ越しました。内容も逐次移行中です。引き続きよろしくお願いします。
https://hkaji.github.io →こちら
stm32,esp32,pi picoやPI zero,Pi4bの設定や作成例をはまりどころを中心に書いています。「はまらない」手助けになればと。何事も一歩踏み出さないと始まりません。
引き続き3Dプリンターです。当分続きます。静音化したヘッドですが、造形物冷却ファンをつけ忘れてました。ファン取付と配線の状況です。
静音化ヘッドのstlファイルはthngiverseからダウンロードしました。説明を細かく読まなかったのが反省点です。別のblogを読んでいてこのヘッドを使ってる方がいたのですが、ファンが2個付いてます。ん。そこにどうやってつけれるのと思っていましたが、なるほど。
普通の軸流40mmファンでなく、吹き出しが90度横に出るタイプです。そういうことですか。ということでぽち。元々は24Vファンなので12V化して風量的に問題ないのかと少し心配ですが、横吹きのファンは種類が少なくあまり選択肢がありません。
ファンの電源は、制御ボードから出ています。印刷時1層目が終わったらオンになります。ノズルから出てくる熱々の材料を冷やすための風です。ベッドに近い層を急に冷やすとソリや剥がれの原因になるので、ファン速度の設定も重要です。
制御ボード→DC/DCコンバーター→冷却用ファンと配線します。制御ボードは、プリンターの裏からアクセスなので配線結構面倒です。プリンター後部は、静音化で24V→12Vのコンバータ置き場になってます。
一つにまとめられるといいのですが、on/offのタイミングがそれぞれなので、こんな感じです。コンバーターを1つにしてリレーで制御するともう少しスッキリかもしれません。コンバータとリレーがコンパクトにまとまったボードがあればいいのですが。
テスト印刷するとちゃんとノズル横の左右のダクトから風が出てきます。これがどの程度造形物に影響するのかわかりませんが、しばらくは様子を見たいと思います。標準ヘッドでは、送風ダクトが片側です。
新しい静音ヘッドに造形物冷却用のファンを取付けて配線しました。このファンの効果はどの程度なのかわかりませんが、しばらく経過観察です。12V化したのでファン2個取付けても静かなヘッドです。
3Dプリンターは、octoPiを使って印刷ファイルのやり取りやヘッドノズルの温度設定などをしています。印刷中の状況をタイムラプス撮影して動画にすることができます。octoPiお勧めプラグインの一つoctolapseの設定と撮影状況です。
octoPiを起動して、レンチマークをクリック。plugin manageを選択します。そこに沢山のpluginが表示されているので、その中から「octolapse」を選択してインストールします。
使っているスライスソフトにも追加のGcodeが必要です。それぞれのスライスソフトやバージョン毎に違うので環境に合わせてGcodeの追加作業が必要です。これをやらないと印刷時にエラーが出て印刷できません。
タイムラプスな撮影は撮影間隔を設定し、時間毎に撮影した静止画を動画作成ソフトでひっつけて作ります。これは、octoPiの標準機能で作成可能です。こんな感じです。
プラグインoctolapseを使うと、印刷一層終わるごとにヘッドやベッドを指定の位置に退避させ撮影して、次の層へという動きになります。このようにして撮影した静止画を動画作成ソフトで引っ付けると造形物が成長しているような動画になります。こんな感じです。
どちらが良い悪いではなく、手法によって作成される動画が異なります
octoPiのプラグインoctolapseを導入し印刷物のタイムラプス動画を作成しました。3Dプリンターは造形物を作ることが主ですが、作成過程も楽しむことができます。デカものを印刷すると数時間掛かるので、印刷副産物として楽しめます。ただし、ヘッドを退避する時間×積層数分の印刷時間が伸びます。
RaspberryPi+OctoPiで快適3Dプリント環境を手に入れた【OctoLapse編】
3Dプリンターもサポートの付け方など、ソフトウェアではうまくいってても実際印刷するとあーあになったりということで、経験が必要です。失敗も次につながる良い経験なので、なぜダメなのかをよく考えつつもやってみることが一番重要です。今回は経験値アップのためにdockerロゴを作成しつつ、タイムラプス撮影を試してみます。
dockerロゴのstlファイルはインターネット上に多数共有されていました。自分で楽しむだけなのでライセンスはそう気にしません。しっぽの部分は結構急峻なのでサポート無しだとうまくいかない可能性大です。
このようなサポートをつけ、サポートの充填率は10%と薄めにしておくとはがしやすいです。これでGcode作成しました。
USBカメラは、ELECOMの手持ちです。三脚に両面テープで固定してモニターで映り具合を調整します。octoPi側は、「control」画面に動画が映っていることを確認します。
「timelapse」の画面で撮影間隔等を設定します。今回は10s毎にしましたが、もう少し長くてもいいのかもしれません。この辺は何度かやってみて経験値が必要です。z軸が動くときにという設定もあります。
準備が終わればベッドの調整をして印刷です。timelapseは自動的に処理してくれます。
印刷中
印刷完了
サポート材も充填率10%したら、簡単にはがすことができました。サポート材の形等パラメータは重要です。
タイムラプスは、出来上がったmp4ファイルに設定情報を加えようと思ったのですが、動画作成ツールが言うこと聞きません。octoPiが作成した動画をそのままYoutubeにアップしました。Youtubeのリンクです。30s程と結構長いです。
3Dプリンターの経験値を上げるためにロゴ印刷しました。印刷中のtimelapse撮影も試してみました。設定さえしておけばoctoPiがいい感じにmp4の動画にしてくれます。撮影パラメータの最適化にはもう少し経験値が必要ようです。
空きのPi2B+があったので、「OctoPi」をインストールして、3Dプリンターと接続してみました。これまでスライスソフトで作成したGcodeファイルをSDカードを経由して3Dプリンターへ読み込ませていましたが、「OctoPi」を使うことによって、スライスソフトの入ったPCからPi2BのUSBを経由して直接3DプリンターへGcodeファイルを送信できます。SDカード抜き差しの煩雑さから解放されました。
PCとpi2b、3Dプリンターの接続イメージは、このような感じです。
参考リンクにあるimgファイルをダウンロードして、Raspberry Pi imagerやEtcherでSDカードに書き込めば終了です。SDカードは手持ちの8GBです。
Pi2bの電源入れると問題なく立ち上がりWWW serverが自動的に起動してます。avahiが動いているので「http://octopi.local」でアドレスは探してくれます。defaultは、user:pi、pass:raspberryでログインできます。初期設定を適当にすると以下のような画面になります。
以下の機種のfirmwareによっては、温度表示がおかしくなるようで修正手順のとおり作業が必要です。
Pi2b側はA、プリンター側はmicroBのUSBケーブルが必要です。設置場所等を考えてケーブル長などを選ぶ必要があります。プリンター側は特に設定ありません。
画面左側の「connect」ボタンで自動的につながります。Gcodeファイルのuploadやヘッドとノズルの温度状況や設定ができます。印刷中は、Gcode viewerで進捗状況や以降の印刷の状況などを確認できます。
前項にも書きましたが、スライスソフトでGcodeを作成し、画面上のuploadボタンでファイルを選択し、印刷ボタンを押せばプリンターに送られます。スライスソフトcuraならアドインを入れるとoctoPi経由で直接プリンターにGcodeを送ることも出来るようです。
手持ちのUSBカメラを接続してみました。それなりに撮影できそうです。各腫設定があるので、これは別途まとめたいと思います。
Pi2bにインストールしたoctoPiと3Dプリンターとを接続することにより、SDカードでのファイル交換が不要となり、利便性が向上しました。更にPi2BにWebカメラを接続することにより印刷中の動画撮影もできるようなので、ひきつづき機能確認していきたいと思います。
OctoPrint doesn't show a temperature graph for my Creality printer with stock firmware
3Dプリンターの静音化に向けてノズルヘッドに取り掛かります。静音ファンを埋め込むためのヘッド部品を作成し、12V化して静音化を試みます。
最近お世話になっているthingiverseから関連ファイルをダウンロードして、スライスします。
空中部分にサポートを付けないといけないですが、あまり奥まったところにつけるとはがすのが大変なので、形や充填率を調整しながら設定します。スライスソフト上は9hの大作です。
熱がかかる部分なのでPLAだと変形の恐れありとアドバイスもらいましたが、ABS樹脂はまだ試していないのでPLAで作ってみます。途中でヘッドスピードを上げながら作成時間6h49mで完成しました。
サポート薄くしたつもりですが、ガッツリと引っ付いているのでカッターやラジオペンチで少しずつはがしました。キレイに印刷は出来ています。
FANは24VなのでDC-DCコンバータを途中に入れて12Vに降圧します。
作成した部品にファンを取り付けます。40mm角12Vの静音ファンです。向き間違わないように。
ファンは12Vなので途中にDC/DCコンバーターを入れて降圧します。制御ボードからヘッドまでの既存配線は抜いて元に戻せるようにしまっておきます。新たに配線して12Vを確認しました。
ヘッドとファン交換によりもすごく静かになりました。これで、ほぼ静音化作業は終了です。
しばらく様子見ながらいろいろと印刷したいと思います。
3Dプリンターの静音化を図るためヘッドを印刷して静音ファンに交換しました。ヘッドは静かになりましたが、風量的にどうなかはしばらく様子を見てみます。ヘッド交換後、何個か印刷してみましたがPLAヘッドの変形はないようです。
今回の魔改造で電源ユニット、制御ユニットと合わせて交換できるところのファンはすべて交換しました。筐体と共振しているところもあったので、電源は外出しにしたりと一部変更しました。
当初に比べれば格段に静かになりました。いろいろと変更したので、しばらく様子を見たいと思います。魔改造の沼は、まだまだ続きます。
Ender3 V2本格静音化MOD メインボード・PSU・ホットエンド・造形物冷却用4つの騒音ファンを静音ファンに交換
3Dプリンターの静音化に向けて部品を作成したので、電源ユニットと制御ユニットの静音ファン交換や配線をします。
3Dプリンター本体下部の各ネジを外してユニットをばらします。作成した静音ファン用の部品に静音ファンを取り付けます。ネジ穴の位置はばっちりでした。
電源ユニット
制御ユニット
電源ユニットはもともと12Vなのでプラスマイナス間違わないように配線して納めれば終了です。制御ユニットは、24Vなので降圧変換器を間に入れて12Vに降圧します。
左が入力、右が出力です。特に設定はありませんが7seg上の青い部品の小さなネジが可変抵抗で細部の出力電圧を調整できます。最初は11Vだったので調整して12Vにしました。7seg左のボタンは、入力と出力電圧表示の切り替え、右のボタンは出力のon/offです。
ファンの厚み分底上げしないといけないので、四隅の両面テープで止めてあるゴムをはがして、印刷して作成した高さ38mmの足をXレールにはめます。印刷精度でレールにはまりにくいので、向きはバラバラです。10mmの板ゴムを切って準備しておいたのですが、別途作成しなくてもはがしたゴムをそのまま流用すればよかったです。
ということで2つのユニットの静音化作業は完了しました。
お試し印刷してみます。制御ユニットのファンは、動いている?くらい静かになりました。電源ユニットは、少し静かになりましたが静音とまでは程遠い感じです。配線等は当たっていないので、ファン自体がうるさいようです。しばらくこれで使ってみて、風量が十分で静かなファンを探したいと思います。
電源ユニットと制御ユニットのファンを静音化しましたが、電源ユニットのファンはまだちょっとうるさいです。引き続き静音化続きます。材料を熱しているヘッドユニットにもファンがあるので、そちらも静音化したいと思います。
Ender3 V2本格静音化MOD メインボード・PSU・ホットエンド・造形物冷却用4つの騒音ファンを静音ファンに交換
購入して初期確認まで終わった3Dプリンターですが、各種ファンがうるさいです。早速、魔改造の沼に入っていきたいと思います。
ファンは4つあります。
電源は12V、その他は24Vです。静音ファンは基本12V動作なので24Vの配線はDC-DCコンバータで12Vへ降圧します。
本体の裏側を覗くとこのようになってます。左側が電源ユニット、右側がメインボードです。それぞれ60mmのうるさいファンがついています。
更に電源ユニットを開けてみると、このような感じです。
この60mmファンを静音化します。風量を確保するためにファンを大きくして回転数の小さいものに交換します。他の部品と干渉するので電源ユニット外側に取り付けます。ファンの厚みと空気を吸い込む分、3Dプリンターの足に下駄履かさないといけません。先人が38mmと45mmの下駄ファイルを作ってくれてました。
Ender 3 v2 Feet Riser - 38mm/45mm total clearance by squirrelf
80mm角ファン用の蓋もファイルがあります。これは印刷に10数時間かかるようです。
Ender 3 V2 PSU cover with 80mm fan by mpuromaki
参考リンクに必要な材料があるのでその通りAmazonでぽち。ざっくり以下のとおりです。
電源用はデフォルト12V、その他は24Vを12Vに降圧して静音ファンを動かします。
必要な部材は、このとおり到着済みです。静音化追加費用0.8諭吉です。
DC-DC変換器は、市販のこれです。左の入力端子に直流24Vを入力して左下のmodeスイッチを押すと出力電圧を入力電圧-2V~1.25Vまで変更できて、右の端子から降圧された直流が出力されるようです。
1,000円/個程度でした。出力電圧が表示されます。変換器を入れてレールに止めるカバーを作成しました。先人が設計したstlファイルをthngiversからダウンロードして、スライスソフトでGcodeに変換して印刷すればできます。印刷の練習を兼ねて3個分作りました。スライスソフトの密着性やサポート設定を変更しながら印刷しました。積層途中が空中になる部分はサポート入れないとうまくできないし、サポート入れるとはがすのが大変です。この辺は、設定と仕上がりを見ながら経験値を積まないとよい解決策は生まれません。3Dプリンターの静音化に向けて、一番うるさい電源ユニットの配線確認や関連する部品の作成を行いました。引き続き、ファン交換作業を進めて魔改造静音化を進めたいと思います。
Ender3 V2本格静音化MOD メインボード・PSU・ホットエンド・造形物冷却用4つの騒音ファンを静音ファンに交換
机回りを整理してレイアウト変更とサイドテーブルを作成し、3Dプリンターの設置場所を確保しました。熱整形タイプの3Dプリンターを購入したのでそのまとめです。
3Dプリンターは、CREALITY Ender3V2を購入しました。お値段は、Amazonで5千円クーポンを使って3.5諭吉程でした。グレーのフィラメントも同時購入してこのような荷姿で届きます。
本体の下半分は完成した形ですが、上半分は組立が必要です。付属の組立説明書だけではたぶん完成しません。Youtubeに多数の先人が組立動画をアップされているので参考にした方がスムーズに組立ができます。約2hかかりました。工具は付属されているもので問題ありません。
組立終わったら、材料が出てくるノズルとベッドのレベルを調整します。Zero pointにノズルを持ってきて、adjust modeにするとステッピングモーターがフリーになります。ベッド下部の四隅にある調整ネジを回して、ベッドとノズルの隙間を紙1枚程度に調整します。
内包されていたSDカードにサンプルがあったので「dog」というのを印刷してみました。3cm四方程度の大きさですが50分程かかります。曲面も意外にスムーズな仕上がりです。
CADソフトと仕上がりが同じなのかテストするサンプルもあるようなので追々試していきたいと思います。
3D CADソフトでモデルを作ってSTLというファイルを吐き出します。そのファイルでは3Dプリンターは動かないので、Gcodeに変換するためにスライサーソフトで変換します。参考リンクのCuraと言うソフトを使いました。先人も多数です。
3Dプリンターを購入し、組み立てお試しプリントまでやってみました。まだまだCADの使い方やパラメータ調整等いろいろとやっていかないといけませんが、非常に楽しいアイテムです。
Ultimaker Cura:強力で使いやすい3Dプリントソフトウェア | Ultimaker
時系列DBは、3種類構築設定してpi4bのhostやdockerの状況を監視できることを確認しました。本題のマイコン監視に移ります。esp32からUDPでデータを投げるプログラムを作成し、telegrafが受け取れることを確認します。
前回docker上で作成したInfluxDB+telegrafを活用して、esp32から送信したUDPデータをtelegrafが受け取れるようにします。
以下の3行がサンプルとしてコメントアウトしてあるのでコメントアウトを外します。
[[inputs.socket_listener]]
service_address = "udp://:8094"
data_format = "influx"
containerを再起動して、telegraf.confを再度読み込ませます。
shell atachしてlogをみると
2021-07-10T06:11:53Z I! [inputs.socket_listener] Listening on udp://[::]:8094
ちゃんとudp:8094が待ち受けになってます。
telegraf containerのポートは待ち受けていますが、外部ネットワークと繋がっていません。あっポートの転送ねと。
docker-compose.ymlの修正
ports:
- "8094:8094"
これでOKかと思いましたが、これだとtcpで転送されます。うーーん。
docker-compose.ymlの再修正
ports:
- "8094:8094/udp"
サンプルソースを見ると、UDPポートを宣言して、パケット作って送るだけのようです。
エキスを抽出するとこの4行です。
line = String("temperature value=" + temperature);
// send the packet
udp.beginPacket(host, port);
udp.print(line);
udp.endPacket();
とりあえず、BME280で計測した温度を5秒おきにtelegrafが待ち受ける8094/UDPに投げるプログラムを作成し、M5stackへ書き込みました。ちゃんと動いている感じです。
VScodeのシリアルモニターです。
同じ内容をM5stackのLCDにも表示してます。
influxdbにデータが格納されたかを確認するためにchronografを使います。port:8890をたたくとブラウザーから接続できます。grafanaと同じようにdatasourceをInfluxDBを指定すると、受け取っているデータがずらっと確認できます。telegrafからのデータにちゃんと「temperature」という項目があり、dashboardを作成してデータを表示させるとこのようにグラフが作成できました。
esp32 からtelegrafへudpポートを使ってデータを送信できること確認しました。今後は、複数のデータをまとめて送信する方法を確認して行きたいと思います。
esp32からtelegrafへ
ESP32で取得したデータをgrafanaで表示する。 - Qiita
How to send sensor data to InfluxDB from an Arduino Uno | InfluxData
zabbix監視を始めて以来、時系列データの監視にのめり込み、Prometheus環境の構築でニンマリ。これは、docker-composeで構築できたので、そう労力はかからず。M5stackの内部情報の監視は出来たものの、mqttプログラムとの同居が難しい感じ。ということで、M5stackの内部情報をpushで受け取ってくれるものを探していると、InfluxDBを使うとできそうだと先人の知恵。
今回もdocker-composeでお気軽構築を目指したいと思います。
この図のようにdockerに頼り切って構成したいと思います。
pi_zeroには、dcokerとdocler-composeは、インストール済みです。pi_zeroは、VScodeでremote接続できないので、手動でいきます。
毎度のことですがdocker問屋は、なかなか一発で卸してくれません。在庫がないとか、発注伝票が違うとかしょっちゅうです。pi_zeroの公式armv6イメージはカタログにないそうで。あーーそうですか。自作物がアップロードされていましたが動きません。
pi_zeroはあきらめて、pi4bで確認します。pi4bには、Prometheusが動いていますが同居してもまだリソースは大丈夫そうです。
armv6イメージ無い問題のためarmv7環境のpi4bに構築します。ポートが当たらないように、新たな構成図です。
参考リンクからコピーして中身を修正します。
修正したものは、参考リンクへ張っておきます。
${HOME}/docker/influxdbで、設定ファイルの作成が必要です。
# docker run --rm arm32v7/influxdb influxd config > influxdb.conf
# docker run --rm arm32v7/telegraf telegraf config > telegraf.conf
mysqlと同様にDBの作成等面倒な作業が必要です。RDBとほぼ同じなSQL作業です。user追加等をいろいろと先人の知恵を拝借しました。この辺は、Prometheusの方がお気軽な感じです。
これまでは、httpのpostでDBの作成やuser管理が出来たようですが、セキュリティな観点からか専用のchronografと言うパッケージから管理ができるようです。DBの視覚化と管理ツールです。grafanaほどの派手さはありません。dashboardもちまちま設定しないといけないのでちょっと面倒です。
grafana+influxDB+telegrafと検索すると、サンプルは沢山あります。DLが多いdashboard(ID:1443)をimportするとこのような画面になります。
時系列DBのInfluxDBと関連ソフトウェアtelegraf,chronografを構築設定しました。pi4bの監視ができていることまでは確認出来ました。telegrafの使い方をもう少し勉強してUDPデータを受け取れるように変更し、M5stackの監視が出来るのか確認していきたいと思います。
raspi docker influxDB
Running influxdb on Raspberry Pi using Docker compose
esp32 telegraf arduino code
How to send sensor data to InfluxDB from an Arduino Uno | InfluxData
telegraf UDP listener
Telegraf Socket Listener Input Plugin | Blog | InfluxData
influxDB+telegraf+chronograf docker-compse.yml (.envが必要です)
version: "3"zabbixの構築とagentをインストールしてwin10の監視、pingを使ってマイコンの監視をやってきました。見た目も重要なので、ダッシュボードを派手にするためにgrafanaを使ってみます。
インストールは、参考リンクのとおりで問題ありません。
Pizero + debian
zabbix-server 4.0
参考リンクのとおり、以下の手順で問題ありません。
sudo apt-get install -y apt-transport-https
sudo apt-get install -y software-properties-common wget
wget -q -O - <https://packages.grafana.com/gpg.key> | sudo apt-key add -
echo "deb <https://packages.grafana.com/enterprise/deb> stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install grafana-enterprise
参考リンクは、64bit版のようです。これはインストールできますが、動きません。
ARMv6用のパッケージは、こちらでした。
Ubuntu and Debian(ARMv6)SHA256: d3a688fe3f7ec68bb5ca33c88af655ab53254e4fddab649a9b6f3f758b0a7341
$sudo apt-get install -y adduser libfontconfig1
$wget <https://dl.grafana.com/oss/release/grafana-rpi_8.0.3_armhf.deb>
$sudo dpkg -i grafana-rpi_8.0.3_armhf.deb
これで、deamonをreloadして、再起動すると動くはず。
きたーーーー。
デフォルトのID/PASSは、admin/adminだそうです。
zabbixをデータソースに使えるプラグインがあるそうです。それもインストールします。
#zabbixプラグインのインストール
grafana-cli plugins install alexanderzobnin-zabbix-app
#grafanaの再起動
systemctl restart grafana-server
datasourceをzibbix-serverにして、適当なdashboardをimportするとあっという間に派手な監視画面が表示できます。
視聴化の代表となっているgrafanaを使って、zabbix-serverの状況を派手に可視化する事を試してみました。一昔前なら、ライセンス料お高めのソフトを購入しないとここまでは出来なかったと思います。OSSでここまで出来るとはおどろきです。
garafanaインストール
zabbix pluginのインストール
Grafanaを使ってZabbixの監視画面を作成する - あきろぐ
zabbixの構築は前回まとめました。今回は、serverの設定とagentの導入です。
初期画面からいい感じで進んでいましたが、早速DBの設定でつまづきます。
「Cannot connect to the database.」とのこと。IDやパスワードなどはあってるのですが。
/var/log/apache2
/var/log/mysql
/var/log/zabbix-server
それぞれの中身を見ながら原因探求です。
phpのmysql関連のライブラリーが入ってないようです。
/usr/share/doc/zabbix-frontend-php/README.Debianにこのように書いてありました。
Configuring the Zabbix frontend
-------------------------------
Please point your Browser to <http://yourserver/zabbix/> in order to configure
your zabbix-frontend. The default username is "Admin" with password
"zabbix". To prevent other users from viewing your data, change this
password immediately after logging in.
If you are using PostgreSQL as a database backend please make sure that
the 'php-pgsql' package is installed. Similarly 'php-mysql' is needed if
you are using MySQL database backend.
$sudo apt-get install php-mysql
これで再起動するとログイン画面までたどり着きました。
user:Admin, Pass:zabbixでログインできます。ようやくここまでたどり着きました。
今度はswapが足りないようです。
pi@pizero:/etc $ swapon -s
Filename Type Size Used Priority
/var/swap file 102396 102372 -2
参考リンクのとおり100Mから512Mへ増やしました。
pi@pizero:/etc $ swapon -s
Filename Type Size Used Priority
/var/swap file 524284 0 -2
試しにWin10にagentをインストールしてみます。参考リンクのとおりにやれば問題ありません。Win10のfirewallはポート10050と10051が解放されていなので設定が必要です。
あとは、zabbixのダッシュボードに監視対象ホストを追加します。agentからは各種情報がレポートされるのでどの値をダッシュボードに表示させるのか選ぶ必要があります。
非力なOSの無いプロセス1個のマイコンの監視はどうするか。先人の知恵を探っていると、
いずれもプログラム内にコードを埋め込んで、一定時間毎にserverにデータを送信する仕組みです。これでもいいのですが、マイコン内の情報を吸い出せるわけではないので、自分で体温計で熱を測ってメールで医者に送って記録してもらう感じです。
医者が聴診器を当ててもしもしする方法としては、pingによる応答を記録するような監視が可能です。というか、これしかないです。esp32は、WiFi接続してるとICMPにも応答します。ただし、消費電力下げるためにDeepSleepしてるとWiFi機能もオフになるので反応しません。引き続き試しながら進めていきたいと思います。
今日のまとめ
先週構築したzabbix serverの設定とWin10にagentをインストールして、監視の状況を確認しました。引き続きマイコンの監視をどうするのか試行錯誤進めていきたいと思います。
swap領域の拡張
Raspberry Pi のスワップ領域拡張 - Qiita
esp32のzabbix-agent
Win10にzabbix-agentをインストールする
Windows10にZabbix Agentをインストールする
Win10のfiwewallの設定
Zabbix による Windows マシンのエージェント監視 ~ 1. エージェントのインストール ~
zabbix-serverの監視対象の追加
M5stackのmqtt送信を試験していますが、不定期で送信停止状態になってることがあります。何が原因なのか調べるためにzabbixで監視したいというのがとっかかりです。ちゃちゃっとdockerで構築のつもりが...
Pizeroは、半年ほど温度湿度センサーの値をambientへ送り続ける役目で連続運用してました。たまにapt updateしましたが、基本放置。久しぶりにupdateしてdockerをインストールしようとするも、errorが大盛です。やりたくないけど、SDカードをフォーマットして再構築です。
Pizeroは、ご存じのとおりUSBがマイクロ、HDMIもminiとアダプターが必要なので、出来ればキーボードや画面を接続せずに再設定したいところ。
「Pizero 配線レスインストール」など、いい感じの先人はいますが、簡単にはいかず。結局、キーボードと画面接続して、再設定完了です。
Pizeroは、debian 32-bitです。dockerのインストールは簡単です。参考リンクにあるスクリプトを動かせば、以下のとおり設定完了です。時間もそうかかりません。
Client: Docker Engine - Community Version: 20.10.7 API version: 1.41 Go version: go1.13.15 Git commit: f0df350 Built: Wed Jun 2 11:57:27 2021 OS/Arch: linux/arm Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.7 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: b0f5bc3 Built: Wed Jun 2 11:55:25 2021 OS/Arch: linux/arm Experimental: false containerd: Version: 1.4.6 GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d runc: Version: 1.0.0-rc95 GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7 docker-init: Version: 0.19.0 GitCommit: de40ad0
docker-composeは、$sudo apt-get install docker-composeです。
pi@raspberrypi:~/docker $ docker-compose -v docker-compose version 1.21.0, build unknown
ユーザーpiのpermission問題等を片付けて、dockerの動作確認です。
おーー。ちゃんと動いてます。pi@pizero:~/docker $ docker run hello-world Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (arm32v5) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: <https://hub.docker.com/> For more examples and ideas, visit: <https://docs.docker.com/get-started/>
この調子でzabbixもちゃちゃっといきましょう。参考リンクのとおり進めます。
pi@pizero:~ $ docker run --name zabbix-appliance -t -p 10051:10051 -p 80:80 -p 443:443 -d zabbix/zabbix-appliance:latest WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm/v6) and no specific platform was requested c5e82cf34de3b3d1202c469ca27acff11d01836c8ea234974acbe1f51fa3474b
そういうことね、64bit用でしたか。残念。はぁ~。
気を取り直してdockerに固執せず、pkgをインストールしてみます。必要なのは、以下のの2つのようです。
pizeroの状況もモニタするために、以下もインストールします。
pkgをインストールしただけ動きません。参考リンクのとおりmysqlに手動でDBの設定が必要です。MySQLにZabbixデータベースを作成します。
# mysql -uroot
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
mysql> exit
初期スキーマとデータをインポートします。
# cd /usr/share/zabbix-server-mysql/ # mysql -uroot zabbix < schema.sql # mysql -uroot zabbix < images.sql # mysql -uroot zabbix < data.sql
順調かと思ってるとここで止まります。
pi@pizero:~/docker/zabbix $ mysql -uroot zabbix < schema.sql ERROR 1118 (42000) at line 1278: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
mysql(mariaDB)のバージョンによって解決方法が違うようです。schema.sqlの先頭に以下の2行を入れると解決できました。
SET GLOBAL innodb_default_row_format='dynamic'; SET SESSION innodb_strict_mode=OFF;
ここまでたどり着くのは長かったです。mysqlもはまりどころ満載でした。無事DBは構成できました。あと少しです。このモジュールを入れます。
$sudo apt-get install libapache2-mod-php
このコマンドを打つと、zabbix-frontend-php関連のconfをapache2のモジュールフォルダーにリンクを張ってくれます。
$sudo a2enconf zabbix-frontend-php
ブラウザーからhttp://IP_address/zabbixをたたくと、このように設定画面に移行します。
dockerで15分と妄想してましたが、がっつり週末をかかりました。やってみるといろいと勉強にはなります。このように考えないと心が折れそうです。これからZabbixの使い方を勉強します。
Pizeroは、シングルコアでarmv6と世代が古いためVScodeが使えません。最近はVScodeと拡張機能におんぶにだっこでしたが、久しぶりのCLIは手間と時間がかかります。昔はこれしかなかったのでカチカチコマンド叩いてました。emacs+lispに乗り換えた時、ちょっと便利になったと思いましがVScodeはそれ以上です。
Pizeroにzabbix-serverをインストールしました。dockerでちゃちゃっとはいかず、pkgを入れてDBの構成や細かな設定が必要でした。先人の知恵は、zabbix,DB,phpのバージョンが異なるネタが各種あるので、選別する必要があります。それがわかるまで結構時間を要しました。次は、使い方を勉強したいと思います。
pizero doker
Raspberry Pi Zero WでDockerを使う - みーのぺーじ
zibbix
DockerのZabbixをRaspberry Pi上で運用する
Zabbix 5.0 LTSをコマンド2つで構築する - Opensourcetechブログ
zabbixをpkgインストール
MQTT(Message Queuing Teremetory Transport)のお勉強のためローカル環境で、publisher/broker/subscriberを構成して、メッセージの送受信確認をやってみました。
Win10上のWSL2(debian)とpi4b(debian)を同一ネットワーク上に接続して環境を構成した。pub/subのプログラムはお手軽さを優先してpythonにしました。
brokerには、mosquittoを使います。debianだとsudo apt-get install mosquittoでインストールとサービス起動ができます。brokerの仕込みはこれだけです。ポート1883で動いてます。
Win10のwsl2はdebianです。pythonのmqttライブラリは、paho-mqttというのがメジャーなようです。pip3 install paho-mqttでインストールできます。
mosquittoがサービスとして動いていれば、他にやることはありません。ポート1883を待ち受けて仕事してくれます。
pi@pi4b:~ $ systemctl status mosquitto.service
mosquitto.service - Mosquitto MQTT v3.1/v3.1.1 Broker
Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset
Active: active (running) since Thu 2021-06-17 08:59:19 JST; 1h 21min ago
Docs: man:mosquitto.conf(5)
man:mosquitto(8)
Main PID: 2101 (mosquitto)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/mosquitto.service
└─2101 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
6月 17 08:59:19 pi4b systemd[1]: Starting Mosquitto MQTT v3.1/v3.1.1 Broker...
6月 17 08:59:19 pi4b systemd[1]: Started Mosquitto MQTT v3.1/v3.1.1 Broker.
publisherとsubscriberのpythonコードをそれぞれ作成します。データを入れる箱をtopicsと言うらしいですが"test/001"という名前にしておきます。
送信データは、提携メッセージに数字を1つづつ増加させたものを引っ付けてpubします。
publisher側の状況
publish: 3146
publish: 3147
publish: 3148
publish: 3149
publish: 3150
publish: 3151
publish: 3152
publish: 3153
publish: 3154
publish: 3155
subscriber側の状況
Received message 'b'Hello, from paho_sub!3138'' on topic 'test/001' with QoS 0
Received message 'b'Hello, from paho_sub!3139'' on topic 'test/001' with QoS 0
Received message 'b'Hello, from paho_sub!3140'' on topic 'test/001' with QoS 0
Received message 'b'Hello, from paho_sub!3141'' on topic 'test/001' with QoS 0
Received message 'b'Hello, from paho_sub!3142'' on topic 'test/001' with QoS 0
Received message 'b'Hello, from paho_sub!3143'' on topic 'test/001' with QoS 0
Received message 'b'Hello, from paho_sub!3144'' on topic 'test/001' with QoS 0
Received message 'b'Hello, from paho_sub!3145'' on topic 'test/001' with QoS 0
Received message 'b'Hello, from paho_sub!3146'' on topic 'test/001' with QoS 0
Received message 'b'Hello, from paho_sub!3147'' on topic 'test/001' with QoS 0
subscriberを増やしても、publisherは影響を受けないというのがmqttの特徴だそうです。subscribe.pyを2つ動かすと確かに同じメッセージを受け取ることができます。
VScode上にbashを2つ起動して、sub.pyを2つ動かした状況です。ちょっと蛇足ですが。androidアプリにも「mqtt client」というのがあるので試しにインストールしてみました。WiFiオンにしてローカルネットワークに接続し、brokerのIPアドレスとtopics名"test/001"を設定するとWin10のdebianからpublishされた文字列がsubscribeできます。またこの端末から任意の文字列をpublishも出来ることを確認しました。へーーー。
subscribeのスクリーンショットです。MQTTのお勉強のため、片方向の送受信確認をしました。送受信データを使ってモータ制御などにも応用できるようです。倒立ロボのパラメータ送信や状態確認に使えると嬉しいのですが。更にマイコンからの確認や送受信を往復できるように引き続き詰めていきたいと思います。
#
# pahoを使ったpublisher
#
import paho.mqtt.client as mqtt # MQTTのライブラリをインポート
from time import sleep # 3秒間のウェイトのために使う
BROKER_HOST = "x.x.x.x" # brokerのIPアドレス
# ブローカーに接続できたときの処理
def on_connect(client, userdata, flag, rc):
print("Connected with result code " + str(rc))
# ブローカーが切断したときの処理
def on_disconnect(client, userdata, flag, rc):
if rc != 0:
print("Unexpected disconnection.")
# publishが完了したときの処理
def on_publish(client, userdata, mid):
print("publish: {0}".format(mid))
# メイン関数 この関数は末尾のif文から呼び出される
def main():
client = mqtt.Client() # クラスのインスタンス(実体)の作成
client.on_connect = on_connect # 接続時のコールバック関数を登録
client.on_disconnect = on_disconnect # 切断時のコールバックを登録
client.on_publish = on_publish # メッセージ送信時のコールバック
client.connect(BROKER_HOST, 1883, 60) # 接続先とポート番号
# 通信処理スタート
client.loop_start() # subはloop_forever()だが,pubはloop_start()で起動だけさせる
# 永久に繰り返す
count = 1
while count > 0:
client.publish("test/001","Hello, from paho_sub!" + str(count)) # トピック名とメッセージを決めて送信
count+=1
sleep(2) # 3秒待つ
if __name__ == '__main__': # importされないときだけmain()を呼ぶ
main() # メイン関数を呼び出す-------
# # pahoを使ったsubscriber # import paho.mqtt.client as mqtt # MQTTのライブラリをインポート BROKER_HOST = "x.x.x.x"# brokerのIPアドレス# ブローカーに接続できたときの処理 def on_connect(client, userdata, flag, rc): print("Connected with result code " + str(rc)) # 接続できた旨表示 client.subscribe("test/001") # subするトピックを設定 # ブローカーが切断したときの処理 def on_disconnect(client, userdata, flag, rc): if rc != 0: print("Unexpected disconnection.") # メッセージが届いたときの処理 def on_message(client, userdata, msg): # msg.topicにトピック名が,msg.payloadに届いたデータ本体が入っている print("Received message '" + str(msg.payload) + "' on topic '" + msg.topic + "' with QoS " + str(msg.qos)) # MQTTの接続設定 client = mqtt.Client() # クラスのインスタンス(実体)の作成 client.on_connect = on_connect # 接続時のコールバック関数を登録 client.on_disconnect = on_disconnect # 切断時のコールバックを登録 client.on_message = on_message # メッセージ到着時のコールバック client.connect(BROKER_HOST, 1883, 60) # 接続先とポート番号 client.loop_forever() # 永久ループして待ち続ける
中華製のCO2センサーをM5stackを使って試してみます。先人はいるので、ちゃちゃっといけそうな感じです。
このCO2センサーは、NDIR(非分散赤外線)方式のガスセンサーです。CO2は、4.26μmの波長を吸収するそうで、その特性を使ったセンサーです。
センサー出力は、I2CではなくUARTです。また、電源電圧5V+-0.1VとシビアなのでDC-DCコンバータから給電したほうがいいようです。測定範囲は、データシートによると400-5000ppmとのこと、2020年の地球大気のCO2濃度は410ppm前後なので、それなりに測定できそうです。しばらく動作確認して問題なければ、ambientに送信して長期的に観測をしたいと思います。
arduinoと先人のライブラリーを活用します。M5stackの動作確認に使用したコードは、最後に貼っておきます。今回はM5stackとcommuモジュールです。UARTは、GPIO1とGPIO3に接続されます。回路図で確認しました。
M5stack側がオス、センサー側もオスなのでメスーメスの配線があれば直接接続できます。手元にある配線材がオスーオスとオスーメスなので、ブレッドボードを経由して配線します。
電源5VとGND、UARTのTxとRxの4線です。電源入れると1分程センサーは準備が必要なようです。
このように値が読み取れました。息を吹きかけると2000ppm程度に値が変化するので、それなりに動作しているようです。しばらく様子見て、esp32のセンサー環境に組込み値をambientへ送信して長期観測したいと思います。
中華製CO2センサーMH-Z19CをM5stackに接続して動作確認しました。値の正確性はわかりませんが、それなりの値で計測できることを確認しました。
このページは、以下に引っ越しました。内容も逐次移行中です。引き続きよろしくお願いします。 https://hkaji.github.io →こちら