123
Главная » 2013 » Январь » 9 » Робот ASURO: Шаг за шагом. ATmega8L, Си
19:18
Робот ASURO: Шаг за шагом. ATmega8L, Си


DAGU ASURO Robot kit - мобильный робот, разработан в образовательных целях для школ и университетов. Набор состоит из процессора Atmel AVR RISC, двух моторов, шести детекторов столкновения, датчиков, светодиодов, индикаторов и IR. Автономный робот ASURO оснащён микропроцессором Atmel AVR ATmega8 с возможностью загружать свои программы. Шесть датчиков касания, одометры на колёсах, пара фототранзисторов снизу со светодиодом подсветки позволяют роботу неплохо ориентироваться в окружающем мире. Предназначен как для любителей, так и для школьных кружков и студенческих лабораторий.


При сборке требуется паяльник и инструмент!

 Данная статья представляет из себя быстрое ознакомление с особенностями программирования робота ASURO для начинающих программистов, без зацикливаний в особенности языка программирования. Мы будем изучать особенности этого робота ШАГ ЗА ШАГОМ.
$CUT$


***


фото.1

фото.2


 1.ОПИСАНИЕ К РОБОТУ ASURO

 Есть такой робототехнический набор "ASURO robot KIT" - такой набор для сборки робота. Поставляется в виде набора для сборки и пайки своими руками. Размеры робота сравнительно не большие, сколько точно не скажу ищите в описании. Мне лень хотел сказать замерять, но вот как на зло я знаю где лежит линейка и без особых телодвижений до нее можно дотянуться... Так и быть - 10.5 х 12.5 (см). 

Все это умещается на плате которую вам предстоит спаять и установить на нее детали. Все детали, кстати, выполнены в DIP корпусе и с ним подобным, что облегчает жизнь начинающему робототехнику. Паять не сложно будет. Детали расположены очень кучно и при пайке соблюдайте аккуратность и внимательно устанавливайте на свои места детали. Иначе перепаивать а это очень тяжко для таких плат, так как у меня обычно детали припаиваются намертво =). 

Мозговым центром бота является микроконтроллер фирмы Atmel - ATmega8L, где L - означает что микросхема из рода мало потребляющих и мало-требующих для работы. Обычно запускаются от 3-5 Вольт. Этот МК управляет 6 тактильными датчиками (датчиками касания), установленными в передней части бота, 4 оптопарами которые установлены рядом с редуктором для подсчета количества оборотов колеса. А также датчиком линии состоящим из 2х фототранзисторов и одним светодиодом между ними. 

Редуктор на этом роботе, мягко говоря - никудышнейший ! Я просто не могу Вам сказать все что о нем думаю! Редуктор нельзя использовать для участия в конкурсах или настоящих соревнований по робототехнике. Он очень м-е-едленный, очень слабенький, руками слегка притормаживаешь и он дохнет от напряги, пищит. Сразу говорю - редуктор меняйте !Моторами управляет Н-мост на транзисторах C32740 и, кажется микросхемой CD4081BD.

Напряжение робот просит в количестве 4 батареек типоразмера ААА по 1.5 (1.2) Вольт каждая.


 2.ВИДЕОТЕСТЫ РОБОТА ASURO

На видео показано прохождение роботом трассы.







  3.ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ

Технические характеристики набора приведены в таблице.1.


 Табл.1.
МИКРОКОНТРОЛЛЕР
ПРОГРАММИРОВАНИЕ
СЕНСОРЫ
ИСТОЧНИК ПИТАНИЯ
РАЗМЕРЫ
AVR ATMega8 Память: 8 kB флэш, из них около килобайта занято Bootloader_ом 1 kB RAM 1 kB EEPROMРобот поставляется с прошитой во флэш программой AVR-Bootloader, после подачи питания загрузчик пытается принять с компьютера данные, а если IR сигнал не обнаружен, через две секунды робот начинает исполнять текущую программу. Два фототранзистора позволяют отслеживать линию на полу шесть контактных датчиков (микропереключатели) Две фотоячейки считают обороты колёс. 4 шт. гальванических элемента типоразмера 4AAAДлина × Ширина × Высота
117×122×45мм

 Принципиальная электрическая схема робота ASURO показана на фото.3.
 
фото.3 нажимайте для увеличения

Будем считать что робот у вас допаян и собран. Батарейки новые и при включении он запускает тестовую прошивку которая проверяет все агрегаты типа моторов, датчиков, сенсоров.


 4.ПРОГРАММИРОВАНИЕ.

Начните с установки пакета программ которые идут на диске с роботом. Список необходимых к установке программ:

  • WinAVR или AVRStudio4. Компиляторы С\С++ с помощью которых мы будем составлять и
    компилировать инструкцию поведения робота - .hex файл, который скушает
    микроконтроллер. В нашем случае будет использоваться первый вариант -
    WinAVR 
  • Flash - загрузчик нашего .hex кода. 
  • Adobe Reader по идее есть у каждого, но если хотите можете его скачать тоже для чтения мануала на английском. 

 5.НАСТРАИВАЕМ ПРОГРАММУ.

 Запускаем WINAVR - Programmers Notepad. Нажимаем вкладку Tools -> Options -> Tools(именно tools a не project tools). Откроется окошко подписанное как "Sheme". В этом окне выбираем нашу схему - C\C++. Выбрав схему нажимаем Add. Сейчас нужно будет добавить батник (.bat) который содержит в себе всего одну строку команду или "make all" или "clean all" В открывшемся окне "Свойства: New Tool" набираем имя(name): make asuro. В поле команда указываем файл test-all.bat, который находится на диске в разделе \ASURO_src\FirstTry\Test-all.bat. 

 ВНИМАНИЕ! Скопируйте папку FistTry c диска на свой компьютер на диск С прямо в корень. 

То есть путь к папке должен быть следующим C:\FirstTry\. Это связанно с тем что компилятор не сможет перезаписать файлы находящиеся на диске что идет в комплекте и когда вы бы попытались запустить команду make asuro(позже узнаете как), то компилятор бы не ругаясь скомпилировал все, но на самом деле файлы не изменятся совершенно. И да, компилятор не умеет работать с русскими путями. Например если у вас файл находится по такому пути C:\FirstTry\Вася Пупкин\ . Будьте внимательными. 

И так, вы указали путь к файлу test-all.bat. Идем дальше. В поле Folder указываем путь к папке в котором находится этот файл test-all.bat. Т.е. получается так: C:\FirstTry\. Указали. Теперь закроем окно нажав кнопку "ОК". Теперь у нас появился список:[WinAVR] Make All ... make.exe ... all Снова нажимаем Add. В поле Name пишем clean asuro. В поле Command указываем файл Test-clean.bat. Файл находится там же где и Test-all.bat. В поле Folder указываем папку где находится файл. Нажимаем "ОК". 

Все на этом пока наши настройки закончены !


  6.ПИШЕМ ПРОГРАММУ.

В скопированной папке FistTry которая у вас находится по адресу C:\FistTry\ найдите файлик test.c - это файл программы на языке Си. Можете открыть его блокнотом и вы увидите в нем следующий код:

#include "asuro.h" 
int main(void)
 
    Init(); 
    while(1); 
    return 0; 

Откройте окно программы WinAVR - Notepad programmer. Нажмите File -> Open. Найдите папку FirstTry и в ней файл test.c. Выберите его и нажмите Открыть. Откроется точно тот же код что указан выше, правда теперь он немного подсвечен. 

Разберем наш код. 

 1. #include "asuro.h" - библиотека с настроенными заранее функциями для
корректной работы робота и его микроконтроллера ATmega8. 
 2. Int main(void) - начало нашей программы(функции) 
 3. Int(); - инициализация. В некоторых случаях не требуется, но укажем все равно.
 4. While(1) - бесконечный цикл, проверяющий соответствие true\false (правда\ложь) 
 5. Return(0) - возвращение в начало функции 

Важный момент - " ; " точка с запятой (!) должна присутствовать в конце каждой строки кода, исключения различные условия. 

После того как мы разобрали строки попробуем его скомпилировать. Для этого нажимаем вкладку меню Tools -> make asuro. Нажав на make asuro мы запустим команду make all которая находится в файлике Test-all.bat. Как только мы запустили компиляцию в низу в окне Output начали мелькать строки состояния, ошибок, путей и прочих информационных данных, часть из  которых нам пока что не нужна, но кое что всегда должно быть во внимании. 

В самом низу этих строк будет надпись: 

 Errors: none
--------
------- end ---------
---------
Process Exit Code:
 0
> Tame Taken: 00:01 


  7.ЧТО ЭТО ЗНАЧИТ ?


Первая строка говорит о том, что в ходе компилирования не обнаружено каких либо ошибок синтаксиса и прочего. Вторая строка просто так. Третья строка говорит что ошибок (точек выхода\сбоя\ошибки) не найдено. Четвертая строка показывает затраченное время на компиляцию. 

ВНИМАНИЕ!
Перед каждой компиляцией обязательно сохранитесь! Иначе, когда вы вносите изменения в коде, в самой программе WinAVR NP, в тесте вашей программы, при запуске на компиляцию он вам не покажет ошибки. И вы, радостные, побежите заливать прошивку в МК и потом будете ломать голову почему ничего не изменилось )

Для проверки увидит ли он ошибку сделайте тест: 

  1.Открыв файл программы test.c и запустите на компиляцию. Вы увидите что ошибок 0. 
  2.Теперь открытый файл test.c на любой из строчек удалите ";" 

После чего также запустите на компиляцию. Что в итоге ? Ошибок, опять же, он не выдал. Видимо компиляция происходит не из окна с текстом программы а именно от файла test.c где-то из папки...

И так. Теперь мы знаем как установить, настроить, скомпилировать и проверить нашу программу. Возникает закономерный вопрос - что нужно сделать чтобы робот начал выполнять нашу программу (инструкцию) сам ?


Для этого нужно нашу программу запихать в его мозги, - микроконтроллер. Причем в память его не энергозависимую. А то если запишем в энергозависимую, то при его выключении все потеряется. Для тех кого заинтересовало какие есть типы памяти - ищите в гугле

Помните мы было дело создавали папку FirstTry ? Вот сейчас идем в эту папку и находим там файлик test.hex. Это тот самый файл который умеет читать МК. Если хотите, можете его открыть в блокноте и узнаете что он из себя представляет =) 


  8.ПРОШИВАЕМ МИКРОКОНТРОЛЛЕР.

Запускаем программу Flash, которую вы должны были скачать с диска с роботом. Если еще этого не сделали -самое время. Запустили. Откроется маленькое окошко в котором Вам предстоит выбрать: 

а) COM-порт
COM-порт - это мост, который связывает программку Flash и наш программатор, который вы подключили в USB-порт. На самом деле COM - тот же самый USB, только называется по другому. Как узнать какой COM порт нам нужен ? Когда вы подключите программатор в USB, если у вас стоит Windows 7, то в большинстве случаев драйвера на него найдутся сами, и
установятся автоматически. Но бывают случаи, в большинстве, приходится все делать вручную. 

б) Обзор ...
- Тут мы находим файл с расширением .HEX. В нашей папке выбираем файл test.hex

в) Programm ...
Нажимая эту кнопку программатор начинает запрашивать у МК состояние - готов ли МК к прошивке или нет. Включен он или нет ? Будьте готовы включить робота сразу после нажатия на эту кнопку, так как если робот будет выключен - программа будет писать TameOut - время ожидания вышло. 


  9.УСТАНАВЛИВАЕМ ДРАЙВЕР ДЛЯ ПРОГРАММАТОРА.

 1. Мой компьютер -> Свойства -> Управление. В открывшемся окне нажимаем "Диспетчер устройств". В диспетчере находим "Неизвестное устройство". Если с вашей системой ранее было все ОК, то неизвестных устройств должно быть всего 1 - наш программатор.

 2.
Нажимаем правой кнопкой по этому неизвестному -> Обновить драйвер -> Выполнить поиск драйверов на этом компьютере ->Выбрать драйвер из списка уже установленных -> В списке (принтеры, мониторы, клавиатуры и прочей фигне) тыкаете на первое попавшееся устройство, например "Принтеры" -> В открывшемся окошке жмем "Установить с диска" -> Заходим в папку, точнее на диск что идет в комплекте с роботом. На диске идем в папку "USB-driver", тыкаем по первому попавшемуся INF файлу. Жмет открыть, ОК. Появится строка типа "USB Serial converter". Нажимаете на эту строку, -> Далее -> Да.

 3.
Установка драйвера завершена. Можете проверить наличие нашего программатора. Заходим в Диспетчер устройств, находим вкладку "Порты(COM и USB)". Там будет либо название программатора, либо название как у меня: USB Serial port (COM1). Так  вот, к чему я все подвожу. Вот эта надпись в скобках - (COM1) - и есть тот порт, который вам нужно указать в программе Flash. У кого-то может быть другой порт, например COM21. Так что смотрите каждый персонально. 


  10.ПРИСТУПАЕМ К ПРОШИВКЕ МИКРОКОНТРОЛЛЕРА.

Будем считать что у вас настроен программатор, робот с заряженными батарейками, прошивка готова в виде файла test.hex.

Выполните следующую последовательность действий:
1. В программе Flash нажимаем Programm.
2. Берем тут же робота и включаем его.

3. Глаз робота - TSOP - ИК датчик, с помощью которого он видит данные от программатора. Черный такой, с 3 ножками. Его направьте на ваш программатор чтобы между роботом и программатором не было предметов. Расстояние должно быть около 20 см, больше не рекомендую. 

 ВНИМАНИЕ! Не стоит пытаться прошить робота рядом с лампой дневного света, или рядом с монитором с электронно лучевой трубкой. Мало ли, но от них идут всяческие помехи. Если помехи есть, то в окне программы Flash будут появляться красные буквы "t "- timeout. Если они появились, ну, по трясите роботом перед программатором, должно помочь )

Если все идет хорошо, то там будет писаться flashed, flashed, tttflashed, tcccflashed. Главное что flashed - записано, сохранено.

После картины "шамана с бубном", трясущего роботом над программатором, ну, по крайней мере - я тряс ) Вы кое как, возможно и не с первого раза, но все же прошили МК на 100%. Теперь можно выключить питание робота, так как он будет висеть так далее, ждать новые команды от программатора.

Включите робота. Через 5 секунд ожидания робот начнет выполнять программу. Что он начнет делать ? Ответ прост - ничего ! =) Мы не указывали каких либо действий - просто программа типа START-END. 


  11.ПРОГРАММА "МИГАНИЕ СВЕТОДИОДОМ".

 На нашем роботе 20 объектов, которыми мы можем в полной мере управлять. Начнем с самого простого - светодиоды. У нас их 7 штук, 3 из которых ИК(инфракрасного диапазона), остальные обычные. 

Разберем как они идентифицируются. Так как у нас есть asuro.h - в нем содержаться все дефайны, функции, с которыми мы работаем в основной программе. 

Дефайны(defain) - заменяет одно на другое. Например "Вася Пупкин Пупкович" "Вася". Вместо того, чтобы нам в программе писать полное Вася Пупкин Пупкович... мы напишем просто Вася. Нам проще, а программе всё равно, так как мы заранее указали что Вася содержит в себе полное ФИО.

Также в нашем случае, производитель заранее попарился и напридумывал различных функций, упрощающих жизнь программисту. 

В место того чтобы писать и настраивать порты на Запись\Чтение - Ввод\Вывод, мы просто напишем LED и наш светодиод включится. Возникает вопрос, LED'ов то у нас дофига, как именно тот что нужен нам включить ? Ответ скрывается в мануале... Но я его тут процитирую:

Начнем с индикатора питания. Он у нас сдвоенный, имеет два цвета - красный, зеленый, желтый(если горят и тот и тот). Команда для включения красного цвета: 

StatusLED(RED); 

- как видно, тут указан статус светодиода: RED или GREEN 

 #include "asuro.h” 
 int main(void) 
 
   Init(); 
   StatusLED(RED); 
   while(1);
   return 0; 

 Компилируем. Tools -> Make asuro -> Проверяем на ошибки. Если ошибок нет... Надеюсь вы не забыли что нужно было сохраниться перед компиляцией ? Быстренько сохраняем и нажимаем компилировать снова... Если ошибок нет, то запускаем программу Flash, выбираем все тот же COM-порт и тот же test.hex файл. Нажимаем Programm ... Включаем робота и шаманим с роботом над программатором.

Прошивка на месте. Перезапускам робота. Сначала как всегда ожидание в 5 секунд, и после чего загорается красным цветом светодиод. Готово - как говорят программисты - It's Work ! 

Собственно вот сейчас мы запустим нашу мигалку в работу. Будем использовать вечный цикл, чтобы программа постоянно крутилась по кругу. 

Напишем программу: 

#include "asuro.h" 
int main(void) 


    Init(); 
    while(1) 
    { 
        unsingned int i; 
        StatusLED(GREEN); 
        for (i = 0; i < 842; i ++) 
        Sleep(0xFF); 
        StatusLED(RED); 
        for (i = 0; i < 842; i ++) 
        Sleep(0xFF); 
    } 


Разберем код: Используем 2 вида цвета - зеленый и красный. Делаем задержку в виде счетчика FOR, в котором мы объявим переменную i равную 0, и значение, до которого эта переменная будет увеличиваться, - до 842. Команда i ++ означает, что к i будет прибавляться цифра 1. Т.е. мат. действие можно записать разными способами: i+=1; i++; i=i+1; Как только i будет равно 842, счетчик запустит команду Sleep(). Эта команда активирует паузу. Как рассчитать паузу ? Ответ в этой формуле: (0.003s/1)/72kHz=216 Это при условии если нам нужна задержка в 3 миллисекунды. 

 Итог: мигание светодиода то зеленый то красный.

Для тех кто хочет зажечь другие светодиоды, вот другие команды:
1. FrontLED(ON); - светодиод который предназначен для поиска линии
2. BackLED(OFF,ON); - два светодиода расположенные рядом с моторами

Инфракрасные светодиоды включаются чуть по другому, но об этом позже. Кстати по поводу дефайнов, ниже пример того как их правильно указывать:

#define NAME replacement_text

  12.DEFINE ПРОСТОЙ НАГЛЯДНЫЙ ПРАКТИЧЕСКИЙ ПРИМЕР

#include "asuro.h”
#define STARTINGVALUE 33

int main(void)
{
  int i;
  i= STARTINGVALUE;
  // теперь переменная i равна 33
  return 0;
}



Разберем пример: мы задали переменную i типа int (int - Integer - Целое число). До начала программы, в "хедере" (шапке, в самом верху), мы задаем замену - число 33 мы заменяем на целое слово STARTINGVALUE. По умолчанию переменная i = 0. Но в программе мы нашу переменную приравниваем (=\==) к слову STARTINGVALUE, которое в свою очередь просто заменяется цифрой 33. В будущем такой заменой можно заменить целую кучу строк кода !

  13.РАБОТА С УСЛОВИЯМИ IF ELSE


Эти команды всегда используются для создания различного рода событий, которые происходят и выполняются в зависимости от ситуации. Как движение автомобилей на перекрестке с участием светофора - ЕСЛИ (IF) горит красный (StatusLED(RED), то { выполняется одно действие }, если нет, т.е. что-нибудь еще (ELSE), то { выполняется другое действие }.

Как это выглядит в программе:

if ( Ваше условие)
  {
     Если условие совпадает, т.е. оно правда (true), выполняется эта строка ;
  } 

else
  {
     Если условие не совпадает, т.е. оно не правда (false), выполняется эта строка ;
  }


Какими бывают условия:

    ==   что-то равно чему-то
    !=    что-то не равно чему-тоl
    <     что-то меньше чего-то
    >     что-то больше чего-то
    <=   что-то меньше или равно чему-то
    >=   что-то больше или равно чему-то

Пример: (A > B), (A <= и так далее... Давайте разберем более наглядный пример с использованием все тех же светодиодов:

#include "asuro.h”
int main(void) 

{

  while (1) 
  {
    if (PollSwitch()>0) 
    {
      StatusLED(RED);
    } 

    else 
    {
      StatusLED(GREEN);
    }
    
  }

}


Скомпилируйте и залейте этот код в микроконтроллер. Готово ? Тогда включите робота. Что начало происходить ? Нет, выключать и включать по десять раз, думая что что-то не так, не стоит. В идеале у вас должен загореться зеленый светодиод, и больше никаких действий не будет совершаться, пока...

Вот тут то и начинает работать наше условие "ПОКА".

Что такое функция PollSwitch() ? Объясняю. Эта функция отвечает за опрос наших контактных датчиков, которых у нас аж 6 штук. Каждый датчик обзывается как К1, К2, ... ,К6.

В нашей программе мы делаем условие: ЕСЛИ хоть 1 датчик касания нажат, ТО включаем зеленый светодиод, ЕСЛИ нет, то включаем красный светодиод. Теперь снова включите робота и тут же нажмите и держите любой датчик касания. Светодиод поменяет свой цвет. Ура ! Работает !


  14.УПРАВЛЕНИЕ МОТОРАМИ 

Давайте разберем как же нам заставить робота не только реагировать на прикосновения, но и как-то уже передвигаться - ездить в зад и в перед, поворачивать, танковый разворот... и так далее. 

За управление моторами отвечают две команды: 

1. MotorDir(параметр_1, параметр_2); 

"МоторДирекшен"(MotorDirection или MotorDir) отвечает за направление вращения двигателей. Для контроля направления используется "параметр_1,2". Чтобы мотор крутился вперед, нужно задать параметр FWD (Forward - прямо), если нужно назад - параметр RWD (Backward\Revers - назад). Если вы хотите остановить мотор, нужно указать параметр BREAK. 

Например: 

MotorDir(FWD,FWD);      -Задать движение обоих моторов вперед 
MotorDir(RWD,RWD);      -Задать движение обоих моторов назад 
MotorDir(FWD,RWD);       -Один мотор крутим вперед, второй крутим назад. "Танковый разворот" 
MotorDir(FWD,BREAK);   -Один мотор крутим вперед, второй останавливаем.


2. MotorSpeed(параметр_1, параметр_2); 

"МоторСпиид"(MotorSpeed) отвечает за скорость вращения наших моторов. Скорость вращения контролируется специальной вещью - ШИМ(Широтно-Импульсная-Модуляция). Вкратце это пучок импульсов которые с определенной частотой включают мотор. Обычно мы как включаем мотор ? подали постоянное напряжение и мотор раскрутился. А в ШИМе мы подаем импульсами наше "постоянное напряжение" и мотор начинает вращаться. Чем чаще эти импульсы приходят, тем быстрее крутится мотор. 

Можете провести эксперимент: возьмите мотор с проводками уже припаянными, возьмите батарейку, и один проводок подключите к батарейке, а второй возьмите в другую руку. Взяли ? Будем считать что вы один провод мотора подключили на +, а вторым будем касаться -. И так. Подключите наш проводок что в руке на минус. Мотор начнет крутиться постоянно с максимальной скоростью. А теперь давайте симмитируем наш ШИМ: начинайте многократно касаться нашим проводом на - батарейки. Что наблюдаем ? Пока вы касаетесь мотор - крутится, как только провод не касается мотор останавливается. Чем чаще и быстрее вы начинаете касаться батарейки - тем быстрее крутится мотор. Это и есть наш ШИМ, в общих чертах.  

Параметр_1 и Параметр_2 задаются числом в диапазоне от 0 - 255. Почему 255 ? Это рассчитывается по формулам, зависит от частоты и прочих параметров нашего робота. Если 0 - это значит мотор стоит, 255 - мотор крутится на максимальных оборотах. Если хотите медленно - пробуйте уже сами задавать число в этом диапазоне. По идее, но не факт, минимальное значение при котором мотор еще будет подавать признак работы - 60. Это будет либо писк либо ооооочень медленное вращение, либо жалостный писк.  

Например: 

MotorSpeed(255,255); -Моторы на полную мощность


Ну как вы должно быть уже поняли - одно без другого работать не будет. По этому вот вам цельный код, который вы должны залить в ваш МК: 

#include "asuro.h" 
int main(void)
 
  Init(); 
  MotorDir(FWD,FWD); 
  MotorSpeed(255,255); 
  while(1); 
  return 0; 
}

Прошиваем и проверяем. Сразу после включения ваши моторы должны закрутится вперед. поэкспериментируйте с диапазоном чисел и направлением.

Хорошо. Будем считать что с мигалками и передвижениями робота мы разобрались. Может уже успели сделать функцию при которой робот едет прямо, утыкается носом в препятствие, включает реверс, поворачивает, и дальше едет и так далее... ? Да, уже сделали ? Ну вы молодцы тогда  

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

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

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

Эти датчики считывают и передают информацию в аналоговом формате - то есть напряжение, по которому мы будем судить есть линия или ее нет. Обычно для более точного определения используют всяческие преобразования. Существуют преобразователи ЦАП и АЦП - цифровой и аналоговый. Один из напряжения делает цифры 10010111...011, другой из цифр напряжение 1V...3V..5V...0.83V ~ 

Фототранзисторы Т9 и Т10 будут нам передавать значения вместе с функцией LineData(unsigned int *data) 

Из мануала следует, что: 

unsigned int data[2]; 
LineData(data);


data[] содержит в себе "контейнер" с информацией с левого датчика и с правого датчика. 

Напишем программу: 

 #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 редуктор. Из-за инерции редуктор не останавливается и докручивается из последних сил... Может у вас будет работать и лучше, но не факт. =] 

Для своего случая я сделал "релейный регулятор". Работает просто - моторы(левый и правый) крутятся до тех пор, пока датчики(левый и правый) находятся на белой стороне. Как только датчик наезжает на линию - соответствующий мотор останавливается. Да и скорость я установил меньше, чтобы из-за инерции не было лишнего пробега. 

Вот код моей программы 

 
 #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

И так... Мы уже умеем работать с ШИМом и управлять двигателями (сервами тоже можно кстати, если очень захотеть). Включать и считывать информацию на датчиках, и индикаторах. Давайте теперь попытаемся увидеть то, что видит и чувствует наш ASURO - увидеть как он реагирует на срабатывание тактильных и сенсорных датчиков и прочего... Попытаемся поуправлять им прямо с компьютера используя обратную связь с роботом. 


  16.ОБРАТНАЯ СВЯЗЬ. 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. Запишем нашу строку в функцию: 

SerWrite("Hello! SERVODROID.RU\n",20);


5. Символ \n в строке обозначает перенос строки на следующую строку. Это для удобности отображения информации? Как будет выглядеть информация: 
>Hello! SERVODROID.RU 
>Hello! SERVODROID.RU 
>Hello! SERVODROID.RU 
... 
>Hello! SERVODROID.RU


Напишем простую программу для проверки: 
 
 #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" ...в общем - не читаемые кракозябры.  Для решения этой проблемы проверьте настройки портов и расстояние от ПК до МК.



Если у ВАС возникли вопросы пишите на ФОРУМЕ или в Online чат по робототехнике мы их обсудим! 

автор Сергей Мельников 
© SERVODROID.RU Внимание! Полное либо частичное копирование материала без разрешения администрации запрещено!
Категория: Робоконтроллеры | Просмотров: 13256 | Добавил: MSA-Beam-Robotics | Рейтинг: 5.0/1
Всего комментариев: 7
avatar
1 MSA-Beam-Robotics • 17:55, 10.01.2013
И в чем косяк был ? dry
avatar
2 nightmare • 17:40, 12.01.2013
Тут острая нехватка запятых:
"СЕНСОРЫ
Два фототранзистора позволяют..."
Ошибки:
FistTry
Int main(void)
Int();
While(1)
Return(0)
defain
"
for (i = 0; i < 842; i ++)
Sleep(0xFF); ..."
Нет смысла в шестнадцатеричной системе писать, а также надо попробовать функцию задержки _delay_ms() из WinAVR, для этого надо добавить в начало программы:
#define F_CPU 8000000UL
#include <avr/delay.h>
Такой способ проще и удобнее, задержки сразу в милисекундах.
avatar
3 MSA-Beam-Robotics • 14:09, 13.01.2013
РисовалкаВидео-конференция
11:02:31SHERIFF(A): секунду
11:02:42SHERIFF(A): il02, http://www.servodroid.ru/photo
11:03:09SHERIFF(A): там наверху ссылка добавить фото
11:04:29Нас покидает il02 закрыв страницу
11:05:05К нам присоединяется il02
11:05:05il02: [Ссылка удалена. Зарегистрируйте свой ник для размещения ссылок.]
11:05:21SHERIFF(A): www у ссылки удалите
11:05:26SHERIFF(A): и вставьте
11:05:32il02: servodroid.ru/forum/47-714-1
11:05:33SHERIFF(A): или зарегистрируйтесь в чате
11:06:21SHERIFF(A): по ссылке нет вашего сообщения
11:08:02il02: там картинка с роботом
11:08:27SHERIFF(A): il02, мне нужно ваше фото вашего робота чтобы опредилить где вы накосячили )
11:08:56SHERIFF(A): при прошивке робота на программаторе мигают индикаторы ?
11:09:10il02: немного подождите пожалуйста сейчас сфотографирую
11:09:11SHERIFF(A): в Flash информация какая пишется ?
11:09:17SHERIFF(A): il02, ок
11:12:17Нас покидает il02 закрыв страницу
11:13:35К нам присоединяется asmal95
11:13:41SHERIFF(A): asmal95, q
11:14:43asmal95: SHERIFF(A), ку
11:14:46К нам присоединяется il02
11:14:50asmal95: Всем привет
11:15:16SHERIFF(A): блин моя посылка застряла опять\
11:15:45SHERIFF(A): и по почтовому отслеживанию висит на статусе покинуло международный пункт обмена с веом в 0 грамм
11:15:45asmal95: SHERIFF(A), Где?
11:16:06il02: при формировании test.hex ошибок нет. при передачи через USB ИК соединение ОК а потом tttttttttttt
11:16:08SHERIFF(A): они там че, болтики собирают рассыпаные при шмрне на таможне ?? ><
11:16:17SHERIFF(A): il02, tameout
11:16:32SHERIFF(A): это значит программатор не может связаться с роботом
11:16:37SHERIFF(A): фото робота в студию
11:17:06SHERIFF(A): *шмоне (от шмонать, рвскать)
11:17:07il02: сперва ttttttttttt потом tameout
11:17:32SHERIFF(A): il02, фото можете дать ?
11:19:30asmal95: SHERIFF(A), у меня последних хлам из китая шел месяца полтора, а китай покинул через неделю после заказа.. Наша почта как улитка работает...
11:19:54SHERIFF(A): и не говори...
avatar
4 MSA-Beam-Robotics • 14:09, 13.01.2013
11:20:57asmal95: Сейчас осмелился заказать ручку с камерой и маленький видеорегистратор, ток на разных сайтах, сейчас буду ждать)
11:25:06il02: вот фото fotolink.su/v.php?id=bce10610201115542cc36b7d2cf10274
11:26:36il02: SHERIFF(A), Где?
11:26:51il02: помогите плиз
11:30:03SHERIFF(A): сейчас
11:30:06SHERIFF(A): я обедал
11:32:16SHERIFF(A): R9 вы куда припояли ?? В CON2 ?
11:32:44SHERIFF(A): asmal95, hexrf c rfvthjq &jJ
11:32:53SHERIFF(A): че за руча ?
11:33:48asmal95: SHERIFF(A), встроенная камера в ней, должна писать видео на флешку микро сд
11:34:03asmal95: SHERIFF(A), http://www.aliexpress.com/item....-record ing/611900088.html?cn=null&PID=5711755&tp1=null&tracelog=null&src=ale&URL=http%3A%2F%2Fwww.aliexpress.com%2Fitem%2FFree-shipping-HD-Video-1280-960-Pen- DVR-mini-dvr-DVR-Camera-Pen-with-voice-recording%2F611900088.html&cv=10975781&af=cj_5711755&vd=30
11:34:37Нас покидает Dimsan закрыв страницу
11:34:48il02: Нет R9 не в Con2
11:34:55SHERIFF(A): il02, ок
11:35:00SHERIFF(A): показалось
11:38:23SHERIFF(A): а R9 не дроссель случаем ?
11:38:26il02: при включении запускается самодиагностика, при передачи данных на USB ИК мигает светодиод, а робот через короткий интервал заново самодиагностируется
11:38:39SHERIFF(A): *R11\24
11:38:59SHERIFF(A): il02, ок, сделайте так:
11:39:16SHERIFF(A): приготовьте прошивку
11:40:41il02: R9, R16: 220Ω 5% (red, red, brown, gold)
11:40:45SHERIFF(A): как только нажмете Programm- хватате робота, включайте его питание и поднесите датчиком TSOP(там черный трехногий) к программатору так, чтобы он лицом к лицу на расстоянии в 2-5 см смотрел на программатор
11:42:14SHERIFF(A): чем неужобно IR-программирование, так это тем, что данные передаваемые через ИКпорты идут долго и программа может не дождаться порции, написав нам timeOut
11:42:14il02: R11: Instead the 100Ω 5% resistor please use L1 an 10μH coil (brown, black, black, silver).
11:44:32SHERIFF(A): при прошивке поднесите робота датчиком робота к датчикм программатора
11:44:41SHERIFF(A): и скажите что происходит ?
avatar
5 MSA-Beam-Robotics • 14:09, 13.01.2013
11:46:49il02: OPEN COM3 OK!, Bulding RAM OK!, Connect to ASURO Timeout
11:47:08SHERIFF(A): робота поднесли да ?
11:47:34SHERIFF(A): тут придется пошаманить с ним
11:47:34il02: как сказали 2-5 см
11:48:10SHERIFF(A): пробуйте менять при прошивке положения робота, отворачивать даже от программатора на короткий промежутток времени
11:48:12SHERIFF(A): и да
11:48:26SHERIFF(A): битрейд программатора выставлен по инструкции ?
11:49:11il02: Bits pro Second: 2400 • Databits: 8 • Parity: none • Stopbits: 1 • Flowcontrol: none
11:50:30il02: вы не в курсе перемычка JP1 возле выключателя не играет роли
11:51:39SHERIFF(A): играет
11:51:43SHERIFF(A): у вас она стоит
11:51:47SHERIFF(A): у нас тоже
11:52:10SHERIFF(A): перемычка та что возле датчиков на противоположной стороне
11:52:29SHERIFF(A): она не перебита ?
11:52:58il02: стал его вращать при прошивке Page 1 of 26 OK потом опять ошибка
11:53:25il02: прогресс улучшился но не намного
11:53:28SHERIFF(A): il02, тоесть "зеленные" данные появились 7
11:53:52SHERIFF(A): il02, ка там, "R" вроде
11:53:57SHERIFF(A): мол записано
11:54:26SHERIFF(A): Так если появились проблема или с питанием, или с расстоянием
11:54:33il02: tttcc Flashed
11:54:45SHERIFF(A): так. Через которую из 2х программ прошивок вы заливаете прогу ?
11:55:13il02: ASURO Flash 1.2
11:55:19SHERIFF(A): пробуйте обе
11:55:42SHERIFF(A): при тестировании робота получалось то одной то другой прошивать
11:56:51SHERIFF(A): если есть зеленые данные, значит аппаратная часть, по идее коректна.
11:57:07SHERIFF(A): Только в нашем случае дросселя в нашем роботе не стоит
11:57:25SHERIFF(A): Возможно это играет роль, проверять можно на испытаниях
11:57:45SHERIFF(A): Вместо дросселя стоит резистор по инструкции red red brown gold
11:59:02il02: сейчас загрузил с 1 по 8 Page а на 9 ссссссссс timeout
11:59:28il02: раньше и это не получалось
11:59:29SHERIFF(A): il02, исключите посторонние источники света
11:59:43SHERIFF(A): свет ламп дневного света особенно
12:01:00SHERIFF(A): При прошивке у вас происходит следующее: программатор через ИК-светодиод посылает пачку роботу на TSOP, робот отвечает что получил и отправляет с своего ИК-светодиода пачку на программаторский TSOP
12:01:05SHERIFF(A): и так идет обмен.
12:01:41SHERIFF(A): Если в случае, что от робота не пришло подтверждение, программатор пытается снова послать данные строку до тех пор пока не выйдет время
12:01:54SHERIFF(A): Если время выходит, программатор отключается.
12:02:29SHERIFF(A): Каждый раз при программировании робота, нужно включать его после нажатия кнопки Program на компе
12:03:10il02: БОЛЬШОЕ СПАСИБО. все получилось!
12:03:32SHERIFF(A): il02, я сам мучался когда его прошивал
12:03:49SHERIFF(A): самый лучший и надежный вариант - заменить датчики на провода
12:03:53il02: а почему такие проблемы с ИК? неужели производители не могут сделать проще
12:03:57SHERIFF(A): но это надо уметь
12:04:15SHERIFF(A): il02, по проводам будет быстрее
12:04:33SHERIFF(A): видимо они решили сделать такую фишку как беспроводная передача данных
12:04:44SHERIFF(A): т.е. также и ручное управление и тп
12:04:56il02: я все понимаю но для моих 12 лет и это прогресс
12:05:09SHERIFF(A): и раз уж такое дело - то решили не заморачиаться и программирование так же осуществлять
12:05:29SHERIFF(A): il02, это хорошо !
12:06:33SHERIFF(A): il02, по прошивке - будьте внимательны, так как бывали случаи что прошивка не загружалась по программатору, те там написано таймаут или тп, а на самом деле программа загрузилась
12:06:36SHERIFF(A): было и такое
avatar
6 Enigust • 12:02, 08.05.2013
Задумался над приобретением одного из следующих экземпляров, Asuro, PRO BOT 128 или NIBO 2. Посоветуйте что более подходит для начинающего?
avatar
7 Aleks_Crow • 19:51, 01.10.2013
Достойный наборчик!
avatar