![image](https://habrastorage.org/getpro/habr/post_images/faa/dd5/2ae/faadd52ae8262ebb89e581993cb729ed.jpg)
В том году мне посчастливилось получить для экспериментов набор от Амперки Технокуб (бесплатно, то есть даром), время шло, но попробовать его собрать времени всё не находилось… Набор увидел коллега по работе — и заинтересовался. Я с радостью отдал ему для экспериментов. И вот, что получилось (совместная статья):
Некоторое время назад меня заинтересовала платформа Ардуино как способ попробовать реализовать свои идеи. Ранее до этого был опыт сборки сурового аналогового сигнализатора в качестве курсового проекта по электронике. И волею судеб — коллега из местного хакспейса MakeItLab одолжил набор от Амперки Технокуб.
Про сборку и программирование простейшей системы индикации освещения на базе Технокуба и будет данная статья.
Предварительно надо сказать, в чём собственно предназначение DIY набора Технокуб? По сути это система световой индикации какого-либо события. Само событие — может инициироваться от компьютера (через USB соединение), например:
- получение почты (это приложение идёт по-умолчанию с Технокубом)
- наступление события в календаре
- уведомление от какого-либо устройства или датчика
- уведомление о приходе запроса с каким-либо приоритетом
- и т.п.
Конечно Технокуб может работать и автономно.
Программную составляющую, мы рассмотрим в конец статьи, а сейчас посмотрим, что внутри и соберём (в нашем примере) — систему, что будет получать информацию от датчика освещения, и визуализировать цветом эти данные (по сути простейший ночной светильник).
![](https://habrastorage.org/files/75b/7a0/170/75b7a01701af4687be9996163bf5d045.jpg)
Мне досталась большая коробка из постомата, внутри которой лежала коробочка поменьше с, собственно, самим технокубом и датчиком освещенности.
![](https://habrastorage.org/files/fdc/682/1a0/fdc6821a08f7449c8d6294135383f0a5.jpg)
Внутри самой коробки (которая, надо сказать, сразу произвела впечатление добротного и с душой сделанного продукта) меня ожидали комплектующие технокуба.
![](https://habrastorage.org/files/cfb/e49/4cb/cfbe494cbbd64d3b83a6852b04956430.jpg)
Разложив все вместе, получилась следующая картина.
![](https://habrastorage.org/files/dab/32c/ce1/dab32cce1cea4bfa941995e8abbc379f.jpg)
Как мы видим, набор Технокуба состоит из световых индикаторов, конструктивных элементов (в том количестве, чтобы можно было собрать куб).
![](https://habrastorage.org/files/794/de6/f52/794de6f5239340caa9e9e0daa3156eeb.jpg)
И конечно же «мозг» системы — Ардуино (Iskra от Амперки, аналог Arduino Leonardo)
![](https://habrastorage.org/files/5a9/d3e/640/5a9d3e6402c74efab6b17b148bd64735.jpg)
Разложив и внимательно рассмотрев все комплектующие, я начал сборку технокуба по инструкциям с официальной вики.
![](https://habrastorage.org/files/133/1cf/ef2/1331cfef21a8435aa4e0b39507b175ef.jpg)
![](https://habrastorage.org/files/0fb/32b/c4b/0fb32bc4b0a64a9382f1a83f42444594.jpg)
![](https://habrastorage.org/files/4de/618/469/4de618469cc646db8073da04ce837ce3.jpg)
Надо заметить, что идея сделать конструктор из ПВХ мне показалась достаточно оригинальной. При первой сборке осталось некоторое количество мусора — стружки от ПВХ и крепления защелкивались достаточно жестко (не так легко, как показано в официальном видео), но после нескольких манипуляций я понял, что это достаточно удобно и наловчился собирать этот конструктор.
После того, как я закрепил плату и светодиоды на элементах конструктора я начал подключать провода…
![](https://habrastorage.org/files/f53/63d/7f8/f5363d7f8b204b10afe74ad7d0162086.jpg)
![](https://habrastorage.org/files/b65/e00/9d3/b65e009d376e44dc88286a3185408546.jpg)
![](https://habrastorage.org/files/d78/eaa/564/d78eaa564bc640ccaff61a9ff613b972.jpg)
Надо заметить, что уложить столько проводов в таком маленьком пространстве оказалось не так-то просто. Я даже пробовал уложить их в трубку, но это тоже не очень помогло — провода стали плохо гнуться. Поэтому позже было принято решение скрутить их спиралькой с помощью карандаша — так они стали занимать меньше места, меньше путаться, но при этом к ним оставался удобный доступ.
![](https://habrastorage.org/files/14b/33c/8b1/14b33c8b175444908cbd65c35be01691.jpg)
![](https://habrastorage.org/files/f8a/a2e/ea0/f8aa2eea0d72436ea466d787a95c3c38.jpg)
![](https://habrastorage.org/files/b43/8ef/203/b438ef203ea44ba0b135ab2dde904a98.jpg)
![](https://habrastorage.org/files/d5d/098/5fa/d5d0985faa064e3daefb9082d78ba14a.jpg)
После достаточно долгой сборки куба настал черед подключения кабеля. И тут меня ждал приятный сюрприз. Я имею привычку рассматривать USB-штекер прежде чем вставить его в разъем. Но этот штекер оказался не такой как все остальные. Я сделал предположение и…
![](https://habrastorage.org/files/a81/588/bd7/a81588bd70ec45a2822701ea3597ccd3.jpg)
… оказался прав! Эмпирическим путем было выяснено, что штекер двухсторонний. То есть не нужно мучаться проблемой суперпозиции USB-штекера.
Настала долгожданная очередь включения куба и проверки его работы!
Для начала необходимо было установить в качестве прошивки реализацию протокола Firmata, с помощью которой можно управлять устройством. После недолгих манипуляций с устройством по инструкции с официального сайта и загрузки программы Cube от Амперки я, наконец, запустил устройство.
![](https://habrastorage.org/files/780/ee0/300/780ee03000594529912718d68dce6a50.jpg)
![](https://habrastorage.org/files/04f/3dc/052/04f3dc052f4446c9afb09581f2aefd5e.jpg)
![](https://habrastorage.org/files/466/295/ebe/466295ebe14f4334ad79e2c01fb25236.jpg)
Сложно описать тот детский восторг, который я испытал после того, как куб заработал!
Но это было только начало пути. В комплекте был датчик освещенности и теперь моей задачей было присовокупить его к этому устройству.
![](https://habrastorage.org/files/5e1/492/cce/5e1492cce523486cb130458b2d30a53e.jpg)
После долгих попыток примастырить датчик к кубу было принято решение изменить начальную конструкцию.
У меня получилась такая конструкция.
![](https://habrastorage.org/files/b26/72a/e67/b2672ae67526456887b9f462ea033662.jpg)
![](https://habrastorage.org/files/5c8/e34/513/5c8e345132e749e5a7db623c0dac78dd.jpg)
Дальше нужно было понять, что будет делать будущее устройство с датчиком освещенности? Я решил, что с помощью светодиодов оно будет сигнализировать о текущем уровне освещенности следующим образом:
0 (минимальное освещение) - мигает красный светодиод 1 - горит красный светодиод 2 - горит два красных светодиода 3 - горит два красных светодиода и один зеленый 4 (максимальное освещение) - горят все светодиоды
Также в устройстве должна быть возможность задать максимальный и минимальный уровень освещенности.
Признаться, я программирую на питоне недавно и я сразу попытался разобраться с библиотекой wx и сделать свой GUI, но в конечном итоге бросил эту идею и решил модифицировать оригинальное приложение от технокуба и добавить свой режим.
У меня получился такой GUI.
![](https://habrastorage.org/files/6f5/cdc/324/6f5cdc3244994e16a14e0d2195362051.jpg)
После запуска устанавливаем максимальный и минимальные уровни освещенности, после чего можно проверить как устройство меняет индикацию в зависимости от уровня освещенности. Результат его работы можно видеть на видео.
Программирование
Из чего состоит базовая конфигураци ПО для Технокуба:
- Скетч Firmata — записанный на Ардуино (позволяющий полностью управлять и получать данные с Ардуино через последовательный порт — реализованный через USB подключение)
- Десктопное GUI приложение Cube на базе wxPython (wxPython 3.0 для Python 2.7)
Cube приложение состоит из нескольких файлов:
- main.py — графический пользовательский интерфейс;
- device.py — управление светодиодами на низком уровне;
- modes.py — файл, который отвечает за проверку почты
После установки необходимых библиотек, запускается с помощью python main.py.
![](https://habrastorage.org/files/0bf/285/5e3/0bf2855e3ee8420c813661929a287ed9.png)
Графический интерфейс позволяет управлять цветом Куба вручную, или включить на выполнение одну из предустановленных Программ, как например индикация поступления почты (предварительно указав параметры)
![](https://habrastorage.org/files/ed5/d3e/235/ed5d3e23524f4339b68b40a700aeedda.png)
![](https://habrastorage.org/files/e98/0b3/8f3/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 и залить на Ардуино, чтобы получилось самодостаточное устройство, не требущее запуска отдельного приложения на компьютере
- и так далее...
toteKopf
Ой, такая замечательная статья о сборке набора с инструкцией! Это ведь так сложно! Зачем такое выкладывать? Какая практическая ценность, если есть инструкции? Более менее ценно выглядят планы, но ведь их реализации тут нет.
bazis13
Это ж реклама бесплатно полученного товара. Если не выложить обзор, больше ничего на халяву не дадут.
nemilya
Набор Технокуб — станет одним из наборов в бесплатно доступной библиотеке компонентов для участников нашего хакспейса (в Екатеринбурге). Так как сами хакспейсы — явление народно-стихийное (то есть не коммерческое) — то не вижу большой проблемы, что одним из способов пополнения этой библиотеки будет публикация обзоров по интересным наборам.
Наблюдая со стороны — могу сказать, что набор вполне неплохой — несмотря на простоту, и легкий уровень вхождения — мотивирует к изучению программирования (python), и дальнейшего изучения Ардуино.
Так же мне кажется в среде DIY конструкторов — нет аналогичных конструктивных наборов — сборка без каких либо крепежей. Очень просто.
На мой взгляд Амперка молодцы, что находят ресурсы, чтобы делать свои продукты, и развивать образовательные DIY направления в электронике и робототехнике.