Category: техника

Машинка, объезжающая препятствия и ездящая на свет

Я расскажу о своем первом опыте соприкосновения с миром электроники, или даже робототехники. Целью было собрать какую-нибудь машинку, которая может видеть препятствия на своем пути и понимать, где светлее, а где темнее, и, скажем, ездить в направление максимального света.
Надо совершенно четко понимать, что создание такой машинки почти ничем не отличается от сборки конструктора. Ничего принципиально сложного нет. Просто надо знать, что покупать.
Сердцем, или лучше сказать мозгом, всех проектов такого типа является микроконтроллер. Микроконтроллер - это что-то типа простенького процессора с памятью, куда записывается программа. Грубо говоря, у микроконтроллера есть несколько "информационных" входов, куда можно подавать напряжение от 0 до 5В, и несколько "информационных" выходов, куда уже сам микроконтроллер согласно записанной программе выдает напряжение 0 или 5В. Вот так вот выглядит типичный микроконтроллер:



Единственная проблема такого микроконтроллера в том, что нужно иметь специальное устройство - прошиватель, чтобы записывать программу в нее. Но существует очень много плат на которых уже есть и микроконтроллер и прошиватель. Нужно просто подсоединить ее через USB-кабель к компьютеру и записать нужную программу. Любопытному читателю можно порекомендовать сайт arduino.ru, где есть исчерпывающая информация про такие платы. Ардуино в мире микроконтроллеров - это что-то типо UNIXа в мире операционных систем: все открыто и все такое. Ардуино включает в себя как и платы с микроконтроллерами, так и язык программирования микроконтроллеров, очень похожий на Cи.
Для моего проекта на остановился на плате DFRduino Romeo:



В этой плате есть 3 принципиальные вещи:
1) Микроконтроллер.
2) USB-прошиватель программ для микроконтроллера.
3) Драйверы моторов - специальные выходы для питания моторов машинки. Тут необходимо сказать, что такие выходы действительно нужны. Микроконтроллер, конечно же, может давать напряжение 5В, и, казалось бы, этими 5В можно и питать моторы. Но  нужно понимать, что это напряжение только "информационное", потому что выход микроконтроллера не предназначен для больших токов, необходимых для питания мотора. Поэтому на плате есть что-то типа транзистора, которому микроконтроллер лишь "сообщает" включить мотор или выключить.
Теперь нам нужна машинка. Подойдет любая. Но есть специальные машинки, предназначенные для таких роботопроектов. Они примечательны тем, что на них очень удобно все крепить, а антипримечательны тем, что медленно едут . Я купил вот эту:



Для того, чтобы наша машинка объезжала препятствия нам потребуется сонар. Сонар посылает ультразвуковую волну, которая отражается от препятствия и летит обратно. Зная скорость звука и время, через которое волна пришла обратно, можно вычислить расстояние до препятствия. Я купил ultrasonic module HC-SR04:



Этот сонар мерит расстояние до 5 метров, что вполне достаточно для наших целей.

Мы еще хотим, чтобы машинка "понимала" где больше, а где меньше света. Для этого можно использовать фоторезистор. Фоторезистор - это такой прибор, который меняет свое электрическое сопротивление в зависимости от интенсивности облучаемого света. Принцип работы фоторезистора довольно прост. В качестве проводника электричества берется полупроводник со специально подобранными параметрами, так чтобы видимый свет выбивал бы электроны в зону проводимости, облегчая им прохождение. Тем самым свет и уменьшает сопротивление полупроводника. Следует отметить, что фоторезисторы со своей работой справляются довольно хорошо. Малейшее изменение света сказывается на сопротивлении. Я купил в эти:



Теперь нам нужна крутящаяся влево-вправо "голова", на которую мы и прикрепим сонар и фоторезистор. Чтобы "видеть", что происходит не только впереди. Такая "голова" называется сервомотор. Это специальный моторчик, который может поворачиваться именно на тот угол, который мы ему укажем. Я купил Futaba S3003:



Примечательно, что все вышеописанные приборы очень хорошо умеют "разговаривать" с микроконтроллером. Ничего сложного в подсоединении нету. Некоторая тонкость возникает только в подсоединении фоторезисторов. Дело в том, что микроконтроллер способен измерять только напряжение от 0 до 5В, он не умеет измерять сопротивление. И чтобы измерить сопротивление фоторезистора (это и есть информация о падающем свете), нужно ее соединить последовательно с обычным резистором, как указано на этой схеме:

Теперь измеряя падение напряжения на фоторезисторе можно определить ее сопротивление, и тем самым интенсивность падающего света.  Чтобы была более-менее адекватная информация об окружающем свете, я поместил на каждой стороне машинки по фоторезистору.
Существует еще одна маленькая проблема. Дело в том, что в природе не бывает двух абсолютно одинаковых фоторезисторов и они при одинаковой освещенности имеют немного разные сопротивления, поэтому их показания следует откалибровать программно.
Вот что получится, если все собрать вместе: 



Итак мы имеем машинку, которая "знает" информацию об интенсивности падающего света с 4-х сторон, может мерить расстояние до препятствий и может крутить "головой", на котором установлены сонар и передний фоторезистор. Наша конструкторская работа закончена.
Дальше нужно включить свои таланты в программировании и сделать с все, что захотите. К примеру, в следующем видеоролике программа использует информацию только с переднего резистора, и машинка едет в сторону максимального света:



Мой дорогой друг Макс сделал аналогичную машинку. И, к примеру, в его ролике машинка едет куда-попало, объезжая препятствия:


Управляемая через блютус машинка.

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



Но у меня, как у новичка, была проблема, что нужно иметь специальный программатор, который прошивает микроконтроллер. Существует прекрасное решение этой проблемы - ардуино. Ардуино - это и микроконтроллер и прошиватель на одной плате. Вот так выглядит плата arduino nano, которую я использовал в машинке:



Вот, к примеру, ссылка для покупки arduino nano. Многое про ардуино я тут говорить не буду. Скажу лишь, что исчерпывающая информация об ардуино представлена на сайте arduino.cc и на его русскоязычной версии arduino.ru. Язык программирования очень похож на Си, а зашивать програмки надо через miniUSB-кабель.
Следующий шаг - это выбор машинки. Мне нужна была очень простая машинка: колеса да моторы, и чтобы крепить было все удобно. Я нашел прекрасное решение: ссылка, хотя я и не настаиваю на нем. Сгодится любая машинка с моторами.



Недостаток этой машинки в том, что там не поворачиваются влево-вправо передние колеса, поэтому во время езды надо использовать технику поворотов танков. Машинке чтобы повернуться, левые колеса должны крутиться в одну сторону, а правые в другую.
Следующий шаг немного нетривиальный. Дело в том, что, как я уже говорил, наш микроконтроллер может подавать на выходе напряжение 5 В, но не может пропускать через себя ток, достаточный для того чтобы крутить моторы. То есть этими 5 В нельзя питать моторы. Существует специальная микросхема (что-то типа транзистора), которая называется драйвером двигателей. На нее можно подавать с микроконтроллера "информационные"  5 В, а микросхема уже включает или выключает питание на моторах. Вот она: ссылка.



Следующий шаг - это выбор блютус приемника, который может общаться по беспроводной связи с мобильником. Я покупал вот этот приемник, но я сейчас бы его не купил, а купил бы этот. Они отличаются только ценой $40 против $13, характеристики у них одинаковые. 




Вот, что получилось в собранном виде:




Для меня самая сложная часть проекта была написание приложения на телефоне. У меня на телефоне система android и я не имел ни малейшего представления как писать на нем приложения. Я совершенно не знал язык Java, на котором все это пишется. Мне очень сильно помог вот этот полуторачасовой видеоролик, где очень доступно, поэтапно показывается как написать простейшее приложение.

Следующей моей проблемой было то, что я совершенно не мог найти официальных библиотек, позволяющих наладить общение между телефоном и машинкой. Дело в том, что блютус модуль использует очень простой и редко используемый протокол общения. Если честно, то я до сих пор хорошо в этом не разобрался, есть ли действительно официальные библиотеки или нет. Скорее всего есть. Но я нашел неофициальную библиотеку, которая была дипломной работой студента из MIT. Вот тут.
С грехом пополам приложение написано. Оно по акселерометру вычисляет пространственное положение мобильника и передает данные на машинку. Вот как оно выглядит:



На экране есть большая кнопка запуска и выводятся проекции гравитационного поля на оси координат.
Вот, собственно, что из этого всего вышло: ссылка



Спасибо за внимание.