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

Сегодня мы рассмотрим датчик обнаружения линии QTR-1RC компании Pololu. Он принадлежит к семейству датчиков QTR, за этой аббревиатурой в данном случае следует 1RC, где 1 означает считыватель (вместо 3 или 8), а RC обозначает цифровой выход вместо аналогового выхода серии A.
Для данного датчика есть специальная библиотека (https://www.pololu.com/docs/0J19), которую также можно подключить через менеджер библиотек.

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

Скетч Arduino, поставляемый с библиотекой и приведенный в конце материала, определяет время калибровки, за которое загорается встроенный светодиод Arduino (A13). Нужно перемещать датчик по линиям, и датчик будет «учиться» в течение этого времени и отображать определенные значения в последовательном мониторе в качестве контрольного значения.
При абсолютно точном обнаружении лог выдает 1000, при уверенности в отсутствии линии лог выдает 0. Также есть промежуточные значения. Скетч универсален – можно также подключить до 8 датчиков линии.

#include <QTRSensors.h>
QTRSensors qtr;
const uint8_t SensorCount = 8;
uint16_t sensorValues[SensorCount];
void setup()
{
qtr.setTypeRC();
qtr.setSensorPins((const uint8_t[]){3, 4, 5, 6, 7, 8, 9, 10}, SensorCount);
qtr.setEmitterPin(2);
delay(500);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
for (uint16_t i = 0; i < 400; i++)
{
qtr.calibrate();
}
digitalWrite(LED_BUILTIN, LOW);
Serial.begin(9600);
for (uint8_t i = 0; i < SensorCount; i++)
{
Serial.print(qtr.calibrationOn.minimum[i]);
Serial.print(' ');
}
Serial.println();
for (uint8_t i = 0; i < SensorCount; i++)
{
Serial.print(qtr.calibrationOn.maximum[i]);
Serial.print(' ');
}
Serial.println();
Serial.println();
delay(1000);
}
void loop()
{
uint16_t position = qtr.readLineBlack(sensorValues);
for (uint8_t i = 0; i < SensorCount; i++)
{
Serial.print(sensorValues[i]);
Serial.print('\t');
}
Serial.println(position);
delay(250);
}
© digitrode.ru