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

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

Подключение 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

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

1 comment

Как научить ребенка программировать

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

Использованию информационных технологиях применительно к развитию детей посвящен мой новый курс на Microsoft Virtual Academy, под кодовым названием “Как научить ребенка программировать”. На самом деле речь пойдет не только о программировании – в этом курсе я постарался описать известные мне технологии Майкрософт, которые могут вдохновить ребенка на творчество.

Этот курс предназначен для родителей, которые ищут различные способы занять своих детей творчеством. Мы видим, что дети с удовольствием берут в руки компьютер, и важно дать им правильные творческие инструменты, чтобы они воспринимали компьютер не как поставщика развлекательного контента (наравне с телевизором), а как инструмент для творчества. На самом деле детям нравится творить (этим в основном объясняется популярность Minecraft), и важно направить их в правильное русло.

Среди технологий, о которых рассказывается в курсе – технологии для исследования мира (Bing Maps, Worldwide Telescope), для коллективного творчества (Photosynth, Image Composite Editor и др.). Я также уделяю особое внимание вопросу мотивации детей, и рассказываю о своем опыте работы с детскими коллективами как преподавателя детского лагеря ЮНИО-Р, одного из идеологов часа кода в России и детского трека Microsoft AppDay, лектора и ведущего мастер-классов в Компьютерии.

Особое внимание конечно уделяется именно обучению программированию. На мой взгляд, важнее всего увлечь ребенка на первых этапах процесса, поэтому предлагается использовать инструменты быстрого создания игровых миров Kodu Game Lab и Project Spark. Ну а потом уже подключаются различные “традиционные” инструменты – от увлекательного введения в C#, до возможного пути Small Basic –> Visual Basic и функционального программирования на F#.

Конечно, приведенный подход не является единственно правильным, и может кому-то показаться дискуссионным. Если у вас возникают какие-то свои мысли, или вы хотите поделиться своим опытом и пообсуждать вопросы обучения детей – я с удовольствием это сделаю в комментариях к этому посту, вконтакте или в твиттере.

Надеюсь, этот курс будет полезен и интересен – по крайней мере об интересе к этой теме говорят полные залы на моих докладах на конференциях DevCon и ряде других. Приятного просмотра!

Add a comment

Команда евангелистов Microsoft готовится к конференции DevCon 2015

image

Завтра в подмосковном курорте Яхонты начнется крупнейшая в России конференция для разработчиков по технологиям Майкрософт – Microsoft DevCon. Но наша команда евангелистов уже сегодня присутствует на мероприятии и активно готовиться поразить всех слушателей завтра самыми искрометными и интересными докладами. А для тех, кто не сможет присутствовать лично – смотрите онлайн-трансляцию на сайте конференции.

Add a comment