Восьмиканальный датчик линии Octoliner v1: инструкция, примеры работы и документация

Езда по линии — самое зрелищное и азартное соревнование по робототехнике. Следуя по чёрной линии, робот должен быстрее всех добраться до финиша. В этом ему помогает датчик линии: при помощи оптических сенсоров робот «видит» чёрную линию и следует по ней. Чем точнее датчик, тем быстрее робот преодолеет дистанцию и придёт к финишу.

Установите на «Робоняшу» целую сборку из датчиков линии, и ваш робот станет чемпионом в этом виде соревнований. Ни одна линия не ускользнёт от его восьмиканального зрения.

Видеообзор

Как это работает

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

Сенсоры линии подключены к отдельному 32-разрядному микроконтроллеру STM32F030F4P6 с вычислительным ядром ARM Cortex M0. Контроллер считывает данные с восьми датчиков линии и передаёт их управляющей платформе по интерфейсу I²C/TWI. Адрес модуля по умолчанию 0x42, но его можно изменить, если захотите подключить несколько модулей.

Интенсивность излучения и чувствительность фотоприёмников можно программно регулировать.

Примеры работы для Arduino

Подключение датчика

К платформе Arduino сенсорный модуль удобнее подключать через плату расширения: например, через Troyka Shield.

При помощи трёхпроводных шлейфов подключите модуль к питанию V и G и к пинам шины I²C — SDA и SCL.

Получение данных с датчиков линии

Для запуска примеров скачайте и установите библиотеку Octoliner.

Попробуем получить значения с датчиков сборки и вывести полученные значения на монитор serial-порта. Для этого создадим объект для работы с датчиком, выставим чувствительность фотоприёмников и настроим яркость свечения инфракрасных светодиодов.

folowSensorSimple.ino
// библиотека для работы с модулями 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);
  // выставляем яркость свечения ИК-светодиодов в диапазоне от 0 до 255
  octoliner.setBrightness(255);
}
 
void loop() {
  // считываем значение с датчиков линии
  for (int i = 0; i < 8; i++) {
    // выводим значения в Serial-порт
    Serial.print(octoliner.analogRead(i));
    Serial.print("\t");
  }
  Serial.println();
  // ждём пол секунды
  delay(500);
}

Поиск линии

Теперь научим датчики определять нахождение линии. Будем использовать диапазон от –1 до 1:

  • –1 — линия в крайнем левом положении модуля.
  • 1 — линия в крайнем правом положении модуля.
  • 0 — линия посередине модуля.
folowSensorMapLine.ino
// библиотека для работы с модулями 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);
  // выставляем яркость свечения ИК-светодиодов в диапазоне от 0 до 255
  octoliner.setBrightness(255);
 
}
 
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);
}

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

Примеры работы для Espruino

Схема устройства

К платформе Iskra JS сенсорный модуль удобнее подключать через плату расширения: например, через Troyka Shield.

При помощи трёхпроводных шлейфов подключите модуль к питанию V и G и к пинам шины I²C — SDA и SCL.

Получение данных с датчиков линии

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

folowSensorSimple.js
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:

  • –1 — линия в крайнем левом положении модуля.
  • 1 — линия в крайнем правом положении модуля.
  • 0 — линия посередине модуля.
folowSensorMapLine.js
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.

Микроконтроллер STM32F030F4P6

Мозг сенсорной сборки — мощный 32-разрядный микроконтроллер STM32F030F4P6 с вычислительным ядром ARM Cortex M0. Контроллер считывает данные с восьми датчиков линии и передаёт управляющей платформе по интерфейсу I²C/TWI.

Микросхема MCP6004

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

Понижающий DC-DC

Преобразователь NCP582LSQ33 с выходом 3,3 В обеспечивает питание логической части модуля. Максимальный выходной ток 150 мА.

Светодиодная индикация

На плате расположены два светодиода — индикаторы данных и питания.

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

Troyka-контакты

На модуле выведен разъём Troyka-контактов:

  • Питание (V) соединяет с рабочим напряжением микроконтроллера.
  • Земля (G) соединяет с пином GND микроконтроллера.
  • Сигнальный (D) — пин данных шины I²C. Подключается к SDA-пину микроконтроллера.
  • Сигнальный (C) — пин тактирования шины I²C. Подключается к SCL-пину микроконтроллера.

Входной сенсорный канал

На модуле расположено восемь датчиков линии на оптопаре TCRT5000.

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

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

Принципиальная и монтажная схемы

Характеристики

  • Напряжение питания: 3,3–5 В
  • Микроконтроллер: STM32F030F4P6
  • Интерфейс: I²C
  • Адрес по умолчанию: 0x42
  • Тип сенсора: оптопара TCRT5000
  • Количество каналов: 8

Ресурсы