![image](https://habrastorage.org/getpro/geektimes/post_images/1f2/ba9/19b/1f2ba919b28a731daf3e280c522d850d.jpg)
Электроника — это очень интересно. Крайне приятное ощущение, когда ты вскрываешь какой-то электронный прибор, видишь что-то знакомое: «Вот диод, а вот транзистор!», когда вместо того, чтобы нести материнскую плату в ремонт, ты можешь сам поменять на ней конденсатор за пару минут. Однако, многие боятся ее, представляя огромные монтажные схемы со странными закорючками и непонятный ассемблерный код. Я же хочу показать всем, что начать заниматься электроникой, а в частности робототехникой, это несложно! Простого робота можно изготовить всего за пару часов.
Несколько слов
В данных статьях, я буду пошагово изготавливать робота, начиная с самого простого, и постепенно усложняя, и описывать различные нюансы, решение проблем, которые встретятся мне на пути.
В первую очередь, эти статьи написаны для новичков, чтобы помочь им получить свой первый опыт в этой сфере в положительно-приятном виде, чтобы все у них получилось, и они не впали в отчаяние.
Тех, кто разбирается, я попрошу не сильно критиковать по поводу каких-то моментов, где что-то можно сделать лучше и рациональнее, а давать советы.
Приятного прочтения.
От лирики к делу
Цель первая – собрать основу для робота и заставить его ездить.
Нам потребуется:
• Микроконтроллер(далее мк)
• Стеклотекстолит односторонний
• 2 электродвигателя
• Что-нибудь в качестве колес
• Программатор для прошивки мк
• По желанию, для удобства, разъем для подключения программатора к плате
Я начал изучать контроллеры AVR фирмы Atmel, потому что они довольно распространены и просты, и использовать буду их. В данном случае мой выбор остановился на ATMega16A.
![фото Атмеги 16 и атмеги 8](https://habrastorage.org/getpro/geektimes/post_images/250/4b7/f05/2504b7f0520e14f3a2741055cdafdb4a.jpg)
(На фото ATMega16A и ATMega8A)
Он имеет 40 ножек и 16 кб памяти. Этого с лихвой хватит для моих экспериментов и прожорливого кода C. Да, программировать я буду на C, так как это все-таки проще, но я честно изучил самые основы ассемблера, чего и советую остальным: крайне поможет в будущем. Вы можете использовать и другие мк, например, atmega8.
Двигатели я взял рассчитанные на напряжение 2-8V с током 120мА.
Шаг 1. База
Нам необходимо сделать основную плату. Будем вытравливать текстолит. Как это делать уже много раз описывали.
Первым делом, мне необходимо развести дорожки под программатор. Я уже изготовил заранее программатор конструкции Громова, который работает по через com-порт.
![фото программатора Громова](https://habrastorage.org/getpro/geektimes/post_images/c96/aa3/a2f/c96aa3a2fa9054129e1c5b108299618c.jpg)
Кстати, сразу он у меня не заработал. Причина была в несоблюдении полярности диодов, обращайте на это внимание.
Смотрим расположение портов I/O:
![схема портов i/o atmega16](https://habrastorage.org/getpro/geektimes/post_images/7cb/387/d97/7cb387d97ebf0355056ce5792774edd8.jpg)
Нам надо связать ножки так(в порядке разъема программатора):
- 7 -> MISO
- 8 -> SCK
- 11, 31 -> GND(0V)
- 9 -> RESET
- 6 -> MOSI
- 10, 30 -> VCC(+5V)
У меня нет лазерного принтера, поэтому я воспользуюсь обычным черным маркером. Его минус в том, что он частично смывается и из-за этого невозможно сделать тонкие дорожки. Ну и, конечно, все рисуется от руки. Рисуем:
![разметка текстолита маркером](https://habrastorage.org/getpro/geektimes/post_images/47a/44d/6a8/47a44d6a8132d037c000553f879e7867.jpg)
Разводка не идеальна, нам потребуются перемычки, но да ладно. Так же я вывел контакты со всех ножек мк, чтобы в будущем удобнее было к ним паять, и сделал дорожки на плате, авось пригодятся, не переводить же впустую ценный металл текстолита.
Я травлю в растворе медного купороса и поваренной соли. Плюсы в доступности, цене, гораздо меньшей токсичности. Потенциальный минус в скорости процесса.
Развожу смесь и помещаю туда плату. Желательно ее двигать, так процесс будет быстрее. Можно поместить туда распылитель аквариумного компрессора.
В этот раз травля длилась очень долго, целых два-три часа. Потому что концентрация в растворе была слабая: стоит у меня уже несколько недель и медленно выпадает в осадок. Плата получилась очень неудачная, большой процент дорожек смылся и стравился.
![fail](https://habrastorage.org/getpro/geektimes/post_images/714/d98/a92/714d98a921a1ba01b79ae36eb30352d6.jpg)
Следовательно попытка номер два.
Рисуем заново, немного по-другому, несколько раз тщательно проводя дорожки маркером. Но самое главное(!), ОБЕЗЖИРИВАЕМ плату перед этим, чего я забыл сделать в первой попытке.
![new](https://habrastorage.org/getpro/geektimes/post_images/57f/797/08d/57f79708dd107d42c58ecc2d90e7293b.jpg)
А вот тонкость: как очень быстро травить. Помещаем плату в герметичную емкость с раствором (необязательно, чтобы он покрывал всю ее). Закрываем. И начинаем очень активно эту емкость трясти руками. В итоге, моя плата вытравилась всего за минуты 3 таких действий. И вот результат:
![вытравленная плата](https://habrastorage.org/getpro/geektimes/post_images/e6b/d3a/f97/e6bd3af9715212822f5835b662130825.jpg)
В этот раз получилось очень качественно.
После залуживаем, паяем перемычки, используя изоленту для перекрывания дорожек.
![фото залуженных дорожек](https://habrastorage.org/getpro/geektimes/post_images/1f5/f36/756/1f5f36756f9b272cdd54a41ad6e79484.jpg)
Припаиваем микросхему и разъем под программатор. Готово:
![фото готовой платы](https://habrastorage.org/getpro/geektimes/post_images/6b7/ed4/a41/6b7ed4a41b7ec5c7bd7227712c1ab100.jpg)
Шаг 2. Движение
Организовываем движущую часть. Система будет на трех колесах, два из которых с приводом от двигателей. Я решаю их просто приклеить к текстолиту.
Размечаем, обезжириваем плату ватным тампоном и спиртосодержащей жидкостью.
Клеим двигатели, оставляем их сохнуть.
![image](https://habrastorage.org/getpro/geektimes/post_images/f8e/ad4/814/f8ead4814b5d53d2a0e3b2b1ba7ff98c.jpg)
Придумываем третье колесо. Нашел старый детский механический конструктор, который идеально подойдет и собрал такую конструкцию:
![image](https://habrastorage.org/getpro/geektimes/post_images/9c9/506/8b5/9c95068b528ef7a646a3bdf05f69f016.jpg)
Так же сажаем ее на клей и оставляем сохнуть.
Далее нужны сами колеса. Я решил их взять из того же набора. Однако, отверстия в них гораздо больше, чем диаметр валов у двигателей. Поэтому был использован креатив с проволокой и резинкой:
![фото решения с колесом](https://habrastorage.org/getpro/geektimes/post_images/0fd/dcb/55e/0fddcb55e15bb93826b1b8e57aa56220.jpg)
Припаиваем контакты двигателей проводками к ножкам на мк. Пусть это будут PB3 и PB4, для левого и PA3, PA4 для правого.
Первая версия робота готова:
![фото первой версии робота](https://habrastorage.org/getpro/geektimes/post_images/6a1/f9f/4b7/6a1f9f4b79b6556fcbd49376dc933a48.jpg)
Шаг 3. Программа и прошивка.
Я написал незамысловатую программу на C, которая просто запускает двигатели.
#include <avr/io.h> // Библиотека для работы с портами ввода-вывода
int main(void)
{
//настраиваем порты на вывод
DDRB |= (1<<2); // ножка PB2
DDRB |= (1<<3); // PB3
DDRA |= (1<<2); // PA2
DDRA |= (1<<3); // PA3
//настраиваем уровни напряжений портов
// плюс
PORTB |= (1<<2);
PORTA |= (1<<3);
// минус
PORTB &= ~(1<<3);
PORTA &= ~(1<<2);
return 0;
}
Прошиваю с помощью uniprof.
Подключаем мк, подаем питание(я взял 5v от блока питания компьютера).
![фото робота с подключенным программатором](http://pp.vk.me/c5557/u91527282/142810521/x_81bdb677.jpg)
Мк откликнулся сразу.
![скриншот uniprof](http://pp.vk.me/c5557/u91527282/142810521/y_391f0081.jpg)
Берем HEX-файл прошивки и шьем. Поначалу один бит не хотел прошиваться, но кнопка «тормоз» все решила.
Готово. Отключаем программатор, обнуляем пальцем reset и… ничего.
Шаг 4. Жестокая реальность
Вот и первая внезапная проблема:
![проблема с напряжениям на ножках мк](http://pp.vk.me/c5557/u91527282/142810521/x_71d2e999.jpg)
Почему же так? Ведь у нас высокий уровень это 5V, а низкий 0. Начинаем изучать матчасть и форумы.
И тут мы узнаем, что мк может выдавать силу тока лишь в 40-50мА максимум, что есть мало для наших двигателей в 120мА. Соответственно, мы можем применить, например, транзисторы.
![фото транзисторов кт315](http://pp.vk.me/c5557/u91527282/142810521/x_7556bf7f.jpg)
Но еще проще(мы ведь новички, да) взять готовый драйвер двигателей(далее дд).
Я прикупил популярный l293d.
![фотографии l293d](http://pp.vk.me/c5557/u91527282/142810521/x_9e53787a.jpg)
К ножкам Output нужно подключить двигатели, а в Input ножки мк, которые будут управлять соответствующими (по номеру) выходами Output. На Enable1 и Enable2 необходимо подать плюс питания.
![схема портов i/o l293d](http://pp.vk.me/c5557/u91527282/142810521/x_1569be44.jpg)
Травим, лудим, припаиваем дд:
![фото припаянного l293d](http://pp.vk.me/c5557/u91527282/142810521/x_24845ff3.jpg)
Клеим плату на нашего робота.
Отпаиваем проводки от мк до двигателей и припаиваем их к соответствующим контактам нашего драйвера.
![image](http://pp.vk.me/c5557/u91527282/142810521/x_05b9d646.jpg)
И вот и все!
Подключаем к программатору и должно заработать. Если нет, то проверяйте места пайки на дефекты и ненужные контакты. (У меня сразу не заработало. Подключив питание система начала ужасно греться. Я думал, что проблема с теплоотводом от l293d, даже припаял пару проволок припоя к ней, что не помогло. Изучая форумы, припаял 2 конденсатора (один электролитический на 100 мкФ и один керамический на 0.1 мкФ) параллельно источнику питания, тоже не помогло. В итоге, оказалось, что я просто перепутал плюс и минус на разъеме питания от бп).
Заработало? Отлично. Берем нашу программку, прошиваем, сбрасываем ресет, и ура! Двигатели стабильно работают!
Прежние колеса отвалились, поэтому я выпилил новые из дерева, и т.к. вышли они не совсем круглой формы, немного сгладил их чудесной изолентой.
Итог:
![image](http://pp.vk.me/c5557/u91527282/142810521/y_74624541.jpg)
Теперь торжественный момент!
Да!
Поиграемся немного с движением:
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB |= (1<<2);
DDRB |= (1<<3);
DDRA |= (1<<2);
DDRA |= (1<<3);
unsigned char i= 0;
while(i<3){
//оба двигателя вперед
PORTB |= (1<<2);
PORTA |= (1<<3);
PORTB &= ~(1<<3);
PORTA &= ~(1<<2);
_delay_ms(700);
//оба назад
PORTB &= ~(1<<2);
PORTA &= ~(1<<3);
PORTB |= (1<<3);
PORTA |= (1<<2);
_delay_ms(1100);
i++;
}
while(1)
{
//левый вперед, правый назад
PORTB |= (1<<2);
PORTA &= ~(1<<3);
PORTB &= ~(1<<3);
PORTA |= (1<<2);
_delay_ms(3000);
//правый вперед, левый назад
PORTB &= ~(1<<2);
PORTA |= (1<<3);
PORTB |= (1<<3);
PORTA &= ~(1<<2);
_delay_ms(3000);
}
return 0;
}
Послесловие
Как вы могли убедиться, сделать простейшего робота элементарно. Далее все ограничивается лишь вашей фантазией.
Не бойтесь начинать что-то новое — всё обязательно получится.
Если есть вопросы — задавайте.
Благодарю за прочтение!
FAQ из ответов на комментарии по теме
Про себестоимость:
- ATMega16A в DIP ~ 110р
- 2 двигателя QX-FF-130-14230 ~ 140р
- l293d ~ 60р
- Конденсатор 100мкФ 25В ~ 2р
- Конденсатор керамический 0.01мкФ ~ 2р
- Текстолит ~ 30р
- Гнездо под программатор ~ 5р
Итого: ~ 349р + опционально: припой, провода, колеса, клей.
Двигатели можно взять и другие, более дешевые, хоть по 20р.
UPD:
Большое спасибо за комментарии. Очень приятно.