スマートキューブ: 次世代ホームコントロールハブ
部品と材料
| 部品 | 数量 |
|---|---|
| Arduino 101 (Intel Curie搭載) | 1 |
| LED (汎用) | 5 (青1, 黄1, 緑1, 赤2) |
| 抵抗 221Ω | 5 |
| ブレッドボード (汎用) | 1 (任意) |
| Seeed Base Shield V2 | 1 |
| Seeed Grove LCD RGBバックライト | 1 |
| Seeed Grove 音センサー | 1 |
| Seeed Grove ブザー | 1 |
| Seeed Grove 温度センサー | 1 |
| キーパッド (4×3マトリックス) | 1 |
| ジャンパーワイヤー (汎用) | 1セット |
| 9V電池 (汎用) | 1 |
| 9V電池スナップ | 1 |
| MDF板 20×30cm (厚3mm) | 1 |
必要な工具と機器
- レーザーカッター (汎用)
- はんだごて (汎用)
アプリとオンラインサービス
- Arduino IDE
- Nordic Semiconductor nRF Connect SDK (任意、BLEデバッグ用)
プロジェクト概要
スマートキューブとは?
スマートキューブは、スマートホームデバイスを制御するポータブルコントローラーです。現代の住宅ではデバイスをよりスマートに管理することが必須になりつつあり、シンプルで直感的な操作が求められます。スマートキューブは Arduino 101 ボードと複数の センサー を内蔵し、家電やアクチュエーターと通信します。
最大の革新は Arduino 101のBluetooth Low Energy (BLE) と 内蔵ジャイロスコープ・加速度計 を活用した ジェスチャー操作 です。キューブには 6つの面 があり、それぞれ異なる機能を担当します。ジャイロスコープが 上向きになっている面を検出 し、その面の機能をアクティブにします。例えば「ライト面」を上に向ければ照明が点灯、キューブを シェイク (振る) すれば消灯します。
面が上向きになって 2秒以上静止 するとその機能が有効化されます (誤動作防止のための遅延)。2秒以上シェイク すると最後に有効化した機能が無効化されます。
本プロジェクトはスマートコントローラーの構築を支援します。キューブからの出力はBLE信号で、スマートフォンアプリ (nRF Connect等) や、別のArduinoを搭載した受信ステーション (セントラリネ) で受信し、実際の家電を制御します。受信側の実装は用途に応じて自由です。
搭載機能 (6面)

- LIGHTS (照明): 上向きで照明ON。シェイクでOFF + 黄色LED点灯 (暗闇でキューブ発見用)。BLEで制御。
- TEMPERATURE (温度): 上向きでエアコン/暖房を自動制御。温度センサーで室温検知。暑ければ青色LED (雪マーク) で冷房、寒ければ赤色LED (太陽マーク) で暖房。適温なら両方OFF。BLEで制御。
- TIMER (タイマー): 上向きでカウントダウン開始 (LCD表示)。ブザーでアラーム。シェイクで一時停止/残り時間表示。終了時にLCDが青→赤に変化しブザー3回鳴動。
- TV (テレビ): 上向きでTV ON。キーパッドでチャンネル入力 (この面が上の時のみキーパッド有効)。数字はBLE送信。シェイクでTV OFF。
- SOUND (音): 上向きで音センサー検知レベルに応じて緑色LEDの輝度変化。シェイクで機能OFF。手拍子検知等への応用も可能。
- OFF面: ニュートラル位置 (何もしない)。この面を上にしてシェイクすると 全機能を一括OFF (スマホのホームボタン的役割)。赤色LED点灯で暗闇での発見用。
構想からの変更点
- 元々は赤外線 (IR) でTVを直接制御予定だったが、Arduino 101がIRライブラリ未対応のため、BLEで別ステーション (Arduino UNO等) に送信し、そこからIR送信する方式に変更。
- ラジオ機能 (TV面と類似) を削除し、音センサー面に変更。
- 筐体を3Dプリントからレーザーカット (MDF) に変更。面ごとに交換可能な モジュラー構造 を実現 (例: タイマー面を自動猫餌やり面に差し替え等)。
製作手順
ハードウェア - 電子工作
Arduino 101にGrove Base Shieldを装着し、以下を接続:
- キーパッド: ピン 10, 8, 7, 6, 5, 4, 2 (順序通り)
- LED: アノード (長い足) → 220Ω抵抗 → 赤色線 (各ピンへ)、カソード (短い足) → 白色線 (GND共通)。ピン割当: 緑=9, 黄=11, 赤=12, 青=13, 赤(OFF用)=A2
- Groveセンサー: ブザー→D3, LCD RGB→I2C, 温度→A0, 音→A1
ハードウェア - 筐体 (レーザーカット)
付属の .dxf ファイルをレーザーカッターで加工。赤線は彫刻 (面のシンボル)、黒線は切断。内寸9cm立方体。3mm厚材料用 (厚みが異なる場合は MakerCase で調整)。MDF推奨だが他素材でも可。
組み立て手順:段ボールでLEDの厚み調整 → キーパッド取り付け (接着シート剥がして穴に嵌め込み) → LCD取り付け → バッテリーコネクター加工 (古いACアダプタープラグを切って電池スナップに接続、省スペース化) → 基板と電池を固定 (シェイク時に動かないよう) → コードアップロード → 電池接続 → 箱を閉じる。
コード解説
コードは添付ファイル (SMART CUBE - complete code with comments) に全文掲載。Arduino IDEでアップロード (Arduino 101対応版に更新済みのこと)。500行超だがほぼ全行にコメント付き。
構成:
- ライブラリと変数宣言: CurieIMU (加速度/ジャイロ), CurieBLE, Wire, rgb_lcd, Keypad。BLEサービス (Automation IO 0x1815) とキャラクタリスティック (Digital 0x2A56, Analog 0x2A58) を定義。
- setup(): ピンモード設定、LCD初期化、IMU初期化 (2Gレンジ、ショック検出閾値7.0g/継続2000ms)、BLEペリフェラル設定 (デバイス名 "SmartCubeSketch"、各サービス/キャラクタリスティック追加、初期値設定)。
- loop() - 4つのパート:
- 姿勢検出: Arduino公式チュートリアルベース。加速度計XYZから現在の向き (0〜5) を常時算出。
- 面の有効化: 向きが変わったら
millis()で計測開始。同じ向きがinterval(2000ms) 継続し、前回と異なる面なら該当フラグ (face0〜5) をtrueに。 - シェイク検出/無効化: IMUのショック割り込み検出 +
SHAKEinterval(2000ms) 経過で、最後に有効化した面 (lastFUNCTION) をfalseにし、BLEでOFF信号送信、LED消灯等の後処理。OFF面シェイク時は全面無効化。 - 有効面の継続処理:
faceX == trueの面のみ、毎ループ実行されるコア機能 (BLE送信、センサー読取、LCD更新、LED制御等)。
カスタマイズ方法: 各面の if (faceX == true) { ... } ブロック内と、シェイク時の無効化ブロック内を書き換えるだけ。メイン構造は維持。
アプリ (BLE確認用)
nRF Connect (Android/iOS) をインストール。デバイス検索で "smartcubesketch" に接続。「Automation IO」タブを開き、連続データ収集を有効化でBLE出力をリアルタイム確認可能。照明/温度/TV機能はBLE接続時のみ動作。
動作デモ動画
コード書き込み → 電池挿入 → 箱を閉じれば スマートキューブ完成! 全機能のデモ動画を用意しています。
結論
このプロジェクトはスマートホームへの 第一歩 です。Arduino 101の 加速度計・ジャイロスコープ がもたらす モビリティ と、BLE による 接続性 を組み合わせた新しいインタラクションです。初の実働プロトタイプ製作で多くの学びがあり、成果に満足しています。読者の皆様もこのガイドから何かを得て、ご自身のニーズに合わせて カスタマイズ していただければ幸いです。拙い英語で恐縮ですが、画像が補助になればと思います。
今後は セントラリネ (受信ステーション) を製作し、スマートキューブとアクチュエーター (照明、空調、TV等) の橋渡し役にしたいと考えています。Arduino 101とGroveキット (プロトタイピングに最適) を使う機会を得られて嬉しく思います。皆様のプロジェクトの インスピレーション になれば幸いです。どんな機能を追加し、どんな文脈で活用されるか楽しみにしています。
これが革命ではないかもしれませんが、家と対話する新しい方法 です。気に入っていただけたら幸いです。さあ、あなたの手でキューブを ハック してください!
コード全文
// Libraries
#include "CurieIMU.h"
#include
#include
#include "rgb_lcd.h"
#include
rgb_lcd lcd;
BLEPeripheral blePeripheral;
BLEService lightsService("1815");
BLEService termoService("1815");
BLEService TVService("1815");
BLEUnsignedCharCharacteristic lightsChar("2A56", BLERead | BLENotify);
BLEUnsignedCharCharacteristic termoChar("2A56", BLERead | BLENotify);
BLEUnsignedCharCharacteristic TVChar("2A58", BLERead | BLENotify);
// 定数・変数宣言 (面管理、シェイク検出、タイマー設定、温度閾値、キーパッド配列、LEDピン等)
void setup() {
// ピンモード、LCD、IMU、BLE初期化
// BLE初期値: lightsChar=3(初期状態), termoChar=0(冷暖房OFF), TVChar='x'(初期状態)
}
void loop() {
BLECentral central = blePeripheral.central();
unsigned long currentMillis = millis();
// 1. 姿勢検出 (Arduinoチュートリアル準拠)
// 2. 面有効化判定 (2秒静止でフラグ立て)
// 3. シェイク検出/無効化 (2秒シェイクでlastFUNCTION面を閉じる)
// 4. 有効面の処理 (face0=タイマー, face1=TV, face2=温度, face3=OFF, face4=照明, face5=音)
}
カスタムパーツとエンクロージャ
レーザーカッター用 .dxf ファイル (MDF 3mm用、赤線=彫刻、黒線=切断)。厚み違いの場合は修正必要。同内容の .pdf も同梱。
回路図
- Fritzing回路図 (黄色線=Groveコンポーネント接続)
- Grove Base Shield接続図
製造プロセス
- わずかに大きな設計がイノベーションを加速しリスクを減らす理由
- 家庭用の低コストワイヤレスセンサーネットワークを構築
- Raspberry Piダッシュボードで家庭の温度を監視する
- スマートプラントIoT:ArduinoとAzureで作る接続型グリーンハウス
- Alexaでシーリングファンを音声制御:ステップバイステップガイド
- ソーラーパネル:住宅への賢明な投資
- スマートホームテクノロジーが日常生活をどう変えるか
- スマートホームのスキルギャップを埋める:なぜ英国は欧州に後れを取るのか
- スマートホームの進化:コネクテッドリビングの未来を展望する
- スマートセキュリティ:ホームIoTデバイスをハッカーから守る専門家の戦略
- スマートホームセキュリティを強化する方法:エキスパートのヒント