Развиваем кругозор и погружаемся в робототехнику вместе

:

image

Электроника — это очень интересно. Крайне приятное ощущение, когда ты вскрываешь какой-то электронный прибор, видишь что-то знакомое: «Вот диод, а вот транзистор!», когда вместо того, чтобы нести материнскую плату в ремонт, ты можешь сам поменять на ней конденсатор за пару минут. Однако, многие боятся ее, представляя огромные монтажные схемы со странными закорючками и непонятный ассемблерный код. Я же хочу показать всем, что начать заниматься электроникой, а в частности робототехникой, это несложно! Простого робота можно изготовить всего за пару часов.

Несколько слов


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

От лирики к делу


Цель первая – собрать основу для робота и заставить его ездить.
Нам потребуется:
• Микроконтроллер(далее мк)
• Стеклотекстолит односторонний
• 2 электродвигателя
• Что-нибудь в качестве колес
• Программатор для прошивки мк
• По желанию, для удобства, разъем для подключения программатора к плате

Я начал изучать контроллеры AVR фирмы Atmel, потому что они довольно распространены и просты, и использовать буду их. В данном случае мой выбор остановился на ATMega16A.

фото Атмеги 16 и атмеги 8
(На фото ATMega16A и ATMega8A)

Он имеет 40 ножек и 16 кб памяти. Этого с лихвой хватит для моих экспериментов и прожорливого кода C. Да, программировать я буду на C, так как это все-таки проще, но я честно изучил самые основы ассемблера, чего и советую остальным: крайне поможет в будущем. Вы можете использовать и другие мк, например, atmega8.
Двигатели я взял рассчитанные на напряжение 2-8V с током 120мА.

Шаг 1. База

Нам необходимо сделать основную плату. Будем вытравливать текстолит. Как это делать уже много раз описывали.
Первым делом, мне необходимо развести дорожки под программатор. Я уже изготовил заранее программатор конструкции Громова, который работает по через com-порт.

фото программатора Громова

Кстати, сразу он у меня не заработал. Причина была в несоблюдении полярности диодов, обращайте на это внимание.
Смотрим расположение портов I/O:

схема портов i/o atmega16

Нам надо связать ножки так(в порядке разъема программатора):

  • 7 -> MISO
  • 8 -> SCK
  • 11, 31 -> GND(0V)
  • 9 -> RESET
  • 6 -> MOSI
  • 10, 30 -> VCC(+5V)

У меня нет лазерного принтера, поэтому я воспользуюсь обычным черным маркером. Его минус в том, что он частично смывается и из-за этого невозможно сделать тонкие дорожки. Ну и, конечно, все рисуется от руки. Рисуем:

разметка текстолита маркером

Разводка не идеальна, нам потребуются перемычки, но да ладно. Так же я вывел контакты со всех ножек мк, чтобы в будущем удобнее было к ним паять, и сделал дорожки на плате, авось пригодятся, не переводить же впустую ценный металл текстолита.

Я травлю в растворе медного купороса и поваренной соли. Плюсы в доступности, цене, гораздо меньшей токсичности. Потенциальный минус в скорости процесса.
Развожу смесь и помещаю туда плату. Желательно ее двигать, так процесс будет быстрее. Можно поместить туда распылитель аквариумного компрессора.

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

fail

Следовательно попытка номер два.
Рисуем заново, немного по-другому, несколько раз тщательно проводя дорожки маркером. Но самое главное(!), ОБЕЗЖИРИВАЕМ плату перед этим, чего я забыл сделать в первой попытке.

new

А вот тонкость: как очень быстро травить. Помещаем плату в герметичную емкость с раствором (необязательно, чтобы он покрывал всю ее). Закрываем. И начинаем очень активно эту емкость трясти руками. В итоге, моя плата вытравилась всего за минуты 3 таких действий. И вот результат:

вытравленная плата

В этот раз получилось очень качественно.
После залуживаем, паяем перемычки, используя изоленту для перекрывания дорожек.

фото залуженных дорожек

Припаиваем микросхему и разъем под программатор. Готово:

фото готовой платы

Шаг 2. Движение

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

image

Придумываем третье колесо. Нашел старый детский механический конструктор, который идеально подойдет и собрал такую конструкцию:

image

Так же сажаем ее на клей и оставляем сохнуть.

Далее нужны сами колеса. Я решил их взять из того же набора. Однако, отверстия в них гораздо больше, чем диаметр валов у двигателей. Поэтому был использован креатив с проволокой и резинкой:

фото решения с колесом

Припаиваем контакты двигателей проводками к ножкам на мк. Пусть это будут 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 от блока питания компьютера).

фото робота с подключенным программатором

Мк откликнулся сразу.

скриншот uniprof

Берем HEX-файл прошивки и шьем. Поначалу один бит не хотел прошиваться, но кнопка «тормоз» все решила.
Готово. Отключаем программатор, обнуляем пальцем reset и… ничего.

Шаг 4. Жестокая реальность

Вот и первая внезапная проблема:

проблема с напряжениям на ножках мк

Почему же так? Ведь у нас высокий уровень это 5V, а низкий 0. Начинаем изучать матчасть и форумы.
И тут мы узнаем, что мк может выдавать силу тока лишь в 40-50мА максимум, что есть мало для наших двигателей в 120мА. Соответственно, мы можем применить, например, транзисторы.

фото транзисторов кт315

Но еще проще(мы ведь новички, да) взять готовый драйвер двигателей(далее дд).
Я прикупил популярный l293d.

фотографии l293d

К ножкам Output нужно подключить двигатели, а в Input ножки мк, которые будут управлять соответствующими (по номеру) выходами Output. На Enable1 и Enable2 необходимо подать плюс питания.

схема портов i/o l293d

Травим, лудим, припаиваем дд:

фото припаянного l293d

Клеим плату на нашего робота.
Отпаиваем проводки от мк до двигателей и припаиваем их к соответствующим контактам нашего драйвера.

image

И вот и все!

Подключаем к программатору и должно заработать. Если нет, то проверяйте места пайки на дефекты и ненужные контакты. (У меня сразу не заработало. Подключив питание система начала ужасно греться. Я думал, что проблема с теплоотводом от l293d, даже припаял пару проволок припоя к ней, что не помогло. Изучая форумы, припаял 2 конденсатора (один электролитический на 100 мкФ и один керамический на 0.1 мкФ) параллельно источнику питания, тоже не помогло. В итоге, оказалось, что я просто перепутал плюс и минус на разъеме питания от бп).

Заработало? Отлично. Берем нашу программку, прошиваем, сбрасываем ресет, и ура! Двигатели стабильно работают!
Прежние колеса отвалились, поэтому я выпилил новые из дерева, и т.к. вышли они не совсем круглой формы, немного сгладил их чудесной изолентой.
Итог:

image

Теперь торжественный момент!

Да!

Поиграемся немного с движением:


#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:

Пост опубликовался сам каким-то мистическим образом, в то время, как в нем присутствовало большое количество еще не исправленных ляпов, за которые я прошу прощения. Исправляю.
Большое спасибо за комментарии. Очень приятно.