安定稼働する定点カメラの作り方(M5CameraとNASを使用) その1

はじめに

お久しぶりです。寒い日が続きますが、お元気でお過ごしでしょうか?
今年の冬はニンニクを栽培しようとチャレンジしています。 実は一昨年ころたん(メロン)を育てた時にRaspberry Piを用いて定点撮影していたのですが、赤外線カメラだったばっかりに写真の色が変だったので、 今回は普通のカメラで定点撮影をしたくなりました。 そこでM5Cameraを用いて定点カメラを作り、実際に4か月以上連続稼働させて問題がなかったので共有します。

目次

ニンニク撮影システムの全体像と使用したもの

M5Cameraを使ってニンニクを撮影し、撮影した画像をNAS上に格納するシステムを作りました。
全体の概要図は以下となります。※WiFiはあくまでも家庭内で閉じています。 f:id:GypsophilaRupi:20220205180035p:plain

M5Cameraはカメラ付きマイコン(ESP32)です。 ArduinoIDEでM5Cameraにプログラムを書き込むことで、撮った写真をネットワーク経由で転送が可能となります。

www.switch-science.com

NASとはネットワークにアクセスできるハードウェアです。そのため、M5Cameraから転送された画像を格納することができます。
加えてNAS上のタスクマネージャーを使えば定期的にNAS上のPython起動することができます。NAS上のPythonは、M5Cameraに写真を撮る指令を送り、撮った写真をNAS上に格納するソフトウェアにしました。
ちなみに今回使ったNASはSynologyのNAS DS118です。

DS118はHDDが1つしかささらないので、HDD交換のことを考えると、HDDが2つささるDS218方がお勧めです。(買いなおしたいという声がどこからともなく聞こえてきます笑)
ただし、他のNASでもPythonが走れば何でもいいと思います。

やったこと

M5Cameraをサーバーにする

M5Cameraをサーバーにすべく、Arduinoでプログラムを編集・書き込みます。

Arduinoサンプルプログラムの準備
  1. Arduino IDEのボード選択
    ツールからArduino Wrover Moduleを選択します。 f:id:GypsophilaRupi:20211205230302p:plain

  2. Arduino サンプルプログラムの入手
    今回編集するサンプルプログラムはCameraWebServerです。ファイルースケッチ例ーESP32ーCameraから入手します。 f:id:GypsophilaRupi:20220205183618p:plain

Arduinoサンプルプログラムの編集

サンプルプログラム(CameraWebServer)からの変更点は以下です。 左がサンプルプログラムで右が編集後で、色がついているところが変更になっているところです。

  1. 環境設定
    4.のホスト名を指定するためにincludeを追加します。 M5Cameraを使うので、下図の通り、defineの内容を変更します。
    また、WifiのID等の変更します。 f:id:GypsophilaRupi:20220123213727p:plain

  2. 写真サイズの変更
    写真サイズをUXGA(1600×1200)に変更します。 f:id:GypsophilaRupi:20220123214452p:plain

  3. Wifiがつながらない間は10秒に1回再起動するように設定
    M5CameraをWifiを確実に繋げるために、Wifiがつながらない間はM5Cameraをソフト的に再起動をし続ける設定にしています。
    f:id:GypsophilaRupi:20220129195101p:plain

  4. ESP32のホスト名の指定
    M5StackカメラはWifiを繋ぎなおす度にIPアドレスが変わるので、ホスト名「http://esp32.local/capture」で写真を撮れるようにしました。
    ただまだこのURLでNASからはアクセスができないので、次回以降の記事でこの辺を改良出来たらと思います。 f:id:GypsophilaRupi:20220129195308p:plain

  5. LEDチカチカと5分に1回の再起動
    ESP32は安定動作ができないイメージがあるので、定期的にM5Cameraの再起動をするようにしています。 また、この解決策に至る過程での苦肉の策として、10秒に1回LEDを点滅させています(必要なのかわかりませんが、気休めに今もチカチカさせています。)
    ピンモードの設定をします。 f:id:GypsophilaRupi:20220123214134p:plain 10秒に1回LEDを点滅させ、5分に1回再起動するようにしています。 f:id:GypsophilaRupi:20220123215106p:plain

以上のことを行ったプログラムCameraWebServerが以下です。

#include "esp_camera.h"
#include <WiFi.h>
#include <ESPmDNS.h>
//
// WARNING!!! Make sure that you have either selected ESP32 Wrover Module,
//            or another board which has PSRAM enabled
//

// Select camera model
//#define CAMERA_MODEL_WROVER_KIT
//#define CAMERA_MODEL_ESP_EYE
#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE
//#define CAMERA_MODEL_AI_THINKER

#include "camera_pins.h"

const char* ssid = "WIFIのSSID";
const char* password = "パスワード";

void startCameraServer();

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  Serial.println();


  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  //init with high specs to pre-allocate larger buffers
  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }
  
  pinMode(GPIO_NUM_14, OUTPUT); 
  
#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  sensor_t * s = esp_camera_sensor_get();
  //initial sensors are flipped vertically and colors are a bit saturated
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1);//flip it back
    s->set_brightness(s, 1);//up the blightness just a bit
    s->set_saturation(s, -2);//lower the saturation
  }
  //drop down frame size for higher initial frame rate
  s->set_framesize(s, FRAMESIZE_UXGA);

#if defined(CAMERA_MODEL_M5STACK_WIDE)
  s->set_vflip(s, 1);
  s->set_hmirror(s, 1);
#endif

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (millis()>(10000)){
      ESP.restart();
    }
  }
  Serial.println("");
  Serial.println("WiFi connected");
  MDNS.begin("esp32"); // ホスト名 esp32.local
  startCameraServer();
  
  Serial.print("Camera Ready! Use 'http://");
  Serial.print(WiFi.localIP());
  Serial.println("' to connect");
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(GPIO_NUM_14,LOW);
  delay(10000);
  digitalWrite(GPIO_NUM_14,HIGH);
  delay(500);
  if (millis()>(5*60*1000)){
    ESP.restart();
  }
  //Serial.println("OK");
}

M5Cameraの写真をリクエスト&保存するPythonプログラムの作成

写真撮影するURLから得た写真を指定したローカルURL上に名前を付けて保存するようにしたプログラム(Python)は以下の通りです。 工夫した点は、写真撮影するURLが開いて、NAS上に写真を書き込むまで4回チャレンジするようにしたことです。これはM5Cameraが定常運転してくれないことを考えての設定です。

import urllib.error
import urllib.request
import datetime


def download_file(url, dst_path):
    for i in range(1,4):
        try:
            with urllib.request.urlopen(url,timeout=10) as web_file, open(dst_path, 'wb') as local_file:
                local_file.write(web_file.read())
        except urllib.error.URLError as e:
            print(e)
        else:
            return

dt_now = datetime.datetime.now()
print(dt_now.strftime('%Y%m%d%H%M'))
        
url = 'http://192.168.11.3/capture'
dst_path = 'data/test'+dt_now.strftime('%Y%m%d%H%M')+'.jpg'
download_file(url, dst_path)
print('finish')

ちなみに、M5Cameraで撮影した画像のIPアドレス(http://192.168.11.3)はWindowsコマンドプロンプトから以下のように見つけました。

C:\Users\****>ping esp32.local

esp32.local [192.168.11.3]に ping を送信しています 32 バイトのデータ:
192.168.11.3 からの応答: バイト数 =32 時間 =77ms TTL=255
192.168.11.3 からの応答: バイト数 =32 時間 =90ms TTL=255
192.168.11.3 からの応答: バイト数 =32 時間 =89ms TTL=255
192.168.11.3 からの応答: バイト数 =32 時間 =95ms TTL=255

192.168.11.3 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 77ms、最大 = 95ms、平均 = 87ms

NAS上のタスクマネージャーを使ってPythonのプログラムを定期的に動かす

4時から30分ごとに17時まで写真を撮り続けるような指定をしました。

  1. NAS上の任意の場所にPythonのプログラムを格納する
    PythonプログラムをNAS上で動かすために、NAS上の任意の場所にPythonプログラムを保存します。
    今回は\ds118\homes\□□□にGarlic.pyを保存しました。

  2. NASのコントロールパネルからタスクマネージャーを開く
    f:id:GypsophilaRupi:20220129203743p:plain

  3. 左の作成ボタンからユーザー指定のスクリプトを選択
    f:id:GypsophilaRupi:20220129204013p:plain

  4. スケジュール管理する
    f:id:GypsophilaRupi:20220129204212p:plain

  5. タスク設定をする
    1行目ではcdコマンドでpythonプログラムを格納した場所に移動し、2行目では作ったPythonプログラムの実行をしています。ちなみに今回のPythonプログラムの名前はGarlic.pyです笑 f:id:GypsophilaRupi:20220129204513p:plain

おわりに

何故動いているかわからない状態で4か月以上の連続稼働に成功しました笑
今回はこれを記事にすることで少し理解が進んでよかったです。 ちなみにニンニクを育てるという本来の目的は最初微妙に上手くいっていませんでした。 鉢を変える植え替えをしたら枯れてしまったので、台所に転がっていた芽が出ていた中国製のニンニクを代わりに植えています。 ちなみに昨日撮れた写真はこんな感じです。 f:id:GypsophilaRupi:20220206000636p:plain

【ジブリ飯】魔女の宅急便のニシンとカボチャのパイを作ってみた

はじめに

お久しぶりです。 そろそろ夏も終わりですがまだまだ暑いですね。 この夏は家庭菜園もせずマイペースに過ごしていました。 オタマトーンを買って遊んだり3Dプリンター使ったりしてるのですが、ブログを更新せずに今日に至ってました。
そんな今日はジブリ飯を作ってみたのでシェアしてみようと思います。
作ったのはニシンとカボチャのパイ! 結構美味しくできました!

今週のお題「肉」みたいですが魚料理です笑

ニシンとカボチャのパイの材料

ニシンとカボチャのパイを作るに当たって買い足した材料はこちら。 ニシンの燻製とオリーブはKALDIでゲットしました。パイ生地やかぼちゃはスーパーで。その他玉ねぎやホワイトソースの材料も必要ですが、家にありました。 f:id:GypsophilaRupi:20210919194023j:plain

参考にしたレシピはこちらです。塩っ気が足りないかなと思ったのですがニシンの燻製に味がついていたのでいい塩梅でした。

cookpad.com

調理過程

レンジで柔らかくしたカボチャをマッシュしてグラタン皿に敷き詰めます。

f:id:GypsophilaRupi:20210919194637j:plain

その上にニシンの燻製を敷き詰めます。 ちなみにニシンの燻製の缶詰に入っていた汁はブロッコリーと一緒に頂きました。

f:id:GypsophilaRupi:20210919194738j:plain

玉ねぎを入れたホワイトソースを敷き詰めます。玉ねぎは一玉入れたので少し甘めに出来ました。

f:id:GypsophilaRupi:20210919194854j:plain

パイ生地を敷き詰めます。絵心が問われる部分です汗 f:id:GypsophilaRupi:20210919195010j:plain

卵黄を水で解いた汁を表面に塗ってオリーブを等間隔に配置します。

f:id:GypsophilaRupi:20210919195102j:plain

210度に予熱したオーブンに入れて200度で10分、180度で10分焼いたのがこちら。なかなかオシャレに出来ました。

f:id:GypsophilaRupi:20210919195156j:plain

感想

生のニシンを使うと臭くなると思ったので敢えて缶詰を使いました。そのため全く生臭さはなかったです。
ホワイトソースは買うかどうか迷いましたが自作してみました。全体的に素材の味が活きていて、大満足な出来でした。
ちょっと量は多かったですが美味しかったので食べきることができました。 あ、よく見たら映画のパイにはあるひれや口がなかった。。。笑 ではでは。 f:id:GypsophilaRupi:20210919202315p:plain

テキシコーに出てくるダンドリオンのぬいぐるみ

テキシコーのご紹介

前回の更新から1か月近く経ってしまいましたが元気に有意義な日々を過ごしています。
NHKのテキシコーという番組をご存じでしょうか? この番組はプログラミング的思考を学ぶ番組ですが、大人でも十分楽しめます。テキシコーのリンクはこちらです。 テキシコー | NHK for School

ダンドリオンのぬいぐるみ製作に至る話

今回はその「テキシコー」という番組に出ているキャラクター「ダンドリオン」のぬいぐるみを作りました。 何故、そんなぬいぐるみを作るに至ったかというと、旦那がダンドリオンのぬいぐるみが欲しいと言ってきたためです。 ほぼ2Dのペラペラのぬいぐるみでいいかなと思っていたら、厚みがある方がいいということでした。
100均のフェルトをチクチク縫って出来上がったのが下の図です。ダンドリオンは黒いフチの幅が結構あるので、それを表現するのが難しかったです。 目は刺繍で作ろうと思ったのですが、結局フェルトで作りました。
普段裁縫をしない割にはそれっぽくなったので満足です。

今、旦那のディスプレイの上に鎮座させていますが、養生テープで止めているので、時間が経つと落ちてきます笑
これで旦那も効率よく仕事ができるようになること間違いなし笑! f:id:GypsophilaRupi:20210613215244j:plain

そら豆の収穫

はじめに

最近はポカポカどころか、暑い日もあって、夏ももう目前という感じですね。 そんな中、そら豆の実は確実に成長しました。昨日すべての実を収穫したので、今日はそれについてです。

4/25 お試し収穫

試しに一個だけ、実を収穫してみることにしました。 さやの中に入っていた実は1粒だけです。 味は美味しかったのですが、まだ若いのかなと思ったので、もう少し日にちを空けて収穫しようと思いました。

f:id:GypsophilaRupi:20210516223645j:plainf:id:GypsophilaRupi:20210516223659j:plain

5/4 収穫 第1弾

お試し収穫から1週間と数日後、再び収穫してみることにしました。 さやは3つほどで、合計で4粒の実を食べることができました。
お試し収穫と同じく、茹でてそのまま食べることにしました。 ホクホク感があり、凄く美味しかったです。

f:id:GypsophilaRupi:20210516223749j:plainf:id:GypsophilaRupi:20210516223800j:plain
f:id:GypsophilaRupi:20210516223812j:plainf:id:GypsophilaRupi:20210516223822j:plain

f:id:GypsophilaRupi:20210516223834j:plain

5/15 収穫 第2弾

アブラムシが発生した部位を切っても3日後には再び発生しているという状態になり始めたので、思い切ってすべての実を収穫することとしました。 苗全体としては大きく育ったりはしていない(むしろ切った分小さくなった)ので、収穫した実の写真だけ載せておきます。 収穫できたさやはボウルの1/3杯くらいもありました。育てたのは2株で、これだけ収穫出来れば満足です。 エビとそら豆の天ぷらもどきにして食べました。天ぷらにするとほくほく感は少なかったですが、美味しかったです。

f:id:GypsophilaRupi:20210516223847j:plainf:id:GypsophilaRupi:20210516223856j:plainf:id:GypsophilaRupi:20210516223909j:plain

f:id:GypsophilaRupi:20210516223917j:plain

まとめ

もう何年もそら豆を食べていなかったのです、こうして育てて食べてみると、旬の野菜の美味しさに気づかされます。 そら豆は最後にアブラムシがついてしまいましたが、基本的に冬に育てる作物は成功率が高くて大満足です。
一方で夏に育てた作物はほぼ成功していません。温かくなると虫が増えるのと、ベランダだと日光が当たらなくなるので、今のところ困難を極めています。 夏野菜を育てるなら早急に苗を買わないといけないと思うのですが、育てるかどうか迷っているところです。
それではまた今度、できればペンギン農家、料理ではなくペンギン工作室としてブログをUPしたいものです。

リンツのテイスティングセットを頂きました

はじめに

飛行機作ったり、届いた磁気浮上装置を組み立てずに眺めたり(笑)、そら豆眺めたり、散策、家事等やっていると、あっという間にGWが終わりに近づいています。 やること沢山あるのでもっと休日が欲しいです。
そんなことを考えている今日は、チョコ好きにはたまらないリンツ テイスティングセットの感想を共有したいと思います。

今週のお題「おうち時間2021」

テイスティングセットの紹介

リンツテイスティングセットとは、22種類ものフレーバーの丸型のチョコが入っているセットになっています。
幸運にもそんな楽しいセットを頂いたので、それぞれの味がどのような味だったか忘れないようにメモしておきました。

f:id:GypsophilaRupi:20210504230531j:plainf:id:GypsophilaRupi:20210504230552j:plain

テイスティングセットのランキング

好きなチョコ順に感想を書き連ねていきたいと思います。独断と偏見によっておすすめ度を5段階評価してみました。
積極的に今後も食べていきたいのは★4つ以上からです。

ミルク ★★★★★

定番中の定番ですが、期待を裏切りません。甘さはちょうどよく、中はクリーミーなミルクチョコとなっています。

ヘーゼルナッツ ★★★★★

細かいナッツそのものが外側の固いチョコに入っています。中に入っているヘーゼルナッツ味のクリームが美味でした。このセットの一番最後に食べて正解でした。

ストロベリー&クリーム ★★★★

イチゴ味のホワイトチョコという感じでした。イチゴチョコが特段に好きというわけではないのですが、これは期待以上で純粋に美味しかったです。

ミルク&ホワイト ☆★★★★

後味は完全にミルクでしたが、最初はホワイトな味がしました。

ホワイト ☆★★★★

くせがなく、きつい感じもなくてスッと口になじむ味で美味しかったです。

カプチーノ ☆★★★★

噛んだ瞬間コーヒーの風味が香りました。純粋にコーヒー味のチョコでした。相変わらず舌ざわりはなめらかでした。

キャラメル ☆★★★★

普通に美味しいけれど、少し甘めで後味が甘かったです。もう少し甘さ控えめだと★5でした。

ストラッチアトラ ☆★★★★

外側も中もホワイトでした。ホワイトチョコにチョコチップ(チョコチップの味はしませんでした)が入っていて、なめらかな舌触りにカリッと食感が入ります。 ちなみにストラッチアトラとはチョコチップ入りのジェラードのことらしいです。

ファッジスワール ☆★★★★

外側はミルクチョコみたいな感じでした。ホワイトチョコよりマイルドさがなかったので、ひっかかる感じはあるものの、美味しかったです。

アーモンド ☆★★★★

美味しいものの、アーモンド味は少ないように思えました。アルコールが結構効いてる気も。イメージ通りのアーモンド味だったらなぁ…

60%カカオ ☆☆★★★

ビターというほどではないが、ミルクというわけでもなく、ほどよいダークチョコという感じでした。

シトラス ☆☆★★★

包み紙を開けたときから柑橘系の香りがします。食べるとそこまで柑橘系がきつくなく、ほんのりシトラスがちょうどよくて意外と美味しかったです。

ミント ☆☆★★★

包み紙をあけるとさわやかなミントの香りがしました。食べ始めはミント感がつよく、あとからチョコの味がします。

ココナッツ ☆☆★★★

香りはココナッツなのですが、味はそこまでココナッツじゃないです。外側のミルクチョコが甘く感じました。

70%カカオ ☆☆★★★

口触りなめらかでした。いわゆるビターチョコという感じでココアパウダーをとかしたような味がしました。

ダーク ☆☆★★★

そもそもビターチョコはあまり好きではないので、★3つ。やっぱりミルクチョコが美味しい。

マンゴー&クリーム ☆☆★★★

口に入れた瞬間少し化学調味料っぽい味がするもホワイトチョコとマンゴー味が意外とあっている一品でした。

ピスタチオ ☆☆★★★

ピスタチオの癖が強いです。期待していたけれど癖のある匂いが気になりました。

シーソルト ☆☆★★★

名前の通り、中身がしょっぱいです。塩がない方が好きですが、外側のチョコは美味しいのでこの評価です。

ソルテッドキャラメル ☆☆★★★

塩キャラメル味なので、塩の味が時々主張してきます。後味も塩の味がしました。

ミルクオレンジ ☆☆☆★★

オレンジとチョコがあまりマッチしていないような感じもしました。あれば食べるかなという程度です。

抹茶 ☆☆☆★★

抹茶自体は好きなのですが、これは病院の味がする気がしました。最初の風味が微妙かなというのでこの評価です。

最後に

色んなフレーバーを食べる機会はなかなかないので、今回こうして自分の好きなフレーバーを知ることができてよかったです。 ばら売りで買う時には★5のミルクとヘーゼルナッツは欠かせないです。 4種セット(ミルク、ホワイト、ダーク、ヘーゼルナッツ)は、コストコで凄く安く買えるみたいなので、コストコ行く機会があったら是非買いたいと思っています。 以上、チョコ+ナッツ好きの食レポでした。