Важная информация!
Сейчас попробую рассказать, как мы ищем минимумы и максимумы полигона, в частности трассы для робота по линии!
Для чего это нужно? Смотрим на изображение. У нас есть линия (черная) и поле (белое). Мы с вами легко можем понять где линия и где "поле", а робот нет. В случае с цифровыми сенсорами все просто, они нам шлют условно 0 на линию и условно 1 на поле. Но а с аналоговыми сенсорами как? Он-то нам пришлет диапазон от 0 до 1023, и где тут черное, а где белое? Да и белое никогда не будет ровно 0, а черное никогда не достигнет 1023. Вот для того чтобы робот мог понимать где что, нам и нужны МИНИМУМы и МАКСИМУМы аналогового сигнала с конкретного поля. Только тогда робот на аналоговых сенсорах сможет понять что он видит.
ВАЖНО! Сразу о железе. все примеры будут приводиться с учетом того, что используется МК на ATmega328P, и сенсор линии pololu qtr-8a а точнее его китайская "копия". Эта "копия" отличается от оригинала ВСЕМ, да-да ничего общего в них нет! алгоритм работы, внешний вид, подключение... единственное что, так это сами фоточувствительные элементы на сенсоре такие же как (внимание) на старых pololu qtr-8a. Но несмотря на это, сенсор линии получился удачный!
Сенсор имеет на борту 8 чувствительных элементов и возвращает нам аналоговый сигнал от 0в до рабочего напряжения 5в, и в нашем случае (ATmega328P) мы будем получать аналоговый сигнал от 0 до 1023 соответственно.
Итого мы имеем, по факту, 8 аналоговых сенсоров линии и Arduino NANO.
как искать min и max?
Когда, на занятиях, я впервые прошу ребят найти минимальное (или максимальное) значение между двумя числами, они всегда пишут вот такой код:
Отрадно, что они понимают что нужно, но все же... У нас же есть функции min() и max(). Вспомним как они работают:
Функция min вернет нам меньшее из двух чисел (а и б), мы также вместо чисел можем вставить переменные в которых хранятся числа, или даже функции которые возвращают числовые значения, таким образом мы с вами можем сравнивать непосредственно результат выполнения функции analogRead() и переменой и получать меньшее из них. Я думаю вам уже все понятно...
Давайте же начнем!
Разберем алгоритм. Начнем мы с того, что создадим глобальные переменные для хранения минимума и максимума. Обе переменные имеют тип данных int. Переменную minimum приравниваем к 1023, а maximum к 0. Для чего? Все просто, догадаетесь сами =)
Далее в переменную minimum сохраняем результат выполнения функции min() которая сравнит результат выполнения функции analogRead() и саму переменную minimum. Также поступаем с maximum.
В результате мы с вами разово перезаписали минимум и максимум трассы для одного сенсора. Но нам же этого мало, верно? Давайте теперь прогоним эти две строчки в цикле на протяжении 3х секунд, и всё это время будем перемещать робота через линию и обратно. Чуете чем пахнет? Да, millis() xD! Я надеюсь вы умеете работать с временем? Если нет, то стоит почитать ;)
Создаем цикл while() который будет на протяжении 3х секунд гонять наши строки и перезаписывать все минимумы и максимумы трассы, а если вспомнить что в это время мы передвигаем робота через линию - то в результате наш робот узнает насколько черная линия и насколько белое поле!
Все? Нет! Cенсоров то у нас 8, а мы сделали это только для одного. Учитывая это, жмем ctrl+A, потом ctrl+C, а затем 8 раз ctrl+V! Готово! xD
На всякий случай скажу что это была шутка! А для того чтобы нам прогнать алгоритм по всем сенсорам - нам нужно добавить еще один цикл. В рамках нашего while(), мы дополнительно поместим наши две строчки в цикл for() на 8 итераций, и важно (!) чтобы счетчик начинался именно с 0. Вот как это будет в коде!
Заметили что мы теперь используем не простые переменные а массивы? Вот и хорошо! Теперь наш код готов! А для того чтобы его проверить нам необходимо будет дописать вывод в монитор порта, но это уже сами сами... Вот что вышло у меня.
Другие интересные статьи и уроки вы найдете тут.