Электроника — это очень интересно. Крайне приятное ощущение, когда ты вскрываешь какой-то электронный прибор, видишь что-то знакомое: «Вот диод, а вот транзистор!», когда вместо того, чтобы нести материнскую плату в ремонт, ты можешь сам поменять на ней конденсатор за пару минут. Однако, многие боятся ее, представляя огромные монтажные схемы со странными закорючками и непонятный ассемблерный код. Я же хочу показать всем, что начать заниматься электроникой, а в частности робототехникой, это несложно! Простого робота можно изготовить всего за пару часов.
Несколько слов
В данных статьях, я буду пошагово изготавливать робота, начиная с самого простого, и постепенно усложняя, и описывать различные нюансы, решение проблем, которые встретятся мне на пути.
В первую очередь, эти статьи написаны для новичков, чтобы помочь им получить свой первый опыт в этой сфере в положительно-приятном виде, чтобы все у них получилось, и они не впали в отчаяние.
Тех, кто разбирается, я попрошу не сильно критиковать по поводу каких-то моментов, где что-то можно сделать лучше и рациональнее, а давать советы.
Приятного прочтения.
От лирики к делу
Цель первая – собрать основу для робота и заставить его ездить.
Нам потребуется:
• Микроконтроллер(далее мк)
• Стеклотекстолит односторонний
• 2 электродвигателя
• Что-нибудь в качестве колес
• Программатор для прошивки мк
• По желанию, для удобства, разъем для подключения программатора к плате
Я начал изучать контроллеры AVR фирмы Atmel, потому что они довольно распространены и просты, и использовать буду их. В данном случае мой выбор остановился на ATMega16A.
(На фото ATMega16A и ATMega8A)
Он имеет 40 ножек и 16 кб памяти. Этого с лихвой хватит для моих экспериментов и прожорливого кода C. Да, программировать я буду на C, так как это все-таки проще, но я честно изучил самые основы ассемблера, чего и советую остальным: крайне поможет в будущем. Вы можете использовать и другие мк, например, atmega8.
Двигатели я взял рассчитанные на напряжение 2-8V с током 120мА.
Шаг 1. База
Нам необходимо сделать основную плату. Будем вытравливать текстолит. Как это делать уже много раз описывали.
Первым делом, мне необходимо развести дорожки под программатор. Я уже изготовил заранее программатор конструкции Громова, который работает по через com-порт.
Кстати, сразу он у меня не заработал. Причина была в несоблюдении полярности диодов, обращайте на это внимание.
Смотрим расположение портов I/O:
Нам надо связать ножки так(в порядке разъема программатора):
- 7 -> MISO
- 8 -> SCK
- 11, 31 -> GND(0V)
- 9 -> RESET
- 6 -> MOSI
- 10, 30 -> VCC(+5V)
У меня нет лазерного принтера, поэтому я воспользуюсь обычным черным маркером. Его минус в том, что он частично смывается и из-за этого невозможно сделать тонкие дорожки. Ну и, конечно, все рисуется от руки. Рисуем:
Разводка не идеальна, нам потребуются перемычки, но да ладно. Так же я вывел контакты со всех ножек мк, чтобы в будущем удобнее было к ним паять, и сделал дорожки на плате, авось пригодятся, не переводить же впустую ценный металл текстолита.
Я травлю в растворе медного купороса и поваренной соли. Плюсы в доступности, цене, гораздо меньшей токсичности. Потенциальный минус в скорости процесса.
Развожу смесь и помещаю туда плату. Желательно ее двигать, так процесс будет быстрее. Можно поместить туда распылитель аквариумного компрессора.
В этот раз травля длилась очень долго, целых два-три часа. Потому что концентрация в растворе была слабая: стоит у меня уже несколько недель и медленно выпадает в осадок. Плата получилась очень неудачная, большой процент дорожек смылся и стравился.
Следовательно попытка номер два.
Рисуем заново, немного по-другому, несколько раз тщательно проводя дорожки маркером. Но самое главное(!), ОБЕЗЖИРИВАЕМ плату перед этим, чего я забыл сделать в первой попытке.
А вот тонкость: как очень быстро травить. Помещаем плату в герметичную емкость с раствором (необязательно, чтобы он покрывал всю ее). Закрываем. И начинаем очень активно эту емкость трясти руками. В итоге, моя плата вытравилась всего за минуты 3 таких действий. И вот результат:
В этот раз получилось очень качественно.
После залуживаем, паяем перемычки, используя изоленту для перекрывания дорожек.
Припаиваем микросхему и разъем под программатор. Готово:
Шаг 2. Движение
Организовываем движущую часть. Система будет на трех колесах, два из которых с приводом от двигателей. Я решаю их просто приклеить к текстолиту.
Размечаем, обезжириваем плату ватным тампоном и спиртосодержащей жидкостью.
Клеим двигатели, оставляем их сохнуть.
Придумываем третье колесо. Нашел старый детский механический конструктор, который идеально подойдет и собрал такую конструкцию:
Так же сажаем ее на клей и оставляем сохнуть.
Далее нужны сами колеса. Я решил их взять из того же набора. Однако, отверстия в них гораздо больше, чем диаметр валов у двигателей. Поэтому был использован креатив с проволокой и резинкой:
Припаиваем контакты двигателей проводками к ножкам на мк. Пусть это будут PB3 и PB4, для левого и PA3, PA4 для правого.
Первая версия робота готова:
Шаг 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 от блока питания компьютера).
Мк откликнулся сразу.
Берем HEX-файл прошивки и шьем. Поначалу один бит не хотел прошиваться, но кнопка «тормоз» все решила.
Готово. Отключаем программатор, обнуляем пальцем reset и… ничего.
Шаг 4. Жестокая реальность
Вот и первая внезапная проблема:
Почему же так? Ведь у нас высокий уровень это 5V, а низкий 0. Начинаем изучать матчасть и форумы.
И тут мы узнаем, что мк может выдавать силу тока лишь в 40-50мА максимум, что есть мало для наших двигателей в 120мА. Соответственно, мы можем применить, например, транзисторы.
Но еще проще(мы ведь новички, да) взять готовый драйвер двигателей(далее дд).
Я прикупил популярный l293d.
К ножкам Output нужно подключить двигатели, а в Input ножки мк, которые будут управлять соответствующими (по номеру) выходами Output. На Enable1 и Enable2 необходимо подать плюс питания.
Травим, лудим, припаиваем дд:
Клеим плату на нашего робота.
Отпаиваем проводки от мк до двигателей и припаиваем их к соответствующим контактам нашего драйвера.
И вот и все!
Подключаем к программатору и должно заработать. Если нет, то проверяйте места пайки на дефекты и ненужные контакты. (У меня сразу не заработало. Подключив питание система начала ужасно греться. Я думал, что проблема с теплоотводом от l293d, даже припаял пару проволок припоя к ней, что не помогло. Изучая форумы, припаял 2 конденсатора (один электролитический на 100 мкФ и один керамический на 0.1 мкФ) параллельно источнику питания, тоже не помогло. В итоге, оказалось, что я просто перепутал плюс и минус на разъеме питания от бп).
Заработало? Отлично. Берем нашу программку, прошиваем, сбрасываем ресет, и ура! Двигатели стабильно работают!
Прежние колеса отвалились, поэтому я выпилил новые из дерева, и т.к. вышли они не совсем круглой формы, немного сгладил их чудесной изолентой.
Итог:
Теперь торжественный момент!
Да!
Поиграемся немного с движением:
#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:
Большое спасибо за комментарии. Очень приятно.