На хабре уже было несколько статей о машинках, управляемых через WiFi и с web камерой на борту.
Вот одна статья: "Радиоуправляемая Wi-Fi машинка с камерой" А вот еще одна статья по теме: "Гонка тарантасов, управляемых через Интернет"
Я хочу предложить новый(?) способ создания подобных машинок.
Для решения этой задачи нужно определиться с каналом передачи команд на машинку и подумать о канале передачи видео с машинки клиенту в браузер.
Я продумывал много разных вариантов, пока не пришла в голову мысль использовать в качестве
Это решение сразу дает много преимуществ: камера на телефоне есть, наверное можно организовать вещание с нее. Опять же WiFi есть — можно организовать передачу команд туда и/или оттуда. Да и вес небольшой…
Конечно сразу возникает много других проблем — как программировать телефон и как подключать к телефону моторчики.
Для связи телефона с внешним миром я использовал его аудио разъем. Несколько коротких аудио файлов WAV с сигналом синусоидальной формы разной частоты: 1000Гц, 1200Гц, 1400Гц… Их воспроизведение в нужный момент — это и есть команда.
К аудио разъему я подключил плату Марсоход (на хабре было несколько статей про нее). Это плата для начинающих эксперименты с ПЛИС Альтеры. Конечно у ПЛИС нет АЦП для оцифровки аудио, но мне это и не нужно. Достаточно, чтобы входной элемент плисины переключался на некотором пороге при наличии входного аудио сигнала. Это удалось сделать. Потом для ПЛИС сделал проект в среде Altera Quartus II, который меряет частоту входного сигнала и интерпретирует ее как команду.
Сначала я просто зажигал разные светодиоды, проигрывая разные звуковые файлы на телефоне. Так убедился, что идея работает. Потом уже подключал моторчики к плате.
У меня не было опыта программирования телефона, пришлось много читать и искать в интернете. В результате остановился на языке Python — оказывается можно писать небольшие скрипты чуть ли не на телефоне и тут же их запускать. Для этого нужно установить на телефон SL4A (Script Layer For Android) и собственно поддержку самого Python. Сайт, где можно почитать об этом подробнее — http://code.google.com/p/android-scripting/ Там же в разделе загрузки можно выкачать SL4A. Есть описание API и примеры.
Изучая примеры скриптов Python для телефона я понял, что все должно получиться — ведь у меня в руках оказался довольно мощный инструмент.
Приведу простой пример. Для того, чтобы телефон стал вещать видео поток нужно запустить с помощью SL4A вот такой простой скрипт на телефоне:
import android
droid = android.Android()
droid.wakeLockAcquireBright()
droid.webcamStart(0,10,9091)
droid.webcamAdjustQuality(0,10)
После этого, к телефону можно подключаться браузером на порт 9091. Правда с Firefox были проблемы, но Chrome показывает вполне прилично. Еще фишка — чтобы видео было пошустрее нужен и телефон побыстрее. У меня не очень быстрый HTC Wildfire S, так что видео иногда тормозило.
Экспериментируя дальше я решил, что правильно будет запустить «веб сервер» прямо на телефоне. Сервер реализуется так же в виде скрипта на Python. Сервер отдает страницы в виде html фреймов: в одном фрейме видео, а в другом HTML FORM с кнопками «Start», «Stop», «Left», «Right», «Back». По нажатию на кнопки браузер клиента отправляет запрос HTTP-GET на сервер, работающий на телефоне. Сервер интерпретирует запросы GET и воспроизводит нужные звуковые файлы. Плата распознает частоту звуковых сигналов и включает или выключает моторчики. Вот как-то так.
После тестирования каждого модуля по отдельности можно собирать и пробовать всю «систему» — машинка на гусеничном ходу с платой Марсоход и телефоном с ОС Андроид:
Вот такая видео демонстрация:
Все исходники проекта, конечно, открыты и их можно взять вот здесь.
Автор: nckma