Блог Дмитрия Сошникова

про технологии и человеческое счастье

You are currently browsing the Технологии category.

Подключение Arduino к Raspberry Pi

Как я уже писал ранее, во многих сценариях интернета вещей бывает полезно иметь один достаточно мощный встраиваемый компьютер (в роли которого может выступать 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 затем подключается обычным образом к питанию, монитору и т.д.

WP_20150427_18_39_55_Pro

При таком подключении общение 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, но в зависимости от номера порта, используемого дистрибутива системы и других факторов это имя может сильно отличаться.

2015-04-27-190009_1920x1200_scrot

Теперь мы можем использовать любые средства общения с последовательным портом для того, чтобы принять значения от датчика, передаваемые Arduino. Чаще всего удобным оказывается использовать Python и библиотеку serial. Например, следующий простой скрипт, набранный прямо в REPL, будет отображать на экране все данные, приходящие в последовательный порт:

import serial
ser = serial.Serial("/dev/ttyUSB0",9600)
while 1:
   ser.readline()

Ниже показано, как этот скрипт выполняется в окне терминала на Raspberry Pi:

2015-04-27-185823_1920x1200_scrot

После этого получения данных в требуемом виде с последующей отправкой их в облако или сохранением в локальной базе данных является делом техники. Об этом я поговорю в следующих выпусках своей колонки про интернет вещей.

Posted Июль 2nd, 2015.

Add a comment

От погодной станции к взрослому интернету вещей. Проект Connect the Dots

Я уже раньше писал про создания простейшей погодной станции на 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.

image

В качестве сценариев поддерживается прямая отсылка данных в облако (с Intel Galileo или плат на основе .NET MicroFramework), или же использование шлюза на базе Raspberry Pi и конечных устройств на Arduino Uno, а также возможность использовать Windows Phone как прямой источник данных (освещенность, акселерометр и т.д.).

Проект Connect-the-Dots хорошо использовать как отправную точку для своих масштабных проектов, связанных с интернетом вещей. Более скромные проекты, возможно, имеет смысл делать с меньшим размахом – про это я буду писать в своих следующих заметках.

Posted Апрель 28th, 2015.

7 comments

Рождение новых математиков и программистов

Недавно на кафедре Вычислительной математики и программирования под моим руководством было успешно защищено шесть дипломных проектов с присвоением квалификации “математик-системный программист”. Я хочу коротко рассказать об этих проектах, чтобы остальные студенты примерно понимали, чем я занимаюсь, и с какими темами имеет смысл идти ко мне на диплом. Ну и просто потому, что ребята и девушки проделали отличную работу, которой хочется гордиться!

Diplomaz2015-2

Описываю работы ребят в порядке слева-направо на этой фотографии:

  • Артём Далевич сделал систему Real-Time Bidding на основе явного представления знаний в виде онтологии предметной области, которая была внедрена в реальную мобильную социальную сеть и дала прирост CTR более, чем на 300%, по сравнению с не-контекстной рекламой. Тема работы: “Облачная платформа мобильной рекламы в реальном времени с учетом онтологии интересов пользователя”.
  • Константин Крашенинников провел исследование того, как влияют посты пользователя в твиттере на его решения о покупке в интернет-магазинах (на примере Amazon). Были собраны и проанализированы данные о большом числе реальных аккаунтов, получены интересные выводы и прототип рекомендательной системы товаров на основе анализа социальной сети.
  • Олег Утеков собрал и запрограммировал прототип робота, способного нарисовать портрет пользователя по фотографии. В системе использовался оригинальный механизм рисования на основе схемы с обратной кинематикой, напоминающей руку художника, а также оригинальные алгоритмы построения последовательности штрихов для рисования. В этой работе было и программирование микроконтроллеров, и обработка изображений на базе OpenCV, и облачные технологии Microsoft Azure. Проект уже поддержан по программе BizSpark.
  • Анна Кирилина сделала систему для лексикографов, облегчающую построение словарей. Система способна импортировать текстовые словари (в Rich Text) в единое лингвистическое мета-языковое поле, допускает последующую ручную коррекцию и редактирование, после чего возможен экспорт конкретных словарей для указанных пар языков в разные форматы, от Microsoft Word и HTML с перекрестными ссылками, до мобильного приложения Windows Phone. Работа использовалась для полуавтоматического перевода крымско-татарско-русского словаря в обратный словарь. Тема: “Программная система полуавтоматической генерации словарей для лексикографов”.
  • Сергей Масленников решал смелую задачу создания веб-системы для проведения онлайн-конференций, которая должна сыграть такую же роль в переносе конференций в онлайн-формат, как системы MOOC делают для онлайн-образования. Был проведен анализ информационных процессов, лежащих в основе традиционных научных конференций, и затем выделена минимальная функциональность, не покрываемая традиционными социальными инструментами. Прототип системы использовался для организации импровизированной конференции дипломных работ студентов кафедры. Тема: “Программно-информационное обеспечение научных конференций в сети интернет”.
  • Виктория Королькова защищала систему контроля результатов школьников на уроках физкультуры на основе Kinect, выполненную в рамках совместного проекта с институтом физической культуры, спорта, молодежи и туризма. Система использует Kinect для анализа выполняемых школьниками на уроках упражнений и получения результатов, для чего применяется ряд математических методов, начиная от метода наименьших квадратов и фильтра Калмана, заканчивая статистическими. Система прошла пробное внедрение в нескольких школах Москвы в рамках проекта департамента образования города. Тема: “Система автоматического мониторинга физической подготовки учащихся на основе технологии Microsoft Kinect”.

Надеюсь, некоторые из этих работы будут продолжены (многие были рекомендованы к публикации и внедрению)! К сожалению, в этом году не было работ по распределенному представлению знаний и сетевым функциональным языкам – но в этой области уже есть планы на следующие годы! Если вам интересны исследования в одной из этих областей – пишите, присоединяйтесь!

Ещё раз поздравляю всех ребят с успешной защитой!

Posted Январь 29th, 2015.

Add a comment