Как устроен и работает датчик линии

  • Аннотация:
  • В этом приложении содержится краткий обзор вариантов использования программирования и датчиков в системе проектирования VEX Robotics Design System.
  • Программирование

Микроконтроллер VEX Cortex выпускается с исходным программным обеспечением, благодаря чему пользователи могут использовать его сразу после приобретения.

Для использования системы проектирования VEX Robotics Design System без автономного программирования или датчиков робота требуется дополнительное программное обеспечение. Система готова к работе сразу после поставки.

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

Для расширения возможностей управления может использоваться пользовательский программный код. Дополнительная информация представлена в сети Интернет по адресу: http://www.vexrobotics.com/products/programming (на английском языке) и http://vex.examen-technolab.ru/material/video (на русском языке: видео-уроки по освоению программной среды и программированию)

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

Подсистема датчиков

В системе проектирования VEX Robotics Design System существует множество датчиков. Полный перечень представлен на сайте: http://www.vexrobotics.com/products/accessories/sensors

Ниже приводится обзор некоторых датчиков, используемых в системе проектирования VEX Robotics Design System.

Ограничительный переключатель VEX

При срабатывании, ограничительные переключатели VEX отсылают сигналы микроконтроллеру. Эти переключатели идеально подходят для индикации достижения верхнего или нижнего предельного положения руки робота, а также могут применяться в триггерных схемах.

Когда ограничительный переключатель находится в исходном (свободном) положении, датчик отправляет своему порту ВЫСОКИЙ сигнал. Этот высокий сигнал исходит от микроконтроллера. При воздействии на переключатель внешней силы (например, при столкновении со стеной), сигнал изменяется на НИЗКИЙ до момента освобождения переключателя.

Находясь в свободном положении, переключатель не различим для открытого порта, как если бы он был вообще не подключен!

Как устроен и работает датчик линии

Бамперный переключатель VEX

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

Эти переключатели используются для индикации контакта и создания реакции робота на контакт, например, изменение курса.

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

Как устроен и работает датчик линии

Потенциометр VEX

Потенциометры VEX определяют положение и направления вращения вала. Этот датчик используется для выполнения аналогового измерения углового положения. Данное измерение позволяет определять положение руки робота или других его механизмов. Использование потенциометра VEX в конструкции робота позволяет упростить реализацию автономных схем его поведения.

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

С его помощью пользователь может настраивать предел, до которого потенциометр противодействует электрическому току, протекающему через него, путем простого поворота оси, присоединенной к центру потенциометра. При изменении сопротивления потенциометра, напряжение также изменяется, чем провоцирует работу потенциометра в качестве делителя переменного напряжения.

Микроконтроллер Cortex измеряет это переменное напряжение, значение которого прямо пропорционально угловому положению вала, присоединенного к центру потенциометра. Этим достигается аналоговое измерение углового положения.

Ультразвуковой дальномер VEX

Ультразвуковой дальномер VEX позволяет определять наличие препятствий на пути робота путем распространения высокочастотных звуковых волн. Датчик генерирует звуковую волну 40 кГц, которая отражается от любых поверхностей и возвращается к датчику Затем, на базе времени, потребовавшегося волне на то, чтобы вернуться, определяется расстояние до объекта.

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

Ультразвуковой дальномер VEX работает в диапазоне от 1,5 до 115 дюймов.

Как устроен и работает датчик линии

Отслеживатели траектории VEX

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

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

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

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

Как устроен и работает датчик линии

Световые датчики VEX

Световые датчики VEX используют фотоэлемент, позволяющий роботу определять присутствие света и реагировать на него. Робот может быть запрограммирован на определенную реакцию на каждое полученное значение объема света. В конструкцию светового датчика входит резистивный фотоэлемент на основе сульфоеленида кадмия (CdS).

Фотоэлемент на основе CdS является фоторезистором, что означает, что его значение сопротивления изменяется в зависимости от объема выявленного света. Спроектируйте простое устройство слежения, позволяющее отслеживать луч света, или используйте световой датчик в конструкции робота, способного избегать затененных пространств.

Установите на световые датчики цветные фильтры, с помощью которых робот сможет различать несколько цветов.

Оптические датчики положения вала VEX

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

В процессе вращения диска, свет просачивается через прорези и блокируется не просвечивающим пространством между прорезями. Датчик определяет количество прорезей, пропускающих свет, и направление вращения диска.

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

  Как устроен и работает датчик линии

Встроенные сенсорные модули VEX

Встроенный сенсорный модуль VEX устанавливается вместо пластиковой крышки на задней стенке 2-проводного электромотора 269 или 393 и представляет собой импульсный датчик.

Установите это изделие и присоедините его к микроконтроллеру Cortex через порт I2C для получения отклика непосредственно от электромотора. Этот датчик предоставляет данные от скорости работы электромотора, проделанном им пути, а также направлении движения.

Читайте также:  Беспроводная передача электроэнергии: трудная история становления

Эти датчики могут использоваться по аналогии с оптическими датчиками положения вала, но при этом они занимают меньше места.

  1. Как устроен и работает датчик линии
  2. Как устроен и работает датчик линии
  3. Гироскопический датчик VEX

Гироскопический датчик VEX измеряет угловое смещение робота VEX, за счет чего обеспечивается отслеживание ориентации или направления движения робота. Этот датчик с одной осью определят вращение до 1000 градусов в секунду.

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

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

Как устроен и работает датчик линии

Аналоговый акселерометр VEX

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

Датчик линии, аналоговый

Как устроен и работает датчик линии

Trema-модуль датчик линии — позволяет различать светлые и темные поверхности, при неизменном расстоянии до них. А если неизменным остаётся цвет отражающей поверхности, то датчик позволяет определять расстояние до неё.

Видео:

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

  • Минимальная ширина фиксируемой контрастной линии: 3мм. 
  • Напряжение питания: 5В

Подключение:

  • Датчик подключается к любому аналоговому выводу arduino
  • В комплекте имеется кабель для быстрого и удобного подключения к Trema Shield.
  • Модуль удобно подключать 2 способами, в зависимости от ситуации:

Способ — 1 :  Используя проводной шлейф и Piranha UNO

Используя провода «Папа — Мама», подключаем  напрямую к контроллеру Piranha UNO

Как устроен и работает датчик линии

Способ — 2 :  Используя проводной шлейф и Shield

Используя 3-х проводной шлейф, к  Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

Как устроен и работает датчик линии

Питание:

Напряжения питания датчика 5В постоянного тока. Подводится к выводам «V» (+5В) и «G» (GND).

Подробнее о модуле:

Датчик освещает поверхность направленным ИК светодиодом (длинна световой волны 940нм). Световой поток отражается от поверхности и попадает на кремниевый NPN фото-транзистор, где преобразуется в электрический сигнал.

Так как используется фото-транзистор NPN типа (обратной проводимости), с нагрузкой на коллекторе, то уровень электрического сигнала на выходе «S», обратно-пропорционален отраженному от поверхности свету и прямо пропорционален удалению от отражающей поверхности.

  • Чем светлее отражающая поверхность, тем меньше уровень сигнала на выходе «S».
  • Чем дальше отражающая поверхность, тем выше уровень сигнала на выходе «S».

Как устроен и работает датчик линии

Из графика видно, что если датчик линии находится в 5 мм от белой отражающей поверхности, то уровень на выходе «S» будет равен ~ 0,3В.Если цвет поверхности изменится с белого на чёрный, то уровень на выходе «S» увеличится с ~ 0,3В до ~ 4,6В.

Если цвет поверхности не изменился (остался белым), а датчик удалился с 5 мм, до 20 мм, то уровень на выходе «S» увеличится до ~ 4,3В.

Примеры:

Включение светодиода при попадании датчика на тёмную линию

Подключаем датчик к аналоговому входу A0 (PIN_LINE).

В качестве светодиода используем интегрированный в arduino или подключаем внешний к 13 выводу (PIN_LED).

Как устроен и работает датчик линии

При помощи функции analogRead(), получаем уровень сигнала на аналоговом входе A0 (PIN_LINE).

При помощи функции digitalWrite(), включаем или выключаем светодиод. Если уровень выше 400 то включаем, иначе выключаем.

const uint8_t PIN_LINE = 0; // аналоговый вывод подключенный к датчику линии
const uint8_t PIN_LED = 13; // цифровой вывод подключенный к светодиоду
bool FLAG_LED = LOW; // флаг разрешающий свечение светодиода
void setup(){
pinMode(PIN_LED, OUTPUT); // переводим вывод светодиода в режим выхода
}
void loop(){
FLAG_LED = analogRead(PIN_LINE)>400?HIGH:LOW; // если уровень сигнала на входе PIN_LINE больше 400 то FLAG_LED = HIGH, иначе FLAG_LED = LOW
digitalWrite(PIN_LED, FLAG_LED); // устанавливаем на выводе светодиода PIN_LED, состояние FLAG_LED
}

Применение:

  • датчик линии (основное назначение датчика)
  • датчик расстояния (при неизменном цвете отражающей поверхности)
  • датчик препятствий (при неизменном цвете отражающей поверхности)
  • датчик оборотов или энкодер (если на вращающийся вал нанести контрастную разметку)

Ссылки:

  • Trema-модуль Датчик линии

Аналоговый датчик линии

Аналоговый датчик линии, в отличие от цифрового, видит не только чёрную и белую поверхность, но и найдёт все оттенки серого.

Как устроен и работает датчик линии

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

Проверим датчик в действии с платформами Arduino. На выходе сенсора аналоговый сигнал. Для быстрого и удобного подключения используйте Troyka Shield.

Как устроен и работает датчик линии

analog-line-sensor.ino
// пин датчика линии
#define SENSOR_LINE_PIN A0
 
// определяем напряжение питания Vcc — 5 В или 3.3 В
#define VOLTAGE 5.0
// переменная для хранения значения аналогового сигнала в вольтах
float v;  
void setup() { // открываем последовательный порт Serial.begin(9600);
}
 
void loop() { // считываем показания с датчика, вычисляем уровень напряжения int reading = analogRead(SENSOR_LINE_PIN); v = (float)reading * VOLTAGE / 1024.0; // выводим показания на экран Serial.print(«V = «); Serial.print(v); Serial.println(» volts»); delay(3000);
}

После загрузки скетча — откройте монитор Serial-порта. Перемещайте датчик над разными градациями серого и следите за показаниями.

Как устроен и работает датчик линии

Датчик подключается к управляющей электронике по трём проводам.

  • Земля (G) — Соедините с пином GND микроконтроллера.
  • Питание (V) — Соедините с рабочим напряжением микроконтроллера.
  • Сигнальный (S) — Выход аналогового сигнала датчика. Подключите к аналоговому входу микроконтроллера.

Оптопара TCRT5000 — это собранные в одном корпусе светодиод и фототранзистор. Светодиод излучает свет в инфракрасном диапазоне с длиной волны 950 нм. Световой поток отражается от поверхности и попадает на фототранзистор.

Чем светлее поверхность, тем больше отражается света, чем темнее — тем меньше.
Как устроен и работает датчик линии

Показания датчика также зависят от расстояния сенсора до поверхности. При расстоянии менее 3 миллиметров — перегородка между ИК-излучателем и приёмником мешает транзистору принимать отраженный свет. А при расстоянии более 10 миллиметров — отраженный свет рассеивается и не доходит до приёмника.

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

Читайте также:  Стоит ли менять алюминиевую проводку на медную и как правильно это сделать

Когда датчик находится над светлой поверхностью индикаторный светодиод горит, а над тёмной — не горит.

Светодиод позволяет более точно откалибровать датчик. Оттенок серого, над которым он загорается в зависимости от настройки — cчитайте реперной точкой.

  • Чип сенсора: оптопара TCRT5000
  • Напряжение питания: 3.3–5 В
  • Максимальный потребляемый ток: менее 10 мА

Модель робота, следующего по линии

Как устроен и работает датчик линии

Я увлекаюсь робототехникой и занимаюсь ей уже полтора года. Робототехника, это прикладная наука, занимающаяся разработкой автоматизированных технических систем. Она опирается на такие дисциплины, как электроника, механика, информатика, а также радиотехника и электротехника. Обычно все новички в этой интересной науке начинают с наборов LEGO Mindstorms. В этих наборах уже даны готовые основные элементы, не требующие спайки и легкие в использовании, удобная среда программирования, позволяющая быстро собрать и запрограммировать робота, используя визуальную среду программирования Lego Mindstorm NXT, в которой запрограммировать робота, может даже человек, незнакомый с языками программирования. Я начинал именно с такого. Это отличный набор, позволяющий изучить основы робототехники, программирования. Несмотря на простоту использования, с помощью этих наборов можно собрать очень сложных роботов, решающих сложные математические задачи. Например, из данного набора собран самый быстрый в мире робот собирающий кубик Рубика 3 X 3 за 4 секунды (Cubestormer II), в котором программа, взаимодействующая с датчиками и двигателями, вращающими кубик, выполняется на телефоне Samsung Galaxy S.

При работе с наборами Lego, содержимое модулей скрыто от нас пластиковой оболочкой. Для того чтобы лучше понять как устроены элементы робота, можно использовать платформу Arduino, при работе с которой нужно глубже понимать как работает робот на уровне “железа”, дает больше гибкости при использовании составных элементов робота.

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

Именно поэтому я решил выяснить, возможно ли самому в домашних условиях собрать настоящего действующего робота, не используя LEGO Mindstorms.

Часть 1. Сборка

2. С чего начать?

Я начал сборку робота с планировки месторасположения его составляющих на платформе. Робот получился двухэтажный. На нижнем ярусе я расположил мотор-редукторы и отсеки с батареями (общее напряжение 9 вольт). Я использовал пластиковые трубочки-стойки для крепления второго яруса.

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

В нижней части робота, со стороны колес установлен цифровой датчик линии Pololu QTR-8RC состоящий из 6 отдельных датчиков.

План месторасположения компонентов на моём роботе

Как устроен и работает датчик линии

Теперь несколько слов о самой платформе Arduino Uno. Arduino — это открытая платформа, которая позволяет собирать всевозможные электронные устройства. Платформа состоит из аппаратной и программной частей; обе чрезвычайно гибки и просты в использовании.

Для программирования используется упрощенная версия языка С++. Разработку можно вести как с использованием бесплатной среды Arduino IDE, так и с помощью другого инструментария. “Мозгом” аппаратной части является микропроцессор ATmega328 работающий на частоте 16 MГц.

Платформа имеет 14 цифровых входов/выходов (6 из которых могут использоваться как выходы широтно-импульсной модуляции), 6 аналоговых входов (в моем проекте не используются).

На плате установлен разъем USB, через который платформу можно подключить к компьютеру и осуществлять программирование платформы, разъем для подключения питания (7 – 12 Вольт), разъёмы выхода стабилизированного напряжения 5В, 3,3В и кнопку перезагрузки.

Также имеется 2 кб оперативной памяти, которые используются для хранения временных данных вроде переменных программы. Эта память очищается при обесточивании. Ещё имеется 1 кб памяти для долговременного хранения данных. По своему назначению это аналог жёсткого диска для Arduino.

4. Подключение компонентов к портам

После распланировки места для «внутренностей» робота требовалось подключить их к плате Arduino. На плате 14 входов. Датчики требуют 6 портов, моторы 4, а дисплей 6. В сумме 16.

14 M1_MAX_SPEED ) motor1speed = M1_MAX_SPEED; // Ораничение максимальной скорости

  • if (motor2speed > M2_MAX_SPEED ) motor2speed = M2_MAX_SPEED; // Ораничение максимальной скорости
  • if (motor1speed < 0) motor1speed = 0; // Проверка скорости на отрицательное значение
  • if (motor2speed < 0) motor2speed = 0; // Проверка скорости на отрицательное значение
  • digitalWrite(M1,HIGH);
  • digitalWrite(M2, HIGH);
  • analogWrite(E1, motor1speed); //Управление скоростью моторов с помощью широтно импульсной модуляции
  • analogWrite(E2, motor2speed); //Управление скоростью моторов с помощью широтно импульсной модуляции
  • }
  • void load_calibration() {
  • qtrrc.calibrate(QTR_EMITTERS_ON);
  • // Присваиваем данные по датчикам, полученные при калибровке
  • qtrrc.calibratedMinimumOn[0] = 172;
  • qtrrc.calibratedMinimumOn[1] = 128;
  • qtrrc.calibratedMinimumOn[2] = 208;
  • qtrrc.calibratedMinimumOn[3] = 292;
  • qtrrc.calibratedMinimumOn[4] = 288;
  • qtrrc.calibratedMinimumOn[5] = 336;
  • qtrrc.calibratedMaximumOn[0] = 1200;
  • qtrrc.calibratedMaximumOn[1] = 872;
  • qtrrc.calibratedMaximumOn[2] = 1150;
  • qtrrc.calibratedMaximumOn[3] = 1520;
  • qtrrc.calibratedMaximumOn[4] = 1460;
  • qtrrc.calibratedMaximumOn[5] = 1760;
  • }
  • void manual_calibration() {
  • // Калибровка датчиков. Робот вращается в разные стороны,
  • // в это время происходит считывание максимальных и минимальных значений для калибровки.
  • digitalWrite(M1,LOW);
  • digitalWrite(M2, HIGH);
  • //Управление скоростью моторов с помощью широтно импульсной модуляции
  • analogWrite(E1, 255);
  • analogWrite(E2, 255);
  • int i;
  • for (i = 0; i < 250; i++)
  • {
  • qtrrc.calibrate(QTR_EMITTERS_ON);
  • delay(20);
  • if (i == 100){
  • digitalWrite(M1,HIGH);
  • digitalWrite(M2, LOW);
  • //Управление скоростью моторов с помощью широтно импульсной модуляции
  • analogWrite(E1, 0);
  • analogWrite(E2, 0);
  • }
  • if (i == 125){
  • digitalWrite(M1,HIGH);
  • digitalWrite(M2, LOW);
  • //Управление скоростью моторов с помощью широтно импульсной модуляции
  • analogWrite(E1, 255);
  • analogWrite(E2, 255);
  • }
  • }
  • if (DEBUG) { // В режиме отладки данные можно посмотреть в среде разработки
  • Serial.begin(9600);
  • for (int i = 0; i < NUM_SENSORS; i++)
  • {
  • Serial.print(qtrrc.calibratedMinimumOn[i]);

    1. Serial.print(' ');
    2. }
    3. Serial.println();
    4. for (int i = 0; i < NUM_SENSORS; i++)
    5. {

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

    • Serial.print(' ');
    • }
    • Serial.println();
    • Serial.println();
    • }
    • //Управление скоростью моторов с помощью широтно импульсной модуляции
    • analogWrite(E1, 0);
    • analogWrite(E2, 0);
    • }

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

    Датчики линии перед началом работы необходимо откалибровать. Для этого программу переключаем в режим отладки (#define DEBUG 1) , помещаем робота на линию, включаем.

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

    1. Шасси Gekko Sport-mini 2wd
    2. Контроллер DFRduino UNO v3 на ATmega328 + ATmega8U2 (arduino)
    3. Драйвер моторов двухканальный DFRobot для Arduino на L298P v1.2
    Читайте также:  Способы соединения приемников электрической энергии

    Инфракрасный датчик расстояния

    Sharp GP2Y0A21YK

    Для измерения расстояния до объекта существуют оптические датчики, работающие на методе триангуляции.

    Самые распространенные из них — это работающие на длине волны, инфракрасные (на английском языке infra-red, сокращенно IR) датчики расстояния с выходным аналоговым напряжением, производимые фирмой Sharp. У датчиков Sharp имеется IR LED с линзой, который излучает узкий световой луч.

    Отраженный от объекта луч направляется через другую линзу на позиционно-чувствительный фотоэлемент (на английском языке position-sensitive detector, сокращенно PSD). От местоположения падающего на PSD луча, зависит его проводимость.

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

    Путь светового луча IR измерителя расстояния

    Выход датчика расстояния Sharp обратно пропорциональный — с увеличением расстояния это уменьшается и растет медленно. Точный график между расстоянием и выходом приведен в спецификации датчика. У датчиков, в соответствии с типом, имеется граница измерения, в пределах которой выход датчика является надежным.

    Измерение максимально реального расстояния ограничивают два аспекта: уменьшение интенсивности отражающегося света и невозможность PSD регистрировать изменение местоположения отображенного маленького луча. При измерении сильно отдаленных объектов, выход датчика остается приблизительно таким же, как и при измерении максимально отдаленных расстояний.

    Минимально измеряемое расстояние ограничено особенностями датчика Sharp, а именно — выходное напряжение на определённом расстоянии (в зависимости от датчика: 4-20 см) начинает резко падать при уменьшении расстояния. По существу это означает, что одному значению выходного напряжения соответствует два расстояния.

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

    График напряжения-расстояния типичного IR измерителя расстояния Sharp

    В комплекте датчиков Домашней Лаборатории есть инфракрасный измеритель расстояния Sharp GP2Y0A21YK с границей измерения 10-80 cм. Выходное напряжение датчика до 3 V в зависимости от измеряемого расстояния.

    Датчик подключается на модуль «Датчики» и его выходное напряжение направляется на канал 0 аналого-цифрового преобразователя AVR.

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

    В спецификации датчика GP2Y0A21YK приведен график зависимости между выходным напряжением и измеренным расстоянием.

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

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

    Далее приведен график связи исправленной обратной величины между выходным напряжением GP2Y0A21YK и расстоянием вместе с линейной линией тренда. Выходное напряжение для упрощения формулы уже переведено в 10-битное значение аналогово-дигитального преобразователя с опорным напряжением +5 V.

    График линеаризации расстояния и значения ADC

    Как видно на графике, линия тренда (синяя) совпадает довольно точно с точками графика (красная линия). Такое совпадение достигнуто с помощью корректирующей константы расстояния.

    Корректирующая константа найдена методом проб и ошибок — испробованы разные числа, пока не были найдены те, при которых график покрыт линией тренда больше всего. Корректирующая константа для данного графика это +2, т.е. ко всем реальным расстояниям в графике прибавлено 2.

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

    1 / (d + k) = a ⋅ ADC + b

    где

    • d — расстояние в сантиметрах
    • k — корректирующая константа (найдена методом проб и ошибок)
    • ADC — это значение дигитализированного напряжения
    • a — линейный член (значение выходит из уравнения линии тренда)
    • b — свободный член (значение выходит из уравнения линии тренда)

    Из формулы можно выразить расстояние d:

    d = (1 / (a ⋅ ADC + B)) — k

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

    • d = (1 / a) / (ADC + B / a) — k
    • Введя в формулу значение корректирующей константы и полученный из уравнения линии тренда линейный и свободный член (полученный из рисунка), получим формулу для вычисления расстояния:
    • d = 5461 / (ADC — 17) — 2

    Эта формула вычислена 16-битными целыми числами и полностью подходит для AVR. Перед вычислением придется убедиться, чтобы значение ADC было выше 17, иначе получится деление на ноль или отрицательное расстояние, что не логично.

    Далее приведена записанная в библиотеке Домашней Лаборатории функция перевода значения ADC в сантиметры. Линейный и свободный член, а также корректирующая константа не вписаны жестко в функцию, но они задаются объектами параметра структуры IR датчика расстояния. Сохраняя параметры отдельно в константе, есть возможность позже просто добавить в программу новые модели IR датчиков расстояния.

    //
    // Структура параметров IR датчика расстояния
    //
    typedef const struct
    { const signed short a; const signed short b; const signed short k;
    }
    ir_distance_sensor;
     
    //
    // Объект параметров датчика GP2Y0A21YK
    //
    const ir_distance_sensor GP2Y0A21YK = { 5461, -17, 2 };
     
    //
    // Перевод значения ADC датчика расстояния IR в сантиметры
    // Возвращает -1, если преобразование не удалось
    //
    signed short ir_distance_calculate_cm(ir_distance_sensor sensor, unsigned short adc_value)
    { if (adc_value + sensor.b = 0) { sprintf(text, «%d cm «, distance); } else { sprintf(text, «Ошибка «); }
      // Отображение текста в начале второй строки LCD lcd_alpha_goto_xy(0, 1); lcd_alpha_write_string(text);
      // Пауза sw_delay_ms(500); }
    }

    Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *

    Adblock
    detector