В этой публикации речь пойдет про мой опыт создания робота для соревнований, а именно следование по линии. Постараюсь рассказать все этапы от проектирования схемотехники и заказа печатной платы до алгоритма и программы.
Гонка роботов по линии уже давно стала базовым испытанием для начинающих робототехников. Практически все региональный и международных соревнования включают это направление, поэтому сделав одного робота вы сможете участвовать практически везде. На первом курсе университета это было следующее задание после первого мигания светодиодом.
Постановка задачи
Любая разработка начинается с технического задания, в нашем случае в качестве ТЗ выступает регламент соревнований "Робофинист". В нем нас интересует требования к габаритам (не более 25х25х25 см) и весу робота (не более 1 кг), а также форма трассы и ее ширина 1,5 см. В зависимости от сложности трассы устанавливается порог на минимальное время ее прохождения (60 сек).
Задача ясна, нужен робот способный обнаружить линию и проехать по ней от старта до финиша за минимальный отрезок времени.
Проектирование принципиальной схемы
Ядром робота является микроконтроллер STM32F103C8T6, он считывает информацию о трассе с помощью оптических датчиков QRE1113 и управляет двигателями через драйвер A3906. Для наглядности работы датчиков каждому присвоен собственный светодиод, как только датчик «видит» черную линию светодиод загорается, это очень упрощает процесс отладки. В качестве источника питания был выбран li-po аккумулятор типа 18650 с напряжением 3,7 В и микросхема заряда LTC4054ES5. Но для корректной работы двигателей нужно не менее 6 В, поэтому поставил повышающий DC-DC преобразователь напряжения LM2577, и линейный LM1117 на 3,3 В для питания логической части.
Пришло время рассказать про первые ошибки. По невнимательности перепутал одну пару пинов питания микроконтроллера и при запуске потратил несколько часов на поиски проблемы, в результате пришлось откусить их. Затем появилась проблема что не все датчики реагировали на линию, моя первая реакция была что я спалил микроконтроллер или перебитые ноги питания на прошлом этапе оказались совсем не лишними, или что я плохо пропаял контакты. Воспользовавшись осциллографом, обнаружил что проблема крылась в самих датчиках, из 10 датчиков не работало 4, заменив их на новые появилась следующая проблема — не работало три индикаторных светодиода PB3, PB4 и PA15. Переписав и просверлив взглядом весь свой код я не мог найти отличий в инициализации не рабочих и рабочих портов везде был Push Pull, 10 MHz и включенное тактирование. Посмотрев осциллограмму заметил что один пин притянут к плюсу и даже в режиме отладки никак не сбрасывался, я понял что спалил микроконтроллер. Закрывая даташит заметил что по странному совпадению именно эти пины используются для JTAG, а я использую SWD, но решив что хуже не будет начал гуглить как отключить JTAG и о чудо это и вправду помогло (см. ниже).
Мини вывод, проверяйте правильность питание на всех этапах чтобы потом не думать спалили вы что то или оно не работает по другим причинам.
Что нужно доработать в схеме
Микросхему заряда догадался поставить, а вот про разряд забыл, хотя она не менее важна, плюс в 2020 г. поставил mini USB вместо tipe C. Хотелось бы еще микроконтроллером отслеживать заряд аккумулятора, но у него не осталось свободных пинов АЦП. Выбирая драйвер опирался на характеристики двигателя 6 В и 700 мА, но не учел что его максимальное напряжение 9 В, а хотелось бы 12 В.
Создание печатной платы
Первым делом было решено определиться с размерами и формой ПП и по совместительству платформой робота. Вспоминаем что по регламенту габариты не должны превышать 25х25 см, но также стоит учесть что при заказе ПП на заводе (PCBWay) в Китае, платы свыше 10х10 см значительно вырастают в цене. Думаю выбор габаритов очевиден.
Дальше следует распределить симметрично датчики (с нижней стороны платы) учитывая ширину линии, а затем и самые тяжелые элементы, двигатели и аккумулятор. Светодиоды устанавливаются на одной оси с соответствующими датчиками, с противоположно стороны платы. Для удобства устанавливаем тумблер включения и разъем заряда аккумулятора в задней части платформы. Остальные элементы устанавливаем ближе к центру.
Обрезав пустые края платы вместо квадрата получается вполне достойный образ платформы робота.
Плата получилась достаточно простой из-за малого количества уникальных элементов. Итого 2 слоя минимальная толщина дорожки 0,25 мм. Сохранив плату в формате Gerber отправил ее на завод выбрав белый цвет маски, тут у меня не возникло особых проблем.
И 3D вид платы с элементам. Живое фото будет в конце.
Что нужно доработать в плате
Некоторые элементы установил слишком близко к пластиковому корпусу аккумулятора и было сложно их паять, а еще сложнее перепаивать. Забыл подписать цоколевку разъема программирования SWD, UART и двигателей в итоге приходится заглядывать в схему.
Закупка комплектующих
Разработка всего нового требует самых больших относительных затрат на единицу товара, попытаться сэкономить можно и нужно, но в разумных пределах, так заказав на Алиэкспресс датчики линии в 4,5 раза дешевле чем в магазине электроники, я поплатился тем что примерно 40% из них оказались не рабочими, а это время на поиск и устранения ошибок. С другой стороны мне не хотелось покупать микросхему LM2577 за 460 руб, в то время когда модуль со всей обвязкой стоит 100 руб. Часть деталей заказал на Али, другую часть в местном магазине.
Вот мои примерные затраты на комплектующие:
1. Двигатели и колеса — 800 руб;
2. Аккумулятор и кейс — 400 руб;
3. Зарядное устройство — 300 руб;
4. Микроконтроллер и драйвер — 200 руб;
5. Стабилизаторы — 400 руб;
6. Платы 10 ед с доставкой 2400/10 = 240 руб за ед;
7. Остальная обвязка — 150 руб.
Итого: 4650 руб общие затраты на компоненты, или 2490 если вычесть цену остальных девяти не используемых плат.
Думаю при правильной закупке компонентов и их монтаже прямо на заводе печатных плат, можно рассчитывать на стоимость в районе 1500-2000 руб за единицу уже при партии в 20-30 единиц.
Алгоритм
Алгоритм реализовал самый простой, если линия оказалась, например, с правой стороны, то правый двигатель начнет замедляться и чем ближе линия к краю, тем медленнее будет работать двигатель, вплоть до его полной остановки, в то время как левый двигатель будет работать на максимальной скорости пытаясь развернуться в сторону линии. Аналогичная ситуация если линия окажется с левой стороны. Тем самым робот пытается стабилизироваться, возвращая линию к центральным датчикам.
Алгоритм в картинках
Так же необходимо предусмотреть и другие ситуации, например, если все датчики засекли линию, то это скорее всего означает что мы пересекаем перекресток и вероятнее всего нам нужно ехать дальше вперед. Или если только крайние датчики засекли линию, то мы приехали на финиш и нужно остановится.
А вот и мини видео:)
Программирование
На этом этапе нужно доставать бубен и бить в него.
Писал в Atollic True Studio использовал только CMSIS и FreeRTOS. На запуск FreeRTOS потратил половину недели, делал все по инструкциям, но в процессе компиляции ловил ошибки, исправлял 1 появлялось 63, или не было ошибок, но контроллер зависал. В какой то момент я понял что уровень моего руко… достиг небывалых высот и пора бы обдумать чем я вообще занимаюсь и что делаю. Благодаря товарищам из сообщества начал копать в нужную сторону и из множества перерытых источников нашел несколько, которые мне помогли (см. ниже). В итоге удалось победить FreeRTOS и пока я его использовал на 0%, потому что все запихал в одну задачу.
Тут мне больше всего помогло видео и статья, и эта статья.
Система тактирования, тут я до сих пор не уверен что оно работает так как должно. Настроив системную частоту через PLL на 48 Мгц, я увидел на ноге MCO 24 Мгц (/2), нет я увидел 22-25 МГц сигнала отдаленно напоминающий синус. При этом я выставил в FreeRTOS config 48Мгц и поставил задержку в 500 мс и запустив увидел что мои 500 мс превратились в 300, перебрав все возможные настройки, заметил что целевые 500 мс я получаю только при тактирование от внутреннего генератора на 8 Мгц, а значение частоты FreeRTOS config вообще никак не влияло, ставил и 1 Гц и 48 ГГц. Решил вернуть 48 МГц и работать с 300 мс, после чего случайно перезагрузил True Studio и о чудо оно работает так как задумывалось, при этом с самого начала я уже указал все пути к файлам.
Проблему JTAG и светодиодов, описал выше, решение нашел тут и нужно просто его отключить освободив тем самым доступ к пинам PB3, PB4 и PA15.
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
Структура проекта примерно следующая:
1. Запускаем систему тактирования;
2. Настраиваем пины, для датчиков в режим Аналогового входа, для двигателей режим выход таймера, для всех остальных простой режим Push Pull;
3. Настраиваем АЦП на цикличную работу через DMA, этот код я полностью позаимствовал отсюда;
4. Настраиваем таймер в режим ШИМ для работы двигателей, это я тоже целиком позаимствовал отсюда;
5. Настроим UART для отладки, тут брал информацию сразу из нескольких источников;
6. На всякий случай приведу пример FreeRtos config;
7. И в конце main;
Немного истории
Этот проект висел у меня в планах уже несколько лет и все время откладывался, но вот сейчас он действительно приближается к логическому завершению чему я очень рад, закончив его хотел бы сделать его частично открытым и продавать в качестве очередной платформы/конструктора если получится, то и до робота сумоиста не далеко, а там и другие пойдут.
В планах не было писать статью, но участие в конкурсе ее требует.
Чуть не забыл про фото, некоторые компоненты еще не пришли, а дедлайн конкурса уже завтра поэтому пришлось использовать DIY не в лучшем его исполнении.
По вопросам можете писать в vk.com/timurkyun