123
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 2 из 2«12
Модератор форума: nightmare, Huntswarrior, Aleks_Crow, {{TNT}} 
Форум » Проекты по робототехнике » Групповые проекты » Робот ASURO на микроконтроллере AVR ATmega8 (Инструкция и программирование робота своими руками)
Робот ASURO на микроконтроллере AVR ATmega8
Администраторы
3318 сообщений
Мужчина
Хорошо. Будем считать что с мигалками и передвижениями робота мы разобрались. Может уже успели сделать функцию при которой робот едет прямо, утыкается носом в препятствие, включает реверс, поворачивает, и дальше едет и так далее... ? Да, уже сделали ? Ну вы молодцы тогда laugh

Давайте подойдем ближе и рассмотрим работу наших светосенсоров - линии и оборотов колеса. Кстати... Я вот у себя обороты пока считать не буду, так как я поставил свой редуктор без цветовой маркеровки черный-белый-черный... Так вот. Давайте разберем как работет наш фототранзистор фронтовой, что под платой внизу.

РАБОТА С ФОТОДАТЧИКАМИ - ФОТОТРАНЗИСТОР, ДАТЧИК ЛИНИИ

Начнем стого, что каким образом работает фотодатчик ? Думаю вы догадываетесь исходя из его названия, он что-то там должен фото...графировать ? ) Нет, принимать "световые пучки", и реагировать на них. Бывают разные типы фотодатчиков - ФОТОрезисторы, ФОТОтранзисторы, ФОТОдиоды, еще какие-либо экзотические, даже та самая солнечная батарея - тоже ФОТО wow

Эти датчики считывают и передают информацию в аналоговом формате - то есть напряжение, по которому мы будем судить есть линия или ее нет. Обычно для более точного определения используют всяческие преобразования. Существуют преобразователи ЦАП и АЦП - цифровой и аналоговый. Один из напряжения делает цифры 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


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
31
Администраторы
3318 сообщений
Мужчина
И так... Мы уже умеем работать с ШИМом и управлять двигателями (сервами тоже можно кстати, если очень захотеть). Включать и считывать информацию на датчиках, и индикаторах. Давайте теперь попытаемся увидеть то, что видит и чувствует наш 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" ...в общем -нечитаемые кракозябры. kind Для решения этой проблемы проверьте настройки портов и расстояние от ПК до МК.


Только дурак нуждается в порядке-гений господствует над хаосом...
Онлайн ЧАТ по робототехнике ! Заходи и общайся без регистрации =)
Профиль Личное сообщение Дом. страница icq Skype
31
Форум » Проекты по робототехнике » Групповые проекты » Робот ASURO на микроконтроллере AVR ATmega8 (Инструкция и программирование робота своими руками)
Страница 2 из 2«12
Поиск: