Оглавление:
Видео: Методы синхронизации Arduino с помощью Millis (): 4 шага
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:51
В этой статье мы познакомимся с функцией millis (); функцию и использовать ее для создания различных примеров синхронизации.
Миллис? Ничего общего с синхронизаторами губ … надеюсь, вы узнали, что милли является числовым префиксом для одной тысячной; то есть умножение единицы измерения на 0,001 (или десять в степени отрицательной 3).
Интересно, что наши системы Arduino будут считать количество миллисекунд (тысяч секунд) от начала выполнения скетча до тех пор, пока счет не достигнет максимального числа, которое может быть сохранено в переменной типа unsigned long (32-битное [четырехбайтовое] целое число - который находится в диапазоне от нуля до (2 ^ 32) -1. (2 ^ 32) -1, или 4294967295 миллисекунд преобразуется в 49,71027-нечетных дней.
Счетчик сбрасывается, когда Arduino сбрасывается, достигает максимального значения или загружается новый скетч. Чтобы получить значение счетчика в конкретный момент, просто вызовите функцию, например:
начало = миллис ();
Где start - длинная переменная без знака. Вот очень простой пример, демонстрирующий вам millis () в действии:
/ * демонстрация millis () * /
беззнаковый длинный старт, завершено, истекло;
установка void ()
{Serial.begin (9600); }
пустой цикл ()
{Serial.println ("Начать…"); начало = миллис (); задержка (1000); Готово = миллис (); Serial.println («Готово»); elapsed = готово-старт; Serial.print (истекший); Serial.println («прошедшие миллисекунды»); Serial.println (); задержка (500); }
Эскиз сохраняет текущее количество миллисекунд в начале, затем ждет одну секунду, а затем снова сохраняет значение миллисекунд в завершении. Наконец, он вычисляет истекшее время задержки. На следующем дампе экрана монитора последовательного порта вы можете видеть, что продолжительность не всегда составляла точно 1000 миллисекунд, как показано на изображении.
Шаг 1:
Проще говоря, функция millis использует внутренний счетчик в микроконтроллере ATmega в сердце вашего Arduino. Этот счетчик увеличивает каждый такт, что происходит (в стандартном Arduino и совместимых устройствах) при тактовой частоте 16 МГц. Эта скорость контролируется кристаллом на плате Arduino (серебряная штука с оттиском T16.000).
Шаг 2:
Точность кристалла может варьироваться в зависимости от внешней температуры и допуска самого кристалла. Это, в свою очередь, повлияет на точность результата в миллисекундах. По неофициальным данным, дрейф в точности отсчета времени может составлять около трех или четырех секунд за 24-часовой период.
Если вы используете плату или свою собственную версию, в которой вместо кристалла используется керамический резонатор, обратите внимание, что они не такие точные и могут привести к более высоким уровням дрейфа. Если вам нужен гораздо более высокий уровень точности синхронизации, рассмотрите специальные микросхемы таймера, такие как Maxim DS3231.
Теперь мы можем использовать миллис для различных функций времени. Как показано в предыдущем примере скетча, мы можем вычислить прошедшее время. Чтобы реализовать эту идею, давайте сделаем простой секундомер. Это может быть настолько просто или сложно, насколько это необходимо, но в этом случае мы остановимся на простом.
Что касается аппаратного обеспечения, у нас будет две кнопки - Start и Stop - с понижающими резисторами 10 кОм, подключенными к цифровым контактам 2 и 3 соответственно. Когда пользователь нажимает кнопку «Пуск», в эскизе будет указано значение миллис - затем, после нажатия кнопки «Стоп», в эскизе снова будет записано значение в миллис, вычислено и отобразится прошедшее время. Затем пользователь может нажать кнопку «Пуск», чтобы повторить процесс, или «Остановить» для получения обновленных данных. Вот набросок:
/ * Супер-базовый секундомер с использованием millis (); * /
беззнаковый длинный старт, завершено, истекло;
установка void ()
{Serial.begin (9600); pinMode (2, ВХОД); // кнопка запуска pinMode (3, INPUT); // кнопка остановки Serial.println ("Нажмите 1 для запуска / сброса, 2 для истекшего времени"); }
void displayResult ()
{float h, m, s, ms; беззнаковый длинный конец; elapsed = готово-старт; h = int (прошедшее / 3600000); over = истек% 3600000; m = int (более / 60000); более = более% 60000; s = int (более / 1000); мс = более% 1000; Serial.print ("Исходное прошедшее время:"); Serial.println (истекший); Serial.print ("Прошедшее время:"); Serial.print (h, 0); Serial.print ("h"); Serial.print (м, 0); Serial.print («м»); Serial.print (s, 0); Serial.print ("s"); Serial.print (мс, 0); Serial.println ("мс"); Serial.println (); }
пустой цикл ()
{если (digitalRead (2) == ВЫСОКИЙ) {начало = миллис (); задержка (200); // для устранения проблемы Serial.println ("Начато…"); } если (digitalRead (3) == ВЫСОКИЙ) {готово = миллис (); задержка (200); // для противодействия displayResult (); }}
Вызовы delay () используются для устранения неполадок переключателей - они не являются обязательными, и их использование будет зависеть от вашего оборудования. Изображение является примером вывода скетча на монитор последовательного порта: секундомер запустился, а затем была нажата кнопка два шесть раз в разные периоды времени.
Шаг 3. Спидометр…
Если бы у вас был датчик в начале и в конце фиксированного расстояния, скорость можно было бы вычислить: скорость = расстояние ÷ время.
Вы также можете сделать спидометр для колесной формы движения, например велосипеда. В настоящее время у нас нет велосипеда, с которым можно было бы возиться, однако мы можем описать процесс, как это сделать - это довольно просто. (Отказ от ответственности - делайте это на свой страх и риск и т. Д.)
Прежде всего, давайте рассмотрим необходимую математику. Вам нужно будет знать окружность колеса. Аппаратная - вам понадобится датчик. Например - геркон и магнит. Считайте герконовый переключатель нормально разомкнутой кнопкой и подключайте его как обычно с понижающим резистором 10 кОм.
Другие могут использовать датчик Холла - каждый свой). Помните из урока математики, чтобы вычислить длину окружности, используйте формулу: длина окружности = 2πr, где r - радиус окружности.
Теперь, когда у вас есть окружность колеса, это значение можно рассматривать как «фиксированное расстояние», и поэтому скорость может быть рассчитана путем измерения времени, прошедшего между полным оборотом.
После установки датчик должен действовать так же, как нормально разомкнутая кнопка, которую нажимают при каждом повороте. Наш эскиз будет измерять время, прошедшее между каждым импульсом от датчика.
Для этого в нашем примере выход датчика будет подключен к цифровому выводу 2, так как он вызовет прерывание для расчета скорости. В противном случае скетч будет отображать скорость на обычном ЖК-модуле с интерфейсом I2C. Предлагается интерфейс I2C, поскольку для этого требуется всего 4 провода от платы Arduino до ЖК-дисплея - чем меньше проводов, тем лучше.
Вот набросок для вашего прочтения:
/ * Базовый спидометр с использованием millis (); * /
#include "Wire.h" // для ЖК-дисплея шины I2C
#include "LiquidCrystal_I2C.h" // для ЖК-модуля с шиной I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // устанавливаем адрес ЖК-дисплея на 0x27 для 16-символьного и 2-строчного дисплея
поплавковый старт, завершено;
время плавания истекло; float circMetric = 1,2; // окружность колеса относительно положения датчика (в метрах) float circImperial; // через 1 километр = 0,621371192 мили float speedk, speedm; // содержит расчетные значения скорости в метрических и британских единицах
установка void ()
{attachInterrupt (0, speedCalc, RISING); // прерывание вызывается, когда датчики посылают цифру 2 high (каждый оборот колеса) start = millis (); // настройка ЖК-дисплея lcd.init (); // инициализируем ЖК-дисплей lcd.backlight (); // включение подсветки ЖК-дисплея lcd.clear (); lcd.println («Наденьте шлем!»); задержка (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric *.62137; // конвертируем метрическую систему в британскую для расчета миль в час}
void speedCalc ()
{elapsed = millis () - начало; начало = миллис (); speedk = (3600 * circMetric) / истекло; // км / ч speedm = (3600 * circImperial) / elapsed; // Миль в час }
пустой цикл ()
{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("км / ч"); lcd.print (int (speedm)); lcd.print («миль в час»); lcd.setCursor (0, 1); lcd.print (int (истекло)); lcd.print ("мс / об"); задержка (1000); // настраиваем в соответствии с личными предпочтениями, чтобы минимизировать мерцание}
Происходит не так уж много - каждый раз, когда колесо совершает один оборот, сигнал от датчика будет переходить с низкого на высокий, вызывая прерывание, которое вызывает функцию speedCalc ().
Это берет показание в миллис (), а затем вычисляет разницу между текущим показанием и предыдущим показанием - это значение становится временем, чтобы преодолеть расстояние (которое является окружностью колеса относительно датчика - хранится в
float circMetric = 1,2;
и измеряется в метрах). Наконец, он рассчитывает скорость в км / ч и миль / ч. Между прерываниями скетч отображает обновленные данные о скорости на ЖК-дисплее, а также исходное значение времени для каждого оборота ради любопытства. В реальной жизни я не думаю, что кто-то установил бы ЖК-дисплей на велосипед, возможно, светодиодный дисплей был бы более уместным.
А пока вы можете увидеть, как работает этот пример, в следующем коротком видеоклипе. Вместо велосипедного колеса и герконового переключателя / магнита я подключил прямоугольный сигнал от функционального генератора к контакту прерывания, чтобы имитировать импульсы от датчика, чтобы вы могли понять, как это работает.
Шаг 4:
Это примерно подводит итог использования millis () на данный момент. Также есть микросхемы (); функция, которая считает микросекунды.
Итак, у вас есть еще одна практическая функция, которая может позволить решить больше проблем с помощью мира Arduino. Как всегда, теперь вам и вашему воображению нужно найти что-то, что можно контролировать, или противостоять другим махинациям.
Этот пост предоставлен pmdway.com - все для производителей и любителей электроники с бесплатной доставкой по всему миру.
Рекомендуемые:
Лазерная система синхронизации Arduino: 6 шагов (с изображениями)
Лазерная система синхронизации Arduino: в рамках моего обучения мне нужна была система для точного измерения того, как быстро модель автомобиля проходит 10 метров. Изначально я думал, что куплю дешевую готовую систему на eBay или Aliexpress, эти системы широко известны как световые ворота, фо
Промышленные пара роботы Técnicas De Cableado FTC - Методы и рекомендации: 4 шага
Технические характеристики промышленных пара-роботов FTC - Методы и рекомендации: многие технические средства и базовые кабели для настройки электрических роботов. Sin embargo, estos métodos y materiales básicos no bastarán para Requisitos de cableado más avanzados. Ya sea que su eq
Методы промышленного подключения роботов FTC - методы и советы: 4 шага
Промышленные методы электромонтажа для роботов FTC - методы и советы: многие команды FTC полагаются на базовые методы и инструменты электромонтажа при настройке электроники для своих роботов. Однако этих основных методов и материалов будет недостаточно для более сложных требований к проводке. Использует ли ваша команда более продвинутые ощущения
Методы определения уровня воды Arduino с помощью ультразвукового датчика и датчика воды Funduino: 4 шага
Методы определения уровня воды Arduino с помощью ультразвукового датчика и датчика воды Funduino: в этом проекте я покажу вам, как создать недорогой датчик воды, используя два метода: 1. Ультразвуковой датчик (HC-SR04) 2. Датчик воды Funduino
Добавление разъема синхронизации ПК к кабелю Nikon Sc-28 TTL (используйте автоматические настройки для включения вспышки камеры и включения вспышки выключения камеры !!): 4 шага
Добавьте разъем синхронизации ПК к кабелю Nikon Sc-28 Ttl (используйте автоматические настройки для включения вспышки камеры и запуска вспышки выключения камеры !!): в этой инструкции я покажу вам, как удалить один из этих надоедливых проприетарных 3-контактных разъемов TTL на сторона кабеля TTL снятого с камеры Nikon SC-28 и замените его стандартным разъемом синхронизации ПК. это позволит вам использовать специальную вспышку, s