Андрей Смирнов
Время чтения: ~20 мин.
Просмотров: 19

Подключение фоторезистора к ардуино и работа с датчиком освещенности

Каждый робот, способный ездить, летать или плавать, должен видеть препятствия, находящиеся у него на пути. Чтобы робот смог это сделать, ему необходимы соответствующие датчики. В английской литературе такие устройства называют proximity sensor, мы же их будем называть датчиками препятствия. На этом уроке мы рассмотрим один из самых распространенных датчиков препятствия, который работает по принципу отражения. Устроен он очень просто. Датчик содержит направленный источник света и детектор света. Источником часто служит инфракрасный светодиод с линзой, а детектором — фотодиод или фототранзистор. refl_.png Светодиод на датчике постоянно включен и излучает узкий пучок света в прямом направлении. Если перед датчиком есть препятствие (рисунок А), то на детектор попадает отраженный свет от источника, и на выходе датчика появляется положительный импульс. В противном случае, если препятствия нет, то датчик молчит (рисунок Б). Есть и третий вариант, когда препятствие есть, но свет от него не отражается! На рисунке В изображен как раз такой случай. Получается, матовую черную поверхность робот не увидит.

1. Подключение

Будем подключать самый простой датчик с цифровым выходом. Принципиальная схема подключения к выводам Ардуино Уно: proximity_ir_схема.pngВнешний вид макетаproximity_ir_bb-1024x700.png

2. Настройка чувствительности

Как известно, вокруг нас имеется множество источников инфракрасного излучения, включая лампы освещения и солнце. Фоточувствительный элемент датчика регистрирует это фоновое излучение, и может дать ложный сигнал срабатывания. Другими словами, датчик препятствия может сработать, когда никакого препятствия и нет вовсе. Чтобы решить эту проблему, на датчике имеется возможность настроить чувствительность таким образом, чтобы воспринимать только свет достаточной силы. Обычно это реализуется с помощью компаратора — электронного устройства, позволяющего сравнивать два уровня напряжения. Одно напряжение подается на компаратор с фотодиода, а другое с делителя напряжения на основе потенциометра. Второе напряжение будем называть пороговым. Теперь датчик даст положительный сигнал только тогда, когда напряжение на фотодиоде станет больше, чем настроенное нами. Для настройки порогового напряжения нам понадобится шлицевая отвертка (она же — плоская). В этой процедуре нам также поможет зеленый светодиод состояния, который загорается когда датчик регистрирует достаточный уровень инфракрасного света. Алгоритм настройки сводится к трем шагам:

  • помещаем датчик в условия освещенности, в которых он будет работать;
  • подключаем датчик к питанию, при этом на нем загорится красный светодиод;
  • убираем перед датчиком все препятствия, и крутим потенциометр до тех пор, пока зеленый светодиод состояния не погаснет.

Для проверки поднесем к датчику ладонь, и на определенном расстоянии загорится зеленый светодиод. Уберем руку — светодиод погаснет. Расстояние на котором датчик регистрирует препятствие зависит от уровня фоновой засветки, от настройки чувствительности и от правильного расположения фотодиода и светодиода на датчике. Они должны быть расположены строго параллельно  друг другу. Теперь, когда датчик настроен должным образом, приступим к составлению программы.

3. Программа

Для примера, будем зажигать и гасить штатный светодиод №13 на Ардуино Уно, в зависимости от показаний датчика. При использовании цифрового датчика, программа будет такой же, как и в случае работы с кнопками. На каждой итерации цикла loop мы считываем значение на выводе №2, и затем сравниваем это значение с уровнем HIGH. Если значение равно HIGH, значит датчик видит препятствие, и мы зажигаем светодиод на выводе №13. В противном случае — гасим светодиод.

const int prx_pin = 2;  const int led_pin = 13;  byte v;    void setup() {      pinMode(prx_pin, INPUT);      pinMode(led_pin, OUTPUT);  }    void loop() {      v = digitalRead( prx_pin );        if( v == HIGH )          digitalWrite( led_pin, HIGH );      else          digitalWrite( led_pin, LOW );  }

4. Пример использования

Попробуем теперь применить цифровой датчик по прямому назначению. Заставим двухколесного робота реагировать на показания двух датчиков, размещенных слева и справа. Сделаем так, чтобы при обнаружении препятствия робот отворачивал от него в противоположную сторону, а затем продолжал движение вперед. Оформим программу в виде блок-схемы процедуры loop.

Задания

Если все получилось, попробуйте выполнить еще несколько заданий с роботом.

  1. Направить датчики препятствия вниз, чтобы робот смог чувствовать край стола. Написать программу, которая предотвращает падение робота со стола.
  2. Снова направить датчики вниз, но на этот раз для другой цели. Как мы выяснили, датчик может отличить черную поверхность от белой. Воспользуйтесь этим свойством, чтобы сделать робота-следопыта (он же LineFollower).
  3. Направить датчики в стороны, и заставить робота двигаться вдоль стены.

Заключение

На следующем уроке мы познакомимся с датчиком, который устроен практически так же, но больше подходит для детектирования черных и белых поверхностей. Попробуем считывать уже не цифровой, а аналоговый сигнал датчика, чтобы сделать более совершенного робота-следопыта.2+

Arduino Рассмотрим подключение нескольких инфракрасных сенсоров к Arduino.

Для проекта нам понадобятся:

  • Arduino UNO или иная совместимая плата;
  • инфракрасный датчик препятствий;
  • инфракрасный приёмник;
  • соединительные провода (рекомендую вот такой набор);
  • макетная плата (breadboard);
  • персональный компьютер со средой разработки Arduino IDE.

1Описание и принцип действия ИК датчика препятствий

Инфракрасное (ИК) или infrared (IR) излучение – это невидимое человеческим глазом электромагнитное излучение в диапазоне длин волн от 0,7 до 2000 мкм. Вокруг нас существуют огромное количество объектов, которые излучают в данном диапазоне. Его иногда называют «тепловое излучение», т.к. все тёплые предметы генерируют ИК излучение.

Длины волн разных типов электромагнитного излучения

Модули на основе ИК излучения используются, в основном, как детекторы препятствий для различного рода электронных устройств, начиная от роботов и заканчивая «умным домом». Они позволяют обнаруживать препятствия на расстоянии от нескольких сантиметров до десятков сантиметров. Расстояние до препятствия при этом определить с помощью ИК-сенсора невозможно.

Если оснастить, для примера, своего робота несколькими такими ИК модулями, можно определять направление приближения препятствия и менять траекторию движения робота в нужном направлении.

Модуль сенсора обычно имеет излучатель (светодиод) и детектор (фотодиод) в инфракрасном диапазоне. Инфракрасный светодиод излучает в пространство ИК излучение. Приёмник улавливает отражённое от препятствий излучение и при определённой интенсивности отражённого излучения происходит срабатывание. Чтобы защититься от видимого излучения, фотодиод имеет светофильтр (он выглядит почти чёрным), который пропускает только волны в инфракрасном диапазоне. Разные поверхности по-разному отражают ИК излучение, из-за чего дистанция срабатывания для разных препятствий будет отличаться. Выглядеть ИК модуль может, например, вот так:

Модуль с ИК излучателем и ИК приёмником

Когда перед сенсором нет препятствия, на выходе OUT модуля напряжение логической единицы. Когда сенсор детектирует отражённое от препятствия ИК излучение, на выходе модуля напряжение становится равным нулю, и загорается зелёный светодиод модуля.

Помимо инфракрасного свето- и фотодиода важная часть модуля – это компаратор LM393 (скачать техническое описание на LM393 можно в конце статьи). С помощью компаратора сенсор сравнивает интенсивность отражённого излучения с некоторым заданным порогом и устанавливает «1» или «0» на выходе. Потенциометр позволяет задать порог срабатывания ИК датчика (и, соответственно, дистанцию до препятствия).

2Подключение ИК датчика препятствийк Arduino

Подключение ИК модуля к Arduino предельно простое: VCC и GND модуля подключаем к +5V и GND Arduino, а выход OUT сенсора – к любому цифровому или аналоговому выводу Arduino. Я подключу его к аналоговому входу A7.

Модуль с инфракрасным датчиком подключён к Arduino Nano

3Скетч Arduino для инфракрасного датчика препятствий

Скетч для работы с инфракрасным сенсором препятствий также предельно простой: мы будем читать показания с выхода модуля и выводить в монитор порта. А также, если ИК модуль обнаружил препятствие, будем сообщать об этом.

Напомню, в Arduino используется 10-разрядный АЦП, поэтому значение аналогового сигнала кодируется числом в диапазоне от 0 до 1023. При использовании аналогового входа Arduino предельные значения «0» или «1023» мы вряд ли получим с датчика, поэтому лучше использовать некоторый порог, например, равный 100 (поэтому в скетче r < 100). При использовании же цифрового вывода Arduino для чтения показаний инфракрасного датчика, можно можно написать (r == LOW) или (r == 0) или (r < 1).

Хорошая статья про аналоговые измерения на Arduino.

Думаю, довольно понятно, как найти применение такому модулю в ваших проектах. Необходимо периодически опрашивать состояние на выходе модуля, и как только напряжение меняется с HIGH на LOW, предпринимать необходимые действия: менять направление движения робота, включать свет в помещении и т.п.

4Подключение к Arduino модуля с инфракрасным приёмником

ИК датчик может состоять из одного только инфракрасного приёмника, как в этом случае:

ИК приёмник

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

К Arduino модуль с ИК приёмником подключается тоже очень просто:

Пин модуля Пин Arduino Назначение
DAT Любой цифровой Признак наличия ИК излучения на входе приёмника
VCC +5V Питание
GND GND Земля
Подключение ИК приёмника к Arduino

Напишем скетч, в котором будем просто показывать с помощью встроенного светодиода, что на входе приёмника присутствует ИК излучение. В данном модуле аналогично с ранее рассмотренным на выходе DAT уровень «0», когда ИК излучение попадает на приёмник, и «1» когда ИК излучения нет.

Если загрузить этот скетч в Arduino, направить на ИК приёмник ИК пульт и нажимать на нём разные кнопки, то мы увидим, что светодиод нашего индикатора быстро мигает. Разные кнопки – по-разному мигает.

Чтение команд ИК пульта с Arduino

Очевидно, что каждая команда закодирована своей бинарной последовательностью. Хотелось бы увидеть, какие именно команды приходят от пульта. Но прежде чем ответить на этот вопрос, нужно посмотреть другим способом, что же отправляет пульт. А именно – с помощью осциллографа. Подключим осциллограф DS203 к тому месту, где сигнал непосредственно излучается в пространство: к аноду инфракрасного светодиода.

Осциллограф отображает часть команды ИК пульта

На осциллограмме видна серия «пачек» импульсов примерно одинаковой длительности. Каждая «пачка» состоит из 24-х импульсов.

Осциллограф отображает часть команды ИК пульта

В таком виде довольно трудно увидеть, какой сигнал передаётся от пульта ДУ. Прелесть нашего приёмника в том, что он выполняет рутинную работу по оцифровке аналогового инфракрасного сигнала и выдаёт уже «красивый» цифровой сигнал. Давайте посмотрим его на осциллографе.

Подключение выхода с ИК приёмника и выхода ИК пульта к осциллографу

Вот так выглядит посылка пульта целиком. Здесь жёлтая линия – аналоговый сигнал пульта ДУ, голубая – цифровой сигнал с выхода ИК приёмника. Видно, что продолжительность передачи составляет примерно 120 мс. Очевидно, время будет несколько варьироваться исходя из того, какие биты присутствуют в пакете.

Осциллограмма пакета с ИК пульта ДУ

При большем приближении видно, что высокочастотное заполнение, которое имеется в аналоговом сигнале, в цифровом сигнале с ИК приёмника отсутствует. Приёмник прекрасно справляется со своей задачей и показывает чистый цифровой сигнал. Видна последовательность коротких и длинных прямоугольных импульсов. Длительность коротких импульсов примерно 1,2 мс, длинных – в 2 раза больше.

Биты пакета ИК пульта, масштаб: 1 клетка – 200 мкс
Биты пакета ИК пульта, масштаб: 1 клетка – 1 мс
Начало пакета ИК пульта, масштаб: 1 клетка – 5 мс, только цифровой сигнал

Мы уже видели подобный сигнал, когда разбирали сигнал комнатной метеостанции. Возможно, здесь применяется тот же способ кодирования информации: короткие импульсы – это логический ноль, длинные – логическая единица. На следующем видео можно посмотреть пакет целиком:

Если зарисовать этот пакет, то получится как-то так:

Один из пакетов ИК пульта

Дальнейшие исследования показали, что все пакеты данного пульта ДУ состоят из двух пачек импульсов. Причём первая всегда содержит 35 бит, вторая – 32.

Есть несколько вариантов, как поступить для получения цифровых данных пакета:

  1. опрашивать пакет через равные промежутки времени (т.н. «стробирование»), а затем принимать решение, это логический «0» или «1»;
  2. ловить фронты импульсов (детектор фронта), затем определять их длительность и также принимать решение, какой это бит.

Напомню, что будем считать короткие импульсы логическим нулём, длинные – логической единицей.

Для реализации первого варианта понятно, с какой частотой необходимо опрашивать ИК датчик, чтобы принимать с него корректные данные: 600 мкс. Это время в два раза меньшее, чем длительность коротких импульсов сигнала (логических нулей). Или, если рассматривать с точки зрения частоты, опрашивать приёмник нужно в 2 раза большей частотой (вспомним Найквиста и Котельникова). Напишем скетч, реализующий вариант со стробированием.

Скетч для чтения пакета от ИК пульта методом стробирования

Поэкспериментируем с данным скетчем и ИК приёмником. Загрузим скетч в память Ардуино. Запустим последовательный монитор. Нажмём на пульте несколько раз одну и ту же кнопку и посмотрим, что мы увидим в мониторе.

Выводим принятые пакеты ИК пульта в последовательный монитор

Это похоже на пакет, который мы видели на осциллограмме, но всё-таки есть ошибки. Между одинаковыми пакетами также встречаются различия, которых быть не должно. Можно улучшить результат, если увеличить частоту стробирования, чтобы точнее определять биты пакета. Для безошибочного приёма необходимо чтобы строб попадал ближе к середине импульса. Но мы не можем гарантировать это, т.к. импульсы могут распространяться с варьирующимися задержками; Arduio выполняет код также не моментально, каждый цикл требует малого, но всё же времени, поэтому с каждым битом мы немного будем уходить от исходной позиции посередине импульса и рано или поздно «промахнёмся» (определим бит с ошибкой).

Перепишем скетч, используя метеод детекции фронтов.

Скетч для чтения пакета от ИК пульта методом детекции фронтов

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

Загрузим скетч, запустим монитор, нажмём несколько раз ту же кнопку пульта.

Выводим принятые пакеты ИК пульта в последовательный монитор

Результат, как видно, более стабильный.

Скачать вложения:

  • Datasheet на компаратор LM393(150 Скачиваний)
  • Техническое описание ИК светодиода(106 Скачиваний)
  • Техническое описание ИК фотодиода(78 Скачиваний)

Последнее изменениеПятница, 10 Январь 2020 17:46 Прочитано 3383 раз

Содержание

</span>

Обзор Датчик линии/препятствия KY-033

Датчик линии – это оптический модуль, предназначенный для обнаружения препятствий в виде белых или чёрных линий. Основным его элементом является оптопара TCRT5000, состоящая из инфракрасного светодиода и фототранзистора. Внешний вид датчика показан на рисунке №1.

datchik_linii_prepjatstvija_01.jpg

Рисунок №1 – внешний вид датчика линии/препятствия.

Согласно документации, инфракрасный диод излучает свет с длиной волны 950nm, что позволяет достоверно определять препятствия на расстоянии от 1мм до 25мм. Также в состав модуля входят компаратор, подстроечный резистор и контрольный светодиод. Подстроечным резистором выбирается порог срабатывания датчика на разный оттенок чёрного цвета. При максимальном сопротивлении датчик сработает на сером оттенке, а при минимальном сопротивлении – только на чёрном. Факт срабатывания сопровождается загоранием контрольного светодиода и подачей логического нуля на сигнальный вывод датчика. Следует отметить, что для удобства монтажа, по обе стороны оптического элемента расположены два крепёжных отверстия. Это позволяет более точно позиционировать датчик или группу датчиков на необходимом расстоянии от препятствия. Для исключения взаимного влияния светодиода и фототранзистора они конструктивно разделены небольшой перегородкой.

Что касается принципа работы, то он очень прост. При подаче питания на модуль, инфракрасный светодиод начинает излучать свет, который отражаясь от белой поверхности попадает на фототранзистор. В таком режиме на выводе OUT (SIGNAL) будет установлена логическая единица. Как только в зону видимости датчика попадает чёрный объект, световой поток, поглощаясь этим самым объектом, перестаёт доходить до фототранзистора и компаратор переключает вывод OUT (SIGNAL) в логический ноль. Более наглядно этот процесс показан на рисунке №2.

datchik_linii_prepjatstvija_02.jpg

Рисунок №2 – логика работы датчика линии 

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

Из основных технических характеристик можно выделить следующие:

  • Расстояние уверенного определения препятствия: 1-25 мм;

  • Диапазон рабочего напряжения питания: 3,3 – 5 В;

  • Тип используемого ИК датчика: TCRT5000;

  • Длина волны излучения: 950nm;

  • Тип используемого компаратора: LM393;

  • Максимальная нагрузка на выход компаратора: 15 мА;

  • Физические размеры модуля: 40х11х11 мм.

В своём составе, датчик линии имеет всего 3 выхода (VCC, GND и S/OUT).  Выводы VCC и GND предназначены для подачи питания на модуль. Вывод S (OUT) служит для регистрации срабатываний. Ввиду того, что датчик способен выдавать только логические «0» и «1», вывод S (OUT) можно цеплять на любой цифровой пин Arduino. На рисунке №3 изображена схема подключения датчика у которого сигнальный выход  идёт на пин D2 Arduino.

datchik_linii_prepjatstvija_03.jpg

Рисунок №3 – схема подключения датчика линии к Arduino UNO 

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


// Макроопределение для подключения датчика линии к пину №2 Arduino

#define PIN_SENSOR  2

void setup(){

// Инициализируем работу с серийным портом для вывода отладочной информации

  Serial.begin(9600);

// Настраиваем на вход пин, к которому подключен датчик линии.

// Здесь нет необходимости включать внутреннюю подтяжку пина к VCC, т.к.

// модуль сам заботится о формировании логической «1» при отсутствии цели

pinMode(PIN_SENSOR, INPUT);

}

void loop(){

// Контролируем датчик с периодичностью около 200 мс

if(digitalRead(PIN_SENSOR)){// Датчикнесрабатывает

    Serial.println(«LIGHT»);

}

else{// Датчиксрабатывает

    Serial.println(«BLACK»);

}

  delay(200);

}

</pre>

Одной из главных отраслей, где используется датчик линии является робототехника. В этой сфере есть направление, когда мобильный робот должен следовать по определённой траектории. Даже устраиваются целые соревнования на лучший алгоритм и скорость прохождения маршрута. В таких проектах, как правило, используется не один, а группа датчиков, с помощью которых робот определяет границы маршрута. Помимо роботов для соревнований, подобные датчики имеют и бытовые роботы-пылесосы. На рисунке №4 показан робот, оснащённый группой из 8 датчиков линии.

datchik_linii_prepjatstvija_04.jpg

Рисунок №4 – роботизированная платформа с 8 датчиками линии

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

Чтобы закрепить знакомство с датчиком KY-033, создадим небольшой проект станка для намотки катушек индуктивности. Идея заключается в следующем. С помощью стандартного терминала серийного порта, мы вводим нужное количество витков проектируемой катушки. Палата Arduino, обрабатывает поступившие данные и даёт команду на вращение мотора и соответственно привода с закреплённым сердечником. Датчик линии будет отсчитывать количество намотанных витков по специально нанесённой метке на вращающуюся часть привода. Если количество витков будет равно заданному в терминале – мотор остановится с выводом соответствующего сообщения. На рисунке №5 схематически отражена идея проекта.

datchik_linii_prepjatstvija_05.jpg

Рисунок №5 – структурная схема проекта намоточного станка 

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

В роли центральной платы управления выберем Arduino Uno. Крутить привод с держателем сердечника будет 12-вольтовый двигатель постоянного тока со встроенным редуктором. С датчиком линии мы уже знакомы – остаётся силовая управляющая часть.

Дело в том, что питать мотор напрямую от платы Arduino мы не можем, так как у последней просто не хватит мощности, поэтому управление двигателем необходимо осуществлять либо через реле, либо через транзистор. Выбираем полевой N-канальный транзистор IRL540N, управляемый логическим уровнем, как наиболее подходящее решение для данного проекта. На рисунке №6 изображена схема подключения всех составляющих элементов проекта.

datchik_linii_prepjatstvija_06.jpg

Рисунок №6 – электрическая схема намоточного станка

Диод 1N4007, используемый в схеме, защищает полевой транзистор от пробоя высоким напряжением самоиндукции, которое возникает во время размыкания индуктивной нагрузки, т.е. двигателя. Резистор 220 Ом ограничивает ток микроконтроллерного выхода, а резистор 100к разряжает затвор, гарантировано отключая двигатель при логическом нуле. Также особое внимание следует обратить на то, что двигатель питается от внешнего источника 12В, минус которого в обязательном порядке соединяется с минусом платы Arduino.

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

  • Фаза №1. При подаче питания программа определяет в каком состоянии находится вал мотора с отметкой. Последняя должна находиться точно над фотоэлементом датчика линии. Если это не так – мотор вращается и выставляет вал в начальное положение. С этого момента можно закреплять проволоку будущей катушки в начале сердечника.

  • Фаза №2. В терминале выводиться сообщение с запросом о вводе требуемого количества витков. После нажатия клавиши ENTER, начинается вращение двигателя.

  • Фаза №3. Программа отслеживает каждый оборот путём фиксации чёрной отметки и сравнивает с заданным до этого числом в терминале. Как только счётчик достигнет конца, пользователь получит сообщение и алгоритм повторится.

Ниже приведёт программный код с подробными комментариями.


#define PIN_LINE_SENSOR 2 // Пин для подключения датчика линии

#define PIN_MOTOR       7 // Пин для подключения схемы управления мотором

uint8_t globalState =;// Глобальное состояние всей системы

uint8_t lineSensorPrevState =;// Предыдущее состояние датчика линии

uint8_t lineSensorCurrentState =;// Текущее состояние датчика линии

String inString =«»;// Строка для получения из порта кол-ва витков

int turnsNumber =;// Кол-во необходимых витков для намотки

int turnsCount =;// Счётчик намотанных витков

void setup(){

  Serial.begin(9600);// Инициализируем последовательный порт

  pinMode(PIN_LINE_SENSOR, INPUT);// Настройка на вход пина датчика линии

  pinMode(PIN_MOTOR, OUTPUT);// Настройка на выход пина управления мотором

  digitalWrite(PIN_MOTOR, LOW);// Останавливаем мотор при подаче питания

}

void loop(){

  lineSensorCurrentState = digitalRead(PIN_LINE_SENSOR);// Опрашиваемсостояниедатчика

if(globalState ==){// Устанавливаем двигатель в начальное положение

// Если зафиксирована чёрная отметка — двигатель выставлен, двигаемся дальше.

// Иначе включаем мотор и дожидаемся фиксации начального положения

if(lineSensorCurrentState ==){

      lineSensorPrevState = lineSensorCurrentState;

      digitalWrite(PIN_MOTOR, LOW);

      Serial.println(«Motor in start position»);

      Serial.print(«Enter coil turns number: «);

      globalState =1;

}else digitalWrite(PIN_MOTOR, HIGH);

}

elseif(globalState ==1){// Ожидаем ввода количества витков пользователем

if(Serial.available()>){// Считываем из порта введённое значение

char inChar = Serial.read();// Читаем очередной байт

      inString +=(char)inChar;// Склеиваем всё в оду строку

if(inChar ==‘n’){// Если зарегистрирован конец строки

        turnsNumber = inString.toInt();// Переводим строку в числовой формат

        Serial.println(«»);// Переходим на новую строку для удобства вывода

        inString =«»;// Очищаем строку приёмного буфера

if(turnsNumber >){// Если введённое пользователем число > 0

digitalWrite(PIN_MOTOR, HIGH);// Включаеммотор

globalState =2;// Переходим к фазе намотки

}else globalState =;// Иначе возвращаемся в самое начало

}

}

}

elseif(globalState ==2){// Началооборота

if(lineSensorCurrentState ==1&& lineSensorPrevState ==){

      lineSensorPrevState = lineSensorCurrentState;

      globalState =3;

}

}

elseif(globalState ==3){// Конецоборота

if(lineSensorCurrentState ==&& lineSensorPrevState ==1){

      lineSensorPrevState = lineSensorCurrentState;

turnsCount++;// Суммируем обороты

if(turnsCount == turnsNumber){// Если кол-во витков равно заданному в терминале

Serial.print(«Turn number: «); Serial.println(turnsCount);

Serial.println(«Completed«);// Информируем об окончании намотки

        Serial.println(«—————————————«);

// Очищаем счётчик витков и заданного в терминале количества

turnsCount =; turnsNumber =;

        digitalWrite(PIN_MOTOR, LOW);// Останавливаеммотор

globalState =;// Переходим в начальную фазу

}

else{// Иначе, если намотка ещё не окончена, выводим инфо в терминал о витках

Serial.print(«Turn number: «); Serial.println(turnsCount);

globalState =2;// Переходим в фазу начального оборота

}

}

}

}

</pre>

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

datchik_linii_prepjatstvija_07.jpg

Рисунок №7 – прототип намоточного станка

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

  • Включаем питание;

  • Дожидаемся, когда двигатель автоматически установится в начальное положение (чёрная отметка должна оказаться под фотоэлементом датчика линии);

  • Вставляем сердечник в держатель и фиксируем на нём один конец провода;

  • Вводим в терминале необходимое количество витков и нажимаем Enter;

  • Аккуратно придерживаем провод рукой и дожидаемся окончания намотки.

На рисунке №8 показано окно терминала, как результат работы программы. Здесь отображено два цикла работы. Изначально задан запрос на намотку 7-ми витков и после отсчёта нужного количества оборотов, повторяется опыт для намотки 3-х витков. Конец каждого цикла обозначен словом Completed с  разделительной полосой.

datchik_linii_prepjatstvija_08.jpg

Рисунок №8 – результат работы программы намоточного станка

1. В продаже помимо цифровых датчиков линии существую аналоговые. В чём их отличия друг от друга?

  • Аналоговый датчик линии способен различать оттенки серого цвета, в то время как цифровой только 2 состояния, установленные подстроечным резистором. Аналоговый датчик линии подключается к аналоговому входу Arduino, а его состояние опрашивается функцией analogRead(). Цифровой датчик опрашивается функцией digitalRead() и может быть подключен к любому цифровому пину Arduino.

2. Как использовать датчик линии в качестве энкодера?

  • Для этой цели необходимо на вращающейся части энкодера нанести чередующиеся чёрно-белые полосы и установить напротив них датчик линии. Проанализировав  изменения с помощью Arduino, можно вычислить угловую скорость и количество сделанных оборотов.

3. Какое минимальное количество датчиков линии необходимо для построения простейшего робота, следующего по линии?

  • Чтобы заставить робота двигаться по линии достаточно 2-х датчиков. Они устанавливаются друг от друга на расстоянии, равном ширине полосы маршрута. Программа постоянно опрашивает состояние датчиков линии и в зависимости от показаний выдаёт питание на двигатели правого или левого колеса.

Используемые источники:

  • https://robotclass.ru/tutorials/arduino-proximity-sensor/
  • https://soltau.ru/index.php/arduino/item/553-kak-podklyuchit-infrakrasnyj-sensor-k-arduino
  • https://3d-diy.ru/wiki/arduino-datchiki/datchik-linii-analogovyy/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации