Тахометр на ардуино уно

Управление шаговым двигателем с помощью Arduino и драйвера A4988

Если вы планируете создать свой собственный 3D-принтер или станок с ЧПУ, вам нужно будет управлять несколькими шаговыми двигателями. Если использовать для этого только Arduino, то большая часть скетча будет занята кодом управления шаговыми двигателями и не останется много места для чего-то еще.

Данную проблему можно решить, использовав специальный автономный драйвер шагового двигателя — A4988 .

Модуль A4988 может контролировать как скорость, так и направление вращения биполярного шагового двигателя, такого как NEMA 17, использую всего два вывода контроллера.

Вы знаете, как работают шаговые двигатели?

Шаговые двигатели используют зубчатое колесо и электромагниты (катушки), позволяющие вращать ось по одному шагу за раз.

  • Последовательность импульсов определяет направление вращения двигателя.
  • Частота импульсов определяет скорость двигателя.
  • Количество импульсов определяет угол поворота.

Частотомер на Arduino

Данная статья является второй в серии статей про измерение с помощью Arduino параметров различных компонентов и физических величин, используемых в радиоэлектронике. Рассмотрим измерение частоты сигнала с помощью Arduino.

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

Частотомер на Arduino Частотомер на Arduino

Этот частотомер является экономически эффективным и может быть легко изготовлен. Для измерения частоты сигнала мы будем использовать Arduino Uno – сердце проекта.

Чтобы протестировать частотомер, мы собираемся создать простейший генератор сигнала. Этот простейший генератор сигнала будет изготовлен с использованием микросхемы таймера 555. Схема на таймере генерирует прямоугольный сигнал, который будет для тестирования подаваться на Arduino Uno.

В итоге у нас будет частотомер и генератор прямоугольного сигнала.

Немного физики

Для измерения частоты вращения нам понадобится датчик положения колеса/вала/круга/итп. Датчик ставится как правило один. Возможно, что он будет срабатывать не один раз на каждый оборот. Например, у вас датчик Холла и 4 магнита на колесе. Таким образом, для правильного вычисления частоты нужно знать:

  • количество срабатываний датчика на один оборот К;
  • минимальная ожидаемая частота Мин.
  • максимальная ожидаемая частота Макс.

То есть, если частота меньше разумного минимума, то считаем, что она равна нулю, если больше максимума — игнорируем показания.

С количеством срабатываний понятно, но зачем ещё эти мины и максы? Давайте рассмотрим сначала варианты расчёта частоты.

Со скоростью всё проще, достаточно знать число π, диаметр колеса, а частоту вращения мы уже знаем.

Микросхема драйвера шагового двигателя A4988

Модуль собран на чипе A4988. Не смотря на свой малый размер (всего 0,8 ″ × 0,6 ″), но обладает хорошими характеристиками.

Драйвер шагового двигателя A4988 имеет высокую выходную мощность (до 35 В и 2 А) и позволяет управлять одним биполярным шаговым двигателем с выходным током до 2 А на катушку, например NEMA 17.

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

Драйвер предлагает 5 различных разрешений шага, а именно:

  • полный шаг
  • 1/2 шага
  • 1/4 шага
  • 1/8 шага
  • 1/16 шага

Познакомимся с основными принципами измерения частоты цифровым способом.

Всего существует два принципа. Оба они основаны на сравнении периодов образцового и измерительного сигналов.

Первый способ иллюстрирует следующая схема.

Импульс входного сигнала (передним или задним фронтом), поступающий от датчика Холла, запускает аппаратное прерывание Ардуино. При срабатывании функции прерывания запускается подсчет количества импульсов n встроенного тактового генератора, период следования которых T0 заранее известен, и продолжается до следующего срабатывания прерывания.

Таким образом сумма длительностей импульсов тактового генератора будет соответствовать времени Т между двумя срабатываниями аппаратного прерывания.

Частота определяется как величина обратная периоду:

А частота вращения, выраженная в об/мин будет в 60 раз больше:

Для получения длительности импульсов образцового сигнала встроенного генератора пользователю Ардуино доступна функция Micros (). Она показывает текущее значение времени в микросекундах с начала запуска программы. Таким образом, обращаясь к ней в моменты срабатывания функции прерывания, можно получить количество микросекунд между двумя срабатываниями. Так как длительность одного образцового импульса T0 равна 1 мкс=1/1000000 с, тогда формула приобретает вид:

Если на валу вращающегося двигателя установлен не один магнит, а несколько (z), то время T между ближайшими срабатываниями функции прерывания сокращается в z раз, а частота входного сигнала возрастает в z раз, тогда формула примет вид:

Второй способ отличается от первого тем, что ведется прямой подсчет числа импульсов k, поступивших от датчика Холла за большой период времени Tm. Этот способ поясняется вторым рисунком. Согласно этому способу частота вращения вала будет равна:

А в минуту – в 60 раз больше:

Если принять Tm=1 c., то формула приобретает вид:

Принципиальная схема

Прибор может работать только в автомобиле с инжекторным двигателем (в карбюраторных датчика скорости нет, а датчик зажигания есть далеко не во всех). Схема прибора показана на рисунке 1. На этом рисунке плата ARDUINO UNO показана схематично как «вид сверху».

Рис. 1. Принципиальная схема спидометра и тахометра на базе Arduino.

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

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

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

Комплектующие для сборки тахометра

Итак, тебе понадобятся:

  • датчик Холла из стартового набора ардуинщика KY-003
  • отладочная плата Arduino Nano v3
  • семи сегментный индикатор на драйвере ТМ1637
  • соединительные провода XH2.54 4pin и 3pin
  • 2-ух жильный экранированный провод
  • набор «Все для паяния»
  • набор «Всё для изготовления печатных плат»
  • установленная на компьютере Arduino IDE желательно версии 1.6.5

И установи библиотеку tm1637 в свою Arduino IDE. Как это сделать? Просто добавь папку из архива в папку куда установлена Arduino. Например С > Program Files (x86) > Arduino > Libraries

Библиотека TM1637 скачать

Общие принципы работы проектируемого тахометра

В этом проекте мы будем создавать цифровой тахометр на основе платы Arduino и модуля инфракрасного датчика для обнаружения вращения и подсчета числа оборотов любого вращающегося объекта. Принцип его действия основан на том, что инфракрасный передатчик излучает инфракрасные лучи которые затем отражаются обратно к инфракрасному приемнику и затем инфракрасный модуль генерирует импульс на своем выходе который обнаруживается контроллером Arduino когда мы нажимаем кнопку start. Он осуществляет счет в течение 5 секунд.

После этих 5 секунд плата Arduino рассчитывает число оборотов в минуту по следующей формуле:

RPM= Count x 12 для одиночного вращающегося объекта.

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

RPM=count x 12 / objects
где
objects – число лопастей в вентиляторе.

Обобщенная структурная схема работы устройства представлена на следующем рисунке.

Структурная схема работы тахометра

Общий принцип работы

Измеряющая данные окружающей среды метеостанция на Ардуино состоит из нескольких основных компонентов:

  • собственно плата управления Arduino (например, Uno). На нее поступает информация со внешних датчиков, контроллер выполняет вычисления и выводит информацию на экран;
  • электронный дисплей — служит для отображения поступивших с контроллера данных в понятной человекочитаемой форме;
  • сенсор влажности температуры. В подобных схемах популярны датчики DHT11 и DHT22. Они регистрируют данные среды и отдают их контроллеру;
  • макетная плата — основа для сборки всех компонентов. На ней фиксируются все элементы метеостанции, по ней же прокладываются электрические соединения;
  • соединительные провода — с «оголенными» концами под пайку или оснащенные штекерами.

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

ШИМ сигнал

Аппаратный

Для генерации ШИМ сигнала с заданным заполнением есть стандартная функция analogWrite(pin, duty) , подробнее обсуждали в уроке про ШИМ сигнал, а частоту можно изменить перенастройкой таймера, как в уроке об увеличении частоты ШИМ. На самом деле таймеры позволяют настроить ШИМ сигнал с более точной или более высокой частотой и другими диапазонами заполнения (до 10 бит), но в ядре Arduino это не предусмотрено. Если такое будет нужно, можно воспользоваться библиотекой GyverPWM. Пример:

Программный ШИМ

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

Функцию PWMgen(заполнение) в данной реализации нужно вызывать как можно чаще в основном цикле программы:

Здесь мы на каждом вызове считаем новый период переключения, тратя на это какое-то время. Можно считать период в отдельной функции, а сам ШИМ генерировать отдельно. Реализацию можно посмотреть в библиотеке PWMrelay.

Полуаппаратный ШИМ

Можно снизить нагрузку на процессор, отдав счёт времени аппаратному таймеру. Примеры на базе GyverTimers (для ATmega328, 2560):

Как известно, digitalWrite() является очень тяжёлой и долгой функцией, и для генерации софт ШИМ рекомендуется заменить её чем-то более быстрым, например прямым обращением к регистру или вот такой конструкцией (для ATmega328p):

Если не хватает количества стандартных ШИМ-выходов, можно поднять полуаппаратный ШИМ на таймере на несколько пинов сразу:

Этот алгоритм является не самым оптимальным, более интересный можно посмотреть в GyverHacks.

Примечание: во всех трёх алгоритмах используется проверка совпадения со счётчиком counter == pwm_duty . Это сильно снижает использование процессорного времени в прерывании, но при резком уменьшении заполнения может приводить к одиночным “вспышкам” заполнения до максимума, так как условие не выполнится. Для более плавной работы можно сделать counter >= pwm_duty , тогда условие будет каждый раз “подстраиваться” под новое значение заполнения, но установка пина будет осуществляться на каждом тике!

Можно ввести буферизацию заполнения ШИМ и брать новое значение только при нулевом значении счётчика, это решит проблему:

Можно применить буферизацию и к остальным алгоритмам.

Библиотека Servo

Как известно, RC сервоприводы управляются при помощи ШИМ сигнала с частотой

50 Гц и длительностью импульса от

2500 микросекунд. В стандартной библиотеке Servo.h реализована генерация полуаппаратного ШИМ сигнала, причём количество пинов можно менять во время работы. Библиотеку можно использовать как генерацию ШИМ, если его параметры подходят для использования.

Программа

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

Таблица 1. Исходный код программы.

Для работы используется функция pulseln , которая измеряет в микросекундах длительность положительного либо отрицательного перепада входного импульса. Так что, для того чтобы узнать период нужно сложить длительность положительного и отрицательного полупериодов.

где Т – период в секундах, a F – скорость в км/час. Поскольку период измерен в микросекундах фактически формула:

Если датчик на 2500 импульсов на км (японский), то формула будет такой:

Соответственно, учитывая, что период измерен в микросекундах:

Для измерения частоты вращения коленчатого вала используется формула:

где Т – период в секундах, a F – частота вращения коленвала в оборотах в минуту. Поскольку период измерен в микросекундах фактически формула такая:

Затем, результаты выводятся в соответствующие строки ЖК-дисплея. Единицы измерения указаны как «km/h» и «оЬ/тіп» (если не нравится, можете изменить).

Если входного сигнала нет, например, включили зажигание, но двигатель не завели, не поехали, то в строках, где нет сигнала, будет надпись «inf».

В принципе, налаживания не требуется. Однако, если неизвестно сколько импульсов на километр дает датчик скорости конкретного автомобиля, это нужно предварительно выяснить.

Либо заниматься экспериментальным подгоном числа, которое делится на период, сверяясь со стрелочным спидометром, что весьма хлопотно, или невозможно, если штатный спидометр неисправный (что и могло стать причиной изготовления данного прибора).

Но лучше все же узнать параметры датчика скорости. А потом рассчитать число, которое в программе делится на период. Обозначим это число X, а количество импульсов на километр N. Тогда X можно рассчитать по такой формуле:

X = 3600000000 / N

Например, если датчик дает, допустим, 2500 импульсов на километр:

Х= 3600000000 / 2500 = 1440000

Или, если датчик дает 6000 импульсов на километр:

Х= 3600000000 / 6000 = 600000

Схема подключения тахометра на Ардуино

Тахометр на Ардуино схема подключения

Тахометр на Ардуино схема подключения

Сборка тахометра не представляет особых трудностей. Просто собирай по схеме, заливай скетч и проверяй работоспособность. После включения на индикаторе должен появится 0, а при мелькании магнитом перед одной из сторон датчика должен загораться светодиод и на индикаторе изменяться показания. Если что-то не так — пиши в комментариях — разберемся.

Скетч для тахометра на Ардуино

Необходимые компоненты

  1. Плата Arduino Pro Mini (купить на AliExpress).
  2. Модуль инфракрасного датчика (купить на AliExpress).
  3. ЖК дисплей 16х2 (купить на AliExpress).
  4. Кнопка.
  5. Макетная плата.
  6. Батарейка на 9 В.
  7. Соединительные провода

Виды датчиков

Для измерения параметров среды часто применяют три вида сенсоров:

  • DHT11;
  • DHT22;
  • SHT1x.

Датчик SHT1x

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

  • малым погрешностям;
  • высокой дальности сигнала;
  • поддержке дробных значений.

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

Датчики линейки SHT1x быстро срабатывают, имеют весьма низкую погрешность, экономичны и умеют «засыпать» при долгой неактивности. Из недостатков выделим:

  • два цифровых интерфейса;
  • невозможность работы без подключения программной библиотеки и диапазон от 0 до 50 градусов — как в других образцах. Его хватает не всегда.

По стоимости все три варианта примерно одинаковы. Для «домашних» установок чаще берут DHT11-22 за их сравнительную простоту в эксплуатации и настройке.

Ошибки дребезга

Для устрашения вас предположу, что измеряем частоту вращения двигателя от индуктивного датчика зажигания. То есть, грубо говоря, на высоковольтный провод намотан кусок кабеля и мы измеряем индукцию в нём. Это довольно распространённый метод, не правда ли? Что же здесь сложного может быть? Самая главная проблема — современные системы зажигания, они дают не один импульс, а сразу пачку.

Но даже обычная система зажигания даёт переходные процессы:

Старинные же кулачковые контактные вообще показывают замечательные картинки.

Как с этим бороться? Частота вращения не может вырасти мгновенно, не даст инерция. Кроме того, в начале статьи я предложил ограничить частоту сверху разумными рамками. Отсчёты, что происходят слишком часто можно просто игнорировать.

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

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

Система охлаждения — радиатор

Чрезмерное рассеивание мощности микросхемы драйвера A4988 приводит к повышению температуры, которая может выйти за пределы возможностей микросхемы, что, вероятно, приведет к ее повреждению.

Даже если микросхема драйвера A4988 имеет максимальный номинальный ток 2 А на катушку, микросхема может подавать только около 1 А на катушку без перегрева.

Для достижения более 1 А на катушку требуется радиатор или другой метод охлаждения.

Система охлаждения - радиатор

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

Сборка тахометра

Итак, начнем по порядку:

Индикатор

При изготовлении тахометра мне хотелось, чтобы индикатор был аккуратно и красиво установлен в корпус блока управления станком. В качестве корпуса я использовал корпус-рамку от вышедшего из строя вольт/ампер метра. Плата индикатора TM1637 практически идеально подходила в этот корпус. Только нужно было обработать напильником — снять по 1 мм с каждой стороны.
Также заменил стандартные пины на разъем XH2.54 4 pin. Получилось практически как заводское изделие.

Индикатор тахометра TM1637

Индикатор тахометра TM1637

Плата датчика Холла

Для аккуратного крепления датчика Холла на шпиндель пришлось сделать новую печатную плату. Кому интересно как я делаю печатные платы читай в этой статье. После изготовления платы, я перенес все детали с KY-003, а так же добавил разъем XH2.54 3 pin. И еще вырезал изоляционную прокладку из какого-то пластика толщиной 3 мм и просверлил в ней небольшие отверстия, чтобы плата ложилась на прокладку всей плоскостью.

Плата тахометра вид сверху

Плата тахометра вид снизу

Прокладка

Печатная плата тахометра на Ардуино

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

Генератор сигналов на микросхеме таймера 555

Генератор сигналов на микросхеме таймера 555. Схема электрическая принципиальная Генератор сигналов на микросхеме таймера 555. Схема электрическая принципиальная

Прежде всего, мы поговорим о генераторе прямоугольного сигнала на микросхеме 555, или, я бы сказал, о нестабильном (астабильном, автоколебательном) мультивибраторе на 555. Эта схема необходима, потому что для проверки частотомера нам необходим сигнал, частота которого известна. Без этого сигнала мы не сможем рассказать о работе частотомера. Если у нас есть прямоугольный сигнал с известной частотой, мы можем использовать его для проверки частотомера на Arduino и для подстройки точности в случае любых отклонений. Макет генератора сигнала на микросхеме таймера 555 показан ниже.

Макет генератора сигналов на микросхеме таймера 555 Макет генератора сигналов на микросхеме таймера 555

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

Типовая схема на таймере 555 в автоколебальном режиме Типовая схема на таймере 555 в автоколебальном режиме

Частота выходного сигнала зависит от резисторов RA и RB и конденсатора C. Формула будет следующей:

Здесь RA и RB – значения сопротивлений, а C – значение емкости. Подставляя значения сопротивлений и емкости в приведенную выше формулу, мы получаем частоту выходного прямоугольного сигнала.

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

Ограничение тока

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

Ограничение тока

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

Для этого есть два метода:

Способ 1:

В данном случае мы собираемся установить ограничение тока путем измерения напряжения (Vref) на выводе «ref».

  1. Взгляните на техническое описание вашего шагового двигателя. Запишите его номинальный ток. В нашем случае мы используем NEMA 17 200 шагов/об, 12 В 350 мА.
  2. Переведите драйвер в полношаговый режим, оставив три контакта выбора микрошага отключенными.
  3. Удерживайте двигатель в фиксированном положении, не синхронизируя вход STEP.
  4. Во время регулировки измерьте напряжение Vref (один щуп мультиметра на минус питания, а другой к металлическому корпусу потенциометра).
  5. Отрегулируйте напряжение Vref по формуле:

ограничение тока = Vref x 2,5

Например, если ваш двигатель рассчитан на 350mA, вы должны установить опорное напряжение 0,14В.

Ограничение тока - способ 1

Способ 2:

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

  1. Взгляните на техническое описание вашего шагового двигателя. Запишите его номинальный ток. В нашем случае мы используем NEMA 17 200 шагов / оборот, 12 В 350 мА.
  2. Переведите драйвер в полношаговый режим, оставив три контакта выбора микрошага отключенными.
  3. Удерживайте двигатель в фиксированном положении, не синхронизируя вход STEP. Не оставляйте вход STEP висящим в воздухе, подключите его к источнику питания логики (5 В)
  4. Подключите амперметр последовательно с одной из катушек шагового двигателя и измерьте фактический ток.
  5. Возьмите небольшую отвертку и отрегулируйте потенциометр ограничения тока, пока не установите номинальный ток шагового двигателя.

Ограничение тока - способ 2

Установка платы датчика Холла

Во-первых, для реализации тахометра, мне нужен был небольшой неодимовый магнит, который нужно было прикрепить на вал шпинделя. Перерыл все ящики — я ничего подходящего не нашел. Зато нашел старый, нерабочий cd-rom от ноутбука. Вот в нем, в катушке электромагнита открывания, как раз и нашел, то, что нужно — небольшой, прямоугольный неодимовый магнит!

Определив высоту и полярность, я приклеил магнит к валу на «суперклей» и обтянул вал с магнитом термоусадкой. На копус шпинделя приклеил прокладку, а уже на прокладку — плату. Как видите — получилось довольно аккуратно. Защитный колпачек в процессе обдумывания, так что, пока без него ????

Установка платы на шпиндель

Установка платы на шпиндель

Датчик Холла 3144 реагирует каждой своей стороной либо на северный, либо на южный полюс магнита, так что перед установкой магнита — определи его положение!

Как протянуть провода от датчика, я расскажу в статье посвященной прокладке кабелей, а пока небольшое видео о работе тахометра на Arduino Nano и индикаторе TM1637

На этом всё. Если понравилось — ставьте лайки, делитесь с друзьями в соцсетях и подписывайтесь на уведомления о новых статьях!

Исходный код программы

В программе мы будем использовать функцию чтения значения с цифрового контакта Arduino чтобы считать значение с выхода модуля инфракрасного датчика. На основе этого считанного значения мы затем будем осуществлять расчет числа оборотов в минуту.

Триггер Шмитта

Мы знаем, что не все тестовые сигналы являются прямоугольными. У нас есть сигналы треугольные, пилообразные, синусоидальные и так далее. Поскольку Arduino Uno может детектировать только прямоугольные сигналы, нам необходимо устройство, которое могло бы преобразовывать любые сигналы в прямоугольные. Поэтому мы используем триггер Шмитта. Триггер Шмитта представляет собой цифровой логический элемент, предназначенный для арифметических и логических операций.

Этот элемент обеспечивает выходной сигнал (OUTPUT) на основе уровня напряжения входного сигнала (INPUT). Триггер Шмитта имеет пороговый уровень напряжения (THERSHOLD): когда уровень входного сигнала выше порогового уровня элемента, уровень сигнала на выходе будет равен высокому логическому уровню. Если уровень входного сигнала ниже порога, на выходе будет низкий логический уровень. Обычно у нас нет отдельного триггера Шмитта, за ним всегда следует элемент НЕ.

Мы собираемся использовать микросхему 74LS14, которая содержит 6 триггеров Шмитта. Эти шесть элементов внутри подключены, как показано на рисунке ниже.

Микросхема 74LS14, содержащая шесть триггеров Шмитта. Распиновка Микросхема 74LS14, содержащая шесть триггеров Шмитта. Распиновка

Таблица истинности инвертированного триггера Шмитта показана ниже, в соответствии с ней мы должны запрограммировать Arduino Uno для инвертирования положительных и отрицательных периодов времени на ее выводах.

  • H – высокий логический уровень;
  • L – низкий логический уровень.

Теперь, когда мы подадим сигнал любого типа на элемент триггера Шмитта, у нас на выходе будет прямоугольный сигнал с инвертированными временными периодами, и этот сигнал мы подадим на Arduino Uno.

Станция с датчиком давления

Следующая модель будет уметь определять:

  • влажность и температуру;
  • уровень высоты;
  • атмосферное давление.

Компоненты

Для сборки потребуются:

  • сенсор DHT22;
  • датчик давления BMP180;
  • плата Ардуино Нано;
  • lcd-экран с блоком I2C;
  • резистор 10 кОм;
  • плата макетная;
  • припой;
  • 40-контактный однорядный разъем;
  • соединительные провода.

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

Сенсор давления

Таковым послужит барометрический датчик с интерфейсом I2C BMP180. Он станет контролировать абсолютное значение параметра вокруг себя. Падение обычно сигнализирует о приближении грозы и наступлении дождя (поскольку им сопутствует область низкого давления), а увеличение, наоборот, говорит о прохождении области низкого давления и наступлении ясной сухой погоды.

Датчик BMP180

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

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

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

Еще один важный момент — светочувствительность. Благодаря силикону в конструктиве BMP180 он способен улавливать попадающий через отверстие в корпусе микрочипа свет и нагреваться. Максимально точные измерения потребуют изоляции от окружающего света.

Датчик bmr180 вид 2

BMP180 соединяется через шину I2C по следующей схеме:

Датчик bmp180 распиновка

Сборка

Процесс сборки начинается с монтажа однорядных разъемов для DHT22 и Arduino:

Начало сборки

От вывода DATA к GND припаян резистор на 10 кОм.

Резистор

Далее монтируется разъем для BMP180 (питаться датчик будет от линии 3.3 В). Компоненты соединяются шиной I2C.

Разъемы

На последнем этапе та же шина соединяется с дисплеем.

Так выглядит домашняя метеостанция в сборе:

Станция в сборе

Пример вывода информации об атмосферном давлении:

Показатели давления

Программный код

Для работы понадобятся скетч Ардуино и библиотеки датчиков. Все они доступны в приложениях к статье.

Скетч1

Датчик на Arduino Uno и плате расширения Troyka Shield

Рассмотрим еще одну погодную станцию. Ее особенности:

  • использование цифрового метеосенсора troyka;Метеосенсор
  • термометр DS18B20;Термометр
  • барометр Troyka V2.Барометр
  • хранение данных на карточке MicroSD — для удобства их последующего анализа на любом устройстве.

Компоненты

Для проекта требуются:

  • контроллер Arduino Uno;
  • плата расширения Troyka Shield;
  • метеодатчик;
  • четырехразрядный цифровой дисплей-индикатор;Дисплей
  • барометр с troyka-блоком подтяжки;Блок подтяжки
  • картридер и карточка micro-SD.

Порядок сборки

Система собирается по шагам.

  1. Установить плату расширения на Ардуино.Установка платы расширения
  2. Подключить к пинам шины I2C метеодатчик.Подключение метеодатчика
  3. Подсоединить дисплей в разъемы e-f на схеме. Пин CS идет на пин 10 микрокомпьютера Ардуино.Подключение дисплея
  4. Барометр вставляется в слот B, пины шины I2C.Подключение барометра
  5. Термометр подключается в слот C, пин 4. Для его работы потребуется дополнительный модуль подтяжки.Подключение термометра
  6. И, наконец, к слоту D и на пин 8 подключается картридер.Подключение картридера

Программные компоненты

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

Как Arduino измеряет частоту

Arduinio Uno имеет специальную функцию pulseIn , которая позволяет нам определять длительность положительного или отрицательного состояния конкретного прямоугольного сигнала:

Данная функция измеряет время, в течение которого высокий или низкий логический уровень присутствует на выводе 8 Arduino Uno. Таким образом, в одном периоде сигнала у нас будут продолжительности положительного и отрицательного уровней в микросекундах. Функция pulseIn измеряет время в микросекундах. В заданном сигнале мы имеем время высокого логического уровня = 10 мс и время низкого логического уровня = 30 мс (частота 25 Гц). Таким образом, в Ltime будет сохранено целое число 30000, а в Htime – 10000. Если мы сложим эти два значения, то получим длительность периода, а инвертировав её, мы получим частоту.

Код Arduino — простой пример

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

Пояснение к скетчу:

Скетч начинается с определения выводов Arduino, к которым подключены выводы STEP и DIR A4988. Мы также определяем stepsPerRevolution. Установите его в соответствии со спецификациями шагового двигателя.

В разделе setup() кода все контакты управления двигателем объявлены как цифровой выход.

В цикле loop() мы медленно вращаем двигатель по часовой стрелке, а затем быстро вращаем его против часовой стрелки с интервалом в секунду.

Управление направлением вращения: для управления направлением вращения двигателя мы устанавливаем вывод DIR в высокое или низкое положение. Сигнал высокого уровня вращает двигатель по часовой стрелке, а низкого — против часовой стрелки.

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

Заключение

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

Скетч Arduino — использование библиотеки AccelStepper

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

Итак, для нашего следующего эксперимента мы будем использовать расширенную библиотеку шаговых двигателей под названием AccelStepper library. Она поддерживает:

  • Ускорение и замедление.
  • Одновременное управление несколькими шаговыми двигателями с независимым шагом для каждого двигателя.

Эта библиотека не включена в IDE Arduino, поэтому вам необходимо сначала установить ее.

Установка библиотеки

Чтобы установить библиотеку, перейдите в Эскиз> Include Library> Manage Libraries… Подождите, пока диспетчер библиотек загрузит индекс библиотек и обновит список установленных библиотек.

Установка библиотеки

Отфильтруйте результаты поиска, набрав «Accelstepper». Щелкните первую запись и выберите «Установить».

Скетч Arduino

Вот простой код, который ускоряет шаговый двигатель в одном направлении, а затем замедляется, чтобы остановиться. Как только двигатель совершает один оборот, он меняет направление вращения. И он повторяет это снова и снова.

Пояснение к скетчу:

Мы начинаем с подключения недавно установленной библиотеки AccelStepper.

Определяем выводы Arduino, к которым подключаются выводы STEP и DIR A4988. Устанавливаем motorInterfaceType значение 1. (1 означает внешний шаговый драйвер с выводами Step и Direction).

Затем мы создаем экземпляр библиотеки с именем myStepper.

В функции setup() мы сначала устанавливаем максимальную скорость двигателя 1000. Затем мы устанавливаем коэффициент ускорения для двигателя, чтобы добавить ускорение и замедление к движениям шагового двигателя.

Затем мы устанавливаем обычную скорость 200 и количество шагов, например, 200 (поскольку NEMA 17 совершает 200 шагов за оборот).

В функции loop() мы используем оператор If, чтобы проверить, как далеко двигателю нужно проехать (путем чтения distanceToGo), пока он не достигнет целевой позиции (moveTo). Как только distanceToGo станет равен нулю мы переключаем двигатель в противоположное направление, изменив moveTo на противоположное значение относительно его текущего положения.

Теперь в конце цикла мы вызываем функцию run(). Это самая важная функция, поскольку шаговый двигатель не будет работать, пока эта функция не будет выполнена.

Оцените статью
Рейтинг автора
4,8
Материал подготовил
Максим Коновалов
Наш эксперт
Написано статей
127
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий