The Робот.

Часть 3. Герой сопротивления.


Свинтус решительно отказывается ездить. При включении у него "отказывает" левое колесо, и он, лихо вращая правым, выписывает вокруг своей "левой толчковой" немыслимые кренделя. Причем настолько немыслимые, что пока этого гада поймали, он умудрился: а) сломать "нюхалку" - свой датчик касания препятствия, б) оторвать провод от аккумулятора.

Пришлось мне взять таймаут на размышления - надо было прикинуть что к чему. Но как ни крути, а выход напрашивался только один - раз одно колесо активно вертится, а второе стоит, значит надо на них питание подавать по-разному - на один двигун меньше, на второй больше. А как это можно сделать, если мы ими рулим с помощью ATMEL'овского микроконтроллера? Ну конечно только с помощью ШИМа! Внимательно читаю статью с сайта DIHALT'a AVR. Учебный курс. Использование ШИМ , вроде все более-менее понятно, но сразу возникает вопрос, что раз уж мы беремся вертеть двигателями с разной скоростью, то неплохо бы понимать, а насколько они по-разному у нас вертятся? Значит надо посчитать обороты колеса А еще неплохо бы сделать датчики касания не просто тупо спереди, а разделить их на левый и правый (а в иделе еще и на передний правый/левый и задний правый/левый, но это можно решить на программном уровне, запараллелив датчики и отслеживать направление движения). А еще задолбался я каждый раз вытаскивать атмелку из "кроватки" для перепрошивания, поэтому ноги SCK,MISO,MOSI лучше не трогать. USART тоже задействовать жалко - вдруг пригодится? И в итоге пришел я к такой мысле, что ног у тиньки2313 маловато будет :)

Посчитаем мои потребности в ногах: две ноги на левый и правый контакные датчики. Две ноги на енкодеры для подсчета оборотов колеса. Две ноги на включение/выключение двигателей (сигналы Enable1,Enable2) - их заводим через ШИМ, соответственно это ноги OC1A(PB3) и OC1B(PB4). Еще четыре ноги надо для Input1,2,3,4/ СТОП!!! Зачем тут использовать четыре ноги, когда логика включения движков как правило такая, что Input2=!Input1, а Input4=!Input3. Значит берем сигнал с одного вывода МК (например PB2), заводим его на Input1 L293D, и его же, но через логический элемент НЕ, на Input2. Аналогично поступаем с Input3 и Input4.


В итоге получается примерно вот такая схема:


и вот такой несложный исходник на С (датчики касания и енкодеры еще не задействованы).
Вроде все логично, в Протеусе все работает, значит можно травить плату и воплощать мысль в железе.
Ну и тут происходит как всегда - наши фантазии разбиваются о суровые реалии физики:
1. Двигатели не крутятся
2. Они еще и противно пищат. Я в шоке - я раньше и не подозревал, что можно делать спикеры из двигателей! :)
Над этой проблемой я бился два дня - камрады в чате сказали, что у меня частота ШИМа лежит в звуковом диапазоне, соответственно движки и пищат, а чтобы это пофиксить, надо задрать частоту. А куда??? И так при 8МГц и при 8-ми битном FastPWM частота составляет 31кГц, что уже за пределами восприятия человеским слухом.
Пришлось тащить Свинтуса в "стационар" - исследовать его на осцилографе, где и выяснилось, что fuse-bit CKDIV8 у меня не был сброшен, следовательно реальная частота МК составляла 1МГц, ну а частота ШИМ - 8.3кГц :)
Окрыленный я побежал домой, перешил фьюзы, поправил исходник.... Но эффект остался прежним - одно колесо стоит, а второе бешенно вертится....
Что уже я только не делал - выставил одинаковые значения счетчика ШИМ на правый и левый двигатели, мерял напругу (12.04V и 11.97V). Оторвал двигатели, вместо них взял новый и неюзанный, втыкал его в оба канала поочереди... Результат один - на Out1,2 движок вертится еле-еле, а на Out3,4 (этот же самый движок!) - крутится как очумелый.

Блин, восстание машин, ей-богу :)
Короче Свинтусу присвоено очередное звание - герой сопротивления :)

11/11/2009.
Продолжение следует.