エントリー

2023年08月の記事は以下のとおりです。

3Dプリンタカバーなど(続)

マザーボードを変更する前にやっておきたいことがようやく終わりそう

IMG_20230818_140040.jpg

エンクロージャー

上の蓋と手前に扉を作製

IMG_20230811_120803.jpgIMG_20230811_120817.jpg

全てはめ込み式にしたので取り外し可能

上部から覗きこめるように透明板(透明写真立ての板を使用)を付けたが前面からも見えた方が便利そうなので後で扉にも付けた

IMG_20230811_120826.jpgIMG_20230811_162923.jpg

扉に使用するための丁番が(ダイキ)だと高価だったので3DプリントしようとしたがCADで上手く作れない

困っていたらコーナンで嬉しい安価版を見つけた

IMG_20230823_131632.jpg

扉留めには磁石を埋め込んだ

フィラメントガイドも隙間ができないように作り直している

エンクロージャは主にABSの積層割れ対策だが,消費電力の改善や冬場の温度保護にもなるだろう

エアフロー用FAN

エアフロー用FANは上部のバーに付け,コントローラをラズパイボックスの横に付けて24Vを元電源から引いた(コントローラはエンクロージャ内に設置予定だったが熱のため変更)

IMG_20230820_135100.jpgIMG_20230822_132146.jpg

温度監視

エンクロージャの上部と下部で温度監視するためBMP280を2個I2C接続で使用

コントロールはラズパイで行うがOctoPrintは利用できないので,映像を含めてラズパイで監視システムを組み込むことにした

(BMP280)

I2C接続した2つのBMP280から温度を取得するためpythonでプログラミングするのだがBMP280のライブラリが無いのでArduino版を参考にして作る( 写真はラズパイ3Bを使ってテスト中)

IMG_20230812_132613.jpg

しかし何故か温度が5~6℃高くなる

Arduinoで確認すると正常なのでBMP280の異常ではない

後で見つけたBME280のスイッチサイエンス版(1接続用なので利用できない)でも同様で温度に誤差がある

読み込んだレジスタ値を(同時ではないが)Arduinoで読んだ値と照合したところ異なる部分があるのでBullseyeのI/O Ctrl部かI2Cの不具合も考えられる

原因不明なため温度の元になる値を5℃分強制的に下げることにした(気圧値にも影響あるため元になる値を補正)

(配信の実装方法)

取得温度の表示はリアルタイムにするため「websocket」を利用(websocketは初なのでこちらが参考になった)

映像は「OpenCV+websocket」「RTSP」「GStreamer」を試行してみたところ正常動作しないので「MJPG-Streamer」を使った(Bullseyeなのでこちらを参考にすると良い)

(OS設定)

ラズパイZERO WHで使用するので32ビット版のBullseyeを使う

2023-05-03-raspios-bullseye-armhf-lite.img.xz

後で再セットアップした際,最新のラズパイイメージャーが正常に動作したので利用したが直接書き込んだ場合以下の問題あることが判った

SSHを有効にするため「/boot/ssh」(拡張子なし)を作成するが,SSHでログインできるUIDが無い

→ 最初の起動でパーティションを拡張,再起動後,consoleでユーザとパスワードの設定待ちとなっている

ログインできたら定番の設定

$ sudo raspi-config

host-name → 当ネットワークの命名規約
LANG → UTF8追加
TimeZone → ASIA,Tokyo

I2C Enable
Serial console Desable + Serial Enable(Bullseyeで扱いに変更あり

$ sudo apt update --allow-releaseinfo-change
$ sudo apt update
$ sudo apt upgrade
$ shutdown -r now

(注)IPアドレスはDHCPサーバにて管理

pythonとGPIO

$ sudo systemctl disable hciuart. → (Bluetoothで「PL011」を使う設定をUARTで使うようにする)

(pythonセットアップ)
$ sudo apt install git
$ sudo apt install python-dev python3-pip

(pipの確認)
$ python -m pip -V
/usr/bin/python: No module named pip

(pipのアップグレード)
$ sudo pip install --upgrade pip
...
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 20.3.4
...
Successfully installed pip-23.2.1

$ pip -V
pip 23.2.1 from /usr/local/lib/python3.9/dist-packages/pip (python 3.9)

(GPIO出力)
$ sudo pip install wiringpi
...
Successfully built wiringpi
Installing collected packages: wiringpi
Successfully installed wiringpi-2.60.1
...

(websocketライブラリ)
$ sudo pip install tornado
Installing collected packages: tornado
Successfully installed tornado-6.3.3
...

(smbus2を使用可能にする)
$ sudo pip install smbus2
...
Installing collected packages: smbus2
Successfully installed smbus2-0.4.2
...

$ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 77

MJPG-Streamer(映像配信)セットアップ

$ sudo apt update
$ sudo apt install -y git cmake libjpeg-dev
$ cd
$ git clone https://github.com/neuralassembly/mjpg-streamer.git
$ cd mjpg-streamer/mjpg-streamer-experimental
$ make
$ sudo make install

ラズパイ専用カメラモジュールを使う場合 (input_raspicam.so)
$ cd $HOME/mjpg-streamer/mjpg-streamer-experimental
$ mjpg_streamer -o 'output_http.so -w ./www -p 8080' -i 'input_raspicam.so -x 1920 -y 1080 -fps 30 -q 10'

USBカメラを使う場合 (input_uvc.so)
$ cd $HOME/mjpg-streamer/mjpg-streamer-experimental
$ mjpg_streamer -o 'output_http.so -w ./www -p 8080' -i 'input_uvc.so -d /dev/video0 -r 640x480 -fps 30 -q 10'

-wは//(root)のコンテンツを指定する場合
-pのポート指定は8080でないと動作しない(コンパイルで固定になっている部分があるのか)
ラズパイ専用カメラモジュールはUSBカメラのライブラリでも動作する
LD_LIBRARY_PATH=/usr/local/lib/mjpg-streamerの指定無しでも動作した(上のコマンドはライブラリのあるディレクトリで起動している)

(コード)

温度表示サーバ(server.py):websocket(tornado)用のサーバサイドpython

映像配信サーバ(mjpg-streamer.sh):MJPG-Streamerサーバ起動用のプロシージャ

監視画面用HTML(main.html):温度表示サーバと組みとなって表示(CSSは未公開)

BMP280温度(newBMP280_2.py):server.pyから使用されるBMP280温度取得python

CPU温度(cputemp.py):server.pyから使用されるCPU温度取得python

(監視画面)

WS202324.png

エンクロージャ内は暗いので照明が必要か

(追加:2023.08.24)

照明を追加12VのLEDモジュールを2個直列して24Vで使用(バーに引掛けて設置)

IMG_20230824_173416.jpg

見える程度にはなったのでとりあえずは良しとする

WS20230824_02.png

外気31℃時,PLAの印刷にて(ビルドプレート50℃設定)上部がMax.42.1℃,下部がMax.39.9℃まで達した

(設置)

I2C用のケーブルをどうするか悩んでいたところ丁度コネクタが異常になったUSBケーブルが出来たので利用

IMG_20230816_111914.jpg

設置用のパーツ(センサー台,ケーブル止め)は3DプリントしてXH端子を付けて完成

IMG_20230817_145015.jpgIMG_20230818_162108.jpg

レールのTスロットに差し込んで回せば止まるように作ってある

IMG_20230820_135108.jpgIMG_20230820_135121.jpg

接続元は基板の空きがなかったため2段にした(いいかげん作り直せばいいのだがw)

IMG_20230822_132120.jpg

排気(未)

冬までには追加する予定

3Dプリンタカバーのエアフロー

3Dプリンタのエンクロージャーはビルドプレート上の熱を抑え込むようにしないとならない

何もしないカバーを掛けただけだと上部だけが暖かくなってしまうのでFANを使って熱を循環させる

IMG_20230809_124005.jpg

FANは上部に付けてやれば(設置場所も悩んだけど)良いのだけどFANの効力がどんなものか判らない

なら・・・ファンコンを付けちゃおうってことで作製,FANは交換前に3Dプリンタに付いていた24V版を再利用することにした

(回路図)

ファンコン_回路図.png

  • コントロールはATTINY13aで十分
  • 風量はソフトウェアPWMで変更(FANが24V0.05Aなので2N7000)
  • 無断変速にする程でもないのでタクトSWで切替
  • LEDは後で付けたので回路図にはない(PB3に10mAで接続)

(スケッチ)

fanCtrl.txt

電源ONデフォルトを7:3のPWMにした(4段階可変)

ブレッドボードで確認

IMG_20230808_194706.jpg

設置する場所が横平棒になるので横長にしてみた(ボードはパーツ配置後切断)

IMG_20230809_121938.jpg

FANは2台で最終動作確認

IMG_20230809_122930.jpg

デフォルトの回転数で0.076A

IMG_20230809_123037.jpg

最高回転数で0.112Aであった(FAN0.05×2+LED0.01A+AVR)(注)LEDとAVRは5V

IMG_20230809_123104.jpg

エンクロージャーへの設置は次回

(排気)

完全密閉ではないがエンクロージャー内の温度監視しながら外へホース経由で排気しようと考えている

IMG_20230809_124006.jpg

ESP32-CAMの利用方法を模索

ESP32-CAMを動作させたのだけど,3セット(Amazon)もあるので利用できないか考えるため調べてみた

IMG_20230731_115244.jpg

ハードウェア
  • 既にモジュール化されているので大きな変更はできない
  • 接続I/Oはカメラ,microSDスロット,高輝度LEDである
  • CPUはESP32SでEPS32と同じと考えてよく,おそらくI2CとSPIには不具合があるかと思われる
  • GPIOはあるが全て使用済なので利用は困難でSPIに接続されている4ピンをSPI未使用にする(microSDは不可となる)ことでOUTPUTピンとして利用できそう
  • モジュールから高輝度LED以外は取り外すことは困難
ソフトウェア

モジュール構成からカメラ機能を主とした利用形態しかなく追加できるI/Oもかなり限定されそうだ

カメラ機能が主なので元となるスケッチはサンプルのCameraWebServerが優秀で良いためプログラムを調べてみるとHTML(camera_index.h)がgzip形式になっていることが判る

HTMLソースが編集できないと画面の変更追加ができないのでネットで情報を得てみると最終的にgzip形式に変換する方法は判った

しかしわざわざgzip形式にすることもないのでそのまま編集できるように改造

①まずはサンプルを動作させてブラウザでHTMLソースを退避しヘッダーファイル(index_ov2640.h等,以下のように)にする

const uint8_t index_ov2640_html[] = R"=====(<!doctype html>
<html>
<head>
<meta charset="utf-8">


(省略)

</body>
</html>)=====";

size_t index_ov2640_html_len = sizeof(index_ov2640_html)-1;

橙色部分が前後に追加したテキスト

index_ov2640なのはスケッチで使用されているESP32-CAMのカメラタイプ名だから

②app_httpd.cppのcamera_index.hを外しindex_ov2640.hを使用

③同じくapp_httpd.cppのesp_err_t index_handler()を編集

(旧)
static esp_err_t index_handler(httpd_req_t *req)
{
httpd_resp_set_type(req, "text/html");
httpd_resp_set_hdr(req, "Content-Encoding", "gzip");
sensor_t *s = esp_camera_sensor_get();
if (s != NULL) {
if (s->id.PID == OV3660_PID) {
return httpd_resp_send(req, (const char *)index_ov3660_html_gz, index_ov3660_html_gz_len);
} else if (s->id.PID == OV5640_PID) {
return httpd_resp_send(req, (const char *)index_ov5640_html_gz, index_ov5640_html_gz_len);
} else {
return httpd_resp_send(req, (const char *)index_ov2640_html_gz, index_ov2640_html_gz_len);
}
} else {
log_e("Camera sensor not found");
return httpd_resp_send_500(req);
}
}

(新)
static esp_err_t index_handler(httpd_req_t *req)
{
httpd_resp_set_type(req, "text/html");
httpd_resp_set_hdr(req, "Content-Encoding", "identity");
sensor_t *s = esp_camera_sensor_get();
if (s != NULL && s->id.PID == OV2640_PID) {
return httpd_resp_send(req, (const char *)index_ov2640_html, index_ov2640_html_len);
}
log_e("Camera sensor not found");
return httpd_resp_send_500(req);
}

汎用ではないのでESP32-CAMのindex_ov2640_htmlだけとなる

まずはUI部の対策のみ施した

温度センサーの確認

3Dプリンタの温度管理のため温度センサーの準備をしている

BMP280のI2Cアドレス

複数個所の温度を取得しようとした時,複数のセンサを繋がないとならないがBMP280なら2つのアドレスが使えるってことで確認

仕様ではSDO端子をVccにつなぐと0x77で、GNDに落とすと0x76になる

良い具合に気象観測用で不良で交換したBMP280がある(6個あって完全に使えないのが2個で1個は実験で破壊したから3個)

SDOピンにプルダウンされている10kΩのチップ抵抗を外して,隣のプルアップされているピンに接続

IMG_20230804_153329.jpg

3.3VロジックのArduino miniでI2Cで接続してアドレス確認と温度取得確認

IMG_20230804_153235.jpg

BMP280をSPI接続で使用

ESP32-CAMではI2Cが使えないのでSPIで接続できるようにする

10kΩのチップ抵抗を全て外せばSPIで接続可能

IMG_20230805_144647.jpg

結果はESP32-CAMではSPIのセレクトラインであるCSを割り当てられるピンがないため失敗

IMG_20230805_144925.jpg

SPIに改造したBMP280の動作は未確認

ESP32-CAMでDHT22(AM2302)を確認

SPIの4ピンはSPIで使用しないならI/Oピンで使用できるのではということでAM2302を接続してみる

IMG_20230805_175811.jpg

通信に1ピンしか使用しない(専用I/F)ので13ピンで温度・湿度・気圧が取得できることを確認(12ピンは使用不可のようで,接続しておくとスケッチ書き込みでエラーとなり,外して無理やり書き込んでもスケッチは動作しない)

IMG_20230805_175742.jpg

ページ移動

  • ページ
  • 1
  • 2

ユーティリティ

検索

エントリー検索フォーム
キーワード

過去ログ

Feed