M5Camera00

M5Camera をレビューしてみた。分解したり、Arduino IDE でスマホに映したりする実験

記事公開日:2019年3月9日


スポンサーリンク

M5Camera を Arduino IDE サンプルスケッチで使ってみる

では、今度は M5Camera を Arduino IDE のサンプルスケッチでプログラミングして、動かしてみます。
プログラミングといっても、ほんの数行書き換えるだけで簡単に動作します。
ただ、Arduino ボード設定が今までとちょっと異なりますので気を付けてください。
※ここから先はクイックスタートのファームウェアは消去されてしまいますのでご了承ください。

また、これは先ほどのように M5Camera が Wi-Fiルーターになるわけではなく、外部ルーターを経由する Station モード( STA モード )です。
ご自分の Wi-Fi ルーターを起動しておいて、ファイアウォール設定や MAC アドレスフィルタリングを見直して、M5Camera ( ESP32 WROVER )が接続できる状態にしておいてください。
ESP32 の MACアドレスを調べる方法は以下の記事を参照してください。

ESP-WROOM-32 ( ESP32 ) チップ・メモリ・MACアドレス情報取得方法

Arduino core for the ESP32 のインストール

事前に Arduino IDE に Arduino core for the ESP32 ( 以下 Arduino – ESP32 と省略 ) をインストールしておきます。

当方では、以下のバージョンで動作確認しています。

Arduino IDE ver 1.8.9
Arduino core for the ESP32 stable 1.0.2

(stable 1.0.1 の場合と stable 1.0.2 の場合とで、サンプルスケッチが異なるので注意してください。
詳細は後述しています。)

インストール方法は以下のページを参照してください。

Arduino core for the ESP32 のインストール方法

Arduino – ESP32 のボード設定

まず、M5Camera をパソコンに USB で接続しておいてください。

次に、下図の様に、
「ツール」→「ボード」→「ESP32 Wrover Module」
をセレクトしてください。

m5camera30.jpg


次に、その「ESP32 Wrover Module」設定は下図の様にします。

m5camera31.jpg


ボード: ESP32 Wrover Module
Upload Speed: 921600
Flash Frequency: 80MHz
Flash Mode: QIO
Partition Scheme: Huge APP (3MB No OTA)
Core Debug Level: なし
シリアルポート: ※ご自分の ESP32 WROVER ( M5Camera )のUSBポート
書込装置: USBasp

stable ver 1.0.2 サンプルスケッチ(サンプルソースコード)の書き換え

次に、Arduino – ESP32 stable ver 1.0.2 の場合のサンプルスケッチ(サンプルソースコード)の書き換えをします。
※stable ver 1.0.1 の場合はこちらを参照してください。

まず、下図の様に、
「ファイル」→「スケッチ例」→「ESP32」→「Camera」→「CameraWebServer」
を選択します。

m5camera32.jpg


そうしたら、名前を付けて保存しておきます。

次に、下図のようにスケッチのメインソースコードのタブを開きます。

m5camera40.jpg


そのコードを以下の様に書き換えます。
10行目と12行目を変更しました。
そして、18行目と19行目をご自分のルーターのSSIDとパスワードに書き換えてください。

#include "esp_camera.h"
#include <WiFi.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 = "xxxxxxx"; //ご自分のルーターのSSIDに書き換えてください
const char* password = "xxxxxx"; //ご自分のルーターのパスワードに書き換えてください

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;
  }

#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_QVGA);

#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(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  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:
  delay(10000);
}

次に、下図の様に、camera_pins.h タブを開きます。

m5camera41.jpg


そして、44行目と55行目を以下のように書き換えます。


#if defined(CAMERA_MODEL_WROVER_KIT)
#define PWDN_GPIO_NUM    -1
#define RESET_GPIO_NUM   -1
#define XCLK_GPIO_NUM    21
#define SIOD_GPIO_NUM    26
#define SIOC_GPIO_NUM    27

#define Y9_GPIO_NUM      35
#define Y8_GPIO_NUM      34
#define Y7_GPIO_NUM      39
#define Y6_GPIO_NUM      36
#define Y5_GPIO_NUM      19
#define Y4_GPIO_NUM      18
#define Y3_GPIO_NUM       5
#define Y2_GPIO_NUM       4
#define VSYNC_GPIO_NUM   25
#define HREF_GPIO_NUM    23
#define PCLK_GPIO_NUM    22

#elif defined(CAMERA_MODEL_ESP_EYE)
#define PWDN_GPIO_NUM    -1
#define RESET_GPIO_NUM   -1
#define XCLK_GPIO_NUM    4
#define SIOD_GPIO_NUM    18
#define SIOC_GPIO_NUM    23

#define Y9_GPIO_NUM      36
#define Y8_GPIO_NUM      37
#define Y7_GPIO_NUM      38
#define Y6_GPIO_NUM      39
#define Y5_GPIO_NUM      35
#define Y4_GPIO_NUM      14
#define Y3_GPIO_NUM      13
#define Y2_GPIO_NUM      34
#define VSYNC_GPIO_NUM   5
#define HREF_GPIO_NUM    27
#define PCLK_GPIO_NUM    25

#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
#define PWDN_GPIO_NUM     -1
#define RESET_GPIO_NUM    15
#define XCLK_GPIO_NUM     27
#define SIOD_GPIO_NUM     22 //ここを変更
#define SIOC_GPIO_NUM     23

#define Y9_GPIO_NUM       19
#define Y8_GPIO_NUM       36
#define Y7_GPIO_NUM       18
#define Y6_GPIO_NUM       39
#define Y5_GPIO_NUM        5
#define Y4_GPIO_NUM       34
#define Y3_GPIO_NUM       35
#define Y2_GPIO_NUM       32
#define VSYNC_GPIO_NUM    25 //ここを変更
#define HREF_GPIO_NUM     26
#define PCLK_GPIO_NUM     21

#elif defined(CAMERA_MODEL_M5STACK_WIDE)
#define PWDN_GPIO_NUM     -1
#define RESET_GPIO_NUM    15
#define XCLK_GPIO_NUM     27
#define SIOD_GPIO_NUM     22
#define SIOC_GPIO_NUM     23

#define Y9_GPIO_NUM       19
#define Y8_GPIO_NUM       36
#define Y7_GPIO_NUM       18
#define Y6_GPIO_NUM       39
#define Y5_GPIO_NUM        5
#define Y4_GPIO_NUM       34
#define Y3_GPIO_NUM       35
#define Y2_GPIO_NUM       32
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     26
#define PCLK_GPIO_NUM     21

#elif defined(CAMERA_MODEL_AI_THINKER)
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27

#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

#else
#error "Camera model not selected"
#endif

これでコンパイル書き込みすればOKです。

stable ver 1.0.1 サンプルスケッチ(サンプルソースコード)の書き換え

次に、Arduino – ESP32 stable ver 1.0.1 の場合のサンプルスケッチ(サンプルソースコード)の書き換えをします。
※stable ver 1.0.2 の場合は前項を参照してください

まず、下図の様に、
「ファイル」→「スケッチ例」→「ESP32」→「Camera」→「CameraWebServer」
を選択します。

m5camera32.jpg


そうしたら、名前を付けて保存しておきます。

次に、そのスケッチ(プログラムソースコード)以下のように変更します。

#include "esp_camera.h"
#include <WiFi.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_M5STACK_PSRAM //ここを変更
//#define CAMERA_MODEL_AI_THINKER

const char* ssid = "xxxxxxxx"; //ご自分のルーターのSSIDに書き換えてください
const char* password = "xxxxxxxx"; //ご自分のルーターのパスワードに書き換えてください


#if defined(CAMERA_MODEL_WROVER_KIT)
#define PWDN_GPIO_NUM    -1
#define RESET_GPIO_NUM   -1
#define XCLK_GPIO_NUM    21
#define SIOD_GPIO_NUM    26
#define SIOC_GPIO_NUM    27

#define Y9_GPIO_NUM      35
#define Y8_GPIO_NUM      34
#define Y7_GPIO_NUM      39
#define Y6_GPIO_NUM      36
#define Y5_GPIO_NUM      19
#define Y4_GPIO_NUM      18
#define Y3_GPIO_NUM       5
#define Y2_GPIO_NUM       4
#define VSYNC_GPIO_NUM   25
#define HREF_GPIO_NUM    23
#define PCLK_GPIO_NUM    22

#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
#define PWDN_GPIO_NUM     -1
#define RESET_GPIO_NUM    15
#define XCLK_GPIO_NUM     27
#define SIOD_GPIO_NUM     22 //ここを変更
#define SIOC_GPIO_NUM     23

#define Y9_GPIO_NUM       19
#define Y8_GPIO_NUM       36
#define Y7_GPIO_NUM       18
#define Y6_GPIO_NUM       39
#define Y5_GPIO_NUM        5
#define Y4_GPIO_NUM       34
#define Y3_GPIO_NUM       35
#define Y2_GPIO_NUM       32
#define VSYNC_GPIO_NUM    25 //ここを変更
#define HREF_GPIO_NUM     26
#define PCLK_GPIO_NUM     21

#elif defined(CAMERA_MODEL_AI_THINKER)
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27

#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

#else
#error "Camera model not selected"
#endif

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;
  }

  // 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;
  }

  //drop down frame size for higher initial frame rate
  sensor_t * s = esp_camera_sensor_get();
  s->set_framesize(s, FRAMESIZE_QVGA);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  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:
  delay(10000);
}

【解説】

●10-11行:
それぞれ、コメント解除と、コメントアウトする

●14-15行:
ご自分のWi-Fiルーターの SSID とパスワードに書き換えてください。

●41行:
22に変更

●52行:
25に変更

サンプルスケッチの変更はたったこれだけです。
これは先ほども述べたように、ESP32 の STA モードです。

コンパイル書き込み実行して、スマホと接続してみる

では、Arduino IDE でコンパイル書き込み実行させてみてください。
完了したら、シリアルモニタを115200bpsで起動して、M5Camera のリセットボタンを押してみて下さい。
シリアルモニタに以下のように表示され、Wi-Fiルーターに接続できて、ローカルIPアドレスが表示されればOKです。

m5camera10.jpg


私の場合は、
http://192.168.0.22
というように割り当てられたので、これをスマホブラウザのURL入力欄に入力します。

すると、下図の様なカメラの設定画面が現れれば成功です。

m5camera11.jpg


一番下の「Get Still」ボタンは、静止画スチール写真撮影ボタンです。
「Start Stream」ボタンを押すと、ストリーミング撮影開始です。

すると、さらにその下に下図の様な映像が出れば成功です。

m5camera12.jpg


因みに、シリアルモニタには以下のように表示されると思います。

m5camera13.jpg


動画は以下です。
この様に操作できればOKです。

どうでしょうか?
Station モード ( STAモード ) にすると、格段に通信が速くなりますね。
まぁ、これはルーターの通信能力に大きく左右されるところなので、できるだけ高速ルーターを使った方が良いです。
フリーズもしませんでした。
タッチペンを動かしている様子も、なかなか追従性が良いですね。
これは使えますよ~!!!

消費電流も 140mA ~ 170mA で、なかなか良い感じです。
ただ、長時間使用すると結構熱くなりますね。
長時間使用はできるだけ避けた方が良いです。
いずれにしても、ここまでできればかなりいろいろなことができそうですよね。
夢がグーンと広がります。
あまりにもスバラシイ!!!

これからカメラを使ったいろいろなプログラミングや工作をしていきたいですね。

編集後記

M5Camera は素晴らし過ぎますね。
殆ど ESP32 WROVER と OV2640モジュールを接続しただけの様なもので、ここまでコンパクトに実現できるとは驚きですね。

まだ私は PSRAM をどの様に使っているかは解明できていないのですが、これを応用すればいろいろと使い道が開けてくると思います。

M5Stack 社の開発スピードが最近あまりにも凄くて、ユーザー側が追い付けていないですね。
この M5Camera も発売されてかなり経ってからようやく使い始められた感じです。

いずれにしても、Arduino IDE で開発できるこういう手軽なモジュールがどんどん出てくることは良いことですね。

ということで、今回はここまでです。
最初の方で述べたように、私はまたこの記事以降、しばらく更新が滞ると思いますが、合間にできるだけ更新がんばっていきたいと思います。

ではまた・・・。


スポンサーリンク


 

mgo-tec電子工作ブログ管理人おすすめ
Amazon.co.jp
M5Stack Basic
スイッチサイエンス
Amazon.co.jp
ESPr Developer 32
スイッチサイエンス(Switch Science)
Amazon.co.jp
Amazon.co.jp

「M5Camera をレビューしてみた。分解したり、Arduino IDE でスマホに映したりする実験」への11件のフィードバック

  1. camera init failed with error 0x20001 となって、IPアドレスが出ません。何か対処法をお教え願いませんでしょうか?

    1. akai さん

      記事をご覧いただき、ありがとうございます。

      まず、お聞きしたいのは、どのような環境でコンパイルされましたでしょうか?
      この記事では、古いバージョンを紹介していますが、
      私は、最新バージョン
      Arduino IDE 1.8.9
      Arduino core for the ESP32 stable 1.0.2
      でも動作OKでした。

  2. バージョンは、Arduino1.8.9です、コンパイルは、できていて、シリアルモニターを見ながらカメラのリセットボタンを押したら、WiHiコネクトの前まではこの記事と同じなのですが、そのあとが、上記レポート文のようになりIPアドレスが出てきません。しかし2回ほどIPアドレスが出たことがありましたが、映像を見る前にWiHiが切れました。そのあとは、camera init failed with error 0x20001が出るだけです。電圧が不安定なのでしょうか?
    エラーの意味が分からずお便りさせていただきました。よろしくご教示願います。

  3. esp32 byEspressf system のことでしょうか? 102となっています。それと、シリアルモニターですが、一部ですが映してみました。
    entry 0x400806a8
    E camera.c:1249 camera probe(): detected camera not supported.
    E camera.c:1249 esp_camera_init(): camera probe failed with error 0x20004
    となっています。

    1. akaiさん

      ありがとうございます。
      それですね。
      esp32 by Espressf system は別名 Arduino core for the ESP32 です。
      そのバージョンが大切です。
      まともに動かないバージョンがあるので要注意です。
      1.0.2 ということですね。
      それと、そのエラーメッセージを送って頂きありがとうございます。
      その情報が無いと、私も原因は全く分かりませんので。

      さて、そのエラーメッセージから、M5camera のマイコン ESP32-WROVER とカメラモジュールOV2640との通信ができていないようです。

      実は、今、気付いたのですが、Arduino core for the ESP32 が stable 1.0.1 と 1.0.2 では、「スケッチ例」にあるサンプルスケッチの構成が変わっていました。
      ですから、1.0.2用にスケッチを描き替えねばなりません。

      まず、メインスケッチのタブの10行目をコメントアウトし、12行目のコメント記号を削除して、
      #define CAMERA_MODEL_M5STACK_PSRAM
      とします。
      そして、18-19行目のSSIDとパスワードをご自分のルーターに合わせて書き換えます。
      そして、そのスケッチのcamera_pins.hタブを開き、44行目を
      #define SIOD_GPIO_NUM 22
      とし、そして55行目を
      #define VSYNC_GPIO_NUM 25
      と変更してください。
      その後、コンパイル書き込み実行してみてください。

      あるいは、この記事に載せてあるコードをコピペして、メインスケッチのタブを書き換えて、SSIDとパスワードを書き換えても動作すると思います。

  4. まずもって、早速の対応ありがとうございます。stable 1.0.2版をご用意いただき大変感謝しております。しかしながらエラーが次のようになっています。
    E camera.c:1049 camera_probe():Detected camera not supported. E camera.c:1249 esp_camera_init(): camera probe failed with error 0x20004
    また、自分なりに最初の#defineをそれぞれ入れ替えて試しましたが、結果は同じでした。それと気になる事が2つあります。
    1つは、私の5Mは、アマゾンにある中華番であること。2つ目は、ケーブルをジョイントで変換して使っていることです。
    この2つがこれらのエラーに影響しているのではと危惧しております。せっかくの10連休に御手間を取らせてしまって恐縮している次第です。因みにコンパイルは、できています。

    1. akaiさん

      なるほど。
      まず、M5Camera が M5Stack社のものでなければ、私にもちゃんと動作するかどうか分かりません。
      そもそも GPIO のピンアサインが全く異なると思います。

      それと、USBケーブルはジョイントしてあっても良いのですが、短く良質なケーブルを使うことです。
      安物のケーブルはおそらくエラーが出ると思います。
      それと、M5Stack社純正のM5Camera付属のType-Cケーブルは、Type-Cのコネクタの挿す方向が上下で異なっており、挿す方向を上下入れ換えるとコンパイルが通るということがあります。
      以上、私が言えることはここまでです。
      とりあえず、M5Stack社純正のM5Cameraに替えてみることですかね。
      そもそも、M5Stack社自体が中国メーカーです。
      ただ、M5CameraはAmazon Japanにはまだ販売されていなかったと思います。
      スイッチサイエンスさんから購入できます。

      1. いろいろお手数おかけしました。とても安く売ってあったのでつい購入しました。初期設定では簡単に映像が出ましたが、反転画像で車のバックカメラとしては使えそうなのですが、監視用としては反転しているのでプログラムの変更を試みた次第です。
        一度スイッチサイエンスさんのM5を購入しようと思います。
        いろいろと勉強になりましたありごとうございました。 akai

コメントを残す

メールアドレスが公開されることはありません。

*画像の文字を入力してください。(スパム防止の為)

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください