Как я уже писал ранее, во многих сценариях интернета вещей бывает полезно иметь один достаточно мощный встраиваемый компьютер (в роли которого может выступать Raspberry Pi), который может связываться с множеством расположенных в разных местах сенсоров, управляемых простыми микроконтроллерами семейства Arduino. При этом можности Raspberry Pi хватает, чтобы передавать данные по защищенным каналам HTTPS в облако, а также чтобы осуществлять взаимодействие с пользователем посредством развитого интерфейса (например, при работе под управлением Windows 10).
Для соединения Arduino с Raspberry Pi существует несколько сценариев подключения:
- Использование явного последовательного канала передачи данных. При этом возникают сложности, связанные с разностью уровней питания: Raspberry Pi работает на напряжении 3.3В, в то время как Arduino использует 5 вольт. При этом для обеспечения безопасного соединения рекомендуется использовать специальные преобразователи уровня.
- Использование последовательной шины I2C, что позволяет подключать к одной Raspberry Pi до 128 устройств Arduino в режиме slave, при этом такое подключение также не требует преобразователей уровня.
- Подключение по USB является пожалуй самым простым способом, поскольку для этого достаточно всего лишь воткнуть Arduino через стандартный кабель в USB-разъем Raspberry Pi. Именно этот способ мы и рассмотрим.
В качестве примера рассмотрим простейший датчик температуры и давления BMP-180, подключенный к Arduino Uno по стандартной схеме. После этого контроллер Arduino включается в USB-разъем Raspberry Pi, а сам Raspberry Pi затем подключается обычным образом к питанию, монитору и т.д.
При таком подключении общение Arduino и Raspberry происходит по последовательному порту. Предварительно (до подключения) на Arduino необходимо залить требуемый скетч – в нашем случае это простая программа, считывающая значение давления и температуры с датчика и печатающая их в виде текста в последовательный канал (температура предваряется символом Т, а давление – P):
#include <Wire.h>
#include <BMP180.h>
BMP180 barometer;
void setup()
{
Serial.begin(9600);
Wire.begin();
barometer = BMP180();
if(barometer.EnsureConnected())
{
barometer.SoftReset();
barometer.Initialize();
}
else
{
Serial.println("E");
}
}
void loop()
{
if(barometer.IsConnected)
{
long pres = barometer.GetPressure();
float temp = barometer.GetTemperature();
Serial.print("P"); Serial.println(pres);
Serial.print("T"); Serial.println(temp);
delay(1000);
}
}
Проверим работоспособность скетча в Arduino IDE, открыв монитор последовательного порта – мы должны увидеть появляющиеся значения температуры и давления. Обратите внимание на скорость – в программе задана скорость в 9600 бод, такие же установки должны быть и у монитора последовательного порта.
Теперь загрузим Raspberry Pi – в моем примере я использую Pidora в качестве базовой операционной системы и классическую модель Rapsberry Pi, хотя с таким же успехом можно использовать Raspberry Pi 2 и Windows 10.
Первым делом нужно определить, какой последовательный порт будет отвечать за общение с Arduino-контроллером. Проще всего это сделать следующим образом: при выключенной плате Arduino смотрим все доступные последовательные терминалы (ls /dev/tty*), после чего включаем плату в USB-порт, и через некоторое время снова смотрим список терминалов. То устройство, которое появилось в списке, и будет требуемым портом. В моём случае это был /dev/ttyUSB0, но в зависимости от номера порта, используемого дистрибутива системы и других факторов это имя может сильно отличаться.
Теперь мы можем использовать любые средства общения с последовательным портом для того, чтобы принять значения от датчика, передаваемые Arduino. Чаще всего удобным оказывается использовать Python и библиотеку serial. Например, следующий простой скрипт, набранный прямо в REPL, будет отображать на экране все данные, приходящие в последовательный порт:
import serial
ser = serial.Serial("/dev/ttyUSB0",9600)
while 1:
ser.readline()
Ниже показано, как этот скрипт выполняется в окне терминала на Raspberry Pi:
После этого получения данных в требуемом виде с последующей отправкой их в облако или сохранением в локальной базе данных является делом техники. Об этом я поговорю в следующих выпусках своей колонки про интернет вещей.
Posted Июль 2nd, 2015. 1 comment
Я уже раньше писал про создания простейшей погодной станции на NetDuino. У рассмотренного решения есть ряд недостатков:
- Используется достаточно редкий контроллер NetDuino 2 Plus – было бы здорово перейти с него на более классический и недорогой Arduino
- Передача данных в сеть идет по незащищенному каналу связи HTTP – в реальных задачах разумнее использовать HTTPS, чтобы а значит для отправки данных необходим более мощный процессор, чем в Arduino
- Предложенный подход с веб-сервисом не всегда способен принять большой поток данных, поэтому если мы хотим поддерживать множество аналогичных погодных станций – необходимо использовать специальные облачные механизмы для интернета вещей, такие как концентраторы событий (Event Hub).
В этой заметке я немного порассуждаю на тему того, как должно быть устроено “взрослое” решение для интернета вещей и приведу много ссылок на англоязычные источники, а в следующих заметках уже опишу некоторые детали процесса подробнее на русском.
Аппаратная сторона
Итак, для отправки HTTPS-запросов и для работы с продвинутыми сервисами Azure нам необходим более мощный процессор, чем в Arduino – при этом Arduino по-прежнему остаётся стандартом де-факто для подключения различных датчиков. Поэтому обычно используют в том или ином виде комбинацию Arduino с более мощным микрокомпьютером, обычно работающим под управлением какой-то операционной системы:
- Связка Raspberry Pi + Arduino. Raspberry Pi представляет собой недорогой одноплатный контроллер стоимостью около $35, на котором могут работать как разные версии UNIX, так и Windows 10. В случае простых датчиков – их можно подключить прямо к Raspberry Pi, но обычно используют Arduino, которое может быть связано с Raspberry Pi по последовательному каналу либо через USB (самый простой способ), либо напрямую или по интерфейсу I2C. Преимуществом Raspberry Pi является то, что можно использовать достаточно мощную операционную систему и производить на плате не только передачу данных, но и осмысленную пред-обработку и принятие решений.
- Arduino Yun представляет собой одну плату, на которой по сути совмещена функциональность классического Arduino Uno и микрокомпьютера под управлением специальной версии Linux – OpenWrt. С точки зрения программирования такая связка очень похожа на рассмотренный выше вариант с Raspberry Pi, но при этом мы имеем одну плату (правда, с чуть менее функциональной ОС).
- Intel Gallileo или Edison – это компактные платы на основе процессоров x86, которые аппаратно совместимы с Arduino, при этом работают под управлением полноценной ОС типа Unix (или даже Windows). Можно работать со всеми аппаратными возможностями этих плат непосредственно из уровня ОС (например, используя Python и библиотеку Wiring x86 – пример такого скрипта смотрите тут, при этом такой же скрипт может отправлять данные в облако), либо с помощью эмулятора Arduino – в этом случае аппаратная часть программируется стандартным способом как Arduino Sketch в Arduino IDE, и затем связывается с базовой ОС через вызов system для отправки данных (пример смотрите тут).
- Конечно, можно еще использовать полноценный персональный компьютер с подключенным Arduino, но такой способ мы не будем рассматривать ввиду его простоты и экономической неэффективности.
Программная часть
Для отправки потоковых данных с датчиков в облако рекомендуется использовать технологию концентраторов событий. Если вы используете в качестве базового микрокомпьютера Raspberry Pi, Arduino Yun или Intel Galileo, то удобнее всего будет разрабатывать на Python. Для этого установите свежую версию Azure SDK for Python, в котором есть API для работы с Event Hub. Более подробный пример работы (с использованием более старого API) приведен тут, документация по функциям работы с Event Hub – тут, а я постараюсь в ближайшее время также описать этот процесс на русском языке.
Проект Connect-the-Dots
Проект Connect-the-Dots – это проект Microsoft Open Technologies с открытым исходным кодом, который показывает разные сценарии использования сенсоров для сбора данных в облаке с использованием Event Hub. Он по сути дела представляет собой реализацию тех принципов, о которых я написал выше – использование достаточно производительных контроллеров для отправки потоковых данных в Azure Event Hub.
В качестве сценариев поддерживается прямая отсылка данных в облако (с Intel Galileo или плат на основе .NET MicroFramework), или же использование шлюза на базе Raspberry Pi и конечных устройств на Arduino Uno, а также возможность использовать Windows Phone как прямой источник данных (освещенность, акселерометр и т.д.).
Проект Connect-the-Dots хорошо использовать как отправную точку для своих масштабных проектов, связанных с интернетом вещей. Более скромные проекты, возможно, имеет смысл делать с меньшим размахом – про это я буду писать в своих следующих заметках.
Posted Апрель 28th, 2015. 7 comments
Недавно на кафедре Вычислительной математики и программирования под моим руководством было успешно защищено шесть дипломных проектов с присвоением квалификации “математик-системный программист”. Я хочу коротко рассказать об этих проектах, чтобы остальные студенты примерно понимали, чем я занимаюсь, и с какими темами имеет смысл идти ко мне на диплом. Ну и просто потому, что ребята и девушки проделали отличную работу, которой хочется гордиться!
Описываю работы ребят в порядке слева-направо на этой фотографии:
- Артём Далевич сделал систему Real-Time Bidding на основе явного представления знаний в виде онтологии предметной области, которая была внедрена в реальную мобильную социальную сеть и дала прирост CTR более, чем на 300%, по сравнению с не-контекстной рекламой. Тема работы: “Облачная платформа мобильной рекламы в реальном времени с учетом онтологии интересов пользователя”.
- Константин Крашенинников провел исследование того, как влияют посты пользователя в твиттере на его решения о покупке в интернет-магазинах (на примере Amazon). Были собраны и проанализированы данные о большом числе реальных аккаунтов, получены интересные выводы и прототип рекомендательной системы товаров на основе анализа социальной сети.
- Олег Утеков собрал и запрограммировал прототип робота, способного нарисовать портрет пользователя по фотографии. В системе использовался оригинальный механизм рисования на основе схемы с обратной кинематикой, напоминающей руку художника, а также оригинальные алгоритмы построения последовательности штрихов для рисования. В этой работе было и программирование микроконтроллеров, и обработка изображений на базе OpenCV, и облачные технологии Microsoft Azure. Проект уже поддержан по программе BizSpark.
- Анна Кирилина сделала систему для лексикографов, облегчающую построение словарей. Система способна импортировать текстовые словари (в Rich Text) в единое лингвистическое мета-языковое поле, допускает последующую ручную коррекцию и редактирование, после чего возможен экспорт конкретных словарей для указанных пар языков в разные форматы, от Microsoft Word и HTML с перекрестными ссылками, до мобильного приложения Windows Phone. Работа использовалась для полуавтоматического перевода крымско-татарско-русского словаря в обратный словарь. Тема: “Программная система полуавтоматической генерации словарей для лексикографов”.
- Сергей Масленников решал смелую задачу создания веб-системы для проведения онлайн-конференций, которая должна сыграть такую же роль в переносе конференций в онлайн-формат, как системы MOOC делают для онлайн-образования. Был проведен анализ информационных процессов, лежащих в основе традиционных научных конференций, и затем выделена минимальная функциональность, не покрываемая традиционными социальными инструментами. Прототип системы использовался для организации импровизированной конференции дипломных работ студентов кафедры. Тема: “Программно-информационное обеспечение научных конференций в сети интернет”.
- Виктория Королькова защищала систему контроля результатов школьников на уроках физкультуры на основе Kinect, выполненную в рамках совместного проекта с институтом физической культуры, спорта, молодежи и туризма. Система использует Kinect для анализа выполняемых школьниками на уроках упражнений и получения результатов, для чего применяется ряд математических методов, начиная от метода наименьших квадратов и фильтра Калмана, заканчивая статистическими. Система прошла пробное внедрение в нескольких школах Москвы в рамках проекта департамента образования города. Тема: “Система автоматического мониторинга физической подготовки учащихся на основе технологии Microsoft Kinect”.
Надеюсь, некоторые из этих работы будут продолжены (многие были рекомендованы к публикации и внедрению)! К сожалению, в этом году не было работ по распределенному представлению знаний и сетевым функциональным языкам – но в этой области уже есть планы на следующие годы! Если вам интересны исследования в одной из этих областей – пишите, присоединяйтесь!
Ещё раз поздравляю всех ребят с успешной защитой!