Главная страница
Навигация по странице:

  • 4.19. МЕХАНИЧЕСКИЕ ДАТЧИКИ

  • Контактный Микропереключатель Упор Корпус робота Рис. 4.48.

  • 4.20. ПОДАВЛЕНИЕ ДРЕБЕЗГА КОНТАКТОВ

  • Элемент

  • Устройства управления роботами, схемотехника и программирование (М. Предко, 2004). Устройства управления роботами, схемотехника и программирование. Устройствауправления роботамисхемотехника и микроконтроллеров picmicro


    Скачать 6.79 Mb.
    НазваниеУстройствауправления роботамисхемотехника и микроконтроллеров picmicro
    АнкорУстройства управления роботами, схемотехника и программирование (М. Предко, 2004).pdf
    Дата29.08.2017
    Размер6.79 Mb.
    Формат файлаpdf
    Имя файлаУстройства управления роботами, схемотехника и программирование .pdf
    ТипРеферат
    #8441
    КатегорияПромышленность. Энергетика
    страница18 из 33
    1   ...   14   15   16   17   18   19   20   21   ...   33
    4.18. ДАТЧИКИ
    При слове «датчик» я всегда вспоминаю телевизионный сериал «Star Trek», в кото- ром эти таинственные устройства могли обнаруживать вещество, энергию и, конеч- но, различные формы жизни.
    Датчики, используемые в робототехнике, могут служить источником самой раз- личной информации об окружающей среде, но сам алгоритм обработки этой инфор- мации определяется не датчиком, а кодом верхнего (биологического) уровня.
    В следующих нескольких разделах я продемонстрирую примеры подключения различных датчиков к микроконтроллерам и приведу текст соответствующих программ. Существует множество различных способов реализации описанных функций; в других книгах этой серии многие вопросы разобраны более подробно.
    Здесь же я ставил себе задачу познакомить читателя с датчиками различного типа и рассмотреть основные методы программирования. Многие входные устрой- ства - например, устройства ввода навигационной информации от спутника
    (Global Positioning System - GPS) или от обычного компаса, приборы измерения наклона, видеокамеры и др. - при этом вынужденно остались за пределами наше- го внимания.
    Несмотря на огромное количество самых разнообразных устройств ввода ин- формации, общий принцип работы с ними остается неизменным. В любом случае вы должны опираться на рассматриваемый в этой книге метод «трех уровней».
    Для упрощения отладки устройств разумно разместить поблизости от каждо- го входного датчика какое-либо устройство индикации, которое бы подключалось к нему непосредственно или через специальный переключатель и обеспечивало бы обратную связь, предоставляя разработчику необходимую информацию о со- стоянии датчика. Вы сэкономите много часов, если поверите, что входные сигна- лы часто не соответствуют тому, что вы о них думаете.
    Разумеется, при этом не следует забывать, что в результате работы индикато- ров может проявиться другая - паразитная - обратная связь, в результате дей- ствия которой входные датчики будут воспринимать информацию не столько от

    214 Устройства управления роботами окружающей среды, сколько от выходных устройств, которые сигнализируют об их собственном состоянии. Кроме того, следует добиваться того, чтобы ваше при- сутствие как можно меньше влияло на поведение робота. Во многих случаях ваше устройство должно реагировать только на окружающую обстановку и игнориро- вать любые формы жизни вблизи себя.
    4.19. МЕХАНИЧЕСКИЕ ДАТЧИКИ
    Подвижные автоматические устройства должны иметь возможность определять присутствие объектов на своем пути и вокруг себя, например, для того, чтобы вы- брать маршрут движения или избежать столкновения. Самый простой способ ре- ализации этой возможности - использование механических контактов. Вообще говоря, я считаю, что робот с контактными усиками выглядит несколько неуклю- же, да и в большинстве случаев трудно обеспечить достаточную надежность их работы, но иногда без них просто не обойтись.
    Принцип работы контактных детекторов поясняется на рис. 4.48. Длинный от- резок тонкой гибкой проволоки при прикосновении к какому-либо предмету при- водит в действие микропереключатель. Длина усика и, соответственно, расстоя- ние, на котором срабатывает такой датчик, должна быть достаточной для того,
    чтобы робот успел изменить направление движения или остановиться. Кроме того, в данной конструкции проволока играет роль рычага, позволяющего даже малому усилию, приложенному со стороны длинного его конца, вызвать переклю- чение механических контактов.
    Контактный
    Микропереключатель
    Упор
    Корпус робота
    Рис. 4.48.
    детектор столкновений
    Подобные детекторы обычно устанавливаются спереди, но в некоторых случа- ях они не помешают по бокам и сзади, чтобы предотвратить возможные столкно- вения с предметами, когда робот маневр, резко изменяя направле- ние движения или разворачиваясь.
    Следует иметь в виду, что при срабатывании механического переключателя его контакты в течение нескольких первых миллисекунд входят в соприкосновение друг с другом сотни раз, генерируя шумовой сигнал, показанный на рис. 4.49. Это

    Подключение к микроконтроллеру периферийных устройств 215
    явление называется дребезгом контактов. Поэтому приходится применять специ- альные методы подавления дребезга. В противном случае может возникнуть си- туация, когда робот, правильно прореагировав на первый импульс, будет вынуж- ден повторить реакцию и на следующие паразитные импульсы, которые на самом деле не являются результатом повторного срабатывания датчика.
    vcc
    : :
    Вход • ±
    микроконтроллера
    Рис. 4.49. Так выглядит дребезг механических на экране осциллографа
    Обычно при подавлении эффекта дребезга механических контактов считают,
    что их состояние не может измениться за время около 20 мс, то есть все измене- ния, происходящие за этот промежуток времени после первого срабатывания, не учитывают. Вносимая в результате работы этого алгоритма задержка обычно вполне допустима. Можно предложить для подавления дребезга следующий фраг- мент кода:
    while (1==1) { // Бесконечный цикл
    // Выполнение операций до срабатывания переключателя.
    if (Button == Press){ // Ждем, чтобы замкнувшиеся контакты остались
    // том же состоянии в течение 20 мс.
    = 0;
    while ( ( Debounce
    )
    ( Button == Press ) )
    for
    (Button==Press)
    // Здесь надо разместить код
    // для реагирования на замыкание контактов.
    Debounce = 0; // Ждем, чтобы разомкнувшиеся контакты остались
    // в том же состоянии в течение 20 мс.
    ( ( Debounce !=
    ) && ( Button == Release ) )
    for
    } // Конец оператора if.

    216 Устройства управления роботами
    // Выполнение операций после срабатывания
    } // Конец оператора while.
    Если вы сделаете контактный детектор не слишком то может оказать- ся, что он срабатывает при движении робота. При использовании микропереклю- чателя от ложных срабатываний может защитить пружина, удержива- ющая контакты в разомкнутом состоянии. Если вместо микропереключателя ваша схема представляет собой пару механических контактов (один из которых подсо- единен к общей шине питания, а второй - к резистору, под- ключенному к положительной шине питания), то использование описанной выше процедуры подавления дребезга приведет к тому, что ваш робот не будет реагиро- вать на любые кратковременные удары. Кроме того, вам может не понравиться,
    что противодребезговая процедура после выполнения фрагмента кода, который производит необходимые действия после замыкания контактов, ждет, пока они снова разомкнутся.
    Чтобы избежать всех этих проблем, желательно использовать логический флажок, устанавливая его на период времени около 20 мс, в течение которых мы игнорируем все изменения состояния контактов, а для отсчета времени ис- пользовать таймер микроконтроллера. Тогда фрагмент кода в главной программе будет выглядеть следующим образом:
    while (1 == 1)
    // Бесконечный цикл.
    // Выполнение операций до срабатывания if (ButtonPressFlag) { // Ждать замыкания контактов.
    // Здесь надо разместить код
    // для реагирования на замыкание контактов.
    // Конец оператора if.
    // Выполнение операций после срабатывания
    } I/ Конец оператора while.
    Соответствующая процедура обработки прерываний от таймера TMRO:
    void interrupt
    (void)
    {
    if
    // Если запрос был от таймера TMRO.
    =0; // Сбросить прерывания.
    // Инкремент счетчика реального времени.
    // Здесь можно разместить код для реализации
    // других которые необходимо
    // выполнять каждую if (Button == Press){ // Если контакты замкнулись.
    if (ButtonReleaseCounter != 0) {
    первый раз?
    ButtonPressCounter = 0;
    ButtonReleaseFlag =0;
    } else if
    >= 20)
    ButtonPressFlag =1;
    ButtonPressCounter = 19;

    Подключение к микроконтроллеру периферийных устройств 217
    > else ;
    } else { // Если контакты разомкнулись.
    if
    0) {
    первый раз?
    =0;
    = 0;
    } else if
    >= 20) {
    ButtonReleaseFlag = 1;
    ButtonReleaseCounter = 19;
    } else;
    > // Конец обработчика прерываний.
    Здесь при замыканий контактов флаг ButtonReleaseFlag сбрасывается и начинается отсчет времени (каждую миллисекунду выполняется инкремент счетчика ButtonPressCounter), который продолжается, пока контакты не будут разомкнуты. При очередном вызове обработчика, если контакты все еще находятся в замкнутом состоянии, а флаг ButtonReleaseFlag сброшен, уста- навливается флаг ButtonPressFlag; это значение используется в главной программе и сигнализирует о том, что в данный момент выполняется противо- дребезговая задержка.
    После размыкания контактов флаг сбрасывается в ну- левое состояние и снова делается задержка на 20 мс, только теперь с каждой мил- лисекундой выполняется инкремент счетчика ButtonReleaseCounter.
    Следует помнить, что контактные усики, которые вы используете в своих кон- струкциях, должны быть металлическими, и их обязательно следует заземлять. Дело в том, что при движении робота в результате трения различных материалов друг о друга образуется статический заряд, который в непроводящем материале (в слу- чае использования, например, пластмассовых усиков) накапливается до тех пор,
    пока при очередном касании какого-либо объекта не вызовет электрический про- бой, а это может привести к повреждению электронных схем.
    Наряду с микропереключателями в качестве детекторов касания можно ис- пользовать и другие приспособления:
    • заземленное металлическое кольцо, которое при столкновении робота с ка- ким-либо объектом деформируется и переключает уровень сигнала на одном из расположенных по периметру робота металлических контактов, соединен- ных через «подтягивающий» резистор с положительной шиной питания. Та- кой способ хорош, когда требуется определить, в каком именно месте про- изошло касание робота о внешний объект. Но если кольцо имеет достаточную массу, то из-за инерции при резкой остановке или в начале движения оно может вызывать ложные срабатывания детекторов;
    • резиновая трубка вокруг робота, которая позволяет при касании изменить внутреннее давление, действующее на контакты. В такой конструкции трудно обеспечить включение датчика, зато трубка работает в качестве амортизатора и заметно снижает чувствительность к различным вибрациям и толчкам, воз- никающим при движении робота;

    218 Устройства управления роботами
    • датчик останова двигателя также может быть использован в качестве детек- тора столкновений. Если робот при своем движении столкнулся с каким-либо объектом, то он останавливается, что приводит к торможению двигателя.
    Однако при этом через обмотку двигателя течет значительный ток, создавая риск повреждения робота (из-за сильного столкновения) или электронной схемы, которая управляет скоростью вращения двигателя. К тому же данный метод снижает срок службы батарей питания.
    Следует заметить, что при использовании контактных датчиков разработчик должен потратить много времени на проведение кропотливых экспериментов,
    прежде чем ему удастся подобрать правильную длину и форму контактного уси- ка. В моих многочисленных экспериментах даже после того, как конструкция дат- чика, наконец, приближалась к некоторому идеалу, все рушилось, когда робот на полной скорости сталкивался с каким-либо предметом или кто-нибудь из детей хватал робота за проволочный усик.
    Когда есть такая возможность, я предпочитаю использовать неконтактные спо- собы обнаружения объектов, например обсуждаемые ниже инфракрасный детектор или ультразвуковой измеритель расстояния. Тем не менее многие разработчики рассматривают контактный метод как самый при использовании любого бесконтактного датчика всегда существует опасность не заметить какой- либо объект, который не отражает сигнал, излучаемый роботом.
    4.20. ПОДАВЛЕНИЕ ДРЕБЕЗГА КОНТАКТОВ
    Одним из первых соображений, которые побудили меня предложить использова- ние прерываний от таймера для реализации функций электронного и механичес- кого уровней, была как раз мысль о том, что такой подход позволит без излишних хлопот и траты процессорного времени подавлять влияние дребезга механичес- ких переключателей, часто применяемых в различных автоматических устрой- ствах в качестве источников входных сигналов. Если в нашем распоряжении име- ется процедура, которая выполняется каждую миллисекунду, то реализация необходимой задержки, требуемой для подавления дребезга, существенно упро- щается. В качестве примера приведем фрагмент обработчика прерываний от тай- мера:
    if
    // Если на выводе микроконтроллера
    // сигнал низкого уровня,
    // соответствующий замкнутым контактам,
    if (ButtonPress < 20)
    ButtonPress++;
    else; // то подавляем дребезг при замыкании контактов.
    else // Если сигнал высокого уровня
    // (то есть контакты разомкнуты),
    if (ButtonPress != 0)
    else; // то подавляем дребезг при размыкании контактов.

    Подключение к периферийных
    219
    Здесь используется условный оператор, который при замыкании контактов начинает отсчет времени, выполняя инкремент счетчика ButtonPress, пока его значение не достигнет 20 (это означает, что контакты оставались замкнутыми в те- чение 20 мс), после чего значение счетчика больше не изменяется. Но как только контакты разомкнутся (уровень сигнала на выводе микроконтроллера станет вы- соким), начинается обратный отсчет - каждую миллисекунду значение счетчика уменьшается на пока не достигнет 0.
    В этом случае код верхнего уровня будет выглядеть следующим образом:
    if (ButtonPress == 0)
    // Выполняем действия, соответствующие разомкнутым контактам.
    else if (ButtonPress
    20)
    {
    // Выполняем действия, соответствующие замкнутым контактам.
    >
    else
    // Еще длится задержка.
    Оба приведенных фрагмента должны повториться в программе по одному разу для каждого имеющегося в конструкции механического переключателя.
    Чтобы проиллюстрировать этот способ подавления дребезга в реальном при- ложении, я собрал схему, показанную на рис. 4.50.
    За основу взят наш предыдущий проект с жидкокристаллическим дисплеем.
    Единственное, что добавлено к прошлой схеме, - резистор, светодиод и кнопка.
    Vcc
    =
    R4 470 К
    Vcc
    Кнопка
    Vcc
    I
    EC
    14 4
    16 15 5
    U1
    RBO
    RB1
    RB2
    Osc1
    Osc2
    Vss
    6 8
    r
    Vcc
    1,16
    +
    77
    9 7 3
    Vcc/ CLR
    Q1/2C
    Q2/3C
    Q3/4D
    Q5/6D
    6Q
    D1
    Gnd
    2,4 5,6 7,11 10,13 12,14
    CR1 1N914
    Рис. 4.50. Схема с
    переключателями

    220 Устройства управления роботами
    Разумеется, ни дисплей, ни светодиод не нужны для работы противодребезговой процедуры, но я хотел показать, как различные интерфейсные модули работают в одном приложении.
    Мы будем использовать дисплей для индикации состояния кнопки. Когда кнопка отжата, на выводе RBO микроконтроллера благодаря «подтягивающему»
    резистору действует сигнал высокого уровня. В этом случае дисплей будет вы- ключен. При нажатии кнопки начинает работать противодребезговая процедура,
    и на дисплее высвечивается надпись
    Спустя 20 мс, если кнопка все еще нажата, появляется надпись
    В главной программе опрашива- ется значение счетчика ButtonPressed, и в зависимости от этого выбирается одно из трех возможных действий.
    Когда ваше устройство заработает, то вы увидите, что надпись появляется на краткий промежуток времени после нажатия и после отпускания кнопки.
    Схема на макетной плате показана на рис. 4.51, кото- рый практически совпадает с рис. 4.47.
    VCC
    / Gnd a
    о а а а в в в в в в в
    Рис.
    Схема размещения
    Желательно взять самый дешевый микропереключатель, чтобы проверить рабо- ту противодребезговой процедуры в наиболее неблагоприятных условиях.
    Список используемых элементов приведен в табл. 4.11.
    Таблица
    Список используемых элементов
    Элемент
    Примечание
    U1
    Микроконтроллер
    Сдвиговый регистр
    Любой кремниевый диод

    Подключение к микроконтроллеру периферийных устройств 221
    Таблица 4. / /.
    Обозначение
    CR2
    R2
    R3
    Список используемых элементов (окончание)
    Элемент
    Светодиод
    10
    0,25 Вт
    1 кОм; 0,25 Вт
    кОм,
    Примечание
    Любого типа
    «подтягивания»
    на выводе
    до напряжения положительной шины питания
    Для регулирования контрастности
    470 Ом;
    0,25 Вт
    1
    Микропереключатель
    Для фильтрации напряжения питания
    микросхем
    С нормально разомкнутыми контактами
    Жидкокристаллический
    дисплей (14 выводов),
    совместимый с Hitachi 44780
    Керамический резонатор
    на 4 МГц, со встроенными
    конденсаторами
    Для генератора тактовых импульсов
    Материалы
    Макетная плата, монтажные провода,
    источник питания +5 В
    В скобках указаны отечественные аналоги, добавленные при переводе. -
    перев.
    Приведенный ниже текст программы вы найдете в файле Code\Whisker\
    whisker.c:
    // 19 апреля 2002 - подавление дребезга контактов.
    // Для индикации состояния кнопки используются светодиод
    // и жидкокристаллический дисплей, подключенный к микроконтроллеру
    // через двухпроводной интерфейс на основе сдвигового регистра 74LS174.
    //
    // Используются прерывания от таймера
    //
    // Замечания по аппаратным средствам:
    // Микроконтроллер PIC16F627/PIC16F84 работает на частоте 4 МГц.
    // Используется внешний тактовый генератор.
    //
    // Подключение выводов
    // RBO - кнопка внешним "подтягивающим" резистором
    // (внутренние "подтягивающие" резисторы порта PORTB
    // микроконтроллера не
    // RB1 - линия Clock интерфейса жидкокристаллического дисплея;
    // RB2 - линия Data интерфейса жидкокристаллического
    // Глобальные переменные и константы:
    int RTC = 0; // Счетчик реального volatile char LCDDlay = 20; // Длительность volatile char LCDState
    // Номер текущего состояния
    // конечного автомата.

    222 Устройства управления роботами static volatile bit Clock static volatile bit ClockTRIS
    static volatile bit Data static volatile bit
    @
    char *
    Указатель строки выводимого volatile char
    = 0; // Смещение, указывающее позицию
    // выводимого символа.
    char
    =
    char
    =
    char
    // Очистка дисплея.
    volatile char
    = 0;
    // Счетчик
    // для противодребезговой процедуры.
    // Слово defined (_16F84)
    PIC16F84 selected
    _CONFIG(Ox03FF1); // Для МК PIC16F84:
    // кварцевый тактовый генератор,
    // таймер включен,
    // сторожевой таймер выключен,
    // защита кода отключена.
    PIC16F627 with external oscillator selected
    // Для МК PIC16F627:
    // внешний тактовый генератор XT,
    // RA6/RA7 используются для ввода-вывода,
    // внешний сигнал сброса,
    // таймер включен,
    // сторожевой таймер выключен,
    // защита кода отключена,
    // детектор BODEN
    Unsupported selected
    // Служебные подпрограммы:
    LCDNybble(char Nybble, char RS)
    // Запись полубайта в
    LCDByte(char Byte, char RS)
    // Запись байта в ЖКИ.
    // Инициализация ЖКИ.
    LCDOut(char * const LCDString) // Вывод строки на ЖКИ.
    // Обработчик прерываний:
    void interrupt char temp;

    Подключение к микроконтроллеру периферийных устройств 223
    if (TOIF)
    // Обработчик прерываний от таймера TMRO.
    TOIF = 0; // Сбросить флаг прерываний от таймера TMRO.
    // Инкремент счетчика реального времени.
    // Здесь можно разместить дополнительный код
    // для обработки прерываний от таймера TMRO.
    // Начало противодребезговой процедуры:
    if (!RBO) // Кнопка if
    < 20)
    else;
    else // Кнопка отжата.
    if (ButtonPress != 0)
    else;
    // Конечный автомат для ЖКИ;
    switch(LCDState) { // В зависимости от текущего состояния:
    case 1: // Начать инициализацию ЖКИ.
    if (--LCDDlay == 0)
    LCDState++;
    break; // Ждать .20 мс.
    case 2: //
    0);
    LCDDlay = 5;
    LCDState++;
    case
    // Ждать выполнения команды.
    if
    == 0)
    break;
    case 4:
    LCDNybble(Ox003, 0); // Шаг 3.
    break;
    case 5:
    LCDNybble(Ox003, 0);
    4.
    LCDState++;
    break;
    case 6:
    LCDNybble(Ox002, 0); // Шаг 5.
    LCDState++;
    break;
    case 7:
    LCDByte(Ox028, 0); // Шаг 6.
    LCDState++;
    break;
    case 8:
    LCDByte(Ox008, a); // Шаг 7.
    break;
    case 9:
    LCDByte(Ox001, 0); // Шаг 8.
    LCDDlay
    // Ждать 5 мс.

    224 Устройства управления роботами break;
    case 10: // Ждать выполнения команды.
    if
    == 0)
    LCDState++;
    break;
    case
    0); // Шаг 9.
    LCDState++;
    break;
    case 12:
    0); // Шаг 10.
    LCDState = 0; // Все готово.
    break;
    case 100: // Вывод сообщения.
    switch (temp =
    case
    // Конец сообщения?
    LCDState = 0;
    = 0;
    break;
    case
    // Очистка дисплея.
    LCDByte(Ox001, 0);
    LCDState++;
    LCDDlay = 5;
    break;
    case 254: // Команда?
    if
    =
    == 0)
    LCDState = 0;
    else {
    if (temp < 4)
    LCDDlay = 5;
    >
    0);
    }
    break;
    default: // Обычные символы.
    1);
    } // Конец внутреннего оператора break;
    case 101: // Message Delay if
    == 0)
    break;
    } // Конец внешнего оператора switch.
    } // Конец обработчика прерываний от таймера.
    // Здесь можно разместить другие обработчики прерываний.
    } // Конец обработчика прерываний.
    // Главная программа:
    void
    Ч

    Подключение к микроконтроллеру периферийных устройств 225
    OPTION = OxOD1; //
    работает с таймером
    // коэффициент деления равен 4.
    = 0; // Начальный сброс таймера
    TOIE = 1; // Разрешение прерываний от таймера TMRO.
    GIE
    // Разрешение обработки прерываний.
    LCDInit(); // Инициализация порта, к которому подключен
    // Здесь можно другие периферийные while (1 == 1) { // Бесконечный цикл.
    // Здесь можно разместить код биологического уровня.
    { // Каково состояние кнопки?
    case
    // Кнопка отжата.
    break;
    case 20: // Кнопка нажата.
    break;
    default: // Длится противодребезговая задержка.
    break;
    } // Конец главной программы.
    Чтобы убедиться в правильности работы этой программы, желательно выпол- нить ее моделирование с помощью симулятора MPLAB и только потом подклю- чать микроконтроллер к программатору.
    Для имитации нажатий кнопки можно использовать асинхронные
    (порядок работы с ними уже обсуждался в главе 3).
    После успешной компиляции проекта выполните команду
    1   ...   14   15   16   17   18   19   20   21   ...   33


    написать администратору сайта