Intel Curie搭載Arduino 101によるモーションアクティブ照明システム
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino 101(Intel Curie搭載) | 1 |
プロジェクト概要
Arduino 101に内蔵されるIntel Curieモジュールの加速度センサーとジャイロスコープを活用し、複数のモーション連動照明スケッチを開発しました。
目標
- 足音(振動)を検知して照明を自動ON/OFF
- 近くでタッピングやダンスのテンポを検出し、照明の点滅を同期
- 加速度・ジャイロデータをUSB/Bluetooth経由で出力し、地震的イベントの検知に活用
GitHubリポジトリ
https://github.com/ckuzma/arduino-101-sketches
収録スケッチ
1. TapFlashTest
タップ(衝撃)検知でオンボードLEDを点滅。衝撃検知閾値の調整用。
#include "CurieIMU.h"
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
CurieIMU.begin();
CurieIMU.attachInterrupt(eventCallback);
CurieIMU.setDetectionThreshold(CURIE_IMU_SHOCK, 1050); // 1.050g = 1050mg
CurieIMU.setDetectionDuration(CURIE_IMU_SHOCK, 75); // 75ms
CurieIMU.interrupts(CURIE_IMU_SHOCK);
}
void loop() {}
static void eventCallback(void) {
if (CurieIMU.getInterruptStatus(CURIE_IMU_SHOCK)) {
digitalWrite(LED_BUILTIN, HIGH);
delay(50);
digitalWrite(LED_BUILTIN, LOW);
}
}
2. TapBeatMatch
テーブル上のタッピングテンポを検出し、オンボードLEDの点滅をそのテンポに同期。加重平均でノイズを軽減。衝撃検知閾値調整可能。

3. SeismicReader + Python可視化スクリプト
- Arduino 101がJSON形式で加速度・ジャイロ値をシリアル出力
- Pythonスクリプトがデータを読み取り、ターミナル上でシンプルなグラフ表示
- CSV保存対応(Excelでグラフ化可能)
- Python 2.x/3.x 両対応、マルチプラットフォーム

4. VibrationLighting
- 本来は足音接近で照明ON/OFFを想定していたが、S/N比が不十分だったため、ミラーへのダブルノック検知に縮小
- 玄関ミラー下部のLEDストリップが、ミラーを2回ノックするたびにON/OFF

ボーナス:汎用化スケッチ「ExternalGyroscope」
Arduino 101専用ではなく、MPU-6050(GY-521/ITG-MTU)等の外付けI2Cセンサーを接続した任意のArduinoで動作するよう移植。CurieGraph.py でデータ可視化可能。
#include
const int MPU_addr = 0x68; // MPU-6050 I2Cアドレス
int ax, ay, az, temp, gx, gy, gz;
void setup() {
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); // スリープ解除
}
String jsonEncodeValue(String key, float keyVal) {
return "\"" + key + "\":" + String(keyVal);
}
String assembleJson(String keysAndVals) {
return "{" + keysAndVals + "}";
}
void loop() {
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); Wire.endTransmission(false);
Wire.requestFrom(MPU_addr, 14, true);
ax = Wire.read()<<8 | Wire.read();
ay = Wire.read()<<8 | Wire.read();
az = Wire.read()<<8 | Wire.read();
temp = Wire.read()<<8 | Wire.read();
gx = Wire.read()<<8 | Wire.read();
gy = Wire.read()<<8 | Wire.read();
gz = Wire.read()<<8 | Wire.read();
String keyVals = jsonEncodeValue("ax", ax) + ",";
keyVals += jsonEncodeValue("ay", ay) + ",";
keyVals += jsonEncodeValue("az", az) + ",";
keyVals += jsonEncodeValue("gx", gx) + ",";
keyVals += jsonEncodeValue("gy", gy) + ",";
keyVals += jsonEncodeValue("gz", gz);
Serial.println(assembleJson(keyVals));
delay(100);
}

注:CurieGraph.py は起動時に数回失敗することがありますが、通常3回目以降で正常接続します。
製造プロセス
- Alexaでシーリングファンを音声制御:ステップバイステップガイド
- Arduino UnoでAtmel AT89シリーズを簡単プログラミング──ステップバイステップガイド
- Arduinoと1Sheeldで作る万能Androidリモコン──IR制御で家電を一括操作
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- Arduino電源制御センター:N-FET/P-FET/リレー/RTC搭載キット
- IoTで遠隔操作する自作ロボットアーム:Arduino MKR1000とSimulink、ThingSpeak活用
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- Arduino Nanoとジョイスティックで2軸ステッピングモーターを制御:Visuinoで簡単プログラミング
- Arduino UNO + WiFiシールドで温度をWebリアルタイム表示 — シリアル出力だけでグラフ化
- 高度なモータ制御回路:ラッチング、停止、タイムディレイ技術