====== Технокуб ======
{{ :device:cube:cube_overvew.jpg?nolink&700 |}}
* Платформы: Iskra Neo
* Языки программирования: Arduino (C++), Python
* Тэги: куб, конструктор, мониторинг почты, нотификатор почты, firmata.
===== Что это? =====
Ждёте новое сообщение на почту, но не хотите каждый раз отвлекаться, обновлять страницу и смотреть в монитор?! Тогда наше умное и одновременно дизайнерское устройство Технокуб для вас. Суть его довольна проста: пока у вас нет непрочитанных сообщений он горит красным, но как только на почте появляется что-то новенькое — мигает и загорается зелёным. Корпус куба создан из специального, разработанного нами, конструктора на основе ПВХ.
===== Что нам понадобится? =====
{{ :device:cube:cube_parts.jpg?nolink&700 |}}
- [[amp>product/iskra-neo?utm_source=proj&utm_campaign=cube&utm_medium=wiki | Iskra Neo]]
- [[amp>product/arduino-troyka-shield?utm_source=proj&utm_campaign=cube&utm_medium=wiki | Troyka Shield]]
- [[amp>product/troyka-led-module?utm_source=proj&utm_campaign=cube&utm_medium=wiki | Светодиод «Пиранья» (Troyka-модуль)]] красный 2 шт. и зелёный 2 шт.
- [[amp>product/usb-cable-micro?utm_source=proj&utm_campaign=cube&utm_medium=wiki | Кабель USB (A — Micro USB)]]
- Крепёжные элементы: винты и гайки
- Конструктор ПВХ
===== Как собрать? =====
- Возьмите платформу Iskra Neo и нижнюю панель кубa (7x7), соедините её с помощью винтов и гаек, так чтобы гайки располагались между панелью и платформой.{{ :device:cube:cube_build1.jpg?nolink&700 |}}
- Далее возьмите два светодиода «Пиранья» ,красный и зелёный, прикрутите их к панели для крепления двух Troyka-модулей. Повторите процесс с двумя оставшимися светодиодными модулями и второй панелью для крепления двух Troyka-модулей.{{ :device:cube:cube_build2.jpg?nolink&700 |}}
- Установите Troyka Shield на платформу Iskra Neo. Подключите через стандартные 3-проводные шлейфы к Troyka Shield одну пару светодиодных модулей (дальняя панель светодиодов): красный к ''5'' пину, зелёный к ''6'' пину. Вторую пару (ближняя панель светодиодов): красный к ''9'' пину , зелёный к ''10'' пину.{{ :device:cube:cube_build3.jpg?nolink&700 |}} В итоге должна получиться схема, как на рисунке ниже.{{ :device:cube:cube_scheme2.png?nolink |}}
- Соедините заднюю панель куба (6x7) с нижней панелью кубa (7x7) и дальней панелью со светодиодами, укладывая 3-проводные шлейфы между Troyka Shield и дальней панелью со светодиодами{{ :device:cube:cube_build4.jpg?nolink&700 |}}
- Возьмите левую боковую панель куба (7x7), соедините её с нижней панелью куба (7x7) и с дальней панелью со светодиодами. Также возьмите ближнюю панель со светодиодами и соедините её с левой боковой панелью куба (7x7), укладывая 3-проводные шлейфы между Troyka Shield и ближней панелью со светодиодами{{ :device:cube:cube_build5.jpg?nolink&700 |}}
- Теперь возьмите правую панель куба (7x7) и соедините её с нижней панелью куба (7x7), а также с ближней и дальней панелью со светодиодами. После этого установите верхнюю панель (7x7) на левую, правую и заднюю панели куба.{{ :device:cube:cube_build6.jpg?nolink&700 |}}
- Соедините переднюю панель куба (7x2) c передней панелью (7x3) через панель крестиков (1x6).{{ :device:cube:cube_build7.jpg?nolink&700 |}}
- Закрепите собранную панель из предыдущего пункта с левой и правой панелью куба.{{ :device:cube:cube_build9.jpg?nolink&700 |}}
Для проверки правильности сборки куба рекомендуем воспользоваться сборочным чертежом.
{{:device:cube:cube_assembly_drawing.png?nolink&700 |}}
===== Как запустить? =====
- [[http://wiki.amperka.ru/arduino-%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82:start| Установите и настройте платформу Iskra в ОС Windows.]] Помните платформа Iskra Neo является эквивалентом итальянской Arduino Leonardo, поэтому везде при выборе платформы выбирайте Arduino Leonardo.
- Подготовьте платформу Iskra Neo для работы с приложениями из компьютера. Для этого прошейте её специальной прошивкой Firmata, которую вы можете найти среди стандартных примеров из библиотеки Firmata:
Файл
Образцы
Firmata
//StandartFirmata//
и загрузить в платформу Iskra Neo, как обычный скетч.
- Далее скачайте и установите программу для управления кубом на компьютер.
[[http://wiki.amperka.ru/_media/device:cube:setup-cube-1.0.zip|Скачать Cube]]
===== Доработка приложения для Windows =====
Данный раздел о том, как внести изменения в программу и сделать её совместимой с Windows. Если вы не собирается вносить изменения в логику работы программы, можете пропустить этот раздел.
==== Протокол Firmata ====
Связь между платформой Iskra Neo и программой на компьютере идёт через стандартный протокол Firmata. Любое программное обеспечение на любом компьютере, которое совместимо с Serial-соединением, может обмениваться данными с микроконтроллером, используя Firmata.
==== Установка среды разработки ====
Для создания и программирования приложения воспользуемся языком программирования Python.
[[https://www.python.org/ftp/python/2.7.9/python-2.7.9.msi|Скачать Python 2.7.9]]
Помимо самой среды, необходимо установить wxPython — библиотеку графического интерфейса пользователя для Python.
Скачать wxPython 3.0 для Python 2.7\\
[[http://downloads.sourceforge.net/wxpython/wxPython3.0-win32-3.0.2.0-py27.exe|для 32-битного Windows]] \\
[[http://downloads.sourceforge.net/wxpython/wxPython3.0-win64-3.0.2.0-py27.exe|для 64-битного Windows]]
==== Создание проекта ====
Скачайте [[https://github.com/amperka/cube| проект]] и поместите его содержимое в отдельную директорию на жёстком диске, допустим: ''//C:\Projects\Cube\//''. Проект состоит из файлов и директорий:
* ''main.py'' — графический пользовательский интерфейс;
* ''device.py'' — управление светодиодами на низком уровне;
* ''modes.py'' — файл, который отвечает за проверку почты
* ''setup.py'' — файл, для конвертации приложения под Windows.
* ''icons.py'' — информация об иконках
* директория ''icons'' — в этой директории, хранятся иконки программы.
* ''.gitignore'' — файл для работы с Git — Запись изменений в репозиторий.
Также в нашем проекте мы воспользуемся готовой библиотекой pyfirmata для Python. Её необходимо установить вручную:
- Зайдите в командную строку:
Пуск
Выполнить
//cmd//
:{{ :device:cube:cube_cmd.png?nolink |}}
- Используя [[https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4_DOS| команды командной строки]] перейдите в директорию, куда вы поместили исходные файлы проекта ''//C:\Projects\Cube\//''
- Допишите такую строку ''C:\Python27\Scripts\pip.exe install pyfirmata'' и дождитесь сообщения об удачной установке.
==== Пробный запуск ====
Теперь попробуем запустить проект. Оставаясь в командной строке, в директории с проектом введите строку ''main.py''. Если вы сделали всё правильно, должна запуститься форма с пользовательским интерфейсом.
Теперь вы смело можете изменять и редактировать код программы.
Например в файле ''main.py'' класс ''ManualControlPanel'' отвечает за графический интерфейс программы, когда выбран ручной режим.
class ManualControlPanel(wx.Panel):
def __init__(self, parent, device):
super(ManualControlPanel, self).__init__(parent)
self.device = device
self.InitUI()
def InitUI(self):
self.red_button = wx.Button(self, label=u'Красный')
self.green_button = wx.Button(self, label=u'Зелёный')
self.red_button.Bind(wx.EVT_BUTTON, self.OnRedButton)
self.green_button.Bind(wx.EVT_BUTTON, self.OnGreenButton)
box = wx.BoxSizer(wx.HORIZONTAL)
box.Add(self.red_button, 1, wx.EXPAND | wx.BOTTOM, 10)
box.Add(self.green_button, 1, wx.EXPAND | wx.BOTTOM, 10)
self.SetSizer(box)
def OnRedButton(self, event):
self.device.go_red()
def OnGreenButton(self, event):
self.device.go_green()
def ActivateMode(self):
pass
def DeactivateMode(self):
pass
А в файле ''modes.py'' класс ''ImapMode'', отвечает за логику программы проверки новых писем на сервере IMAP.
class ImapMode(Mode):
def __init__(self, device, interval=20):
super(ImapMode, self).__init__()
self.device = device
self.interval = interval
self.status = u''
self._prev_count = 0
self._host = None
self._port = None
self._login = None
self._password = None
def set_host_port(self, host, port):
self._host = host
self._port = port
def set_credentials(self, login, password):
self._login = login
self._password = password
def loop(self):
self._stopped = False
while not self._stopped:
self.set_status(u"Проверка почты…")
count = 0
try:
count = self._fetch_unread_count()
message = u"Писем: {}".format(count)
except imaplib.IMAP4.error as e:
message = u"Неверные логин/пароль"
except socket.error:
message = u"Нет соединения с сервером"
self.set_status(message)
if self._stopped:
break
if count > self._prev_count:
self.device.blink()
if count:
self.device.go_green()
else:
self.device.go_red()
self._prev_count = count
countdown = self.interval
while countdown > 0 and not self._stopped:
sleep(0.1)
countdown -= 0.1
self.set_status(u"{} ~ {:.0f}".format(message, countdown))
def stop(self):
self._stopped = True
def set_status(self, status):
self.status = status
self._post_event(StatusChangedEvent(status=status))
def _fetch_unread_count(self):
connection = imaplib.IMAP4_SSL(self._host, self._port)
connection.login(self._login, self._password)
connection.select()
resp = connection.search(None, 'UnSeen')
return len(resp[1][0].split())
==== Запуск программы в Windows ====
После того, как вы создали или изменили программу на языке Python, встаёт вопрос, как же её запустить на Windows, так как не у всех пользователей Microsoft установлен интерпретатор python с нужными библиотеками.
Для этого можно использовать приложение ''py2exe'', которое позволяет упаковать программу на python в ''.exe'' файл и кучу полезного хлама, после чего она будет запускаться на любой windows-машине. Для этого необходимо проделать ряд манипуляций:
- Скачайте и установите приложение ''py2exe''
Скачать py2exe\\ [[http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.7.exe/download|для 32-битного Windows]] \\
[[http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win64-py2.7.amd64.exe/download|для 64-битного Windows]]
- Найдите у себя на компьютере в системной директории ''//c:\windows\system32\//'' библиотеку ''MSVCP90.dll'' и скопируйте её в директорию DLLs, которая находиться в директории с установленным Python. По умолчанию: ''//c:\Python27\DLLs\//''.
- Зайдите через командную строку в директорию с проектом, введите строку:''setup.py py2exe'' и дождитесь сообщение об удачной операции.
Если вы всё сделали правильно, в директории с проектом должны были появиться две новых директории:
* ''build'' — служебная, её можно сразу удалить.
* ''dist'' — собственно, в ней лежит наша программа с файлом ''.exe'' для запуска.
===== Алгоритм =====
* Сразу после запуска приложения, программа проверяет количество подключенных COM-портов.
* Если больше одного, то программа предложит выбрать один из них.
* Если один — сразу подключится к нему автоматически.
* Если ни одного — сообщит об ошибке и предложит повторить попытку.
* Выбор режима работы приложения (бесконечный цикл):
* Ручное управление
* Кликнув на первую кнопку загораются красные светодиоды.
* Кликнув на вторую кнопку загораются зеленные светодиоды.
* Проверка почты на GMail / Mail
* Вводим данные: Логин/пароль и подтверждаем.
* Если писем нет, горит красный светодиод.
* Если есть новое письмо, мигаем попеременно светодиодами в течении 3 секунд и оставляем гореть зеленый.
* Проверка почты через сервер IMAP
* Вводим данные: Логин, пароль, сервер IMAP и подтверждаем.
* Если писем нет, горит красный светодиод.
* Если есть новое письмо, мигаем попеременно светодиодами в течении 3 секунд и оставляем гореть зеленый.
===== Демонстрация работы устройства =====
{{youtube>278MTT0RLM8?large}}
===== Что дальше? =====
Технокуб может быть многофункциональным индикатором самых разнообразных событий, происходящих в вашем компьютере. С ним вы сможете создать не только нотификатор почты, но и уйму других забавных устройств: индикатор уровня занятости, загруженности дорог, текущей клавиатурной раскладки...