Подключаем сторонний датчик касания к mBot2: от крепления до готовой программы

Когда занимаешься робототехникой с mBot2, рано или поздно сталкиваешься с ситуацией, когда базового набора датчиков перестаёт хватать. Кто-то ищет готовые фирменные решения, а кто-то, как я, предпочитает покопаться в ящике с Arduino-модулями и найти там что-нибудь полезное. Тема сторонних датчиков снова всплыла в обсуждениях, поэтому решила поделиться свежим опытом — сегодня расскажу про подключение обычного концевого выключателя, который в стандартной комплектации mBot2 отсутствует, но для многих проектов просто незаменим.

Конечно, можно заказать оригинальный датчик касания от MakeBlock, однако цена на него кусается, а ждать доставку иногда некогда. Гораздо практичнее взять то, что уже лежит под рукой. У меня в запасах обнаружились самые простые концевики от Arduino-проектов — дёшево, надёжно и работает без нареканий.

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

Конкретно у меня оказался модуль от qifei — небольшой, аккуратный, с удобными отверстиями. Его и будем приспосабливать к роботу.

Крепление датчика: собираем надёжную конструкцию

Первым делом нужно решить, на чём будет держаться датчик. Здесь полная свобода творчества: подойдут детали от сервопривода, металлический конструктор, совместимые с LEGO элементы или даже пластиковые уголки из строительного магазина. Главное — обеспечить жёсткую фиксацию, чтобы при касании датчик не болтался и не давал ложных срабатываний. В моём случае нашёлся уголок из какого-то набора расширений MakeBlock, который идеально подошёл по размерам.

Обратите внимание на способ крепления — я использовала белые клипсы из наборов расширений mBot2. Это невероятно удобная штука: вставил, защёлкнул — и держится крепко, а снять можно за секунды. Если клипс нет, сгодятся обычные винты с гайками, подходящие по диаметру к отверстиям датчика. Только не забудьте про пластиковые шайбы — они предотвращают контакт металлических частей крепежа с элементами датчика, что могло бы вызвать некорректную работу.

После установки датчика подключаем провода к разъёму S1 на плате CyberPi — именно через него удобнее всего считывать цифровые сигналы.

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

Здесь крепление тоже на клипсах, но уже чёрных — они короче белых и отлично подходят для соединения тонких деталей. Зачем вообще нужен этот упор? Всё просто: когда робот упирается датчиком в стену, сила реакции может развернуть его корпус. Упор принимает часть нагрузки на себя, и машина сохраняет направление движения. В идеале для лабиринтов можно поставить два датчика касания, но тогда придётся занять оба порта, а мне, например, на S2 обычно нужен дальномер Sharp. Поэтому ограничиваюсь одним датчиком и упором.

Изучаем поведение датчика: что он передаёт

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

Я создаю переменную, присваиваю ей значение с порта S1 и запускаю программу в онлайн-режиме mBlock5. Это удобно тем, что результат виден сразу на экране компьютера без необходимости что-то выводить на дисплей робота. Хотя, если предпочитаете режим загрузки, никто не мешает вывести значение на экран CyberPi — тоже рабочий вариант.

Итак, собираю простейший скрипт: переменная touch получает значение с порта S1, запускаю, смотрю на монитор. Нажимаю на концевик — значение меняется. В моём случае в ненажатом состоянии датчик показывает 1, а при нажатии — 0. Теперь можно смело программировать касание.

Пишем программу для движения до препятствия

Переходим к самому интересному — созданию программы. Задача классическая: робот стоит на месте, я нажимаю кнопку A, и он едет вперёд до касания преграды. После этого чуть отъезжает назад и поворачивается на 90 градусов. Такой алгоритм отлично работает в лабиринтах, особенно когда есть только один дальномер: касание определяет препятствие вплотную, после поворота можно продолжать движение вдоль стены, используя ультразвуковой или инфракрасный датчик.

Заодно в программе я потренировалась выводить информацию на экран и использовать комментарии. Кстати, отличные блоки-комментарии есть в расширении Comment — очень удобная штука, чтобы не забыть, зачем нужен тот или иной фрагмент кода.

Вот как выглядит моя программа:

Поворот на 90 градусов — величина не универсальная. У каждого робота есть свои особенности: износ моторов, вес конструкции, покрытие колёс. Поэтому я всегда проверяю фактический угол поворота и при необходимости корректирую значение. Например, у моего экземпляра точный поворот получается при значении 91, а не 90. Мелочь, но именно такие нюансы делают движение робота предсказуемым.

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

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

Комментарии

?
11 + 8 = ?