Комментарии 18
А можно также взять другой контроллер. Или на дискретной логике сделать. Или на raspberry с линуксом. Для 2 датчиков планировщик как то из пушки по воробьям.
Вы передергиваете. Во-первых, реализация этого на логике — это еще больший оверинжиниринг, ибо влечет за собой десяток плат с микросхемами. Малину и жирные контроллеры с линуксом я не предлагал, как не предлагал и смену контроллера.
Во-вторых, у автора возникла проблема, я описываю подход, где этой проблемы вообще не возникнет — опрос кнопки в одном потоке, работа с датчиком в другом, с экраном в третьем. Причем, как я уже сказал, ничего менять не надо, ни новый контроллер, ни малину, ни линукс, просто немного кода, все равно у тс достаточно памяти.
В-третьих, нет никакого понятия «из пушек по воробьям»: все определяется стоимостью часа разработки и экономией денег после этой разработки. Если я делаю устройство в тираж 1м, то я буду биться за каждый рубль стоимости контроллера, и если надо, посажу разрабов писать на ассемблере прошивку, чтобы уложиться в более дешевый контроллер (разумеется, если меня удовлетворит стоимость поддержки такого ПО): там стоимость разработки сильно-сильно ниже стоимости партии. Если я делаю устройство в тираж 1 (прописью: одну) штуку, то мне абсолютно пофиг, стоит контроллер 10 рублей или 50 рублей, но очень-очень не пофиг на свое время: если +40 рублей к цене устройства экономят мне неделю работы за счет RTOS, планировщика, готовых жирных библиотек и так далее, то выбор очевиден. Тратить неделю на непрофильную работу, если это можно сконвертировать в небольшие затраты смысла ноль, лучше в свободное время какой-нибудь другой девайс сделать. Тут же даже не надо менять контроллер, просто прочитать и понять некоторые концепции, и разобраться, как добавить в проект либу.
У каждого есть свой набор микроскопов с удобными ручками
Нет, всё значительно проще. Аналоговый датчик (1 операционник) + интегратор для импульсов (ещё один) + линейный светодиодный индикатор на компаторах (по 1 на светодиод), например. Операционники бывают и по 4 в одном корпусе. Или АЦП на сдвиговых регистрах — тоже ничего сложного. Конечно, если задаться целью сделать I2C на мелкой логике, это будет страшно…
Вы правы. Но это же хобби-проект. Совершенно не факт, что автор планирует сильно упарываться в микроконтроллеры. А ардуиновский суперцикл — проще всего для понимания.
Принцип работы шагового двигателя
В зависимости от конструкции, сегодня применяются три вида шаговых двигателей: с постоянным магнитом, с переменным магнитным сопротивлением и гибридные двигатели. У двигателей с постоянным магнитом число шагов на один оборот вала доходит до 48, то есть один шаг соответствует повороту вала на 7,5°. Гибридные двигатели обеспечивают не меньше 400 шагов на один оборот (угол шага 0,9°).
Подсчитав количество сделанных шагов, можно определить точный угол поворота ротора. Таким образом, шаговый двигатель является сегодня идеальным приводом в 3D принтерах, станках с ЧПУ и в другом промышленном оборудовании. Это лишь краткий обзор устройства и принципа работы stepper motor, нас больше интересует, как осуществляется управление шаговым двигателем с помощью Ардуино.
Самодельный спидометр и тахометр на базе Arduino с дисплеем 1602А
Здесь описывается цифровой прибор, измеряющий скорость движения автомобиля и частоту вращения коленвала его двигателя. Индикатором служит ЖК-дисплей типа 1602А, он стандартный, на основе контроллера HD44780.
Обозначение 1602А фактически значит, что он на две строки по 16 символов в строке. Индикатор был куплен на «Aliexpress», найден по запросу «HD44780» (цены от 81 рубля). Как уже сказано, у данного индикатора есть две строки. Так вот, в верхней строке прибор показывает скорость движения автомобиля, а в нижней — частоту вращения коленвала двигателя.
В отличие от многих бортовых компьютеров, таких как «Орион-БК» и подобных, а так же, приборов со светодиодными семисегментными индикаторами, этот ЖК-дисплей при включенной подсветке дает очень четкое изображение, отлично видное как на свету, так и ночью в темноте, что особенно важно при автомобильной эксплуатации. В основе схемы прибора лежит готовая плата ARDUINO UNO, на которой расположен микроконтроллер ATMEGA328, а так же вся его «обвязка», необходимая для его работы, включая USB-програм-матор и источник питания
В основе схемы прибора лежит готовая плата ARDUINO UNO, на которой расположен микроконтроллер ATMEGA328, а так же вся его «обвязка», необходимая для его работы, включая USB-програм-матор и источник питания.
Стоимость ARDUINO UNO на том же «Aliexpress» начинается от 200 рублей. Описание платы ARDUINO UNO, а так же программного обеспечения для неё, и подключения к персональному компьютеру приводится автором в Л.1, так что, если кто не в курсе что такое ARDUINO и «с чем его едят», обязательно прочтите сначала статью в Л.1.
Прибор подключается по питанию к выходу замка зажигания автомобиля, а сигналы получает с его датчиков Холла, один из которых является датчиком зажигания, а второй датчиком скорости.
Виды оборудования
Приспособления делятся на два типа: аналоговые и цифровые. Цифровой тахометр характеризуется большей точностью измерений, аналоговый – простотой конструкции. От типа устройства зависит и вид выходной информации. Аналоговые приборы выводят показания в заданных единицах на циферблат. А электронный нужен, когда скорость вращения двигателя нужно получать на дисплее.
По способу снятия показаний оба типа приборов разделяются на виды:
1)бесконтактный – такие тахометры считывают информацию при помощи фотоэлемента (фототахометры) или лазера;
2)контактный – в таких устройствах с валом контактирует специальный элемент;
3)комбинированный – сочетают в себе возможности бесконтактных и компактных моделей.
Любой тахометр из выше перечисленных разновидностей можно купить на сайте ЭкоГуру.
Расчет скорости и ее отображение на аналоговом спидометре
Инфракрасный (ИК) датчик представляет собой устройство которое может обнаруживать присутствие объекта перед собой. Для тестирования работы проекта мы использовали двухлопастной вентилятор, который поместили перед инфракрасным датчиком, поэтому всегда когда лопасть вентилятора будет проходить над датчиком ИК датчик будет обнаруживать это. Для расчета времени одного оборота вентилятора мы задействуем таймеры и прерывания платы Arduino. В определенной степени данная часть проекта похожа на тахометр на основе платы Arduino, ранее рассматривавшийся на нашем сайте.
В этом проекте мы будем использовать прерывание самого высокого приоритета для определения числа оборотов вентилятора в минуту (rpm — revolutions per minute). Мы будем применять это прерывание в нарастающем режиме. То есть всегда когда выход датчика будет изменять свое состояние с LOW на High будет вызываться на выполнение функция RPMCount(). А поскольку в проекте мы использовали двухлопастной вентилятор это значит что данная функция будет вызываться 4 раза за один оборот.
Когда мы определим время одного оборота мы можем рассчитать по ниже приведенной формуле число оборотов в минуту (RPM). В этой формуле 1000/time позволит определить нам число оборотов в секунду (RPS — revolution per second), а умножив полученное значение на 60 мы получим число оборотов в минуту.
Arduino
rpm = (60/2)*(1000/(millis() — time))*REV/bladesInFan;
1 | rpm=(602)*(1000(millis()-time))*REVbladesInFan; |
После расчета числа оборотов в минуту (RPM) скорость можно определить по следующей формуле:
Arduino
Speed = rpm * (2 * Pi * radius) / 1000
1 | Speed=rpm*(2*Pi*radius)1000 |
Поскольку число пи нам известно (Pi = 3.14), а радиус в нашем случае составляет величину 4.7 дюйма, то сначала конвертируем радиус из дюймов в метры:
Arduino
radius = ((radius * 2.54)/100.0) meters
Speed= rpm * 60.0 * (2.0 * 3.14 * radius)/ 1000.0) // в километрах в час
1 |
radius=((radius*2.54)100.0)meters Speed=rpm*60.0*(2.0*3.14*radius)1000.0)// в километрах в час |
В представленной формуле мы умножаем rpm на 60 чтобы конвертировать rpm в rph (revolution per hour – число оборотов в час) и делим на 1000 чтобы преобразовать м/ч (метров в час) в км/ч.
После получения скорости в км/ч мы можем непосредственно показать ее на экране ЖК дисплея в цифровой форме, однако чтобы показать ее в аналоговой форме нам необходимо произвести дополнительные преобразования, в частности, мы должны определить число шагов, которое должен сделать наш шаговый двигатель.
В нашем проекте мы используем 4-проводный биполярный шаговый двигатель, который совершает 200 шагов за один оборот, то есть за один шаг он поворачивается на 1.8 градуса.
К примеру, нам необходимо показать скорость 280 км/ч на спидометре – для этого шаговый двигатель должен повернуться на 280 градусов. То есть максимальная скорость у нас будет равна maxSpeed = 280, а максимальное число шагов (maxSteps) будет равно:
Arduino
maxSteps = 280/1.8 = 155 steps
1 | maxSteps=2801.8=155steps |
Для преобразования скорости в число шагов мы будем использовать функцию Arduino под названием map:
Arduino
Steps = map(speed,0,maxSpeed,0,maxSteps);
1 | Steps=map(speed,,maxSpeed,,maxSteps); |
Итого, получим:
Arduino
steps=map(speed,0,280,0,155);
1 | steps=map(speed,,280,,155); |
После расчета необходимого числа шагов (steps) мы можем непосредственно их использовать в функции управления шаговым двигателем. Но перед этим нам необходимо учесть текущее число шагов (текущий угол), на которое повернут шаговый двигатель. Для этого мы будем использовать следующие преобразования:
Arduino
currSteps=Steps
steps= currSteps-preSteps
preSteps=currSteps
1 |
currSteps=Steps steps=currSteps-preSteps preSteps=currSteps |
где currSteps – текущее число шагов, полученное в результате предыдущего вычисления скорости, а preSteps – последнее выполненное число шагов.
ДОКУМЕНТАЦИЯ
Документация
Инициализация
Библиотека поддерживает два типа драйверов:
При инициализации указывается тип драйвера, количество шагов на оборот и пины:
Количество шагов на оборот нужно для работы функций, которые устанавливают или читают параметр в градусах. Если они не нужны – количество шагов можно поставить любое (единичку). Если нужно – количество шагов нужно указывать с учётом редукторов и микрошагов:
Время шага
Для драйверов STEP-DIR сделана задержка между переключением состояния пина STEP, эта задержка является минимальной, т.е. она может быть больше, чем нужно, но если будет меньше – возможна нестабильная работа драйвера. По умолчанию она составляет 4 микросекунды, но разным драйверам она нужна разная (для других драйверов см. даташит):
Также увеличение задержки может повысить стабильность работы при использовании длинных неэкранированных проводов от микроконтроллера к драйверу (к пину STEP).
Для изменения величины задержки сделай дефайн DRIVER_STEP_TIME перед подключением библиотеки:
Режим FOLLOW_POS
В этом режиме мотор следует на указанную позицию в шагах или градусах. Для её установки есть следующие методы:
Примечание: абсолютная позиция – говоришь мотору повернуться на 300 шагов, он повернётся на позицию 300. При повторном вызове ничего не произойдёт. Относительная – говоришь повернуться на 300 – он повернётся на 300 относительно текущей позиции. Если вызвать ещё раз через некоторое время – цель сместится относительно текущей позиции вала.
Установленную целевую позицию можно прочитать:
Дополнительно можно настроить максимальную скорость и ускорение при движении к целевой позиции:
Также можно вручную установить текущую позицию мотора в шагах и градусах при помощи:
Режим KEEP_SPEED
В этом режиме мотор просто крутится с заданной скоростью. Скорость задаётся при помощи
(New!) Вторым аргументом можно передать включение плавного изменения скорости, по умолчанию стоит false ( NO_SMOOTH ). Смотри пример accelDeccelButton
Установленную скорость можно прочитать:
Алгоритм планировщика скорости
В библиотеке реализовано два алгоритма планирования скорости для режима плавного движения к позиции с ненулевым ускорением:
3Скетч для определения скорости вращения диска
Для того чтобы определить скорость вращения, будем использовать сигнал с цифрового канала сенсора. Такая схема пригодится,
например, для создания спидометра для велосипеда.
Для демонстрации соберём вот такую установку: разместим неподвижно датчик Холла (зажмём тисками), а на поверхности вращающегося диска закрепим постоянный магнит. В качестве вращающейся платформы у меня будет старый жёсткий диск, на котором скотчем (простите за неэстетичность) будет зафиксирован магнит.
Установка для определения скорости вращения на основании показаний датчика Холла
Вспомним формулу угловой скорости:
ω = φ / tгде ω – угловая скорость, φ – угол поворота, t – время, за которое диск повернулся на этот угол. В нашем случае угол (1 оборот) будет равен 360° или 2π радиан. Всё,
что нам остаётся – это подсчитать время, за которое происходит один оборот диска.
В скетче мы будем отлавливать переход сигнала с датчика от HIGH к LOW и вычислять разницу между двумя последовательными переходами.
Временная диаграмма цифрового сигнала с датчика Холла для вращающегося диска
Для определения промежутка времени используем встроенную функцию millis(), которая возвращает количество миллисекунд, прошедших с момента включения платы Arduino.
int digitalPin = 12; // с цифрового выхода датчика Холла unsigned long runTime; // время с запуска платы Arduino, мс int prevValue = 0; // предыдущее считанное значение void setup() { pinMode(digitalPin, INPUT); Serial.begin(9600); runTime = millis(); // запоминаем время запуска программы } void loop() { int digitalValue = digitalRead(digitalPin); // значение с цифрового канала delay(50); // небольшая задержка чтобы исключить дребезг контактов if ((prevValue == HIGH) && (digitalValue == LOW)) { // ловим переход HIGH->LOW сигнала unsigned long timeSpan = millis() - runTime; // время одного оборота, мс runTime = millis(); // запомним текущее время Serial.println("Период оборота = " + (String)timeSpan + " мс"); double omega = 2 * PI / (timeSpan * 1.0E-3); Serial.println("Угловая скорость = " + (String)omega + " рад/с"); } prevValue = digitalValue; // запомним предыдущее значение датчика Холла }
Загрузим скетч, и начнём вращать наш диск с магнитом. Период оборота и угловая скорость выводятся в окно консоли:
Скорость и период вращения диска выводятся в монитор последовательного порта
Кстати, если на небольшом расстоянии друг за другом на диске разместить два магнита, то можно будет определить не только скорость вращения, но и направление. Естественно, скетч придётся немного усложнить.
Возвращаясь к идее спидометра для велосипеда, нужно вспомнить ещё одну формулу – связь угловой и линейной скоростей:
v = ω r
Здесь v – линейная скорость, ω – угловая скорость, r – радиус колеса велосипеда. Теперь несложно дописать наш последний скетч с учётом этой формулы.
Работа схемы
Схема аналогового спидометра на основе платы Arduino представлена на следующем рисунке.
В схеме мы будем использовать ЖК дисплей 16×2 для отображения скорости в цифровой форме и шаговый мотор, с помощью вращения которого будет показываться скорость в аналоговой форме.
ЖК дисплей подключен к следующим контактам платы Arduino:
RS — A5
RW — GND
EN — A4
D4 — A3
D5 — A2
D6 — A1
D7 — A0
Резистор 2,2 кОм используется для установки яркости ЖК дисплея. Модуль инфракрасного датчика (IR sensor module), который используется для определения числа оборотов лопастей вентилятора, подключен к контакту D2 платы Arduino, который в данном случае используется как вход внешнего прерывания 0 (interrupt 0).
В качестве драйвера мотора мы использовали модуль L293N. Контакты IN1, IN2, IN3 и IN4 драйвера шагового двигателя непосредственно подключены к контактам D8, D9, D10 и D11 платы Arduino.
Программа
Программа на C++ с подробными комментариями приведена на рисунке 2. Действие программы по измерению частоты вращения коленвала основано на измерении периода импульсов, поступающих с датчика, и последующего расчета частоты вращения коленвала.
Рис. 2. Исходный код программы.
Для работы используется функция pulseln , которая измеряет в микросекундах длительность положительного либо отрицательного перепада входного импульса. Так что, для того чтобы узнать период нужно сложить длительность положительного и отрицательного полупериодов.
Далее, частота вращения вычисляется по формуле:
F=30/T
где Т — период в секундах, a F — частота вращения коленвала в оборотах в минуту. Поскольку период измерен в микросекундах фактически формула такая:
F= 30000000/Т
Измерение длительности периода состоит из трех этапов, сначала измеряются длительности положительной и отрицательной полуволны в строках:
Htime=pulseln(10, HIGH);
Ltlme=pulseln(10, LOW);
Затем, происходит вычисление полного периода в строке:
Ttime=Htime+Ltime;
И потом, вычисление частоты вращения коленвала в строке:
frequency=30000000/Ttime;
Действие программы по измерению напряжения основано на чтении данных с аналогового входа и расчета результата измерения.
Выход аналогового порта преобразуется АЦП микроконтроллера в цифровую форму. Для получения результата в единицах вольт, нужно его умножить на 5 (на опорное напряжение, то есть, на напряжение питания микроконтроллера) и разделить на 1024.
Для того чтобы можно было измерять напряжение более 5V, вернее, более напряжения питания микроконтроллера, потому что реальное напряжение на выходе 5-вольтового стабилизатора на плате ARDUINO UNO может отличаться от 5V, и обычно немного ниже, нужно на входе применить обычные резистивные делители. Здесь это делитель напряжения на резисторах R5 и R6.
При этом, для приведения показаний прибора к реальному значению входного напряжения, нужно в программе задать деление результата измерения на коэффициент деления резистивного делителя. А коэффициент деления, обозначим его «К», можно вычислить по такой формуле:
К = R6 / (R5+R6)
Очень любопытно то, что резисторы в делителях совсем не обязательно должны быть высокоточными. Можно взять обычные резисторы, затем измерить их фактическое сопротивление точным омметром, и уже в формулу подставить эти измеренные значения.Получится значение «К» для конкретного делителя, которое и нужно будет подставлять в формулу. Чтение данных с аналогового порта происходит в строке:
vout=analogRead(analogInput);
Затем, производится вычисление фактического напряжения с учетом коэффициента деления делителя входного напряжения:
volt=vout*5.0/1024.0/0.152;
В этой строке число 5.0 — это напряжение на выходе стабилизатора платы ARDUINO UNO. В идеале должно быть 5V, но для точной работы вольтметра это напряжение нужно предварительно измерить. Подключите источник питания напряжением 12V и измерьте достаточно точным вольтметром напряжение +5V на разъеме POWER платы. Что будет, то и вводите в эту строку вместо 5.0, например, если будет 4.85V, строка будет выглядеть так:
volt=vout*4.85/1024.0/0.152;
На следующем этапе нужно будет измерить фактические сопротивления резисторов R5 и R6 и определить коэффициент К (указан 0.152) для этой строки по формуле:
К1 = R6 / (R5+R6)
Допустим, получилось К = 0.159, так и пишем:
volt=vout*4.85/1024.0/0.159;
Таким образом, в текст программы нужно внести изменения соответственно фактическому напряжению на выходе 5-воль-тового стабилизатора платы ARDUINO UNO и согласно фактическому коэффициенту деления резистивного делителя.
Затем, результаты измерений выводятся на ЖК-дисплей. Напряжение вносится в первую строку дисплея, а частота вращения во вторую. Единицы измерения указаны как «V» и «оЬ/тіп».
Если входного сигнала с датчика Холла нет, например, включили зажигание, но двигатель не завели, то в строке, где индицируется частота вращения, будет надпись «inf». Если прибор дает сбои при измерении частоты вращения коленвала, может потребоваться оптимизация режима работы входного каскада на транзисторе VT1, соответственно, подбором сопротивления резистора R3, а так же емкости конденсатора С2.
Каравкин В. РК-2017-01.
Литература:
- Каравкин В. — Ёлочная мигалка на ARDUINO как средство от боязни микроконтроллеров. РК-11-2016.
- Каравкин В. — Частотомер на ARDUINO. РК-12-2016.
- Каравкин В. — Спидометр и тахометр на ARDUINO для автомобиля, РК-12-2016.
Установка платы датчика Холла
Во-первых, для реализации тахометра, мне нужен был небольшой неодимовый магнит, который нужно было прикрепить на вал шпинделя. Перерыл все ящики — я ничего подходящего не нашел. Зато нашел старый, нерабочий cd-rom от ноутбука. Вот в нем, в катушке электромагнита открывания, как раз и нашел, то, что нужно — небольшой, прямоугольный неодимовый магнит!
Определив высоту и полярность, я приклеил магнит к валу на «суперклей» и обтянул вал с магнитом термоусадкой. На копус шпинделя приклеил прокладку, а уже на прокладку — плату. Как видите — получилось довольно аккуратно. Защитный колпачек в процессе обдумывания, так что, пока без него ?
Установка платы на шпиндель
Как протянуть провода от датчика, я расскажу в статье посвященной прокладке кабелей, а пока небольшое видео о работе тахометра на Arduino Nano и индикаторе TM1637
Работа схемы
Схема тахометра на основе платы Arduino представлена на следующем рисунке.
Схема содержит плату Arduino Pro Mini, модуль инфракрасного датчика и ЖК дисплей. Плата Arduino управляет всем процессом функционирования устройства: считывание импульса с выхода модуля инфракрасного датчика, вычисление частоты вращения (в оборотах в минуту) и передача значения этой частоты на ЖК дисплей. Инфракрасный датчик используется для обнаружения объекта. Мы можем регулировать чувствительность данного датчика с помощью встроенного в него потенциометра. Модуль инфракрасного датчика состоит из инфракрасного передатчика и фотодиода, который обнаруживает инфракрасные лучи. Инфракрасный передатчик излучает инфракрасные лучи, когда эти лучи падают на поверхность, они отражаются от нее и улавливаются фотодиодом (более подробно об этих процессах можно прочитать в статье про робота, движущегося вдоль линии). Выход фотодиода подключен к компаратору, который сравнивает значение с выхода фотодиода с опорным напряжением и результат сравнения выдает на плату Arduino.
Выход модуля инфракрасного датчика напрямую подключен ко контакту 18 (A4) Arduino. Vcc и GND подсоединены к контактам Vcc и GND arduino. ЖК дсиплей подключен к плате Arduino в 4-битном режиме. Его управляющие контакты RS, RW и En напрямую подсоединены к контактам 2, GND и 3 Arduino. Контакты данных D4-D7 подключены к контактам 4, 5, 6 и 7 Arduino. В схеме также присутствует кнопка, которую необходимо нажать для подсчета числа оборотов. Наш тахометр на основе платы Arduino подсчитывает число оборотов в течение 5 секунд а потом по вышеприведенной формуле осуществляет пересчет этого значения в число оборотов в минуту. Кнопка подключена к контакту 10 Arduino.
Как сделать тахометр своими руками?
Если восстановить заводской прибор невозможно или дорого, его можно сделать своими руками. Эта же задача часто решается владельцами авто-мото транспорта, на которых тахометр не предусмотрен конструкцией.
Видео простейшего тахометра собранного своими руками из вольтметра, двигателя от старого принтера и диодного моста.
Устанавливать датчик на коленвал достаточно сложно, да и балансировка может нарушиться. Проще воспользоваться любым шкивом, которые вращаются синхронно с мотором.
Если есть отверстие – устанавливаем фото-пару и подключаем ее к электронному тахометру. Схему можно купить в виде готового KIT набора (на китайских сайтах электроники), либо собрать на доступной элементной базе.
Есть способы, как подключить самодельный тахометр к системе зажигания. Каждый импульс, подаваемый на высоковольтную свечную катушку, соответствует одному обороту коленвала.
Снимаем сигнал, и подаем на схему тахометра. Если на вашем автомобиле вышел из строя штатный прибор, или вы хотите продублировать его на отдельном табло – возможно подключение тахометра к генератору. Это самая распространенная схема подачи импульсов. Сигнал для счетчика оборотов берем от разъема «W» генератора. Подключение штатное, так работают многие модели заводских тахометров.
Если есть сомнения в правильности – посмотрите электрическую схему вашего авто, надо найти проводник от генератора к прибору.
Итог Изготовить самодельный тахометр достаточно просто, если есть элементарные навыки в электротехнике. При наличии паяльника и готовой схемы – это вопрос пары выходных.
Элементная база на любой вкус: от простенького счетчика импульсов до контроллера, собранного на ARDUINO. Главное понимать, как работает штатный прибор вашего авто.
Пример самодельного тахометра из компьютерной мышки. Все подробности в видео материале.
Для чего он нужен? Если сломался штатный тахометр – ответ очевиден. Если с вашей приборной доской все в порядке – можно добавить стильный элемент к интерьеру автомобиля. Цифровое табло легче считывается, а светодиодная индикация добавит наглядности.
Драйвер шагового двигателя Ардуино
Шаговый двигатель — это бесколлекторный синхронный двигатель, как и все двигатели, он преобразует электрическую энергию в механическую. В отличие от двигателя постоянного тока в которых происходит вращение вала, вал шаговых двигателей совершает дискретные перемещения, то есть вращается не постоянно, а шагами. Каждый шаг вала (ротора) представляет собой часть полного оборота.
Вращение вала двигателя осуществляется с помощью сигнала, который управляет магнитным полем катушек в статоре драйвера. Сигнал генерирует драйвер шагового двигателя. Магнитное поле, возникающее при прохождении электрического тока в обмотках статора, заставляет вращаться вал, на котором установлены магниты. Количество шагов задаются в программе с помощью библиотеки Arduino IDE.
Схема подключения шагового двигателя 28BYJ-48 к Arduino Uno через драйвер ULN2003 изображена на рисунке ниже. Основные характеристики мотора 28BYJ-48: питание от 5 или 12 Вольт, 4-х фазный двигатель, угол шага 5,625°. Порты драйвера IN1 — IN4 подключаются к любым цифровым выводам платы Arduino Mega или Nano. Светодиоды на модуле служат для индикации включения катушек двигателя.
Давайте проверим…
… как это все работает. В основном цикле я буду управлять мощностью мотора с помощью ШИМ-сигнала. Для наглядности я выведу показания скоростей в виде графиков. Кроме того, я добавлю вычисленную «возможную» скорость. Вычислять буду примитивно линейно: если на номинальном напряжении (analogWrite на 255) должна быть скорость 100 об/мин = 600 град/сек, то при половине напряжения (analogWrite на 128) должна быть скорость 50 об/мин = 300 град/сек и т.д. На графиках она будет отмечена синим.
Итак, посмотрим на угловую скорость выходного вала мотора, вычисленную в обработчике внешних прерываний (на каждом тике энкодера):
Синяя линия — предполагаемая скорость, красная — вычисленная. Она отстает, но тоже выглядит линейно. Только на очень малых значениях (при переходе через нуль) присутствуют «ступеньки» — паузы между тиками слишком большие и не помещаются в переменную типа word, поэтому скорость вычисляется некорректно.
Теперь посмотрим на скорость, вычисленную в обработчике прерываний таймера:
На графике явно присутствует «иголки» — резкие переходы между соседними точками, это вызвано низкой точностью измерений. Кроме того, можно заметить «отставание» красного графика от синего — «вершины» сигналов не на одной вертикали, у вычисленного она смещена правее. То есть, мотор уже давно отрабатывает другую скорость, а таймер еще не досчитал, и обновленная скорость еще не вычислялась.
Объединим оба метода, посмотрим на графики:
Радует то, что значения скоростей совпадают (оба метода вычисляют адекватные скорости). Даже если давать нагрузку на мотор и таким образом притормаживать его, оба графика будут синхронно увеличиваться и уменьшаться:
Красным обозначен метод определения скорости по таймеру, обратите внимание, что при перепадах красная линия всегда правее зеленой, то есть этот метод «отстает» от метода определения скорости на каждом тике энкодера. Теперь я попробую изменять период таймера, посмотрим, что из этого выйдет:
Теперь я попробую изменять период таймера, посмотрим, что из этого выйдет:
Как видим, наиболее гладкие графики получаются с таймером, настроенным на 20-50 мс. Если период уменьшать, то слишком сильно снижается точность, если период увеличивать, то вычисление скорости происходит слишком редко и ее значение «отстает» от реального.
Тахометр – прибор для измерения частоты вращающихся тел и объектов. Конкретно здесь – отличный пример использования датчика Холла для ардуинки.
СОВЕТЫ, МАТЕРИАЛЫ, ПОЛЕЗНЫЕ ССЫЛКИ
-
Датчик лучше крепить на оси, во избежание лишних вибраций
-
Предельная теоретическая измеряемая частота вращения – около 3 миллионов оборотов в минуту
-
Если показания “шумят” и “прыгают” – покрутите резистор настройки чувствительности
-
Почитать про аппаратные прерывания можно
ЗДЕСЬ
- Пачка редкоземельных магнитов очень дёшево КУПИТЬ
- Ардуинка, дисплей, серво, сам датчик, шлейфы КУПИТЬ
- Коробочка от губки для обуви
-
Наждак постоянно хотел удрать со стола и убегал от датчика, пришлось поставить его на резиновую прокладку
-
Наждак кстати из какого-то авиационного движка, куплен дедом на барахолке несколько лет назад за 120р. Сейчас такой движок стоит 7000р!!!
-
Сцена с компьютером снята примерно с 3 дубля – первый раз я ударился головой об стол (когда вылезал), потом камера не хотела фокусироваться на дисплее..
Алекс2020-01-09T01:39:23+03:00