Езда по линии — самое зрелищное и азартное соревнование по робототехнике. Следуя по чёрной линии, робот должен быстрее всех добраться до финиша. В этом ему помогает датчик линии: при помощи оптических сенсоров робот «видит» чёрную линию и следует по ней. Чем точнее датчик, тем быстрее робот преодолеет дистанцию и придёт к финишу.
Установите на «Робоняшу» целую сборку из датчиков линии, и ваш робот станет чемпионом в этом виде соревнований. Ни одна линия не ускользнёт от его восьмиканального зрения.
На борту модуля расположено восемь датчиков линии. Кроме чёрного и белого цвета, каждый сенсор способен распознать 4096 оттенков серого. Благодаря такой чувствительности робот лучше определяет границу перехода от линии к фону и быстрее реагирует на повороты.
Сенсоры линии подключены к отдельному 32-разрядному микроконтроллеру STM32F030F4P6 с вычислительным ядром ARM Cortex M0. Контроллер считывает данные с восьми датчиков линии и передаёт их управляющей платформе по интерфейсу I²C/TWI. Адрес модуля по умолчанию 0x42
, но его можно изменить, если захотите подключить несколько модулей.
Интенсивность излучения и чувствительность фотоприёмников можно программно регулировать.
К платформе Arduino сенсорный модуль удобнее подключать через плату расширения: например, через Troyka Shield.
При помощи трёхпроводных шлейфов подключите модуль к питанию V
и G
и к пинам шины I²C — SDA
и SCL
.
Для запуска примеров скачайте и установите библиотеку Octoliner.
Попробуем получить значения с датчиков сборки и вывести полученные значения на монитор serial-порта. Для этого создадим объект для работы с датчиком, выставим чувствительность фотоприёмников и настроим яркость свечения инфракрасных светодиодов.
// библиотека для работы с модулями I²C #include <Wire.h> // библиотека для работы cо сборкой датчиков линии #include <Octoliner.h> // создаём объект для работы с датчиками линии Octoliner octoliner(42); void setup() { // открываем Serial-порт Serial.begin(115200); // начало работы с модулями I²C Wire.begin(); // начало работы с датчиками линии octoliner.begin(); // выставляем чувствительность фотоприёмников в диапазоне от 0 до 255 octoliner.setSensitivity(200); } void loop() { // считываем значение с датчиков линии for (int i = 0; i < 8; i++) { // выводим значения в Serial-порт Serial.print(octoliner.analogRead(i)); Serial.print("\t"); } Serial.println(); // ждём пол секунды delay(500); }
Теперь научим датчики определять нахождение линии. Будем использовать диапазон от –1 до 1:
// библиотека для работы с модулями I²C #include <Wire.h> // библиотека для работы cо сборкой датчиков линии #include <Octoliner.h> // создаём объект для работы с датчиками линии Octoliner octoliner(42); void setup() { // открываем Serial-порт Serial.begin(115200); // начало работы с модулями I²C Wire.begin(); // начало работы с датчиками линии octoliner.begin(); // выставляем чувствительность фотоприёмников в диапазоне от 0 до 255 octoliner.setSensitivity(200); } void loop() { // массив для хранения показателей с датчиков линии int dataSensors[8]; // считываем значение с датчиков линии for (int i = 0; i < 8; i++) { // выводим значения в Serial-порт dataSensors[i] = octoliner.analogRead(i); Serial.print(octoliner.analogRead(i)); Serial.print("\t"); } Serial.println(octoliner.mapLine(dataSensors)); Serial.println(); // ждём пол секунды delay(500); }
Для плавной езды по линии рекомендуем использовать сборку датчиков совместно с ПИД-регулятором.
К платформе Iskra JS сенсорный модуль удобнее подключать через плату расширения: например, через Troyka Shield.
При помощи трёхпроводных шлейфов подключите модуль к питанию V
и G
и к пинам шины I²C — SDA
и SCL
.
Напишем программу, которая поможет получить значения с датчиков сборки и вывести полученные значения на консоль. Для этого подключим модуль работы со сборкой датчиков, выставим чувствительность фотоприёмников и настроим яркость свечения инфракрасных светодиодов.
I2C1.setup({sda: SDA, scl: SCL, bitrate: 100000}); // подключаем модуль работы с октролайнером var octoliner = require("@amperka/octoliner").connect({i2c:I2C1, address:42}); // устанавливаем чувствительность датчиков линии octoliner.setSensitivity(0.8); // устанавливаем уровень подсветки octoliner.setBrightness(1); setInterval(()=>{ for(var i = 0; i < 8; ++i){ // в цикле считываем все 8 датчиков и выводим из значения console.log(octoliner.analogRead(i)); } },500);
Теперь научим датчики определять нахождение линии. Будем использовать диапазон от –1 до 1:
I2C1.setup({sda: SDA, scl: SCL, bitrate: 100000}); // подключаем модуль работы с октолайнером var octoliner = require("@amperka/octoliner").connect({i2c:I2C1, address:42}); // устанавливаем чувствительность датчиков линии octoliner.setSensitivity(0.8); // устанавливаем уровень подсветки octoliner.setBrightness(1); setInterval(()=>{ console.log(octoliner.mapLine(octoliner.getBinaryLine())); },500);
Для плавной езды по линии рекомендуем использовать сборку датчиков совместно с ПИД-регулятором.
Плата крепится к роботу при помощи шести ушек, которые сделаны под размер винтов М3.
Мозг сенсорной сборки — мощный 32-разрядный микроконтроллер STM32F030F4P6 с вычислительным ядром ARM Cortex M0. Контроллер считывает данные с восьми датчиков линии и передаёт управляющей платформе по интерфейсу I²C/TWI.
На борту модуля расположены два четырёхканальных операционных усилителя MCP6004, при помощи которых можно отрегулировать чувствительность сразу восьми сенсоров.
Преобразователь NCP582LSQ33 с выходом 3,3 В обеспечивает питание логической части модуля. Максимальный выходной ток 150 мА.
На плате расположены два светодиода — индикаторы данных и питания.
Имя светодиода | Назначение |
---|---|
ACT | Отвечает за обмен данными между управляющей платформой и сенсорной сборкой. При обмене данными индикатор мигает. |
PWM | Показывает чувствительность датчиков: чем больше чувствительность, тем ярче горит светодиод. |
На модуле выведен разъём Troyka-контактов:
На модуле расположено восемь датчиков линии на оптопаре TCRT5000.
Оптопара TCRT5000 — это светодиод и фототранзистор, собранные в одном корпусе. Светодиод излучает инфракрасный свет, длина волны 950 нм. Световой поток отражается от поверхности и попадает на фототранзистор, где преобразуется в электрический сигнал. Чем светлее поверхность, тем больше отражается света. Чем темнее — тем меньше.
Показания датчика зависят не только от цвета линии, но и от расстояния сенсора до поверхности. Если расстояние менее 3 мм, то перегородка между ИК-излучателем и приёмником мешает транзистору принимать отражённый свет. При расстоянии более 15 мм отражённый свет рассеивается и не доходит до приёмника.