Статьи

Управляйте физическим миром с помощью Ruby и Artoo

IoTWeek_Gray

Это неделя Интернета вещей в SitePoint! Всю неделю мы публикуем статьи, ориентированные на пересечение интернета и физического мира, поэтому следите за последними обновлениями в теге IoT .

Арт

Ruby — довольно приятный язык. Но в прошлом, когда кто-либо упоминал «встроенный», никто не думал о слове «пятно». Вместо этого часто приходили в голову видения ужасно написанного C с большим количеством битов или воспоминаний о чрезмерном количестве времени, проведенного при неадекватном освещении, пытающемся бороться с макетом. К счастью, это не относится к Artoo . Artoo — классная библиотека, которая позволяет Ruby контролировать и взаимодействовать с множеством различных аппаратных платформ (например, Sphero, Arduino и т. Д.). В этой статье мы сосредоточимся на том, чтобы запустить Artoo и запустить его, и рассмотрим несколько различных примеров работы Artoo с использованием Arduino и стандартной клавиатуры.

Настройка программного обеспечения

Предполагая, что у вас есть функциональная версия Ruby (предпочтительно установленная с RVM или rbenv ), установка Artoo очень проста:

   gem install artoo

Кроме того, нам также нужны отдельные гемы для каждого бита оборудования, которое мы хотим использовать. В этой статье мы будем использовать Arduino в качестве основной платформы. Чтобы это работало:

   gem install artoo-arduino

Это все, что нам нужно, чтобы программа начала работать! Следующим шагом будет разговор с Arduino через Artoo.

Настройка оборудования

Как вы, возможно, слышали, Arduino основан на платформе микроконтроллера под названием Atmel AVR. Когда-то в разработке AVR было время, когда вы обычно начинали со взломанного вместе программиста параллельных портов или покупали STK500 и начинали писать какой-то битовый код на C. Затем, если вы работали в Windows, вы могли бы использовать AVRStudio без проблем. Если бы вы работали в Linux, вам пришлось бы использовать набор инструментов gccпередать его в микроконтроллер с помощью avrdude .

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

К счастью, Арту не позволяет нам пройти через эту боль. Вместо этого мы можем использовать Gort с хорошей установочной страницей, которая хорошо работает на различных платформах. Gort значительно упрощает загрузку прошивки на устройства, подключенные через последовательные порты (например, USB). Он не переопределяет функциональность, предоставляемую чем-то вроде avrdude, а просто оборачивает эту функциональность в гораздо более простой в использовании интерфейс. Первым шагом является подключение вашего Arduino к USB-порту на вашем компьютере. Затем мы можем найти его командой gort

   gort scan serial

Это даст вам список последовательных портов, и вы сможете выяснить, к какому из них подключен ваш Arduino. Gort может подключаться ко всем видам устройств. Поскольку мы хотим, чтобы он общался с Arduino, в частности, мы должны установить пакеты, связанные с Arduino, для gort:

   gort arduino install

Вот и все! Чуть gort arduino uploadrequire 'artoo'

connection :arduino, adaptor: :firmata, port: '/dev/ttyACM0'

device :led, driver: :led, pin: 13
device :button, driver: :button, pin: 2, interval: 0.01

work do
puts "Press the button connected on pin #{ button.pin }..."

on button, :push => proc { led.on }
on button, :release => proc { led.off }
end

Архитектура Арту

Artoo — это не просто библиотека, которая позволит нам писать код на Ruby, который работает на Arduino. Скорее, это способ построить устройства в «группы» гораздо более эффективным и чистым способом. Устройства в документации Artoo упоминаются как «роботы». Они не обязательно имеют характеристики, которые мы обычно связываем с роботами (например, движение); они просто должны быть устройствами, которые каким-то образом взаимодействуют с физическим миром (например, Arduino, сферо и т. д.). Он получает события от этих устройств, используя «сокеты», хотя они могут быть через последовательное соединение для чего-то вроде Arduino. Эти события с устройств обрабатываются фрагментом кода, называемым Artoo Master Class. По сути, этот фрагмент кода существует для того, чтобы эти устройства могли работать вместе, а не как полностью независимые устройства. Вы можете думать об этом как о «главном» узле в кластере.

Итак, цель Artoo — позволить вам управлять несколькими устройствами («роботами») для совместной работы, а не для всех.

Это было бы достаточно круто, если бы Арту остановился там. Но это не так. Artoo позволяет вам предоставлять API через HTTP и WebSockets, чтобы вы могли создавать Web / iOS / Android / и т. Д. приложение поверх этих устройств. Например, если вы хотите иметь возможность управлять освещением в комнате с Arduino, вам больше не нужно создавать все, что нужно для связи с Arduino самостоятельно. Вместо этого, используя Artoo, у вас уже есть открытый API, который позволяет вам это делать. Все, что вам нужно сделать, это написать код, который управляет освещением (используя помощников Арту и т. Д. В Ruby) и написать простое приложение, ориентированное на пользователя. Artoo позаботится об остальном. Учитывая, как тяжело было в прошлом подключать веб-сервер к аппаратному устройству, это огромный шаг вперед. Особенно, если вы используете что-то вроде платформы Particle , вы можете создавать довольно классные, связанные с облаком вещи.

светодиоды

Теперь, когда мы знаем, как работает Artoo на более высоком уровне, давайте разберемся с мелочами. Мы разберем пример из Artoo, который позволяет нам создать светодиод, который реагирует на кнопку. Прямо из документации Artoo мы имеем:

 /dev/ttyACM0

Вам следует заменить gort scan serialconnection :arduino, adaptor: :firmata, port: '/dev/ttyACM0'
Несмотря на то, что этот код выглядит довольно простым, он немного закулисен, и документация в настоящее время не очень хорошо объясняет, что на самом деле происходит. Прежде всего, мы настроили соединение с устройством следующим вызовом:

 device :led, driver: :led, pin: 13

Чтобы поговорить с Arduino, Artoo использует протокол Firmata . Протокол Firmata был реализован для всех видов устройств и позволяет Artoo создавать API и т. Д. Поверх Arduino.

 led

Здесь мы представляем совершенно новую концепцию: драйверы устройств. Artoo определяет вещи, с которыми Arduino может взаимодействовать, используя концепцию драйверов устройств. Они принимают аргументы в зависимости от функции устройства. Есть несколько драйверов устройств, которые включены в пакет Artoo Arduino, и другие могут быть добавлены довольно легко. Светодиодный драйвер принимает только один аргумент: контакт, к которому он подключен. В этот момент вы должны подключить светодиод к контакту 13 Arduino.

 device :button, driver: :button, pin: 2, interval: 0.01

Драйвер button Требуется pininterval Если вы читали код Arduino ранее, это будет выглядеть знакомо: интервал, с которым происходит событие.

 work do
  ...
end

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

 on button, :push    => proc { led.on }
on button, :release => proc { led.off }

Драйвер устройства предоставляет два события, которые мы кодируем: releasepush Затем мы используем устройство с именем leddevice Чтобы «развернуть» этот код, нам нужен Arduino, чтобы научиться разговаривать с компьютером:

 gort arduino upload /dev/ttyACM0

Конечно, вы должны заменить /dev/ttyACM0 Это позволит Arduino общаться в Firmata, чтобы мы могли сказать ему, что делать через USB. Допустим, мы сохранили код в arduino_pushbutton.rb Затем мы можем запустить его только со стандартным Ruby:

 ruby arduino_pushbutton.rb

Это должно подключиться к Arduino и включать и выключать светодиод в соответствии с состоянием кнопки.

Клавиатура

Оказывается, мы не ограничены платами микроконтроллеров в качестве физических устройств ввода. Вместо этого мы можем даже использовать клавиатуру, потому что для нее есть драйвер устройства. Чтобы получить драйвер устройства, мы просто делаем:

 gem install artoo-keyboard

Теперь давайте рассмотрим пример использования клавиатуры в качестве устройства ввода:

 require 'artoo'

connection :keyboard, adaptor: :keyboard
device :keyboard, driver: :keyboard, connection: :keyboard

work do
  on keyboard, :key => :got_key
end

def got_key(sender, key)
  puts sender
  puts key
end

Давайте разберем этот код.

 connection :keyboard, adaptor: :keyboard
device :keyboard, driver: :keyboard, connection: :keyboard

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

 work do
  on keyboard, :key => :got_key
end

Драйвер устройства :keyboardkey Мы связываем это с определенным обратным вызовом.

 def got_key(sender, key)
  puts sender
  puts key
end

При обратном вызове мы просто распечатываем устройство, которое отправило нам это событие (то есть клавиатуру), и значение ключа.

Положить его вместе

До сих пор мы работали с одним устройством одновременно. Это немного скучно и несколько лучше, чем использовать что-то вроде Artoo. Мы хотим, чтобы эти устройства могли взаимодействовать, чтобы создавать что-то более значимое, чем просто светодиод, включаемый кнопкой. Итак, мы создадим «регистратор ключей» и попытаемся украсть пароли пользователей Gmail.

Ну вроде. Что мы собираемся сделать, это использовать драйвер клавиатуры, чтобы выяснить, когда кто-то вводит «gmail.com», и, как только они это сделают, включите светодиод на Arduino, чтобы мы знали, что нужно искать пароль сразу после этого. Не очень полезно, но должно позволить нам использовать клавиатуру и Arduino вместе:

 require 'artoo'

connection :keyboard, adaptor: :keyboard
device :keyboard, driver: :keyboard, connection: :keyboard

connection :arduino, adaptor: :firmata, port: '/dev/ttyACM0'
device :led, driver: :led, pin: 13

read_so_far = ""

work do
  on keyboard, :key => :got_key
end

def got_key(sender, key)
  read_so_far = read_so_far + key
  if read_so_far.end_with? "gmail.com"
    led.on
  end
end

И это должно нас заинтересовать! Давайте разберем код.

 connection :keyboard, adaptor: :keyboard
device :keyboard, driver: :keyboard, connection: :keyboard

connection :arduino, adaptor: :firmata, port: '/dev/ttyACM0'
device :led, driver: :led, pin: 13

Опять же, мы сначала настраиваем соединения и драйверы устройств. Затем на цикл событий:

 work do
  on keyboard, :key => :got_key
end

Единственное, что действительно отличается здесь, это сам обратный вызов:

 def got_key(sender, key)
  read_so_far = read_so_far + key
  if read_so_far.end_with? "gmail.com"
    led.on
  end
end

Мы включаем светодиод, когда замечаем, что пользователь набрал «gmail.com»! Конечно, это служит только примером. Драйвер устройства клавиатуры не будет работать, если фокус клавиатуры отсутствует в окне консоли.

Завершение

На самом деле мы только слегка коснулись того, что возможно с Artoo. Тем не менее, документация, которая поставляется с Artoo, в некотором роде отсутствует, и мы восполнили пробелы, чтобы сделать ее более интересной. Для некоторого вдохновения, проверьте этот разговор одним из основателей проекта. Рад видеть, что люди будут строить с помощью Artoo!