Эксперимент по использованию датчиков отражения – для новичков в радиоделе

June 20, 2014 by admin Комментировать »

В последующих экспериментах эти датчики используются для движения робота по заданной линии Но вначале следует провести оценку работы датчиков Вот программа, которая предлагается к проведению этого эксперимента:

/********************************************************/

/************ Чтение датчика отслеживания линий **************/

/********************************************************/ int Sensor0,Sensor1 // Хранит Аналоговое значение

char Txt[6] // Хранит результат преобразования в Строку

// Lcd задание выводов sbit LCD_RS at RD2_bit sbit LCD_EN at RD3_bit sbit LCD_D7 at RD7_bit sbit LCD_D6 at RD6_bit sbit LCD_D5 at RD5_bit sbit LCD_D4 at RD4_bit

// Направление выводов

sbit LCD_RS_Direction at TRISD2_bit sbit LCD_EN_Direction at TRISD3_bit sbit LCD_D7_Direction at TRISD7_bit sbit LCD_D6_Direction at TRISD6_bit sbit LCD_D5_Direction at TRISD5_bit sbit LCD_D4_Direction at TRISD4_bit

void Read_Adc()

{

ADCON0=0b11000001 // Выбор Analog0 RC_Mode и ADON ADCON0GO=1 // Запуск преобразования

while(ADCON0GO) // Ожидаем, пока преобразование завершится Sensor0=(ADRESH*4)+(ADRESL/64) // 10 бит Данных ==> sensor0 ADCON0=0b11000101 // Выбор Analog1 RC_Mode и ADON ADCON0GO=1 // Запуск преобразования

while(ADCON0GO) // Ожидаем, пока преобразование завершится Sensor1=(ADRESH*4)+(ADRESL/64) // 10 бит Данных ==> sensor1

}

void main()

{

Delay_ms(1000) // Начальное ожидание Lcd_Init() // Инициализация ЖКИ

ANSEL = 0xFF // PORTA ==> Analog

TRISA = 0xFF // PORTA ==> input Lcd_Cmd(_LCD_CURSOR_OFF) // Курсор ЖКИ выключен while(1)

{

Read_Adc()

WordToStr(Sensor0,Txt) // Преобразование значения Sensor0 в строку Lcd_Out(1,1,Txt) // и отображение ее на экране ЖКИ WordToStr(Sensor1,Txt) // Преобразование значения Sensor1 в строку Lcd_Out(2,1,Txt) // и отображение ее на экране ЖКИ

}

}

Как и описано в руководстве, после загрузки программы робота следует установить на чёрную линию прилагаемого к конструктору бумажного роботодрома, прочитать показания ЖКИ, затем переместить его на белую поверхность, чтобы ещё раз считать показания индикатора

Здесь следует отметить, что в том случае, когда при монтаже датчиков они  оказываются  на разном удалении от поверхности, разница в показаниях, чёрного  и белого, левого  и правого датчиков будет очень существенна Используя шайбы, следует подогнать расстояние от пола до датчика, по показаниям ЖКИ Кроме того, при движении робота его нос временами задирается, немного перевешивает задняя часть из-за двигателей, поэтому лучше утяжелить носовую часть робота И ещё, роботодром на бумаге после того, как его сложили при укладке конструктора, сильно замят Складки тоже мешают работе робота: при оценке значения светлого и чёрного участка показания могут меняться на участке складки от значения 900 до 400 Бумагу следует разгладить до начала опытов, но в этом я не советчик – как погладить рубашку или брюки, знаю, а как разглаживать бумагу, увы

Полученные с помощью первой программы значения: на чёрном 270 и на белом 970, -– как и описано в руководстве, можно усреднить, определив пороговое значение В моём случае это 620 Именно это значение будет использоваться в программе следующего эксперимента

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

/********************************************************/

/*****  Движение  вперед  вдоль  черной  линии  при  обнаружении  пресечения

***********/

/********************************************************/

#include “motorh”

int Sensor0,Sensor1 // Хранятся Аналоговые значения

char Txt[6] // Хранятся значения, преобразованные в строки

// Lcd задание выводов sbit LCD_RS at RD2_bit sbit LCD_EN at RD3_bit sbit LCD_D7 at RD7_bit sbit LCD_D6 at RD6_bit sbit LCD_D5 at RD5_bit sbit LCD_D4 at RD4_bit

// Направление выводов

sbit LCD_RS_Direction at TRISD2_bit sbit LCD_EN_Direction at TRISD3_bit sbit LCD_D7_Direction at TRISD7_bit sbit LCD_D6_Direction at TRISD6_bit sbit LCD_D5_Direction at TRISD5_bit

sbit LCD_D4_Direction at TRISD4_bit

void Read_Adc()

{

ADCON0=0b11000001 // Выбрать Analog0 RC_Mode и ADON ADCON0GO=1 // Запустить преобразование

while(ADCON0GO) // Ожидаем, пока преобразование закончится Sensor0=(ADRESH*4)+(ADRESL/64) // 10 бит Данных ==> sensor0 ADCON0=0b11000101 // Выбрать Analog1 RC_Mode и ADON ADCON0GO=1 // Запустить преобразование

while(ADCON0GO) // Ожидаем, пока преобразование закончится Sensor1=(ADRESH*4)+(ADRESL/64) // 10 бит Данных ==> sensor1

}

void main()

{

Delay_ms(1000) // Начальное ожидание Lcd_Init() // Инициализировать ЖКИ ANSEL = 0xFF // PORTA ==> Аналоговый TRISA = 0xFF // PORTA ==> вход

Lcd_Cmd(_LCD_CURSOR_OFF) // Погасить курсор ЖКИ while(1)

{

Read_Adc()

WordToStr(Sensor0,Txt) // Преобразовать Sensor0 в строку Lcd_Out(1,1,Txt) // и отобразить на ЖКИ WordToStr(Sensor1,Txt) // Преобразовать Sensor1 в строку Lcd_Out(2,1,Txt) // и отобразить на ЖКИ

if ((Sensor0>620)&amp(Sensor1>620)) // Если оба датчика над белым Forward(255) // Двигаться ВПЕРЕД

if ((Sensor0<620)&amp(Sensor1<620)) // Если оба датчика над черным

{

Forward(255) // Вперед 03 секунды Delay_ms(300)

}

if (Sensor0<620) // Только Sensor0 обнаружил линию

{

S_Left(255) // поворот Налево

}

if (Sensor1<620) // Только Sensor1 обнаружил линию

{

S_Right(255) // Поворот Направо

}

}

}

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

Испытать движение по заданной линии можно на прямой линии, проведённой вдоль роботодрома

Проверив правильность включения датчиков, можно попробовать начинать движение робота не с установки на линию прямо и правильно, а под некоторым углом к прямой линии В чём смысл этих экспериментов

Вот как в руководстве к конструктору описана работа датчиков:

Рис 424 На первом рисунке оба датчика над белой поверхностью, на втором над чёрной Для прямолинейного движения роботу не нужно делать поворотов

Рис 425 Левый датчик над чёрной поверхностью на первом рисунке, на втором наоборот

В первом случае робот должен повернуть налево, во втором повернуть направо Запуская работа под разными углами, можно поэкспериментировать со строками:

S_Left(255) // поворот Налево S_Right(255) // Поворот Направо

Меняя параметр 255, можно проверить угол поворота Изменения могут зависеть от разных причин, в частности от меры разряда аккумуляторов (или батареек) Сделать поворот резче, более крутым, можно, добавив паузы после команд поворота

S_Left(255) // поворот Налево Delay_ms(300)

После экспериментов на прямой, мне захотелось «проехать» по «змейке» роботодрома Меняя программу, скажем, так:

if (Sensor1<400) // Только Sensor1 обнаружил линию

{

Motor_Stop()

S_Right(255) // Поворот Направо Delay_ms(100)

Backward(250) Delay_ms(100)

}

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

Рис 426 Робот на роботодроме

У  меня  терпения  не  хватило,  но,  надеюсь,  у  вас хватит  В  любом  случае  вы  получите  много удовольствия, экспериментируя с этой «змейкой»

Одна из возможных причин неудачи, я этого не исключаю, слишком примитивная система датчиков Вот, как описывается в руководстве к конструктору, система датчиков, позволяющая реализовать более сложные движения робота

Рис 427 Более сложная система датчиков для робота

Неудача с опытами движения по «змейке» заставила меня подумать, а не найти ли подходящую чёрную ленту, которую можно разложить по комнате, и сделать площадки для остановки в конце пути Можно «поправить» программу так, чтобы робот, доехав до площадки, несколько секунд

«подумал», а затем делал бы полный разворот и ехал в обратном направлении Нужно попробовать Но потом

Источник: Гололобов ВН,- Самоучитель игры на паяльнике (Об электронике для школьников и не только), – Москва 2012

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты