- PVSM.RU - https://www.pvsm.ru -

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

image

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Алгоритм Базовой программы 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

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

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

Ссылки

Автор: nemilya

Источник [31]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/116435

Ссылки в тексте:

[1] набор от Амперки Технокуб: https://habrahabr.ru/company/amperka/blog/257843/

[2] Image: https://habrastorage.org/files/1ce/756/162/1ce7561629d14dc695369de86e99519d.jpg

[3] Image: https://habrastorage.org/files/19d/06e/c13/19d06ec13e6f49d6826454355874e6bd.jpg

[4] Image: https://habrastorage.org/files/086/437/ea0/086437ea0ed24438a57edf53fbc2219c.jpg

[5] Image: https://habrastorage.org/files/3dc/0c9/988/3dc0c99885084e30ade5ab40fc166e49.jpg

[6] Image: https://habrastorage.org/files/dc2/597/36e/dc259736e9834cd5ae03175a799a329f.jpg

[7] Image: https://habrastorage.org/files/d6a/9fc/a9c/d6a9fca9c7104f23bc9536194197c27b.jpg

[8] официальной вики: http://wiki.amperka.ru/device:techno-cube#как_собрать

[9] Image: https://habrastorage.org/files/57d/5e4/578/57d5e4578eee43599af23e7c9d6b3309.jpg

[10] Image: https://habrastorage.org/files/43e/856/1a8/43e8561a82fc4ae6afeea8a31be16c36.jpg

[11] Image: https://habrastorage.org/files/03d/d3e/4a7/03dd3e4a732c4cce99f6fbd40bc69677.jpg

[12] Image: https://habrastorage.org/files/639/5be/e7e/6395bee7e2b74b21b16b81dbd5e93374.jpg

[13] Image: https://habrastorage.org/files/852/4ec/a59/8524eca59f474fd4921590044b1d1770.jpg

[14] Image: https://habrastorage.org/files/c64/bce/d35/c64bced3500242cfb8e2a475320429cd.jpg

[15] Image: https://habrastorage.org/files/d3e/39a/edf/d3e39aedfef34b98b8ed8e0961efa06b.jpg

[16] Image: https://habrastorage.org/files/74f/9b9/ae3/74f9b9ae3ef447eaa121ea63d304e869.jpg

[17] Image: https://habrastorage.org/files/478/9e4/c31/4789e4c3111142359b968b8a6b497a22.jpg

[18] Image: https://habrastorage.org/files/b42/e98/037/b42e980373b04b4f823c782887f6b32c.jpg

[19] Image: https://habrastorage.org/files/82c/37d/dd3/82c37ddd300d4e93894028426603ef3e.jpg

[20] Cube: https://github.com/amperka/cube

[21] Image: https://habrastorage.org/files/d38/afc/c5b/d38afcc5b4d24dc489b0f5fac77587a6.jpg

[22] Image: https://habrastorage.org/files/464/b94/ad2/464b94ad2dd14201ab3a1a8149ab00e4.jpg

[23] Image: https://habrastorage.org/files/254/fce/ea2/254fceea284b4cefaa3fbf3879d897eb.jpg

[24] Image: https://habrastorage.org/files/23d/eb1/cf3/23deb1cf365d4285a6e9307a5da13179.jpg

[25] Image: https://habrastorage.org/files/aad/637/511/aad6375113c64217814bcfa1437fb960.jpg

[26] Image: https://habrastorage.org/files/e03/92a/633/e0392a63383a4c3d975dfc553cc9a5bd.jpg

[27] светодиодную шкалу: http://amperka.ru/product/bar-led

[28] Вики с пошаговым руководством по сборке и запуску Технокуба: http://wiki.amperka.ru/device:techno-cube

[29] Оригинальный проект на GitHub: https://github.com/KenLucent/cube

[30] Модифицированный проект с датчиком освещенности на GitHub: https://github.com/KenLucent/light-sensor

[31] Источник: https://geektimes.ru/post/273500/