Робот ASURO на микроконтроллере AVR ATmega8
|
|
Администраторы
3417 сообщений
Мужчина
|
Хорошо. Будем считать что с мигалками и передвижениями робота мы разобрались. Может уже успели сделать функцию при которой робот едет прямо, утыкается носом в препятствие, включает реверс, поворачивает, и дальше едет и так далее... ? Да, уже сделали ? Ну вы молодцы тогда
Давайте подойдем ближе и рассмотрим работу наших светосенсоров - линии и оборотов колеса. Кстати... Я вот у себя обороты пока считать не буду, так как я поставил свой редуктор без цветовой маркеровки черный-белый-черный... Так вот. Давайте разберем как работет наш фототранзистор фронтовой, что под платой внизу.
РАБОТА С ФОТОДАТЧИКАМИ - ФОТОТРАНЗИСТОР, ДАТЧИК ЛИНИИ
Начнем стого, что каким образом работает фотодатчик ? Думаю вы догадываетесь исходя из его названия, он что-то там должен фото...графировать ? ) Нет, принимать "световые пучки", и реагировать на них. Бывают разные типы фотодатчиков - ФОТОрезисторы, ФОТОтранзисторы, ФОТОдиоды, еще какие-либо экзотические, даже та самая солнечная батарея - тоже ФОТО
Эти датчики считывают и передают информацию в аналоговом формате - то есть напряжение, по которому мы будем судить есть линия или ее нет. Обычно для более точного определения используют всяческие преобразования. Существуют преобразователи ЦАП и АЦП - цифровой и аналоговый. Один из напряжения делает цифры 10010111...011, другой из цифр напряжение 1V...3V..5V...0.83V ~
Фототранзисторы Т9 и Т10 будут нам передавать значения вместе с функцией LineData(unsigned int *data)
Из мануала следует, что:
Quote unsigned int data[2]; . . LineData(data);
data[] содержит в себе "контенер" с информацией с левого датчика и с правого датчика.
Напишем программу:
Code ////////////////////////////////////////// #include “asuro.h”
int main(void) { unsigned int data[2]; Init(); FrontLED(ON); MotorDir(FWD,FWD); while(1) { LineData(data); if (data[0]>data[1]) {MotorSpeed(200,150); else {MotorSpeed(150,200);} } return 0; } //////////////////////////////////////////
И разберем ее работу: инициализируем нашу программу. Вводим переменные контейнеров в которых хранятся данные от датчика левого и правого - data[0] и data[1] Далее в нашем условии мы делаем проверку которая гласит: "Если на левом датчике большая засветка(больший коэффициент), то поворачиваем в одну сторону, пока на правом датчике не будет коэфициент больше. Кстати, это весьма неудачный вариант при использовании с таким редуктором который поставил я - Tamiya редуктор. Из-за инерции редуктор не останавливается и докручивается из последних сил... Может у вас будет работать и лучше, но не факт. =]
Для своего случая я сделал "релейный регулятор". Работает просто - моторы(левый и правый) крутятся до тех пор, пока датчики(левый и правый) находятся на белой стороне. Как только датчик наезжает на линию - соответствующий мотор останавливается. Да и скорость я установил меньше, чтобы из-за инерции небыло лишнего пробега.
Вот код моей программы
Code ////////////////////////////////////////// #include "asuro.h" int main(void) { unsigned int data[2]; Init(); FrontLED(ON); while(1) { LineData(data); if (data[0]>data[1]) { MotorDir(RWD,RWD); MotorSpeed(200,0); } else { MotorDir(RWD,RWD); MotorSpeed(0,200); } } //////////////////////////////////////////
Включаем нашего ASURO и лицезреем как он начинает сам ориентироваться на линии используя наши инструкции =] Кстати на заметку, с этой программой робот на ура проходит трассу нашего соревнования на которое вы еще, на момент написания этой статьи, можете успеть http://www.servodroid.ru/index....88
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
И так... Мы уже умеем работать с ШИМом и управлять двигателями (сервами тоже можно кстати, если очень захотеть). Включать и считывать информацию на датчиках, и индикаторах. Давайте теперь попытаемся увидеть то, что видит и чувствует наш ASURO - увидеть как он реагирует на срабатывание тактильных и сенсорных датчиков и прочего... Попытаемся поуправлять им прямо с компьютера используя обратную связь с роботом.
ОБРАТНАЯ СВЯЗЬ. SERIAL READ\WRITE. ПОЛУЧЕМ ДАННЫЕ С РОБОТА.
Для начала нам нужно знать как осуществляется передача данных, например текстовой строки "Hello World, it's work!". Какждая буква - символ. Каждый знак в слове -символ. Всегда нужно считать общее количество символов которое будет передаваться, и указывать это количество при передаче строки, иначе часть слова, строки, пропадет.
За запись отвечает команда SerWrite() в уоторой мы можем передавать информацию с датчиков, команды подтверждения и прочие данные телеметрии. Для считывания данных потребуется какая-нибудь сторонняя программа которая будет мониторить данные проходящие через COM-port. Например Advansed Serial Port Monitor, или написать свою программку. В софтине этой нужно выставить все настройки как у программатора, и выставить его порт, на котором он сидит.
Для того, чтобы записать наше послание и передать его куда-либо, мы сделаем следующее действие: 1. Возьмем функцию SerWrite() 2. Придумаем слова, например "Hello! SERVODROID.RU" 3. Подсчитаем количество символов, которые мы будем передавать: H-1, e-2, l-3, ... , U-20. Итого: 20 символов. 4. Запишем нашу строку в функцию:
Quote SerWrite("Hello! SERVODROID.RU\n",20);]
5. Символ \n в с троке обозначает перенос строки на следующую строку. Это для удобности отображения информации? Как будет выглядеть информация: Quote >Hello! SERVODROID.RU >Hello! SERVODROID.RU >Hello! SERVODROID.RU ... >Hello! SERVODROID.RU
Напишем простую программу для проверки:
Code ////////////////////////////////////////// #include "asuro.h"
void main(void) { Init(); StatusLED(RED); while(1) { SerWrite("Hello! SERVODROID.RU",20); } } //////////////////////////////////////////
Залейте получившийся .hex файл в микроконтроллер.
Вы уже скачали какую-нибудь программку для мониторинга портов ? Если нет - сейчас самое время ! Скачайте Advansed serial port monitor (демо-триал версия) http://www.aggsoft.ru/serial-port-monitor/
Запустите сканер\порт монитор. Если там предлагает вам выбрать действие, например прочто "читать данные с порта" - выбирите это действие. Если вы хотите что-либо другое - вам решать. В настройках выбирите COM-port, например у меня программатор висит на COM1. Выставите битрейд-2400, стоповые биты 1, четность - нет. В принципе этого должно хватить =]
У меня для мониторинга есть собственная программа, которую я писал для робота "ИРПС", скачать программу можно стукнув мне на ящик melnik1412 [DOG] yandex.ru или тут посредством личных сообщений. Лично я тестировал в ней работу программы, что написана выше.
Запускаем сканер. Включаем робота. Подождав 2 секунды, пока робот подумает, пытаются ли ему скормить прошивку, загорится красный светодиод и начнется передача данных с робота на ПК. Эти данные будут показываться у вас в программе сканера портов. Плюс можно визуально наблюдать передачу данных по мигающим светодиодам на программаторе.
На заметку: передача данных по инфрокрасному каналу весьма кривая, и могут происходить "наводки"и вместо слов "Hello! SERVODROID.RU" вы увидите: "*&yifs983f hiuhfsidu" ...в общем -нечитаемые кракозябры. Для решения этой проблемы проверьте настройки портов и расстояние от ПК до МК.
|
|
|
|
|