Создаем комнатный детектор движения на Arduino и MATLAB
В этом примере будет создан простой детектор движения, на базе фоторезистора и Arduino. Управляется при помощи Arduino Support Package для MATLAB.
Введение
Фоторезистор – это переменный резистор, который реагирует на интенсивность падающего света, следовательно, детектор движения будет обнаруживать только то движение, которое вызывает изменения освещенности.
Управляющая программа, написанная в MATLAB, будет использовать команды из Support Package, чтобы считывать напряжение с контактов Arduino. Значения напряжения будут загружаться напрямую в MATLAB с привязкой ко времени. Эти данные будут выведены на график и проанализированы в реальном времени для обнаружения движения.
Код использует комбинацию алгоритмов для обнаружения движения, но есть множество других алгоритмов машинного обучения и анализа данных, которые могут быть использованы в подобных проектах.
Пока детектор движения работает, программа MATLAB хранит все показания напряжения вместе с соответствующими временными отметками. Это позволяет пользователю обрабатывать полный набор данных в MATLAB после завершения записи. Далее в статье представлены результаты анализа нескольких таких записей и алгоритмов.
Что понадобится?
- Arduino или аналог
- Кабель USB
- 1 фоторезистор
- 10 кОм резистор
- Провода (МГТФ на 0,2 должно хватить)
- Небольшая макетная плата
Задача 1: Подключение Arduino к MATLAB
Для подключения Arduino к MATLAB необходимо установить пакет поддержки MATLAB для Arduino. Этот пакет поддержки доступен для MATLAB, начиная с релиза R2014a (текущий R2015а) и выше, и ставится с помощью установщика пакетов поддержки. Этот установщик может быть открыт из ленты MATLAB (Add-Ons -> Get Hardware Support Packages) или из командной строки при помощи команды supportPackageInstaller. После установки пакета поддержки можно подключать Arduino.
Порядок действий
- Подключить Arduino к компьютеру с помощью кабеля USB.
- В MATLAB инициализировать объект Arduino:
% Inputs: Port ID (from your computer), Arduino board type
myArduino = arduino('COM4','uno');
Задача 2: Проверка соединения MATLAB-Arduino
У большинства плат Arduino или клонов есть встроенный светодиод на выводе 13. Если у вашей платы есть светодиод, вы можете проверить соединение, просто помигав им.
Если встроенного светодиода нет, то можно подключить один последовательно к резистору между цифровым выводом (например, 13) и GND (см. электрическую схему ниже).
Номинал резистора будет разным для цвета светодиода, но для красных и желтых светодиодов должно быть достаточно резистора 330 Ом. Когда светодиод будет подключен, для проверки надо выполнить код ниже (5 раз помигаем светодиодом).
Задача 3: Сборка схемы
Важно то, что, как и все резисторы, фоторезистор не имеет ориентации – не нужно беспокоиться о направлении тока, протекающего через него. Сначала нужно создавать простой делитель напряжения с использованием фоторезистора:
- На макетке соединим последовательно фоторезистор и 10кОмный резистор.
- Подключим свободный вывод 10 кОмного резистора к выводу GND Arduino.
- Подключим свободный вывод фоторезистора к выводу 5V Arduino.
Чтобы померить напряжение между фоторезистором и 10 кОм резистором, надо подключить эту точку в цепи к аналоговому выводу Arduino при помощи провода. Эта связка будет работать как потенциометр.
Задача 4: Проверка схемы и фоторезистора
Следующим шагом является проверка схемы для того, чтобы убедиться в том, что фоторезистор правильно реагирует на меняющуюся освещенность.
Приведенный ниже скрипт показывает, как настроить Arduino и получить показания напряжения от фоторезистора через аналоговый вывод Arduino.
Попробуйте накрыть фоторезистор или включить/выключить свет в помещении, когда работает скрипт, чтобы увидеть, как фоторезистор реагирует на изменения освещенности.
Задача 5: Калибровка алгоритма детектора движения
Так как фоторезистор обладает высокой чувствительностью, алгоритмы обнаружения движения потребуют калибровки, которая будет зависеть от окружающих условий освещения и сценария использования детектора движения. Программные уровни освещенности также должны быть скорректированы с учетом желаемой чувствительности.
Код MATLAB для детектора движения (Run_Motion_Detector.m) применяет три вида расчетов в режиме реального времени, для определения того, что текущее значение напряжения соответствует движению.
Каждый расчет – это простой способ количественной оценки изменчивости в пределах небольшого окна данных. Каждый результат расчетов сравнивается с соответствующей пороговой величиной для определения показывает ли это изменение движение. Если какой-либо из результатов превышает соответствующее пороговое значение переменной, текущее значение напряжения обозначается как движение.
Пороговые переменные имеют непосредственное отношение к чувствительности детектора движения и должны быть откалиброваны для каждой конкретной ситуации.
Всего реализовано 3 метода:
- Метод стандартных отклонений: вычисляет стандартное отклонение всех точек внутри окна данных, используя std(voltages). Это основной расчет разницы между показаниями напряжения.
- Метод разностей: вычисляет сумму абсолютных значений разностей между последовательными точками с использованием sum(abs(diff(voltages))). Это расчет чистого изменения между последовательными точками данных в окне данных.
- Метод Slope: вычисляет наиболее подходящий линейный тренд (slope) для окна данных. Требуются как показания напряжения, так и соответствующие отсчеты времени.
Для описательного анализа условий освещения функция getLightingCondition качественно описывает интенсивность света при каждом считывании напряжения.
Эта функция также должна быть откалибрована и расширена соответствующим образом для описания уровня освещенности на месте установки вашего детектора движения.
Задача 6: Обработка записанных данных
Многие датчики движения предназначены только для обнаружения движения в режиме реального времени, так как они предназначены для автоматизации определенной задачи. Это очень распространенный тип детектора движения, применяемый в автоматических дверях в аэропортах и магазинах, или активируемых движением выключателей в офисных зданиях.
Детектор движения, созданный с использованием MATLAB, построенный в этом примере может не только обнаружить движение в реальном времени, а также дополнительно записывать и собирать показания датчика в течение всего сеанса записи.
Функция Run_Motion_Detector автоматически сохраняет необработанные значения аналоговых напряжений и временные отсечки переменных analogVoltage и sensorTime в базовом рабочем пространстве MATLAB.
После сохранения в MATLAB эти данные могут быть переданы функции Analyze_Motion_Detector_Data для реализации и сравнения различных алгоритмов обнаружения движения. На рисунке ниже показаны результаты работы трех алгоритмов обнаружения движения применительно к полному набору данных.
Красные маркеры данных характеризуются как движение по всем трем способами. Показательно, что некоторые движения обнаруживается только по методу Slope (показан зелеными маркерами), в то время как другое движение обнаруживается только методом стандартного отклонения и/или разностным методом (показано голубыми маркерами).
Используя комбинацию этих трех методов для определения движения, детектор движения, реализованный в MATLAB, может создать полную запись движения.
Задача 7: Классификация движения
Используя MATLAB для обработки данных, легко выделить события движения и характеризовать каждое по нескольким рассчитанным параметрам.
Некоторые простые параметры, которые могут быть рассчитаны, включают в себя:
- уровень освещенности, прежде чем произошло событие движения
- уровень освещенности после движения
- средняя освещенность в течение события движения
- общее время для события движения
Функция Categorize_Motion_Events вычисляет эти четыре параметра для каждого события движения и использует их для качественного описания записей движения.
Описания используются для создания отметок на графике напряжения. Отметки движения состоят из трех символов и расположены выше события движения.
- Первый символ — плюс, минус, или знак равенства указывает на увеличение интенсивности освещения (+), снижение (-), или неизменности (=) в окрестности события движения.
- Следующий символ является буквой, обозначающей определенный тип движения. Типы движения с соответствующими буквами перечислены ниже:
- G: Длительное движение (перемена освещения происходит в течение более чем 20 секунд)
- Е: Расширенное движения (перемена освещения происходит в течение нескольких секунд)
- М: Значительное изменение освещенности (изменения освещенности резко вокруг события)
- С: Комбинация (изменение освещенности во время и вокруг события)
- L: изменение освещенности (небольшое изменение освещенности вокруг события)
- Т: Временное движение (никаких существенных изменений освещенности вокруг события)
- Третий знак (если указан) показывает, как среднее значение освещенности в течение каждого события движения связано с предыдущей и следующей интенсивностями света, используя те же знаки плюс, минус и знак равенства, как и для первого символа.
Если требуется отслеживать конкретные виды движения, то можно ужесточить ограничения, чтобы получить более точную классификацию, или использовать методы машинного обучения в MATLAB для программирования автоматически настраиваемого детектора движения.
Практическое применение: Наблюдение за активностью в холле
Так как детектор движения чувствителен к изменениям освещенности, лучше всего он будет работать, когда движение, которое вы хотите отследить, соответствует резкому увеличению или резкому снижению освещенности.
Одним из сценариев, который хорошо работает для обнаружения людей, является расположение детектора движения в коридоре на хорошо освещенной стене или рядом с источником света. Когда люди будут проходить по коридору, будет происходить резкое падение напряжения, когда их тени будут попадать на фоторезистор.
На графике ниже представлены данные, которые собраны детектором движения в холле. События движения классифицируются с использованием версии функции Categorize_Motion_Events, которая была специально модифицирована для анализа данных собранных в холле.
События движения, классифицированные как изменения освещения (M или L), могут быть отброшены, поскольку они, скорее всего, не указывают людей, проходящих через холл.
Это оставляет девять событий, которые, по всей видимости, указывают на проход людей. Может быть выполнен дальнейший анализ, чтобы вычислить скорость человека при ходьбе или как много людей было в группе, изучая длину события движения.
Вывод
При помощи Arduino был создан простой детектор движения, MATLAB был использован для калибровки детектора и классификации движения.
Практическое применение: потренироваться на кошках для оттачивания своего алгоритма с последующим переносом на более серьезную компонентную базу.
Комментарии
Arduino это круто