Реклама в Telegram-каналах DzikPic и dev.by теперь дешевле. Узнать подробности 👨🏻‍💻
Support us

DIY: андроидные штучки-дрючки своими руками

Оставить комментарий
DIY: андроидные штучки-дрючки своими руками

Начинающие программисты часто подолгу ищут подходящую для пробной разработки задачу, к которой можно было бы приложить свои силы и время в освоении очередного языка или платформы. Сегодня я предлагаю пять нестандартных задач для подобной «пробы вкуса», которые, тем не менее, прекрасно подходят не только для начинающих.

И займемся мы сегодня занимательным программированием под популярную ныне платформу Android, гаджеты с которой есть почти у каждого. Благодаря этим пяти примерам мы не только существенно расширим область применения обычного гаджета, попутно прокачав свои полезные навыки и скиллы, но и, надеюсь, сможем получить определенную дозу хорошего настроения, удивив друзей и знакомых. В качестве сопутствующих технологий будут активно использоваться Python и Linux. Минимум технических объяснений будет скомпенсирован полными исходниками уже готовых приложений, ведь все-таки главное в таких демо-проектах — это запоминающаяся и увлекательная идея!

Под катом постановка задач и их решение, много Android и совсем немного Arduino

Хак №1. Лицо-ориентированный робот

Суть первой разминочной задачи проста. Как всем уже известно, в Android 4.0 был впервые для этой ОС реализован API для распознавания лиц, который работает очень даже неплохо. К тому же его просто использовать: для этого нужно лишь не забыть установить стандартный листенер (listener, обработчик событий в программе), который будет «дергаться» каждый раз, когда будет распознано человеческое лицо в поле зрения камеры, примерно вот так:

mCamera.setFaceDetectionListener(faceDetectionListener);

Чтобы показать, насколько интересно можно использовать эту возможность, я беру самый дешевый и распространенный детский конструктор роботов Lego Mindstorms NXT в качестве «рабочего тела» для управляющих «андроидных мозгов», гордым носителем которых выступит ваш планшет или смартфон.

Каждый раз, когда человеческое лицо через камеру смартфона будет зафиксировано и распознано, наш обработчик, соответственно, сработает, после чего он связывается через Bluetooth со своим роботом-хостом, обсчитывает ваши/его координаты и отдает команду для поворота влево, вправо и так далее. Чтобы не зарываться сильно в детали, лишь отмечу, что интерфейс взаимодействия с роботом можно подсмотреть здесь: A Python API for Lego MINDSTORMS NXT.

Вот как это будет выглядеть в действии.

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

Обещаю, ваши гости дети будут в восторге!

Ничего сложного внутри, где мы используем стандартные модули android.bluetooth, android.graphics, android.hardware.Camera, android.view. Для желающих попробовать обещанные исходники этого тестового проекта выложены вот здесь.

Хак №2. Бесконтактный измеритель мощности

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


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

Итак, технически нам предстоит с помощью смартфона (его камеры) засечь частоту мигания блинкера. И уже затем, с помощью нехитрой программной арифметики, подсчитать текущую потребляемую энергию. Учитывая, что среднестатистическая частота обновления картинки смартфонной камеры где-то около 15 fps, я думаю, что этого должно хватить для большинства «домашних случаев», если только под вечер вы не решили врубить свою домашнюю пилораму. В последнем случае частота мигания блинкера будет превосходить возможности распознавания камеры, что, как минимум, должно насторожить.

Вот как этот процесс будет выглядеть в реальной жизни:

Код нашего ElectricityMeter’а ну очень простой, поэтому, как и было обещано, предлагаю разобраться в нем самостоятельно, а скачать его можно вот здесь.

Хак №3. Андроидный расширитель компьютера

ИМХО, совмещение любимого андроидного планшета и своего настольного компьютера, превращая первый в «расширитель» второго, — самое интересное и перспективное направление для окологаджетного творчества. Поэтому предлагаю сделать этот хак многоступенчатым и по нарастающему принципу сложности: сейчас мы выполним промежуточный этап proof of concept, а вот уже в следующем хаке, полностью на основе предыдущего, превратим свой планшет в аватора для некоей полезной программной сущности нашего «большого компьютера».

Итак, для начала покажем, как можно сделать тачскрин своего планшета/смартфона устройством ввода вашего десктоп-компьютера, работающего под Linux. Теория здесь весьма проста — ядро Linux содержит в себе модуль uinput, который позволяет программам из userspace симулировать стандартные устройства ввода, такие как клавиатура, мышка, джойстик и так далее. В примере ниже используется именно этот стандартный механизм для того, чтобы превратить ваш гаджет в удаленный тачпад компьютера. Для этого на самом гаджете устанавливается простое приложение-клиент, которое тупо транслирует события с тачскрина через Интернет. Но куда? Все сигналы клиента уходят на наш компьютер-«сервер», где работает ранее запущенный скрипт на Python, который и «снифает» все события, прозрачно транслицируя их в режиме реального времени в движения «удаленной мышки». Всю эту адскую активность на uinput в свою очередь пасет X-сервер, пунктуально сверяя свои координаты с данными, поступающими оттуда.

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

Исходники гаджетного «клиента» можно скачать здесь, а «серверный» скрипт на Python сливайте отсюда (в последнем случае следует лишь заметить, что для его работы понадобятся модули python-uinput и libsuinput, оба доступные по лицензии GPLv3+). В качестве «сервера» тестировался хост под управлением Ubuntu, также оба устройства, естественно, должны быть подключены к сети Интернет (при этом генерируется минимальный трафик).

Теперь вы можете удивить своих знакомых, показав им магию управления своим компьютером через смартфон из другой комнаты, кухни или даже другой части света.

Хак №4. Управлятор Google Earth

Хорошо, теперь мы готовы усложнить прошлый хак, немного доработав его возможности в более прикладном русле. Думаю, всем памятны многочисленные решения по созданию удаленных пультов для удаленного управления, например, своим любимым WinAmp. Теперь невозбранно сотворим нечто похожее, но более универсальное — для произвольного веб-сервиса. В качестве примера выбран Google Earth, в качестве пульта управления выступит любой смартфон/планшет под управлением Андроид. Вот что должно получиться в итоге:


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

  • нужно разблокировать UDP-порт 20125 на системном файрволе вашего компьютера, который будет использоваться по умолчанию для сетевой трансляции всех тач-событий;
  • после запуска приложения-клиента TouchscreenBroadcaster3D на своем Android-устройстве, сделайте несколько пробных тачей по его экрану. Дело в том, что симулированное устройство на компьютере появится (будет создано) лишь после небольшой паузы и только после генерирования первых событий.

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

  • серверный скрипт android3dmouse.py следует запускать из-под root;
  • загляните в /dev/input/, чтобы узнать, как будет называться новосозданное устройство-симулятор (как правило, это будет файл вида eventN с наибольшим значением в системе);
  • после чего в качестве root-пользователя запустите следующую команду для позволения запуска Google Earth в режиме с разрешенным пользовательским вводом:

chmod 666 /dev/input/eventN

  • теперь осталось открыть файл /opt/google/earth/free/drivers.ini и вставить туда следующий текст, сразу после строки заголовка-блока SETTINGS. Не забудьте, что везде в настройках нужно заменить eventN на валидное для вашей системы значение (которое мы ловко узнали выше):

SpaceNavigator/sensitivityX = 80
SpaceNavigator/sensitivityY = 80
SpaceNavigator/sensitivityZ = 30
SpaceNavigator/sensitivityPitch = 0.5
SpaceNavigator/sensitivityYaw = 0.5
SpaceNavigator/sensitivityRoll = 0.5
SpaceNavigator/device = /dev/input/eventN
SpaceNavigator/zeroX = 0.0
SpaceNavigator/zeroY = 0.0
SpaceNavigator/zeroZ = 0.0
SpaceNavigator/zeroPitch = 0.0
SpaceNavigator/zeroYaw = 0.0
SpaceNavigator/zeroRoll = 0.0
SpaceNavigator/gutterValue = 0

  • как только X-сервер подключил новое устройство и стал двигать курсором мышки, запустите следующую финальную команду, чтобы дать нашему серверу полную волю:

xinput set-int-prop "python-uinput-mouse" "Device Enabled" 8 0

Все готово, теперь можно запускать приложение Google Earth на своем десктопе/ноутбуке.

Традиционно здесь можно скачать исходники клиента для Андроида, а вот здесь — вытянуть код «сервера» на Python.

В качестве последнего дополнения к этому хаку замечу, что этот проект вовсе не оригинален — Риз Батлер (Reese Butler) на недавнем Google Summer of Code создал полный функциональный аналог нашего решения-пульта — Google Earth Remote. Несмотря на всю схожесть, тем не менее некоторые тамошние подходы отличны, а реализация в итоге получилась более сложной. Поэтому любители «поиска всего лучшего» могут заглянуть «под капот» упомянутого альтернативного «смартфонного управлятора» Google Earth по ссылке вот здесь, чтобы сделать свой осознанный выбор.

Хак №5. Вселенская магия равновесия

Этот последний хак — вариация на тему прежних. И уравновешивать мы будем чайник, но только чайник этот будет полностью виртуальный — смоделированный на экране вашего монитора. Для крепления монитора к стене в этой задаче потребуется специальная насадка — pivot screen, которая позволяет монитору свободно вращаться по окружности в плоскости экрана. Впрочем, изготовить его самостоятельно не так уж и сложно, поэтому сразу перейдем к условиям задачи.

Трюк будет осуществлен с помощью гаджета, элегантно прикрепленного скотчем к внутренней части монитора (а точнее, с помощью его встроенного акселерометра), а также спецприложения, запущенного на его борту, которое будет транслировать данные текущей ориентации монитора в режиме реального времени в сеть. Со стороны компьютера-десктопа, как уже догадался читатель, «серверное приложение» заботливо принимает посланные данные, обсчитывает их и оперативно корректирует положение 3D-модели чайника на экране монитора, добиваясь равновесия инь и янь вокруг нас.

Вот как этот фэн-шуй будет выглядеть уже в рабочем виде:

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

Изучить и как-то расширить хак №5 можно, взглянув на исходный код позиционирующего Java-приложения для смартфона, а также на код «серверного чайника», написанного на уже привычном Python. Как и в примерах выше, в связке у нас будут опять слаженно работать Android 4 (клиент) и Ubuntu (десктопный сервер).

Заключительная вишенка к торту

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

В качестве такого примера «продвинутого самосбора» на базе Android-устройств и подручной гаджетной электроники я выбрал шикарный проект-эмуляцию гильотины (old french guillotine simulator), лежа под виртуальным ножом которой вы сможете ощутить себя настоящим белорусским французским революционером (это не пропаганда самоубийства, честно). Подручная бытовая электроника, немного свободного времени и воображения — и вот вам доступны новые острые ощущения + адреналин вперемешку с веянием уже давно ушедшей эпохи, которых порой так не хватает в нашей повседневной размеренной жизни.

А теперь само видео:

P.S.: В завершение остается лишь добавить, что большинство сегодняшних примеров были разработаны жизнерадостным поляком Яцеком Федорыньски (Jacek Fedoryński), за что ему отдельное большое спасибо.

Новый рекламный формат в наших телеграм-каналах.

Купить 500 символов за $150

Читайте также
10 курсов по C++ (июнь 2023)
10 курсов по C++ (июнь 2023)
10 курсов по C++ (июнь 2023)
С++, несмотря на свой солидный возраст, остается одним из основных языков программирования, который применется очень широко: от разработки ПО до создания игр. В сети много ресурсов, которые помогут освоить этот язык. Советуем обратить внимаение на подборку команды Digitaldefynd, котрую мы дополнили. В ней как платные, так и бесплатные ресурсы для людей с разным уровнем подготовки и знаний С++.
1 комментарий
10+ сертификаций Coursera, которые могут изменить вашу карьеру
10+ сертификаций Coursera, которые могут изменить вашу карьеру
10+ сертификаций Coursera, которые могут изменить вашу карьеру
Бюджетный способ прокачать навыки и повысить зарплату — это профессиональный сертификат от Google, IBM или крупного зарубежного университета. На Coursera как раз можно найти десятки полезных обучающих программ по машинному обучению, проджект-менеджменту и не только. Собрали 10+ сертификаций, которые будут выигрышно смотреться в резюме как новичка, так и опытного специалиста.
DataCamp открывает безлимитный доступ к курсам за €69 в год
DataCamp открывает безлимитный доступ к курсам за €69 в год
DataCamp открывает безлимитный доступ к курсам за €69 в год
Google запустила SDK для создания приложений, которые будут работать на разных устройствах и ОС
Google запустила SDK для создания приложений, которые будут работать на разных устройствах и ОС
Google запустила SDK для создания приложений, которые будут работать на разных устройствах и ОС

Хотите сообщить важную новость? Пишите в Telegram-бот

Главные события и полезные ссылки в нашем Telegram-канале

Обсуждение
Комментируйте без ограничений

Релоцировались? Теперь вы можете комментировать без верификации аккаунта.

Комментариев пока нет.