шаблоны сайт визитка joomla
Скачать шаблоны Joomla 3.5 бесплатно
Вы находитесь здесь:Главная»Учебные материалы»Arduino Scetch»Датчик линии QTR8

Датчик линии QTR8

В этой статье мы познакомим вас с деатчиков линии QTR8. Датчики производятся двух типов: цифровой (QTR8RC)  и аналаговый (QTR8A). Датчик линии QTR8 имеет имеет 8  инфракрасных светодиодов и  фототранзисторов в парах, расположенных с шагом 9,5 мм. Это позволяет с легкостью. определять черную линию. Пары светодиодов подключены последовательно для двукратного снижения тока потребления. А так же светодиоды могут отключаться для добавления чувствительности или для функции энергосбережения. Каждый сенсор имеет отдельный цифровой выход.

Описание датчика QTR8RC: 

Основное назначение модуля Pololu QTR-8RC - определение времени. На этом модуле равномерно располагаются с промежутком в 9,5 мм восемь сенсоров-пар содержащих источник инфракрасного сигнала (светодиод) и приемника сигнала (фототранзистор). В каждой цепи фототранзистора используется разряд конденсатора, который позволяет цифровой линии ввода-вывода микроконтроллера считывать аналоговый отражённый инфракрасный сигнал путем измерения времени разряда конденсатора. Более короткое время разряда конденсатора является показателем большего отражения..

Все выходы независимы, но светодиоды расположены в парах, чтобы уменьшить в двое текущее энергопотребление. По желанию МОП-транзистор может управлять светодиодами, для этого на него подается с контакта LEDON сигнал высокого уровня - МОП-транзистор включает светодиоды, когда сигнал низкого уровня - выключает светодиоды. Выключение светодиодов полезно для того, чтобы ограничить потребляемую мощность, когда датчики не находятся в использовании или для того, чтобы изменить эффективную яркость светодиодов посредством управления ШИМ.

Принципиальная схема модуля QTR8 представлена:

Принципиальная схема модуля QTR8RC 

Спецификация: 

  • Рабочее напряжение: 3,3 - 5 В
  • Потребляемый ток: 100 мА
  • Тип выходного сигнала: аналоговый
  • Оптимальное расстояние обнаружения: 3 мм
  • Максимальное расстояние обнаружения: 6 мм
  • Размер (без штыревых разъёмов): 75,0 х 12,7 х 3,2 мм
  • Вес (без штыревых разъёмов): 3,1 гр


Использование: 

У датчика Pololu QTR-8RC выходной сигнал измеряется цифровой линией ввода/вывода. Это обеспечивается за счёт измерения времени разряда конденсатора через фототранзистор. У такого измерения есть несколько преимуществ, особенно в сочетании со способностью модуля Pololu QTR-8RC выключать питание светодиодов:

  • Нет необходимости в аналого-цифровом преобразователе.
  • Улучшенная чувствительность, обусловленная делителем напряжения на аналоговом выходе.
  • Параллельное чтение данных нескольких датчиков доступно на большинстве микроконтроллеров.
  • Параллельное чтение данных позволяет оптимизировать использование опции включения питания светодиодов.

Последовательность шагов считывания данных с датчика:

  • 1. Включите ИК-светодиоды (опционально).
  • 2. Установите вывод микроконтроллера как выходной с высоким логическим уровнем.
  • 3. Конденсатору ёмкостью в 10 нФ требуется, по меньшей мере, 10 мкс для зарядки.
  • 4. Установите вывод как входной (высокое сопротивление).
  • 5. Измерьте время разрядки конденсатора, оно будет равно времени ожидания установки низкого уровня на выводе.
  • 6. Отключите ИК-светодиоды (опционально).

Эти этапы обычно могут выполняться параллельно на нескольких линиях ввода/вывода.

На поверхности с сильной отражательной способностью, время разряда может быть всего лишь несколько десятков микросекунд, со слабой отражательной способностью - до нескольких миллисекунд. Точное время зависит характеристик вашего микроконтроллера. Стандартное время считывания равно 1 мс (т.е. не измеряются слабые различия между поверхностями с плохой отражательной способностью), что позволяет работать на частоте до 1 кГц всех 8 датчиков. Если низкочастотной дискретизации достаточно, существенная экономия энергии может быть реализована путем выключения светодиодов. Например, если 100 Гц частота дискретизации приемлема, то светодиоды могут быть выключены до 90% времени, снижая среднее потребление тока от 100 мА до 10 мА.

Для работы с датчиком мы будем пользоваться библиотекой QTRSensors.h. Скачайте и установите. Необходимо помнить, что корневая папка с файлами библиотеки должна называться QTRSensors (тоже имя, что у заголовочного файла).

Основные методы библиотеки QTRSensors:

Конструктор объекта  QTRSensorsRC 

// создание объекта для цифрового датчика QTR8RC подключенного к цифровым входам от 2 до 9
QTRSensorsRC qtrrc((unsigned char[]) {2, 3, 4, 5, 6, 7, 8, 9}, 8);

 // создание объекта для цифрового датчика QTR8RC подключенного к цифровым входам от 3 до 10 и эммитером, подключенным кконтакту 2. TIMEOUT = 2500 мкс

QTRSensorsRC qtrrc((unsigned char[]) {3, 4, 5, 6, 7, 8, 9, 10}, 8, 2500, 2);

Получение показаний датчика

//считываем показания с датчика qtrrc и записываем в массив sensorValues

qtrrc.read(sensorValues);

//считываем калиброванные показания с датчика qtrrc и записываем в массив sensorValues

qtrrc.readCalibrated(sensorValues);

Калибровка датчика

//считать показания со всех датчиков 10 раз за 2500 т.е. на один шаг приходится 25 мс

qtrrc.calibrate();      

//возвращается максимаьное значение i-ого сенсора

qtrrc.calibratedMaximumOn[i];

//возвращается минимальное значение i-ого сенсора

qtrrc.calibratedMinimumOn[i];

Пример 1. Вывод показаний датчика на экран

Задание. Датчик линии QTR8RC подключен к контактам от 3 до 10. Эмиттер подключен ко 2. Каждую секунду считывайте показания датчика и выводите их на экран в одну строку.

 #include <QTRSensors.h>

// датчик будет возвращать значени от 0 (максимум отражения) до 2500 (минимум отражения).

#define NUM_SENSORS   8     // колчество сенсоров

#define TIMEOUT       2500  // ожидание  2500 микросекунд, по умолчанию значение в конструкторе равно 2000

#define EMITTER_PIN   2     // пин к которому подключён эмиттер

// сенсоры  от 0 до 7 подключены к контактам от 3 до 10

QTRSensorsRC qtrrc((unsigned char[]) {3, 4, 5, 6, 7, 8, 9, 10}, NUM_SENSORS, TIMEOUT, EMITTER_PIN);

unsigned int sensorValues[NUM_SENSORS];

void setup(){

  delay(500);

  Serial.begin(9600); // включить монитор порта

  delay(1000);

}

void loop(){

  // считать значение с сенсоров

  qtrrc.read(sensorValues);

  // вывести значения на экран от 0 до 2500, где 0 обозначает  максимальную отражатательную  способность,  а 2500 - минимальную

  for (unsigned char i = 0; i < NUM_SENSORS; i++) {

    Serial.print(sensorValues[i]);

    Serial.print('\t'); // составить в колонки

  }

  Serial.println();

   delay(250);

}

Пример 2. Вывод калиброванных показаний датчика на экран

Не всегда 8 датчиков датчика линии выдают одинаковые значения. Поэтому их надо калибровать, т.е. определить минимальные и максимальные значения каждого сенсора и пропорционально преобразовать в значения от 0 до 1000. 

Задание. Датчик линии QTR8RC подключен к контактам от 3 до 10. Эмиттер подключен ко 2. Откалибруйте датчик. Каждую секунду считывайте откалтиброванные показания датчика и выводите их на экран в одну строку.

#include <QTRSensors.h>

#define NUM_SENSORS   8

#define TIMEOUT       2500 

#define EMITTER_PIN   2

QTRSensorsRC qtrrc((unsigned char[]) {3, 4, 5, 6, 7, 8, 9, 10}, NUM_SENSORS, TIMEOUT, EMITTER_PIN);

unsigned int sensorValues[NUM_SENSORS];

void setup(){

  delay(500);

  pinMode(13, OUTPUT);

  digitalWrite(13, HIGH);    // включить светодиод на Arduino

//во время калибровки перемещайте датчик линии с самой яркой поверхности в самую темную. продалжайте эти действия во время всей калибровки датчика

  for (int i = 0; i < 400; i++)  // калибровка займёт около 10 секунд = 400*25мс=10000мс

  {

    qtrrc.calibrate();       // считать показания со всех датчиков 10 раз за 2500 т.е. на один шаг приходится 25 мс

  }

  digitalWrite(13, LOW);     // выключить светодиод на Arduino

  Serial.begin(9600);

//вывести минимальное значение каждого сенсора

  for (int i = 0; i < NUM_SENSORS; i++)

  {

    Serial.print(qtrrc.calibratedMinimumOn[i]);

    Serial.print(' ');

  }

  Serial.println();

  // вывести максимальное значение каждого сенсора

  for (int i = 0; i < NUM_SENSORS; i++)

  {

    Serial.print(qtrrc.calibratedMaximumOn[i]);

    Serial.print(' ');

  }

  Serial.println();

  Serial.println();

  delay(1000);

}

void loop(){

  qtrrc.readCalibrated(sensorValues);

  for (unsigned char i = 0; i < NUM_SENSORS; i++)

  {

    Serial.print(sensorValues[i]);

    Serial.print('\t');

  }

  Serial.println();

  delay(250);

}

Пример 3. Движение по черной линии. Нахождение центра масс

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

Пусть робот оснащен линейкой из n датчиков полосы (a1, a2,…, an), расположенных равномерно на расстояниях xi от некоторой начальной точки. 

линейка датчиков

Если каждый датчик выдает сигнал ai, соответствующий детектированию искомой полосы, то можно определить положение «центр масс», т.е. величину итогового смещения полосы относительно линейки:

формула центра масс

Величина xc и будет определять координаты центра определяемой линии относительно линейки. Характерно, что нас не интересуют характер величины сигналов ai. Все это оказывает влияние на работу регулятора (например, ПИД-регулятора), на вход которого и будет подаваться ошибка, равная разности центра датчика линии  и центра масс определяемой линии. Подав на вход регулятора вычисленное выше значение ошибки, мы получим управляющий сигнал u(t). Работать с ним уже будете в зависимости от конструкции вашего робота – притормаживая или ускоряя двигатели в зависимости от знака величины u(t) и ее абсолютного значения.

Составим программу нахождения центра масс определяемой линии относительно линейки. (использование метода центра масс при движение по линии будет рассматриваться ниже)

#include <QTRSensors.h>

#define NUM_SENSORS   8

#define TIMEOUT       2500 

#define EMITTER_PIN   2

double xc = 0;

double s = 0;

QTRSensorsRC qtrrc((unsigned char[]) {3, 4, 5, 6, 7, 8, 9, 10}, NUM_SENSORS, TIMEOUT, EMITTER_PIN);

unsigned int sensorValues[NUM_SENSORS];

void setup(){

  delay(500);

  pinMode(13, OUTPUT);

  digitalWrite(13, HIGH);    

  for (int i = 0; i < 400; i++){

    qtrrc.calibrate(); 

  }  

  digitalWrite(13, LOW);   

  Serial.begin(9600);

}

void loop(){

  qtrrc.readCalibrated(sensorValues);

    

  for (unsigned char i = 0; i < NUM_SENSORS; i++)  {

    xc = xc + (i+1)*sensorValues[i];

    s = s + sensorValues[i];

  }

  if (s!=0) {

     xc = xc/s;

     Serial.println(xc);

     xc = 0;

     s = 0;

   } 

}

Похожие материалы (по тегу)

Другие материалы в этой категории: « Лазерный дальномер CJMCU 530

Новости о нас

КАЖДУЮ ПЯТНИЦУ - бесплатное занятие по 3D-моделированию с 16:40 до 18:10. Только для учащихся нашего технопарка! Подробнее
 Региональный отборочный фестиваль "Робофест-Стерлитамак 2018" состоится 25-26 января в г.... Подробнее
В сезоне 2017/18 фестиваля «РобоФест Стерлитамак 2018» Региональный учебно-тренировочный сбор... Подробнее
ВНИМАНИЕ учащимся! Объявляем конкурс рисунков на тему "Робот моей мечты", который пройдет по двум... Подробнее
В нашем технопарке Толтек СФ БашГУ пройдут открытые ОТБОРОЧНЫЕ СОРЕВНОВАНИЯ для ВСЕХ возрастов и... Подробнее

Наши партнеры

 TZOyoOCZ8y0 logotip novy SF BashGU  utv logo  CityMoll  VolnoeDelo