Pull to refresh

Говорящая машинка из старого мобильника

DIY
Sandbox
Привет, Хабр. Наверное у каждого человека дома валяются старые мобильники. Сдохла батарея, поцарапался экран, просто надоел.

В ряде случаев такой «старый» телефон — довольно продвинутое устройство.
Например бывший дочкин SonyEricsson Z310i — java, bluetooth, камера, gprs. Отчего бы не использовать его для воплощения своей старой детской мечты — радиоуправляемая машинка с камерой на борту? И вот сошлось вместе несколько обстоятельств: валяется телефон, откуда-то взялась сломанная машинка без пульта, подрос младший сын, на хабре попалась статья, в интернете нашелся сайт.

Итак, алгоритм:


  • пользователь П нажимает кнопки на сотовом телефоне Т1
  • Т1 передает команды по bluetooth
  • машинка везет на себе сотовый телефон Т2, который их получает и передает их по звуковому каналу(проводной hands-free) на микроконтроллер
  • МК, в свою очередь, распознает команды и управляет двигателями, лампочками и всем прочим.
  • Т2 снимает на камеру происходящее и передает обратно на Т1,
  • Т1 передает полученное изображение по оптической связи П
  • ????
  • П радуется


Инструменты и материалы


В один из магазинов ушел заказ, и через некоторое время я стал обладателем отладочной платы STM32L-DISCOVERY, макетной платы, драйвера двигателя L293D, и всякой разъемно-проводной мелочи.
В качестве первого шага была заклеена сломанная подвеска машинки, проверены двигатели, измерено их потребление. В интернете найдена документация на плату, процессор и L293D.
В качестве IDE был выбран IAR.

Действия руками


Естественно, были пройдены все этапы программирования мк — поморгать, написать что-то свое на жкд, погудеть. Для отладки работы периферии очень помогли тестер, детский электронный конструктор и старенький осциллограф.
image
Вообще написание кода на мк состоит в основном из подтачивания и комбинирования стандартных примеров.
Следующий этап — приготовить плату, припаять драйвер двигателя и попробовать реальное управление. По краям платы мк выведены почти все его ноги на довольно длинные пины со стандартным шагом 2.5 мм, причем и вверх, и вниз. Для подключения на весу использовались разъемы PBS-6. Готовое устройство на самой машинке — это кусок макетной платы с такими же разъемами, т. е. самопальный шилдбоард. И вот драйвер двигателя подключен, и мы уже моргаем лампочкой накаливания из конструктора. Теперь припаиваем питание на разъем под ножки GND и EXT_5V. Очень удачно, что питание и управляющие ноги стоят по диагонали — платы неплохо держатся вместе всего на двух разъемах. Припаиваем батарейный блок, провода к моторам(забавно, что их можно путать — перепрограммировать контроллер проще, чем распутывать проводки). Небольшая программка — и вот уже слепая и глухая машинка ездит туда-сюда, и исполняет разворот в 12 приемов.

Командование


После недолгого гугления и задумчивых взглядов в осциллограф было принято простейшее решение — команды кодируются синусоидальными сигналами разной частоты. Со стороны телефона частоты формируются проигрыванием WAV потока 8бит, моно, 8кГц дискретизации. В качестве командных частот выбраны делители частоты дискретизации, т.е. 160, 200, 250...2000 Гц. Таким образом, на данном этапе мы имеем 9 команд, из которых 7 используются для движения(вперед, назад, вперед-влево, назад-вправо… стоп).
Для измерения частоты на стороне МК применяется таймер, прерывание и компаратор. Отрицательный вход компаратора коммутирован на внутреннее опорное напряжение 0.3В(Vref/4), выход компаратора настроен на вызов прерывания при прохождении переднего фронта импульса. 16-битный таймер считает импульсы частоты 8МГц. В момент прерывания считывается значение счетчика таймера и сравнивается с предыдущим отсчетом. В случае обнаружения 5 примерно одинаковых импульсов подряд команда считается принятой. Для того, чтобы машинка остановилась в случае выхода из зоны приема, телефон-пульт в перерывах между командами периодически передает нулевые байты. Если телефон-приемник не получает никаких команд в течении примерно 200 мсек, двигатели выключаются.

И на этой радостной ноте начинаются проблемы.


Оказалось, что выбранный телефон не поддерживает bluetooth из-под java. у другого полудохлого телефона — SonyEricsson C702 — так завалена Ачх в верхих частотах, что команды не опознаются. Третий телефон — мой основной Samsung B2100 -обладает невероятным количеством багов в java, что с ним вообще почти невозможно работать. Камера на C702 умудряется выдавать какие-то невероятные по размеру фотографии, которые затем долго и нудно передаются по bluetooth.
Кроме этого всего, при отладке схемы воспроизведения звука я неудачно ткнул щупом осциллографа в плату. Веселый огонек и струйка дыма заставила было меня попрощаться с платой МК, но оказалось, что все не так страшно. Я всего лишь спалил диод в цепи питания программатора и один из выходов МК. Теперь для прошивки и отладки программы необходимо подключать не только USB, но и батареечное питание, а прожженный выход пришлось перепаять на свободный исправный пин.
image

В результате в начальную задумку были внесены коррективы — напряжение в звуковом тракте сравнивается с землей, а фотографии, полученные с камеры пережимаются в JPEG 100*160пикс перед передачей.

Звуковой тракт, свинец и фары


Наличие на борту контроллера ЦАП и довольно большого количества флеш-памяти(128кб) навело на мысль, что можно научить машинку говорить. Для этого мы с сынишкой записали 2 WAV-файла, и добавили их в программу. Записывать звуки пришлось на нетбуке жены с Windows XP, т.к. стандартными средствами семерки невозможно записать WAV файл в формате PCM 8bit. (кстати, подскажите программку попроще для преобразования звуковых файлов). Для усиления звука применяется микросхема к174ун24, звук выводится на 2 динамика 8Ом 1Вт.

Страничка проекта на SourceForge

В качестве последнего штриха пальчиковые аккумуляторы были заменены на 6В 4.7Ач свинцовую батарею. Параллельно основному двигателю были впаяны белые светодиоды в качестве фар. Машинка приобрела «пацанский» ксенон, массу и динамику настоящего джипа, просадку подвески и рев мотора.

И вот проект завершился.



Машинка умеет передвигаться по команде, снимает фотографии и глаголет нечеловеческим голосом. Этот проект был моим первым шагом в мир кустарной робототехники, который свел меня с замечательными людьми и заново научил держать в руках паяльник. Однако продолжения у этого проекта не будет, ибо начальная идея себя не очень-то оправдала.

Платформа j2me продемонстрировала всю свою врожденную убогость.

Несмотря на вроде бы унифицированное и разветвленное api, засилие багов и недоделок в реализациях не позволяет использовать все заложенные возможности. Система защиты все время запрашивает доступ к ресурсам телефона. На пульте управления с этим можно смириться, но на машинке — мешает жутко. Обработка и передача даже маленьких картинок занимает безумное время — около 5 секунд. Говорить о передаче видео или картинок в сколько-нибудь реальном времени не имеет смысла.

Железо

Микросхема L293D очень удобна в использовании, но, к сожалению, выполнена на биполярных транзисторах, и при напряжении питания 5-6В половина энергии батарей уходит на обогрев мирового пространства. Ну а недорогая машинка из супермаркета не является хорошей механической платформой.

Осознав все это, я решил прекратить развитие проекта, а за первым шагом последовал второй — вайфай, камеры и более продвинутая электроника.
Tags: DIYj2mebluetoothSTM32L-Discoveryarm
Hubs: DIY
Total votes 62: ↑59 and ↓3 +56
Comments 22
Comments Comments 22

Popular right now

Top of the last 24 hours