Технокуб для гиков — программируем свет

image

В том году мне посчастливилось получить для экспериментов набор от Амперки Технокуб (бесплатно, то есть даром), время шло, но попробовать его собрать времени всё не находилось… Набор увидел коллега по работе — и заинтересовался. Я с радостью отдал ему для экспериментов. И вот, что получилось (совместная статья):

Некоторое время назад меня заинтересовала платформа Ардуино как способ попробовать реализовать свои идеи. Ранее до этого был опыт сборки сурового аналогового сигнализатора в качестве курсового проекта по электронике. И волею судеб — коллега из местного хакспейса MakeItLab одолжил набор от Амперки Технокуб.

Про сборку и программирование простейшей системы индикации освещения на базе Технокуба и будет данная статья.

Предварительно надо сказать, в чём собственно предназначение DIY набора Технокуб? По сути это система световой индикации какого-либо события. Само событие — может инициироваться от компьютера (через USB соединение), например:

  • получение почты (это приложение идёт по-умолчанию с Технокубом)
  • наступление события в календаре
  • уведомление от какого-либо устройства или датчика
  • уведомление о приходе запроса с каким-либо приоритетом
  • и т.п.


Конечно Технокуб может работать и автономно.

Программную составляющую, мы рассмотрим в конец статьи, а сейчас посмотрим, что внутри и соберём (в нашем примере) — систему, что будет получать информацию от датчика освещения, и визуализировать цветом эти данные (по сути простейший ночной светильник).

75b7a01701af4687be9996163bf5d045.jpg

Мне досталась большая коробка из постомата, внутри которой лежала коробочка поменьше с, собственно, самим технокубом и датчиком освещенности.

fdc6821a08f7449c8d6294135383f0a5.jpg

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

cfbe494cbbd64d3b83a6852b04956430.jpg

Разложив все вместе, получилась следующая картина.

dab32cce1cea4bfa941995e8abbc379f.jpg

Как мы видим, набор Технокуба состоит из световых индикаторов, конструктивных элементов (в том количестве, чтобы можно было собрать куб).

794de6f5239340caa9e9e0daa3156eeb.jpg

И конечно же «мозг» системы — Ардуино (Iskra от Амперки, аналог Arduino Leonardo)

5a9d3e6402c74efab6b17b148bd64735.jpg

Разложив и внимательно рассмотрев все комплектующие, я начал сборку технокуба по инструкциям с официальной вики.

1331cfef21a8435aa4e0b39507b175ef.jpg

0fb32bc4b0a64a9382f1a83f42444594.jpg

4de618469cc646db8073da04ce837ce3.jpg

Надо заметить, что идея сделать конструктор из ПВХ мне показалась достаточно оригинальной. При первой сборке осталось некоторое количество мусора — стружки от ПВХ и крепления защелкивались достаточно жестко (не так легко, как показано в официальном видео), но после нескольких манипуляций я понял, что это достаточно удобно и наловчился собирать этот конструктор.

После того, как я закрепил плату и светодиоды на элементах конструктора я начал подключать провода…

f5363d7f8b204b10afe74ad7d0162086.jpg

b65e009d376e44dc88286a3185408546.jpg

d78eaa564bc640ccaff61a9ff613b972.jpg

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

14b33c8b175444908cbd65c35be01691.jpg

f8aa2eea0d72436ea466d787a95c3c38.jpg

b438ef203ea44ba0b135ab2dde904a98.jpg

d5d0985faa064e3daefb9082d78ba14a.jpg

После достаточно долгой сборки куба настал черед подключения кабеля. И тут меня ждал приятный сюрприз. Я имею привычку рассматривать USB-штекер прежде чем вставить его в разъем. Но этот штекер оказался не такой как все остальные. Я сделал предположение и…

a81588bd70ec45a2822701ea3597ccd3.jpg

… оказался прав! Эмпирическим путем было выяснено, что штекер двухсторонний. То есть не нужно мучаться проблемой суперпозиции USB-штекера.

Настала долгожданная очередь включения куба и проверки его работы!
Для начала необходимо было установить в качестве прошивки реализацию протокола Firmata, с помощью которой можно управлять устройством. После недолгих манипуляций с устройством по инструкции с официального сайта и загрузки программы Cube от Амперки я, наконец, запустил устройство.

780ee03000594529912718d68dce6a50.jpg

04f3dc052f4446c9afb09581f2aefd5e.jpg

466295ebe14f4334ad79e2c01fb25236.jpg

Сложно описать тот детский восторг, который я испытал после того, как куб заработал!
Но это было только начало пути. В комплекте был датчик освещенности и теперь моей задачей было присовокупить его к этому устройству.

5e1492cce523486cb130458b2d30a53e.jpg

После долгих попыток примастырить датчик к кубу было принято решение изменить начальную конструкцию.
У меня получилась такая конструкция.

b2672ae67526456887b9f462ea033662.jpg

5c8e345132e749e5a7db623c0dac78dd.jpg

Дальше нужно было понять, что будет делать будущее устройство с датчиком освещенности? Я решил, что с помощью светодиодов оно будет сигнализировать о текущем уровне освещенности следующим образом:

0 (минимальное освещение) - мигает красный светодиод
1 - горит красный светодиод
2 - горит два красных светодиода
3 - горит два красных светодиода и один зеленый
4 (максимальное освещение) - горят все светодиоды


Также в устройстве должна быть возможность задать максимальный и минимальный уровень освещенности.

Признаться, я программирую на питоне недавно и я сразу попытался разобраться с библиотекой wx и сделать свой GUI, но в конечном итоге бросил эту идею и решил модифицировать оригинальное приложение от технокуба и добавить свой режим.
У меня получился такой GUI.

6f5cdc3244994e16a14e0d2195362051.jpg

После запуска устанавливаем максимальный и минимальные уровни освещенности, после чего можно проверить как устройство меняет индикацию в зависимости от уровня освещенности. Результат его работы можно видеть на видео.

Программирование


Из чего состоит базовая конфигураци ПО для Технокуба:

  • Скетч Firmata — записанный на Ардуино (позволяющий полностью управлять и получать данные с Ардуино через последовательный порт — реализованный через USB подключение)
  • Десктопное GUI приложение Cube на базе wxPython (wxPython 3.0 для Python 2.7)


Cube приложение состоит из нескольких файлов:

  • main.py — графический пользовательский интерфейс;
  • device.py — управление светодиодами на низком уровне;
  • modes.py — файл, который отвечает за проверку почты


После установки необходимых библиотек, запускается с помощью python main.py.

0bf2855e3ee8420c813661929a287ed9.png

Графический интерфейс позволяет управлять цветом Куба вручную, или включить на выполнение одну из предустановленных Программ, как например индикация поступления почты (предварительно указав параметры)

ed5d3e23524f4339b68b40a700aeedda.png

e980b38f376d4aff83e4dd5ca9bbe056.png

Алгоритм Базовой программы Cube:

  Сразу после запуска приложения, программа проверяет количество подключенных COM-портов.
      Если больше одного, то программа предложит выбрать один из них.
      Если один — сразу подключится к нему автоматически.
      Если ни одного — сообщит об ошибке и предложит повторить попытку.
  Выбор режима работы приложения (бесконечный цикл):
      Ручное управление
          Кликнув на первую кнопку загораются красные светодиоды.
          Кликнув на вторую кнопку загораются зеленные светодиоды.
      Проверка почты на GMail / Mail
          Вводим данные: Логин/пароль и подтверждаем.
          Если писем нет, горит красный светодиод.
          Если есть новое письмо, мигаем попеременно светодиодами в течении 3 секунд и оставляем гореть зеленый.
      Проверка почты через сервер IMAP
          Вводим данные: Логин, пароль, сервер IMAP и подтверждаем.
          Если писем нет, горит красный светодиод.
          Если есть новое письмо, мигаем попеременно светодиодами в течении 3 секунд и оставляем гореть зеленый.


Амерка предусмотрела возможность сборки автономной exe программы — в случае если вы захотите сделать дистрибутив вашей версии ПО — для какого-либо приложения Технокуба (это делается с помощью запуска setup.py py2exe, и в папке «dist» появится exe файл).

Для нашего примера

Было создано отдельное приложение (на базе оригинального), суть приложения — получать данные с датчика освещённости, и в зависимости от его значения — включать один из режимов индикации. Как это было сделано:

В класс отвечающий за панельку, что открывается при выборе выпадающего списка «Показания датчик»

class SensorPanel(wx.Panel):
...


в методе def loop (self): была реализована следующая логика:

    def loop(self):
        while not self._stopped:
            raw_value = self.device.get_analog()
            self.sensor_label.SetLabel(u"%.3f" % raw_value)
            sensor_value = round((1 - (self.max_level - self.device.get_analog()) / (self.max_level - self.min_level)) * 5)
            self.device.show_level(sensor_value)
            sleep(1)


Метод loop () запускается при выборе пункта из выпадающем списке (в нашем случае называется «Показания датчика»):

threading.Thread(target=self.loop).start()


Суть метода, в бесконечном цикле (до тех пор пока не выставлен флаг _stopped) — получить значение с датчика:

raw_value = self.device.get_analog()


вывести это значение в GUI интерфейсе:

self.sensor_label.SetLabel(u"%.3f" % raw_value)


рассчитать число (от 0 до 4) на базе силы освещения

sensor_value = round((1 - (self.max_level - self.device.get_analog()) / (self.max_level - self.min_level)) * 5)


И далее дать команду Технокубу включить один из режимов подсветки:

self.device.show_level(sensor_value)


и засыпаем на 1 секунду (не блокируя интерфейс).

sleep(1)


На стороне датчика, необходимо было реализовать show_level (), это выглядит так:

class CubeDevice(object):
    ...
    def show_level(self, num):
        if num < 1:
            self.blink_light_level()
        else:
            self._write_pins([6], 1 if num >= 1 else 0)
        self._write_pins([5], 1 if num >= 2 else 0)
        self._write_pins([10], 1 if num >= 3 else 0)
        self._write_pins([9], 1 if num >= 4 else 0)


Возможно, не лучший python код — это мой первый опыт программирования на Python.

Заключение


Данный набор доставил мне массу приятных впечатлений и дал ценный опыт. Что было сделано:

  • произведена сборка самодостаточного устройства с привлекательным внешним видом из составных частей
  • практическое применений знаний по языку программирования Python
  • изучение библиотеки wx и доработка графического интерфейса
  • первый реальный опыт работы с Git и GitHub


Что дальше?
А дальше можно дорабатывать устройство следующими путями:

  • сделать корпус для устройства и заменить светодиоды на светодиодную шкалу, добавить кнопки для установки уровней
  • переписать программу с Python на C и залить на Ардуино, чтобы получилось самодостаточное устройство, не требущее запуска отдельного приложения на компьютере
  • и так далее…

Ссылки


© Geektimes