LXF154:Arduino
|
|
|
Arduino Прерываем серию, чтобы рассмотреть программирование встроенной функции
=Arduino: Польза прерываний= Arduino – это не только монтаж. Ник Вейч покажет пару полезных приемов программирования и создаст радар контроля скорости с точностью лазера.
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Ранее мы узнали, как объединять компоненты различных типов в проектах Arduino, но сегодня мы прервемся на специальное руководство о том, как программировать в Arduino встроенную функцию.
Взгляните на этот простенький фрагмент кода:
int sensorValue=0; void setup() { pinMode(2, INPUT); digitalWrite(2, HIGH); pinMode(13, OUTPUT); } void loop() { sensorValue = digitalRead(2); digitalWrite(13, !sensorValue); }
Цепь представить себе легко: в ней всего одна нажимная кнопка, помещенная между выводом 2 и Землей, и при ее нажатии загорается встроенный светодиод на выводе 13.
Единственный вопрос, который мог у вас возникнуть – почему мы устанавливаем значение вывода в «единицу» (HIGH) и программно инвертируем считываемое значение для управления светодиодом. А это экономит время на добывание резистора 10 кОм, чтобы он выступал в качестве понижающего, если вы хотите подключить кнопку к плюсовому выводу напряжения питания и включать светодиод сигналом «единица» (HIGH).
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Нашим мозгам удобнее считать включение «единицей» (HIGH), но этого как раз и стоит остерегаться – то, во что хочется верить головой, иногда не самый эффективный способ решения проблемы. В нашем случае – в Arduino есть встроенные повышающие резисторы, которые удерживают выходной сигнал на уровне «единицы», и его уровень легко понизить простым нажатием кнопки. А вот встроенных понижающих резисторов нет, и если надо удерживать вывод на уровне «нуля», об этом придется думать самим.
Это важно помнить, хотя код такого и не отражает. Вы нажимаете кнопку, свет загорается, и попроси вы кого-нибудь написать соответствующий код, вы получили бы именно такой. С ним все в порядке. В основном цикле проверяется входной сигнал, и согласно с ним включается или отключается светодиод.
Ну, а теперь взгляните на следующий фрагмент кода:
int sensorValue=0; void setup() { pinMode(2, INPUT); digitalWrite(2, HIGH); pinMode(13, OUTPUT); } void loop() { int j; sensorValue = digitalRead(2); digitalWrite(13, !sensorValue); for (int i=0; i<1000; i++){ j = j+i*i; delay(100); j= 1; } }
В чем разница? Мы здесь добавили в цикл некие произвольные действия. Их смысл роли не играет: они вставлены лишь для иллюстрации. Что произойдет, если выполнить этот код на нашей цепи? На вид все то же, да? Если да, вы просто слишком медленно нажимаете кнопку... попробуйте еще!
Проблема в том, что все эти вычисления в главном цикле отнимают изрядную часть процессорного времени. А значит, за заданный временной интервал обработается меньшее количество итераций цикла; откуда следует, что код, проверяющий, нажата ли кнопка, будет выполняться реже, чем прежде, и некоторые нажатия кнопок вообще не обнаружатся.
Такая неотзывчивость может раздосадовать конечного пользователя: для регистрации события ему придется целенаправленно и убедительно давить на кнопку. Бывает и хуже. Переключающий сигнал датчика для наблюдения за определенными событиями часто очень непродолжителен (порядка нескольких десятков микросекунд, в зависимости от применяемых датчиков), и его легко пропустить совсем. А если вам требуется обеспечить действие почти сразу же по срабатыванию триггера? Например, если датчики близости робота говорят, что он вот-вот рухнет со скалы, надо, чтобы двигатели застопорились немедленно, а не когда от робота останется дымящаяся куча смятых деталей «Лего».
В подобных случаях не обойтись без прерываний. В большинство процессоров и во многие микропроцессоры встроен именно такой способ привлечения внимания работающего процесса – это вроде горячей телефонной линии прямо от босса.
Процессор выполняет себе свою обычную работу, но когда происходит нечто важное, он получает вызов от менеджера прерываний, который велит ему запустить процедуру обслуживания прерывания (Interrupt Service Routine – ISR). По сути дела, заданное условие самостоятельно проверяется особой частью микроконтроллера – без затрат времени нашего кода.
Процессор периодически проверяет, не установлен ли какой-либо флаг прерывания, и если да, то выполняет заранее заданное действие – исполняет заданный фрагмент кода. Код процедуры обслуживания прерывания не лишен ограничений: она не может принимать параметры и возвращать результаты, что может показаться серьезным недостатком. Но она способна изменять выполнение основного цикла, пользуясь глобальными переменными, или просто установить флаг, давая знать основному процессу, что произошло событие.
Из-за возможной перегрузки на стандартных микросхемах Atmega доступны всего два прерывания, связанных с выводами 2 и 3. Процедура обслуживания прерывания может быть запущена по возрастающему фронту (т. е. вывод переключается в состояние «единица»), по спадающему фронту или по изменению состояния – эти случаи покрывают все возможные ситуации.
Для кода Arduino существуют специальные команды прерывания, но главное – воспользоваться методом attachInterrupt() для установки ISR. Он принимает три параметра: используемое прерывание (0 = вывод 2, 1 = вывод 3), имя запускаемой процедуры обработки прерывания и событие, вызывающее прерывание. Упомянутым нами событиям в коде соответствуют константы RISING, FALLING и CHANGE. Вот наш пример, в котором управление на сей раз осуществляется прерываниями:
int sensorValue=0; void setup() { pinMode(2, INPUT); digitalWrite(2, HIGH); pinMode(13, OUTPUT); attachInterrupt(0,caught0,CHANGE); } void loop() { int j; for (int i=0; i<1000; i++){ j = j+i*i; delay(100); j= 1; } } void caught0(){ sensorValue = digitalRead(2); digitalWrite(13, !sensorValue); }
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Мы взяли код, который включает и выключает светодиод, и связали его с прерыванием. Так как событие возникает при изменении значения вывода, оно и включает, и выключает светодиод, поэтому мы считываем текущее значение.
Если событие будет очень-очень коротким, есть шанс, что к моменту считывания значения оно изменится снова – если вам нужна такая точность, можно сделать две отдельных процедуры обслуживания прерывания и управлять ими событиями RISING и FALLING, тем избежав необходимости проверять текущее состояние вывода. Теперь можно нажимать кнопку с любой скоростью – хотя посторонний код все еще выполняется, нажатия кнопок получают заслуженный ими приоритет.
Если требуются два прерывания – скажем, один датчик что-то включает, а другой выключает – можно добавить другую процедуру обслуживания прерывания и инициализировать ее точно таким же образом:
int sensorValue=0; void setup() { pinMode(2, INPUT); pinMode(3, INPUT); digitalWrite(2, HIGH); digitalWrite(3, HIGH); pinMode(13, OUTPUT); attachInterrupt(0,caught0,FALLING); attachInterrupt(1,caught1,FALLING); } void loop() { int j; for (int i=0; i<1000; i++){ j = j+i*i; delay(100); j= 1; } } void caught0(){ digitalWrite(13, HIGH); } void caught1(){ digitalWrite(13, LOW); }
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Любопытствуете, когда может возникнуть такая ситуация? Простой пример – датчик скорости. Чтобы вычислить скорость движения чего-либо, можно взять два датчика, обнаруживающих, когда объект проходит две заданные точки. Измерение времени между этими моментами позволит вычислить среднюю скорость.
В Arduino есть встроенный таймер, подсчитывающий время в миллисекундах. Его значение можно узнать в любой момент вызовом функции millis(), которая возвратит беззнаковое целое число [unsigned long] – количество миллисекунд, прошедших с момента включения таймера. Учтите, что это значение не всегда точное: процедуры обработки прерываний, особенно длинные, влияют на работу часов (потому что прерывания важнее всего), но для простой ISR заметной разницы не будет. Попробуйте следующий код:
int sensorValue=0; boolean running = LOW; unsigned long startTime; unsigned long intervalTime; void setup() { pinMode(2, INPUT); pinMode(3, INPUT); digitalWrite(2, HIGH); digitalWrite(3, HIGH); pinMode(13, OUTPUT); attachInterrupt(0,caught0,FALLING); attachInterrupt(1,caught1,FALLING); Serial.begin(9600); } void loop() { int j; for (int i=0; i<1000; i++){ j = j+i*i; delay(100); j= 1; } } void caught0(){ digitalWrite(13, HIGH); if (!running) { running = HIGH; startTime=millis(); } Serial.println(millis(), DEC); } void caught1(){ if (running){ running = LOW; digitalWrite(13, LOW); intervalTime=millis()-startTime; Serial.println(intervalTime, DEC); } }
В этой версии кода есть ряд изменений. Мы создали несколько переменных для хранения времени, а также булевскую переменную, выступающую в качестве флага. При нажатии первой кнопки процедура обработки прерывания устанавливает флаг в значение «единица» (HIGH), если оно еще не задано, и запускает таймер. Если флаг уже в состоянии «единица», событие полностью игнорируется. Это поведение означает, что мы не получим множественных
срабатываний триггера – таймер работает и продолжит работу до тех пор, пока не будет остановлен вторым нажатием кнопки/прерыванием. Оно проверит, что флаг находится в состоянии «единица» (HIGH), и если да, то остановит часы и определит разницу во времени – еще раз повторю, что подход с проверкой флага означает, что случайное срабатывание триггера не остановит часы до того, как они запущены. Затем результат отправляется по последовательной линии связи, потому что пока у нас нет выводного устройства (мы перейдем к нему через минуту).
В реальной системе не предполагается, что человек нажмет кнопку, пробежит мимо и затем нажмет другую кнопку – нужна какая-то пусковая система, не влияющая на скорость объекта. Существует множество способов ее сделать: от бэйджиков радиочастотной идентификации до датчиков давления, датчиков движения PIR и т. д. С точки зрения точности и дешевизны компонентов, лучший вариант – система с прерывистым лазерным лучом.
Направьте лазер на фоторезистор, и благодаря интенсивному сфокусированному лучу выходное значение сильно изменится даже при обильном фоновом освещении (при желании снизить влияние рассеянного света, поместите фотодиод в кусок соломинки или нечто подобное).
Остается преобразовать этот сигнал в событие, которое можно измерить. От аналоговых входов проку мало – прерывания на этих выводах не работают, и в любом случае процесс считывания аналогового значения слишком медленный; значит, нужно преобразовать аналоговое значение в цифровое. Если вы читали первую статью из этой серии (LXF151), то должны самодовольно поздравить себя с догадкой, что нам понадобится триггер Шмитта.
Мы уже говорили о том, как создать простой триггер Шмитта, и не будем углубляться в эту тему, ограничившись показом принципиальной схемы для тех, кто все пропустил.
Преимущество подобной обработки выходного сигнала двойное: во-первых, вы получаете «защищенный от шума» сигнал – здесь нет места для ложного срабатывания триггера и колебания выходного сигнала, вызывающее сложности в программе. Во-вторых, вы получаете сигнал с корректным логическим уровнем, однозначно передающим «единицу» или «ноль» на другое устройство или на Arduino.
Идем за покупками
Все это можно собрать самостоятельно, но, возможно, часть будет удобнее купить готовым. Можно приобрести интегральную схему со множеством триггеров Шмитта, часто в инвертирующем формате, так что низкому напряжению на входе соответствует «единица» на выходе, а высокому – «ноль».
Шесть триггеров Шмитта в стандартном 14-контактном DIP-корпусе доступны в микросхеме 74ACT14 – каждый обойдется пенсов в 10. Я обычно приобретаю чуть более удобные микросхемы 74F132 или HCF4093 со сдвоенными триггерами Шмитта, поступающими на вход вентиля «И-НЕ». Это означает, что можно подать сигнал на один из входов вентиля «И-НЕ» и управлять сигналом на другом входе (или подавать туда другой сигнал), чтобы переводить выходной сигнал схемы «И-НЕ» в состояние «единица» или «ноль». Если вам нужен одиночный инвертор, просто соедините оба входа.
Недостаток микросхем тот, что выходные уровни имеют малую мощность (с током порядка нескольких десятков мА) – для логических уровней они подходят прекрасно, но если вы хотите с их помощью управлять светодиодом или чем-то другим, все равно придется использовать транзистор.
Поэтому мы подключили к схеме подходящий резистор, чтобы создать делитель напряжения с фоторезистором. Убедитесь, что фоторезистор находится внизу схемы, чтобы при освещении лазером он формировал низкое выходное напряжение. Пройдя через инвертор Шмитта, этот сигнал преобразуется в обычный сигнал «единицы» (HIGH), который спадет, когда луч прервется. Если вы используете другие микросхемы или датчики, измените код соответствующим образом (или перепишите код так, чтобы он работал по возрастанию фронта сигнала – RISING).
Самая хитрая часть всей схемы – нацеливание лазеров на фоторезисторы. Если вы измеряете скорость бегуна или чего-то большого, необходима прочная опора, например, стопка кирпичей, потому что даже небольшое дрожание лазера может привести к ошибке в измерениях. Для лабораторных исследований, при которых луч проходит короткое расстояние, проще собрать некую рамку, которая поддерживает луч сфокусированным.
Наконец, для отображения результата нужно придумать способ получше. Для этого существуют модули многострочных ЖК-экранов. Большинство из них используют микросхему HD44780 как параллельный интерфейс к размещенным на плате оперативной памяти и логике управления дисплеем, поэтому передавать туда данные просто (существует библиотека Arduino специально для этих целей). Ей требуется шесть дополнительных выводов, так как она использует полубайтовый параллельный интерфейс (четыре линии с данными), но ресурсов Arduino тут вполне хватит.
В начале кода библиотеку нужно подключить явно:
- include <LiquidCrystal.h>
и создать экземпляр дисплея:
LiquidCrystal lcd(11,12,5,6,7,8);
Приведенные здесь параметры – выводы регистра выбора (Register Select – RS) и «доступен» (Enable – E) дисплея, за которыми следуют четыре вывода данных (DB4-7). Дисплей, как правило, имеет больше выводов, чем указано здесь (обычно 16), но точное местоположение выводов может отличаться, поэтому перед установкой дисплея в схему ознакомьтесь с документацией.
Также доступны несколько полезных методов:
lcd.begin(16,2); // установка дисплея с 2 строками и 16 столбцами
lcd.display(); // включение дисплея
lcd.nodisplay(); // выключение дисплея
lcd.print(“Hello, World!”); // печать строки
lcd.print(variable, DEC); // печать десятичного значения переменной
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
В документации есть и другие функции (www.arduino.cc/en/Tutorial/LCDLibrary), но почитайте документацию по ЖК-экрану – у вашей модели дисплея могут быть персональные свойства.
На этом наш рассказ о прерываниях закончен; они могут быть весьма полезны во всех типах проектов, включая двигатели и робототехнику, с которыми мы познакомимся в следующий раз.