Octopod:家庭・産業向けスマートIoTオートメーションソリューション
部品と材料
| 部品名 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | |
| Arduino MKR WiFi 1010 | 1 | 入手困難なためNodeMCU ESP8266で代用 |
| Maxim Integrated MAX32630FTHR | 1 | MAX32620FTHR、Arduino 1010、または任意のESP8266ボードで代替可。WiFiは別途必要 |
| Raspberry Pi Zero Wireless | 1 | 通常のRaspberry Pi 2/3でも可 |
| DHT11 温湿度センサー(4ピン) | 1 | |
| Seeed Grove ガスセンサー MQ2 | 1 | |
| SparkFun 土壌水分センサー(ねじ端子付き) | 1 | |
| PIR人感センサー(汎用) | 1 | オプション |
| RFIDリーダー(汎用) | 1 | |
| リレー(汎用) | 1 | 2チャネル推奨 |
| RGBディフューズLED(共通カソード) | 1 | |
| Raspberry Piカメラモジュール | 1 | |
| サーボ Tower Pro MG996R | 1 | |
| ブザー | 2 | |
| HC-05 Bluetoothモジュール | 1 | オプション |
| LED(汎用) | 4 | |
| 壁面アダプター/モバイルバッテリー | 2 | |
| マイクロSDカード | 1 | 4GB以上、Class 10推奨(Raspberry Pi OS用) |
必要な工具と機器
- グルーガン(汎用)
- 3Dプリンター(汎用、オプション)
- 手工具(ニッパー、ハサミ、カッター等)
アプリとオンラインサービス
- Blynk(スマホアプリ)
- OpenCV(コンピュータビジョンライブラリ)
プロジェクト概要
数多くのIoTオートメーションプロジェクトがありますが、Octopodは格別です!NodeMCU(またはMAX32620FTHR/Arduino MKR 1010)、Arduino Uno、Raspberry Pi 3を組み合わせ、家庭やオフィス、工場をスマート化します。
- 温度、湿度、ガス濃度を監視しスマホに通知
- 人感センサーで動体検知時に通知
- 土壌水分センサーで植物の水やりタイミングを通知
- Blynkアプリで家電をリモート制御
- RGB LEDでムードライティング
- カメラでライブ映像配信、OpenCVで人物検知時に写真をメール送信
- RFIDドアロックで許可されたカードのみ解錠



全体の仕組み
- NodeMCU:各種センサー、リレー、RGB LEDを接続。WiFi経由でBlynkアプリと通信し、データ送信・家電制御を行う
- Raspberry Pi:WiFi接続でカメラライブ映像を配信。OpenCVで人物検知し、検知画像をメール送信
- スマートドアユニット:RFIDモジュールで許可カード検知時にサーボ駆動で解錠
ステップ1:メインOctopod(NodeMCU)のコーディング
コードにはほぼ全行にコメントを付けています。概要:
ライブラリインクルード
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#define BLYNK_PRINT Serial
Blynk認証・WiFi設定
char auth[] = "Your Blynk Auth Key";
char ssid[] = "Your WiFi SSID";
char pass[] = "Your WiFi Password";
ピン定義と変数
#define DHTPIN 2
#define soilPin 4
#define gasPin A0
#define pirPin 12
int pirValue, soilValue, PIRpinValue, SOILpinValue;
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;
Blynkアプリからのフラグ受信(仮想ピンV0, V1)
BLYNK_WRITE(V0) { PIRpinValue = param.asInt(); } // 動体検知ON/OFF
BLYNK_WRITE(V1) { SOILpinValue = param.asInt(); } // 土壌水分チェックON/OFF
センサーデータ送信(1秒ごと)
void sendSensor() {
int h = dht.readHumidity();
int t = dht.readTemperature();
if (isnan(h) || isnan(t)) return;
Blynk.virtualWrite(V5, h); // 湿度
Blynk.virtualWrite(V6, t); // 温度
}
動体検知・土壌水分チェック関数
void getPirValue() {
pirValue = digitalRead(pirPin);
if (pirValue) { Blynk.notify("Motion detected"); }
}
void getSoilValue() {
soilValue = digitalRead(soilPin);
if (soilValue == HIGH) { Blynk.notify("Water Plants"); }
}
setup() / loop()
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
dht.begin();
Blynk.tweet("OCTOPOD IS ONLINE!");
pinMode(pirPin, INPUT);
pinMode(soilPin, INPUT);
timer.setInterval(1000L, sendSensor);
}
void loop() {
Blynk.run(); timer.run();
if (PIRpinValue == HIGH) getPirValue();
if (SOILpinValue == HIGH) getSoilValue();
}
ステップ2:RFIDスマートロック(Arduino Uno)のコーディング
MFRC522ライブラリを使用。まずdumpInfoスケッチでカードUIDを取得し、コード内の "XX XX XX XX" を許可したいUIDに書き換えます。UID一致でサーボが180度回転(解錠)、5秒後に戻る(施錠)。不一致なら赤LED点滅とブザー音。Bluetooth版コードも用意しています。


ステップ3:Raspberry Pi 人物検知AIセットアップ
Raspberry Pi 3 + カメラV2 + OpenCVでスマート防犯カメラを構築。人物検知時にメール送信、同一WiFi内ならブラウザでライブ映像視聴可能。
前提条件
- Raspberry Pi 3にRaspbian Stretchをクリーンインストール推奨(Jessieからのアップグレードは非推奨)
- 物理アクセスまたはSSH/VNCでターミナル操作可能
手順概要
- カメラ接続・有効化:
sudo raspi-configでカメラ有効化、リブート - ファイルシステム拡張・不要パッケージ削除: LibreOfficeとWolfram Engine削除で約1GB確保
- 依存パッケージインストール: cmake, libjpeg, libtiff, libavcodec, libgtk, libatlas, python-dev 等
- OpenCV 3.3.0 + opencv_contrib ソース取得・展開
- Python仮想環境構築:
mkvirtualenv cv -p python3等 - NumPyインストール
- CMake設定・ビルド: スワップサイズを1024MBに拡張して
make -j4(約4時間)。完了後sudo make install,sudo ldconfig - cv2.soを仮想環境にシンボリックリンク
- スワップサイズを100MBに戻す(SDカード寿命対策)
- 動作確認:
python -c "import cv2; print(cv2.__version__)"
Pythonプログラム配置・実行
Google Driveから Smart-Security-Camera リポジトリをダウンロード。mail.py でGmail SMTP設定(要「安全性の低いアプリの許可」)、main.py でメール送信間隔や検知モデル(全身/上半身/顔)を設定。python main.py で起動。ブラウザで https://<PiのIP>:5000 にアクセスするとライブストリーム表示。外部ネットワークからはngrokでトンネリング可能。


ステップ4:Blynkアプリインターフェース設定
- Blynkアプリインストール、新規プロジェクト作成(デバイス: NodeMCU, 接続: WiFi)
- Auth Keyをメールで受け取り、コードに反映
- ウィジェット追加:ゲージ×3(温度V6、湿度V5、ガスV7)、zeRGBa(RGB制御)、ボタン×4(動体検知V0、土壌水分V1、リレー1、リレー2)、SuperChart(履歴グラフ)、タブ2枚目にTwitter/Notifications/Email/Eventor
- 再生ボタンで動作開始


ステップ5:Octopod筐体製作(段ボール/木材)
警告:最も時間のかかる工程です! 3Dプリント用STLファイルも提供しているので、そちらを使えばスキップ可能。八角形を立体化したユニークなデザイン。9cm×9.5cmの長方形4枚を連結し、135度の角度で折り曲げて接着、2組を直交させて立体化、三角形の開口部にはアクリルバターペーパーを貼り付け。スプレー塗装で3コート仕上げ。

ステップ6:ドアロック筐体製作
靴箱にスプレー塗装2-3コート、ダクトテープでチェック柄デザイン。

ステップ7:Octopod組み立て
大型ブレッドボードにNodeMCU、ブレッドボード電源、各種センサー、LED、リレーを配線。ピン配置:
- DHT11 → D4/GP2
- MQ2 → A0/ADC0
- 土壌水分 → D2/GP4
- PIR → D6/GP12
- RGB: R→D8/GP15, G→RX/GP3, B→TX/GP1
- リレー: Ch1→D0/GP16, Ch2→D5/GP14
電源はモバイルバッテリーまたは壁面アダプター。Raspberry Piとカメラを筐体に固定し、開口部をアクリル板で塞ぐ(メンテ用に1-2箇所開けておく)。土壌水分センサーの突起は外に出す。

ステップ8:ドアロック組み立て
Arduinoにコード書き込み後、配線して靴箱筐体に収納。LED用穴2つ、サーボ露出用穴を開け、RFIDリーダーとブレッドボードを固定。電源投入で動作開始。※実用ロックとしては使用しないでください(実験用)。
結論
本当に楽しいプロジェクトでした!ライトの見た目も良く、サイドランプとして作るだけでも価値あり。BlynkとOpenCVの作者たちに感謝。質問があればコメントでどうぞ。投票もよろしく!
- Saksham
アップデート
Amazon Alexaとの連携を開発中。2-3日でコード公開予定!
コード
octopod.ino (Arduino / NodeMCU用メインコード)
/***************************************************************************
OCTOPOD: A SMART HOME AUTOMATION PROJECT MADE BY SAKSHAM
Download latest Blynk library: https://github.com/blynkkk/blynk-library/releases/latest
Download latest DHT Sensor library: https://github.com/adafruit/DHT-sensor-library
***************************************************************************/
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#define BLYNK_PRINT Serial
char auth[] = "Your Blynk Auth Key";
char ssid[] = "Your WiFi SSID";
char pass[] = "Your WiFi Password";
#define DHTPIN 2
#define soilPin 4
#define gasPin A0
#define pirPin 12
int pirValue, soilValue, PIRpinValue, SOILpinValue;
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;
BLYNK_WRITE(V0) { PIRpinValue = param.asInt(); }
BLYNK_WRITE(V1) { SOILpinValue = param.asInt(); }
void sendSensor() {
int h = dht.readHumidity();
int t = dht.readTemperature();
if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; }
Blynk.virtualWrite(V5, h);
Blynk.virtualWrite(V6, t);
}
void getPirValue() {
pirValue = digitalRead(pirPin);
if (pirValue) { Serial.println("Motion detected"); Blynk.notify("Motion detected"); }
}
void getSoilValue() {
soilValue = digitalRead(soilPin);
if (soilValue == HIGH) { Serial.println("Water Plants"); Blynk.notify("Water Plants"); }
}
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
dht.begin();
Blynk.tweet("OCTOPOD IS ONLINE!");
pinMode(pirPin, INPUT);
pinMode(soilPin, INPUT);
timer.setInterval(1000L, sendSensor);
}
void loop() {
Blynk.run(); timer.run();
if (PIRpinValue == HIGH) getPirValue();
if (SOILpinValue == HIGH) getSoilValue();
}
octopod_door.ino (Arduino RFIDドアロック - Bluetoothなし版)
/***********************************************************************************************************
OCTOPOD: SMART HOME AUTOMATION - ARDUINO RFID DOOR LOCK
Library Required: MFRC522
************************************************************************************************************/
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define SS_PIN 10
#define RST_PIN 9
#define LED_G 5
#define LED_R 4
#define BUZZER 2
MFRC522 mfrc522(SS_PIN, RST_PIN);
Servo myServo;
void setup() {
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
myServo.attach(3);
myServo.write(0);
pinMode(LED_G, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(BUZZER, OUTPUT);
noTone(BUZZER);
Serial.println("Put your card to the reader...");
}
void loop() {
if (!mfrc522.PICC_IsNewCardPresent()) return;
if (!mfrc522.PICC_ReadCardSerial()) return;
String content = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
content.toUpperCase();
if (content.substring(1) == "XX XX XX XX") { // 許可UIDに変更
Serial.println("Authorized access");
digitalWrite(LED_G, HIGH);
tone(BUZZER, 500); delay(300); noTone(BUZZER);
myServo.write(180); delay(5000); myServo.write(0);
digitalWrite(LED_G, LOW);
} else {
Serial.println("Access denied");
digitalWrite(LED_R, HIGH);
tone(BUZZER, 300); delay(1000);
digitalWrite(LED_R, LOW); noTone(BUZZER);
}
}
octopod_door_bluetooth.ino (Bluetooth版ドアロック)
/***********************************************************************************************************
OCTOPOD: SMART HOME AUTOMATION - ARDUINO RFID DOOR LOCK (Bluetooth)
************************************************************************************************************/
#include <SoftwareSerial.h>
SoftwareSerial BTserial(0, 1); // RX | TX
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define SS_PIN 10
#define RST_PIN 9
#define LED_G 5
#define LED_R 4
#define BUZZER 2
MFRC522 mfrc522(SS_PIN, RST_PIN);
Servo myServo;
void setup() {
BTserial.begin(9600);
BTserial.println("Waiting for connections...");
SPI.begin();
mfrc522.PCD_Init();
myServo.attach(3);
myServo.write(0);
pinMode(LED_G, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(BUZZER, OUTPUT);
noTone(BUZZER);
BTserial.println("Put your card to the reader...");
}
void loop() {
if (!mfrc522.PICC_IsNewCardPresent()) return;
if (!mfrc522.PICC_ReadCardSerial()) return;
String content = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
content.toUpperCase();
if (content.substring(1) == "33 3E A7 E5" || content.substring(1) == "E5 36 6B 49") {
BTserial.println("Authorized access");
digitalWrite(LED_G, HIGH);
tone(BUZZER, 500); delay(300); noTone(BUZZER);
myServo.write(180); delay(5000); myServo.write(0);
digitalWrite(LED_G, LOW);
} else {
BTserial.println("Access denied");
digitalWrite(LED_R, HIGH);
tone(BUZZER, 300); delay(1000);
digitalWrite(LED_R, LOW); noTone(BUZZER);
}
}
カスタムパーツとエンクロージャー
- 段ボール/木材用基本設計:
octopod_v2_ukTmIJ0uMl.f3d - 3Dプリント用本格エンクロージャー:
octo_2_v3_sii4tuCF7d.f3d
回路図

Bluetooth版の場合:HC-05のRX→Arduino TX、TX→Arduino RX、5V↔5V、GND↔GND
ピン配置対応表(Arduino MKR 1010 / MAX32620FTHR使用時の参考)
ESP MAX A0 ------ GPIO2 A1 ------ GPIO1 Soil Sensor MAX Analog ------ GPIO3 Gas Sensor (MQ2) MAX Sensor ------ GPIO4 PIR Sensor MAX Sensor ------ GPIO0 Relay MAX 1 ------ M0 2 ------ M1

製造プロセス
- Raspberry Piで構築するホームオートメーションシステム:リモート制御対応
- スマートブラインド:Arduinoとソーラー電源で実現する自動光制御
- ESP8266・Arduino・超音波センサーで作るスマートIoTジャー:リアルタイム中身監視
- 1Sheeldで作るスマートホーム自動化&セキュリティシステム
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- SparkFun 7セグメントディスプレイで作る信頼性の高いArduinoカウントダウンタイマー
- Arduinoで自作RCポルシェカー:ステップバイステップガイド
- ArduinoとESP8266で作るWi-Fi対応スマートドアロック — スマホで解錠
- 産業オートメーション4.0:生産効率に革命をもたらす
- スマートホームテクノロジーが日常生活をどう変えるか
- マルバタイジングがスマートホームIoTを脅かす:隠れた広告がデバイスを侵害する可能性