Обучаюший набор «Цифровая лаборатория» NR05 из серии «Азбука электронщика» может иметь множество практических применений.

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

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

В этом материале мы расскажем, как из компонентов набора и инфракрасного барьера BM083 производства Мастер Кит можно сделать счетчик/ограничитель доступа в помещение или на мероприятие, а также электронный финиш с индикацией времени. Причем схема подключения меняться не будет, а разница будет только в прошивках (программах) микроконтроллера.

Нам понадобятся входящие в набор плата расширения со встроенным символьным индикатором, трехцветный RGB-светодиод, звукоизлучатель, провода, а также дополнительно два источника питания на 12 В, и, конечно, инфракрасный (ИК) барьер BM083.

 

Барьер состоит из двух модулей – передатчика (слева) и приемника (справа). Для работы каждого из них необходим источник питания постоянного тока напряжением 12В и током не менее 60мА для приемника и 30мА для передатчика. Расстояние между передатчиком и приемником может быть до 50 м. Передатчик формирует инфракрасное излучение, модулированное импульсами для увеличения помехоустойчивости, а приемник принимает это излучение и включает реле при его исчезновении.

Основной вариант работы ИК барьера – это работа «на просвет», когда приемник и передатчик устанавливаются друг против друга на определенном расстоянии. В этом случае реле в приемнике срабатывает при пересечении области распространения луча непрозрачным для инфракрасного излучения предметом. При использовании такого режима барьер имеет некоторые особенности. Так как приемник комплекта имеет весьма высокую чувствительность, то при использовании ИК барьера в ситуациях, когда рядом присутствуют значительные отражающие поверхности, например, стены, могут иметь место сбои в работе, так как приемник будет реагировать на сигнал отраженный от стен. Для того чтобы избежать таких ситуаций, рекомендуется на приемник и передатчик устанавливать защитные бленды – пластмассовые или металлические трубки, зачерненные внутри. Такие бленды сужают поле зрения устройства и повышают надежность его работы. Высокая чувствительность приемника позволяет кроме традиционной работы «на просвет» использовать ИК барьер в режиме работы «на отражение». Для реализации этого режима нужно, чтобы в контролируемой зоне не было отражающих объектов. В этом случае  приемник и передатчик ставятся рядом и направляются в сторону этой зоны. Между ними устанавливается непрозрачная перегородка, препятствующая прямой засветке приемника передатчиком. При появлении в контролируемой зоне отражающего объекта приемник включит реле. Дальность действия в таком режиме зависит от величины отражающего объекта, но во всех случаях будет меньше, чем при работе на просвет.

Мы будем использовать контакты реле приемника для подачи сигнала о срабатывании барьера в микроконтроллер (МК) платы Ардуино, установленной на плате расширения набора NR05. При этом для повышения помехозащищенности используемого входа микроконтроллера следует использовать так называемые подтягивающие резисторы.

Как известно, выводы микроконтроллера могут использоваться как на выход, так и на вход. Выводы Ардуино стандартно настроены как порты ввода, таким образом, не требуется явной декларации в функции pinMode(). Сконфигурированные порты ввода находятся в высокоимпедансном состоянии. Это означает, что порт ввода дает слишком малую нагрузки на схему, в которую он включен. Эквивалентом внутреннему сопротивлению будет резистор 100 МОм подключенный к выводу микросхемы. Таким образом, для перевода порта ввода из одного состояния в другое требуется весьма небольшой ток. Это позволяет применять выводы микросхемы для подключения емкостного датчика касания, фотодиода, аналогового датчика со схемой, похожей на RC-цепь.

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

Если на порт ввода не поступает сигнал, то в этом случае рекомендуется задать порту известное состояние. Это делается добавлением подтягивающих резисторов 10 кОм, подключающих вход либо к +5 В (подтягивающие к питанию резисторы), либо к земле (подтягивающие к земле резисторы).

Микроконтроллер имеет программируемые встроенные подтягивающие к питанию резисторы 20 кОм. Программирование данных резисторов осуществляется следующим образом.

pinMode(pin, INPUT);           // назначить выводу порт ввода

digitalWrite(pin, HIGH);       // включить подтягивающий резистор

Также допустима такая сокращенная запись:

pinMode(pin, INPUT_PULLUP);

Подтягивающие резисторы управляются теми же регистрами (внутренними адресами памяти микроконтроллера), которые управляют состояниями вывода: HIGH или LOW. Следовательно, если вывод работает как порт ввода со значением HIGH, что означает включение подтягивающего к питанию резистора, то конфигурация функцией pinMode() порта вывода на данном выводе микросхемы передаст значение HIGH. Данная процедура работает и в обратном направлении, т.е. если вывод имеет значение HIGH, то конфигурация вывода микросхемы как порта ввода функцией pinMode() включит подтягивающий к питанию резистор.

Подключение компонентов нашего устройства одинаково для работы его в качестве счетчика и в качестве электронного финиша.

Ниже приведены коды программ для этих двух применений.

Коды снабжены достаточным количеством комментариев для понимания их работы.

Подключение Ардуино к компьютеру, установка оболочки Arduino IDE для написания программ и их загрузки в Ардуино подробно описаны в обучающем пособии, входящем в набор. Там же даны начальные сведения о языке программирования для Адруино, тексты программ и примеры подключения различных датчиков и устройств.

Маленькое видео, демонстрирующее работу устройств:

 

 

1.      Код программы (скетч) для работы устройства в качестве счетчика.

/*

Программа работает совместно с инфракрасным барьером ВМ083.

Нормально разомкнутые контакты реле приемной части модуля ВМ083 подключаются

к выводу D10 платы расширения набора NR05.

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

подключенный к выводу D5.

При достижении счетчиком значения, заданного переменной threshold, раздается

звуковой сигнал и загорается синий светодиод, подключенный к выводу D6.

Пьезоизлучатель со встроенным генератором подключается к выводу D3.

*/

 

// подключаем библиотеку LiquidCrystalRus

#include <LiquidCrystalRus.h>

// подключаем библиотеки, которые использует LiquidCrystalRus

#include <LiquidCrystalExt.h>

#include <LineDriver.h>

// определяем константы и переменные

#define input 10

#define redLED 5

#define blueLED 6

#define sound 3

  // счетчик

unsigned long count = 0;

  // порог счетчика

unsigned long threshold = 10;

 

// создаем экземпляр объекта дисплея lcd, задавая, куда подключены его контакты RS,EN,DB4,DB5,DB6,DB7

LiquidCrystalRus lcd(A1, A2, A3, 2, 4, 7);

 

// функция setup выполняется один раз при запуске микроконтроллера

void setup() {

  // bнициализируем дисплей: 16 символов и 2 строки

  lcd.begin(16, 2);

  // задаем вывод input(10) как вход с подтяжкой к плюсу питания

  pinMode(input, INPUT_PULLUP);

  // задаем выводs redLED, blueLED и sound как выход

  pinMode(redLED, OUTPUT);

  pinMode(blueLED, OUTPUT);

  pinMode(sound, OUTPUT);

  // выключаем светодиоды и пьезоизлучатель

  digitalWrite(redLED, LOW);

  digitalWrite(blueLED, LOW);

  digitalWrite(sound, LOW);

  // выводим на дисплей надпись "Счетчик 0"

  lcd.setCursor(0,0);

  lcd.print("Счетчик ");

  lcd.print(count);

  lcd.setCursor(0,1);

  lcd.print("Порог ");

  lcd.print(threshold);

 

 

} // конец функции setup

 

// функция loop выполняется циклически, пока на микроконтроллер подано питание

void loop() {

  // если сработало реле приемника модуля BM083

  if (digitalRead(input) == LOW)

  {

    digitalWrite(redLED, HIGH); // включаем светодиод

    count++; // увеличиваем значение счетчика на 1

    lcd.setCursor(0,0);

    lcd.print("Счетчик ");

    lcd.print(count);

    while(digitalRead(input) == LOW){};

    digitalWrite(redLED, LOW);

  }

  // если достигнут заданный порог счетчика

  if (count == threshold)

  {

    lcd.setCursor(0,0);

    lcd.print("Счетчик ");

    lcd.print(count);

    digitalWrite(sound, HIGH); // включаем звукоизлучатель

    digitalWrite(blueLED, HIGH);

    delay(1000); // пауза 1 сек

    digitalWrite(sound, LOW);

    lcd.clear();

    lcd.print("Порог ");

    lcd.print(count);

    lcd.setCursor(0,1);

    lcd.print("     превышен");

    delay(2000);

    digitalWrite(sound, LOW);

    count = 0; // сбрасываем счетчик

    digitalWrite(blueLED, LOW);

    lcd.clear();

    lcd.print("Счетчик ");

    lcd.print(count);

    lcd.setCursor(0,1);

    lcd.print("Порог ");

    lcd.print(threshold);

   

  }

 

} // конец функции loop

 

 

2.      Код программы (скетч) для работы устройства в качестве электронного финиша.

 

/*

Программа работает совместно с инфракрасным барьером ВМ083.

Нормально разомкнутые контакты реле приемной части модуля ВМ083 подключаются

к выводу D10 платы расширения набора NR05.

При нажатии на кнопку 3 (среднюю) платы расширения включается

красный светодиод (вывод D5) и начинается отсчет времени.

При пересечении барьера отсчет останавливается, на дисплее отображается время,

прошедшее между нажатием кнопки и персечением барьера, включается зеленый светодиод (вывод D9),

на 1 сек включается звукоизлучатель, подключенный к выводу D3.

*/

 

// подключаем библиотеку LiquidCrystalRus

#include <LiquidCrystalRus.h>

// подключаем библиотеки, которые использует LiquidCrystalRus

#include <LiquidCrystalExt.h>

#include <LineDriver.h>

// определяем константы и переменные

#define input 10

#define greenLED 9

#define redLED 5

#define sound 3

// определяем, сколько кнопок подключено в качестве аналоговой клавиатуры

// клавиатура подключена к аналоговому входу A6

#define NUM_KEYS 5

// для каждой кнопки заносим калибровочные значения(выведены экспериментально)

int  adcKeyVal[NUM_KEYS] = {30, 150, 360, 535, 760};

  // время запуска

unsigned long startTime;

  // время остановки

unsigned long stopTime;

 

// создаем экземпляр объекта дисплея lcd, задавая, куда подключены его контакты RS,EN,DB4,DB5,DB6,DB7

LiquidCrystalRus lcd(A1, A2, A3, 2, 4, 7);

 

// функция setup выполняется один раз при запуске микроконтроллера

void setup() {

  // bнициализируем дисплей: 16 символов и 2 строки

  lcd.begin(16, 2);

  // задаем вывод input(10) как вход с подтяжкой к плюсу питания

  pinMode(input, INPUT_PULLUP);

  // задаем выводы redLED, greenLED, sound как выходы

  pinMode(redLED, OUTPUT);

  pinMode(greenLED, OUTPUT);

  pinMode(sound, OUTPUT);

  // выключаем светодиоды и пьезоизлучатель

  digitalWrite(redLED, LOW);

  digitalWrite(greenLED, LOW);

  digitalWrite(sound, LOW);

  // выводим на дисплей надпись

  lcd.setCursor(0,0);

  lcd.print("Для старта нажми");

  lcd.setCursor(0,1);

  lcd.print("среднюю кнопку");

 

 

 

} // конец функции setup

 

// функция loop выполняется циклически, пока на микроконтроллер подано питание

void loop() {

  while (get_key() != 3){} // ждем нажатия кнопки запуска

  startTime = millis(); // сразу после нажатия кнопки записываем текущее число миллисекунд

                        // смотри встроенную функцию millis()

  lcd.clear();

  lcd.print("Отсчет...");

  digitalWrite(redLED, HIGH);

  digitalWrite(greenLED, LOW);

  while (digitalRead(input) == HIGH){} // ждем срабатывания барьера

  digitalWrite(redLED, LOW);

  digitalWrite(greenLED, HIGH);

  stopTime = millis(); // записываем новое значение числа миллисекунд

  unsigned long time = stopTime - startTime; // вычисляем число миллисекунд между стартом и стопом

  // вычисляем значения часов, минут, секунд и миллисекунд для вывода на дисплей

  int hours = time / 3600000;

  int minutes = (time % 3600000) / 60000; // операция % означает целочисленное деление с остатком

  int seconds = (time % 60000) / 1000;

  int millisec = time % 1000;

  // выводим время на индикатор

  lcd.clear();

  lcd.print(hours);

  lcd.print(" час. ");

  lcd.print(minutes);

  lcd.print(" мин. ");

  lcd.setCursor(0,1);

  lcd.print(seconds);

  lcd.print(",");

  lcd.print(millisec);

  lcd.print(" сек.");

  digitalWrite(sound, HIGH);

  delay(100);

  digitalWrite(sound, LOW);

 

} // конец функции loop

 

// пользовательская Функция get_key читает значение с АЦП, куда подключена аналоговая клавиатура

// и сравнивает с калибровочными значениями, определяя номер нажатой кнопки

int get_key()

       {

         int inp = analogRead(A6);

         int k;

         for(k = 0; k < NUM_KEYS; k++)

           if(inp < adcKeyVal[k])

             return k + 1;    

         return 0;

       }

Вы недавно смотрели

              
Рейтинг@Mail.ru Яндекс.Метрика