Система управления светом на Intel Curie (Arduino 101) с детекцией движений
Компоненты
- Arduino 101 (Intel Curie) — 1 шт. (встроенные акселерометр и гироскоп BMI160)
О проекте
Проект исследует возможности встроенного в Intel Curie 6-осевого IMU (акселерометр + гироскоп) для трёх задач:
- Автоматическое включение света при обнаружении шагов/вибраций (детекция ударов/шока).
- Синхронизация мигания со стуком/танцем — определение темпа и мигание в такт.
- Вывод сырых данных IMU (JSON) по Serial/Bluetooth для сейсмического мониторинга / краудсорсинга данных.
Все скетчи доступны в репозитории: github.com/ckuzma/arduino-101-sketches
Основные скетчи
1. TapFlashTest — базовая детекция удара
Мигает встроенным LED (pin 13) при обнаружении удара по плате.
#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 с акселерометра/гироскопа в Serial. Python-скрипт (CurieGraph.py) читает порт, рисует графики в терминале и сохраняет CSV для Excel.
Поддержка Python 2.x / 3.x, кроссплатформенный.
4. VibrationLighting — практическое применение
Изначально задумывалось для детекции шагов у входной двери и включения ленты. Из-за шума упростили до «двойного стука» по зеркалу — включает/выключает LED-ленту под зеркалом.
Бонус: работа с внешним MPU-6050 (GY-521) на любом Arduino
Скетч ExternalGyroscope читает MPU-6050 по I2C и выдает тот же JSON-формат, совместимый с CurieGraph.py. Демонстрирует, как дешевые сенсоры + любой Arduino могут участвовать в краудсорсинге сейсмических данных.
#include <Wire.h>
const int MPU_addr = 0x68;
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); // wake up
}
String jsonEncodeValue(String key, float val) {
return "\"" + key + "\":" + String(val);
}
String assembleJson(String kv) { return "{" + kv + "}"; }
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 kv = jsonEncodeValue("ax", ax) + ",";
kv += jsonEncodeValue("ay", ay) + ",";
kv += jsonEncodeValue("az", az) + ",";
kv += jsonEncodeValue("gx", gx) + ",";
kv += jsonEncodeValue("gy", gy) + ",";
kv += jsonEncodeValue("gz", gz);
Serial.println(assembleJson(kv));
delay(100);
}
Примечание: CurieGraph.py может не запуститься с первого раза — обычно заработает к 3-й попытке.
Производственный процесс
- Продвинутые схемы управления двигателями: защёлкивание, стоп и задержка времени
- Управление потолочным вентилятором через Alexa: пошаговое руководство
- Легкая прошивка микроконтроллеров Atmel AT89 с помощью Arduino Uno — пошаговое руководство
- Универсальный Android-пульт на Arduino, 1Sheeld и ИК-управлении
- Умная копилка: управление монетоприёмником на Arduino Nano
- Arduino Power Control Center: N-FET, P-FET, реле и RTC
- Удаленное IoT-управление самодельной манипулятором
- Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
- DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением
- Управление двумя шаговыми двигателями через джойстик на Arduino Nano — простой урок (Visuino)