Собрал 3 платы для "высоковольтных" роботов и начал их запускать. Обычно первая проверка, подача на USB разъём 5в от лабораторного БП с ограничением тока. Если КЗ не наблюдается - подключаем к компьютеру и проверяем, что USB-CDC опознался. Теоретически, уже можно в микроконтроллер залить программу. Затем проверял автономное питание. На клеммы для батарей подключил лабораторный БП, установил напряжение 16в, ограничение - 1А. Подаю питание и проверяю напряжения на выходе преобразователей - 9в для моторов и 5в для логики и серв. Вроде, есть. Теперь надо бы проверить, как работает система включения/выключения питания (при подаче питания схема установилатсь во включенние состояние). Давлю кнопку - выключилось. Давлю снова... опа! у БП включается ограничение тока и напряжение падает до 3.4вольта. И больше не работает. Начинаю прозванивать омметром - на выходе преобразователя 5в вижу КЗ.
Спойлер

Вот схема питания робота. Транзисторы VT1-VT4 - выключатель питания, образуют Latching circuit с коммутирующим транзистором. Далее эти 16в с батареи идут на 2 преобразователя: на DA2 делающего 9в для моторов и DA3 дающего 5в. Эти пять вольт через коммутатор DA4 идут на простой LDO LM1117 DA5, который из 5в делает 3.3в которыми питается микроконтроллер и его периферия. DD11 - одногейтовый коммутатор типа 4053 - 74LVC1G53DP. Используется для того, чтобы контролировать напряжение батареи и мотора. В прошлой версии контролировал только батарею, а тут подумал, что у меня в список сканирования АЦП помимо фотодатчиков включено еще напряжение батареи и резистивная матрица кнопок. А так как фотодатчики сканируются 2 раза: без подсветки и с подсветкой, то получалось, что напряжение батареи и кнопки сканировались тоже два раза. И вот решил поставить мультиплексор на напряжение - теперь контролирую не одно, а два. Кнопки пока не под мультиплексором. Трудно придумать что бы еще добавить, тем более, если для всех остальных используется внутренняя опора, то для кнопок - Vdd.
Кстати, с этим мультиплексором на плате накосячил. Посмотрел в даташите, что корпус TSOP8, ну и взял в библиотеке ref-packages такой корпус. А оказалось, что в библиотеке корпус широкий, а у этой микросхемы - узкий. Но повезло, что выводы 2-4 сидят на массе, а от первого идёт дорожка под корпус к переходному отверстию - соскрёб маску и припаял: 5-8 выводы на родные пады, а 1-4 на то место где маску соскрёб. Выкрутился.
Так вот, возникло подозрение, что при выключении пробивает TPS563201, после чего, она пропускает 16 вольт дальше на TPS2113, которая от этого напряжения тоже улетает (возможно, в момент следующего включения). В общем, за пару дней у меня улетели все TPS563201 (был купивши 5 штук) и TPS2113 (3 штуки), потом нашел у себя еще 2 штуки TPS563200. Пришлось делать заказ на следующий комплект. Во время последнего "сжигания", попытался даже осциллографом глянуть, что там на шине питания происходит. К тому времени все 2113 были убиты, так что преобразователь был изолирован от нагрузки. Нагрузкой был резистор на 24Ω со светодиодом для индикации. Выставил на БП 14.7в и попробовал включать-выключать - вроде не сгорает. Тогда ткнулся осциллографом, собирался настроить порог синхронизации, но при первом же выключении-включении - опять пробило. Синхронизации не было, но на экране заметил какой-то всплеск, но оценить его величину не могу. Есть, подозрение, что виноват БП, что у него при снятии нагрузки "подскакивает" напряжение. И много не надо. К сожалению у TPS563201 абсолютный максимум всего 19 вольт. Т.е. запас меньше 2.5 вольт. Потом стал думать, что если виноват БП то, может, при питании от батарей такой проблемы не будет?
Хорошо, будем вставлять батарейки. Они как раз и пришли через недельку после описанных событий. Заряжаю, вставляю в батарейный отсек, измеряю напряжение - 0 вольт. Все показывают 0 вольт. Вытаскиваю и измеряю на самой батарейке - 4.2в. Начинаю внимательно смотреть, а они плюсовым выводом не касаются контакта. Ну да, купил аккамуляторы у которых нет выступа на плюсовом контакте. Думал-думал, как выйти из этой ситуации и решил модифицировать контактики в батарейном отсеке. При помощи пуансона и молотка выдавил углублённую часть контакта. Вот фото, что у меня получилось - по середине, оригинальный, еще не модифицированный контакт.
Включил, выключил, включил - вроде, не полыхнуло. Похоже, действительно виноват БП. Но как этот выброс просачивается? Не могу понять. А из практики, с батарейками еще ни одна TPS563201 не сдохла. Но мне стало как-то стрёмно. Когда эти стабилизаторы улетали под блоком питания с ограничением тока - это не страшно, а вот если улетит под аккамуляторами? Там же защиты от перегрузки может не быть. Не хотелось бы чтобы оно где-то полыхнуло. Поэтому порезал дорожку и впаял трёхамперный предохранитель (на схеме F1 - изначально его не было).
Правда, был подстраховавшись. Помимо нового комплекта TPS563201 заказал и готовые импульсные стабилизаторы n7805 - на случай, если и от батарей будет гореть, то снесу все детали и на проводках и клее поставлю этот "запасной" вариант.
Когда увидел, что преобразователи работают нормально, решил собрать одного робота. Было у меня свободное шасси, моторы и плата сенсоров. Когда платы тестировал с питанием, программа загружена еще не была, и заметил, что у одной платы не зажигается светодиод означающий включение драйвера двигателя. Решил начать именно с этой платы. Стал разбираться со светодиодом. Нашел, что сигнал sleep драйвера двигателя и включения светодиодов сенсора линии соединены вместе. Похоже, снова BGM240 припаялся не удачно. Отпаивал-припаивал - коротыша нет, а светодиод не зажигается. Оказалось, была еще капелька олова закорачивающая этот сигнал на массу под микросхемой драйвера двигателя. Устранил. Припаял моторы - не крутятся. Начал дальше искать - теперь уж точно BGM240 - оба сигнала ШИМ двигателей не контачат. Устранил. Дальше всё пошло как по маслу.
Теперь стоит вопрос где взять шасси, моторы и сенсоры для второго робота. Единственный вариант - разобрать одного из уже сделанных. Решил, что буду разбирать тот, что с "новыми" сенсорами линии, чтобы "высоковольтные" роботы были с одинаковыми сенсорами (да и на плате нагрузочные резисторы я уже накидал 4.7кΩ, для старого варианта надо 47кΩ). Взял одну из плат, припаял двигатели. Делаю тест - двигатели идут страшными рывками. Начал разбираться - проблема в измерении напряжения батареи и напряжения поступающего на моторы. Программа видит низкое напряжение, даёт 100% ШИМ, потом контроллер видит, что по таходатчикам колесо "убежало" вперед, тормозит, итд. Подумал, что опять придётся возиться с пайкой BGM240 и решил собирать другую плату. Собрал, но она как-то странно себя вела, так что и не понять причину. Искал-искал, и понял, что легче разобраться с предыдущей платой. Тем более, что подключив её и проведя тесты, заметил, что BGM240 нормально контачит - когда тестером в режиме проверки диодов тыкался в выход мультиплексора "4053", значения "подскакивали". Но при тыкании на входы 4053 - нет. Оказалось, что там где-то не контакт. Отпаял, зачистил маску побольше (это тот кристалл, которому пады не соответствуют) припаял по-новой, напряжение начал показывать нормально. Осталось, собрать. Вот только был уже вечер пятницы перед субботними соревнованиями. Ну ничего, просидел до позднего вечера и собрал. Так что поехал на соревнования с 2 "высоковольтными" роботами. Но как запасной вариант был - использовать одного низковольтного, если что не пойдёт.
На соревнования следования по линии особенно не старался, так как за это время к роботу совсем не притронулся. Проверил сенсоры, поставил небольшую скорость и попытался проехать. Ворота не сработали. Пошел и прикрутил "флажок", чтобы сенсор лучше видел - результат зафиксировался, чуть увеличил скорость - результат чуть лучше, еще увеличил - результат чуть хуже из-за того, что робота начало заносить на поворотах. Конечный результат - второе место. До первого надо было вытянуть 2 секунды, что для моего робота совершенно нереально.
Главное внимание было эстафете. Трасса была сложнее. Как сказал судья: "похожая на ту, что была в видео". Но на этой трассе было одно заковыристое место для моего робота, и еще одно для других роботов. Для моего робота (ну и других) проблему создавал один очень крутой поворот. Мой робот его проходил, но так как он выскакивал на белое поле - считал, что конец линии и выполнял завершающую процедуру. Вообще-то у меня было предусмотрено, но тот кусок был закомментирован, что конец линии считается только если линия пропала, когда была по середине сенсоров, а не с краю, т.е. чтобы потеря линии на повороте не считалась бы за конец трассы. Пока думал, влючить эту фишку или нет, случайно был ляпнувши, что "вообще-то трасса не соответсвует правилам соревнований". Потому как было указано, что минимальный диаметр поворота 10см, а там даже эстафетная палочка диаметром 7см в поворот не вписывается. Другие тут же отметили, что и минимальное расстояние между соседними линиями не соблюдено и из-за этого на повороте подхватывают неправильную линию. Ну и устроили "революцию". Вызвали судью, высказали претензию и для удовлетворения наших запросов постелили запасную трассу, такую же как была на предыдущих соревнованиях.
Пока готовились, поразглядывал роботов других команд. Интересным показался робот школьника из нашего клуба. В принципе, только наши роботы были "не лего". Причем, если у меня роботы были более-менее одинаковые, то у него были два разных. Причем конструкция "клешней" тоже разная. По сравнению с его конструкциями, мои выглядят бледненько.
Это ищется по ключевому слову "mantis gripper". У второго робота клешня была попроще, но тоже на шестерёнках, а не на проволочках, как у меня. Правда, он палочку от пола не поднимал - только одна серва. Хотя проволочки проволочками, а так как теперь у меня питание мощное, решил, что полностью сжимать клешни для захвата палочки не следует - может быть излишне повышенное потребление тока. Поэтому, ввёл конфигурационные параметры для позиций открыть/закрыть и подбирал позицию, при которой палочка схвачена достаточно хорошо, но не слишком крепко. Во всяком случае, в этот раз случая, чтобы робот уронил палочку не было.
На соревновании запустил робота на небольшой скорости 50 см/с, прошел за 25 секунд. Судья думал что никто не переплюнет. Но, я опасался, так как при подготовке видел, как ходят другие роботы. Так и получилось, что лего робот нашего одноклубника (тоже из PRK) прошел за 21 секунду. Ну что сказать, он собаку съел на лего лайнфоловерах (даже на соревнованиях Robotex призовые места получал) и ехал по "родной" трассе. Попробовал увеличить скорость до 70 см/с - результат улучшился всего на секунду. При следующем увеличении скорости не вписался в поворот и трасса была выполнена всего на 75%. Так что второй. Второй "не лего" робот занял третье место. Вот не спрашивал как на лего роботах делалась передача палочки, а автор этого робота поначалу хотел тоже организовать "передачу информации", но по инфракрасному каналу. Но что-то не получалось, поэтому на соревновании сделал просто таймер - второй робот просто ждал указанное время и начинал двигаться. В первом и во втором заезде синхронизация не получилась, второй робот поехал слишком рано, а в третьем заезде всё получилось как надо. Из остальных команд только еще одна смогла выполнить трассу, но время было полторы минуты.
А у меня с блютусом получилось не очень хорошо. Побаивался, что может быть проблема с "радиообстановкой". Так и оказалось, роботы не успевали соединиться друг с другом за 5 секунд. Приходилось по 3 раза нажимать кнопку "старт", пока робот начинал двигаться. Теперь, изменил программу, так, чтобы по истечении 5 сек, робот проверял наличие соединения и если его нет - просто ждал его появления и тогда бежал, а не отменял задачу совсем. Потому что в этих соревнованиях точность этих "5 секунд" не обязательна (в отличии от драгрейса). Ну постоит на старте 10-15 секунд...
После соревнований решил посмотреть, работает ли фишка с разгоном на прямой и детектированием поворотов. Оказалось, что нет. Вот график начала заезда.

Красная линия "stage" показывает номер "этапа": 1 - выход на позицию для забирания токена, 2 - езда "вслепую" (игнорируются ошибки смещения), 3 - разгон-торможение на прямом участке, детектирование поворота, снова разгон-торможение и т.д. Видно, что робот разогнался до 1 м/с затем сбавил скорость до 0.5 м/с и ждёт поворот. И ни первый поворот на 90°, ни второй на 180° он не опознал. Опознавание сделал так, что если ошибка становится выше некоего порога, взводится триггер, а когда ошибка уменьшается ниже некоего порога - считаем поворот завершенным и можно снова разгоняться. По данным предыдущих соревнований порог был поставлен "14", но в этот раз ошибка достигла только 9.7, поэтому триггер не сработал. Дело в том, что на величину ошибки влияет скорость робота, радиус поворота и... коэффициенты PID. Конкретно, на предыдущих соревнованиях Steering_KP был 0.04, а на этих поставил 0.05. Можно было бы "подогнать" пороги, но это на этой трассе - тут все повороты с одинаковым радиусом, а если другая трасса? В общем, стоит вопрос, как распознать поворот. На профайлер надежды нет - он рапортует 0°, так как steering для него это просто "выравнивание". Снимать информацию с таходатчиков и делать расчеты параллельно профайлеру? Но с другой стороны, все эти коррекции подчиняются переменной g_steering_adjustment (на графике названа steering - сиреневого цвета) и там особо ничего не видно (пока из-за порядка величин - они очень маленькие, если не считать всплесков из-за дифференциальной составляющей). Надо еще думать.
Можно бы напрячь под это дело гироскоп, но пока не знаю как с ним справиться. Когда рисовал плату хотел туда поставить такой же гироскоп как и на Pololu роботах LSM6D33. Это чтобы в случае чего воспользоваться ихней библиотекой. Но на тот момент их в продаже уже не было и напаял замену, что предложил DigiKey LSM6DSR. Но библиотека её не признаёт, так как значение считываемое из регистра WHO_AM_I ожидается 0x69, а LSM6DSR выдаёт 0x6B. И вот не знаю, насколько они "совместимы" и можно ли просто подменить идентификационный код.
Нашел, что раньше были акселерометры выдающие аналоговый сигнал - LY3200, его можно было бы включить в цикл сканирования АЦП и не возиться с шиной i2c, но купить его нигде уже нельзя - давно снят с производства.
Кстати, про "всплески". Они возникают из-за того что передаточная характеристика смещение от линии/значение ошибки - ступенчатая. "Пропорциональность" сразу не делал, так как решение от предыдущего робота не годится. Все данные здесь верх ногами. Там было: чем больше значение АЦП - тем темнее, а здесь, наоборот, светлее. Но теперь решил этим заняться. Понятно, что чтобы считать "чёрную пропорциональность" значения АЦП надо из чего-то вычесть. Пробовал от 4095 (макс. значение), но отношение получалось не очень внятным, поэтому, решил вычитать от значения порога (граница между черным и белым). У моего робота это 350-400. То что значения для белого поля при этом получатся отрицательные - не волнует, так как в расчетах участвуют только те сенсоры, которые над чёрным полем.
Попутно, так как этим занимался солнечным утром, потестировал, как распознаётся линия при засветке солнцем. И заметил очень интересную вещь:
Код: Выделить всё
60501,4095,4895, 4095,4895, 4095,4895, 1555,1762, 788,1002, 4095,4895, 4095,4895, 4095,4895
60531,4095,4895, 4095,4895, 4095,4895, 1556,1765, 793,1007, 4095,4895, 4095,4895, 4095,4895
60563,4095,4895, 4095,4895, 4095,4895, 1561,1767, 798,1012, 4095,4895, 4095,4895, 4095,4895
60593,4095,4895, 4095,4895, 4095,4895, 1561,1766, 800,1014, 4095,4895, 4095,4895, 4095,4895
60623,4095,4895, 4095,4895, 4095,4895, 1563,1767, 803,1016, 4095,4895, 4095,4895, 4095,4895
60653,4095,4895, 4095,4895, 4095,4895, 1567,1769, 808,1020, 4095,4895, 4095,4895, 4095,4895
60683,4095,4895, 4095,4895, 4095,4895, 1570,1774, 812,1025, 4095,4895, 4095,4895, 4095,4895
60713,4095,4895, 4095,4895, 4095,4895, 1578,1778, 819,1032, 4095,4895, 4095,4895, 4095,4895
Первый столбец время, а дальше сенсоры по парам: темновой и светловой отсчеты. Так вот можно заметить, что помимо двух центральных сенсоров, остальные находятся в насыщении - 4095, т.е. те что на белом поле уже "ослепли", а центральные два над черным полем, еще дают вменяемые показания. Поэтому сделал небольшой хак: если освещенный сенсор даёт значение близкое 4095, к нему прибавляется двойной порог (2 * 400 = 800), чтобы разница была однозначно выше порога и поле считалось бы белым (значения 4895 в распечатке). Поэтому пока черное поле не зашло в насыщение - робот черную линию еще способен распознать, несмотря на то, что "белые" сенсоры уже ослепли. Так удалось еще расширить рабочий диапазон сенсоров линии.
Возникла еще одна заковыка. Когда еще тестировал сенсоры на "низковольтном" роботе и строил графики в экселе, линии выглядели несколько ровнее. А у этого робота выглядят "пушистыми". Ну да, преобразователь 5в несколько шумный, а именно его я завёл на коллекторы фототранзисторов. Поэтому напаял на разъём 78L05, пусть питается через линейный стабилизатор. А вот что подать на вход этого стабилизатора? С батарей нельзя - слишком большая будет рассеиваемая мощность. Там помимо фототранзисторов еще 10ма ест белый светодиод для цветового сенсора и 4 по 10ма светодиоды подсветки фототранзисторов (правда, короткими импульсами). Поэтому соединил с выходом 9в стабилизатора. Линии стали гораздо глаже. Но в схеме был предусмотревши перемычку, которая выключает этот преобразователь, если драйвер двигателя переводится в режим сна. Ну, значит, не придётся воспользоваться этой перемычкой.
Спойлер
