Menu Home

Бесплатная техническая библиотека для любителей и профессионалов Бесплатная техническая библиотека


Arduino. Операции цифрового ввода-вывода. Энциклопедия радиоэлектроники и электротехники

Бесплатная техническая библиотека

Энциклопедия радиоэлектроники и электротехники / Радиолюбителю-конструктору

Комментарии к статье Комментарии к статье

Загрузив среду разработки Arduino IDE, можно увидеть, что в выведенной в открывшемся окне заготовке будущей программы присутствуют две функции: setup() и loop(). С функции setup() начинается работа любой программы. Она выполняет ее один раз сразу после подачи питания на плату, а также каждый раз после нажатия на имеющуюся на плате кнопку RESET, устанавливающую микроконтроллер в исходное состояние. Внутри этой функции задают режимы работы портов, инициализируют последовательный интерфейс и другие периферийные устройства, как находящиеся внутри микроконтроллера, так и подключенные к нему внешние. Эта функция, даже если она пуста, должна обязательно присутствовать в программе.

Функция loop() содержит бесконечный цикл, который микроконтроллер многократно выполняет, вплоть до выключения питания. В нем опрашивают внешние датчики, подают команды исполнительным устройствам, производят вычисления и прочие операции. В качестве примера приведем простейшую программу, которая с периодом в одну секунду зажигает, а затем гасит встроенный в плату Arduino светодиод, обозначенный на ней буквой L и подключенный к цифровому выводу D13.

Эта программа входит в число стандартных примеров, прилагаемых к среде разработки Arduino IDE. В табл. 1 приведен ее текст в том виде, в котором он приложен. Учтите, что на принятом в среде поклонников Arduino жаргоне исходный текст программы называют "скетчем" - эскизом.

Таблица 1

Arduino. Операции цифрового ввода-вывода

Фрагменты программы, относящиеся к одному блоку, ограничивают фигурными скобками { и }. Далее будем называть их операторными скобками. Текст программы может содержать комментарий, поясняющий ее суть и нюансы работы. Многострочный комментарий ограничивают сочетаниями символов /* (в начале) и */ (в конце). С символов // начинают комментарий, заканчивающийся в конце той же строки. При трансляции (преобразовании текста программы на понятном человеку языке программирования в исполняемый микроконтроллером машинный код) эта часть текста полностью игнорируется.

Единственная исполняемая строка тела функции setup()

pinMode(13, OUTPUT);

переводит вывод D13 платы Arduino в режим выхода.

Функция loop() начинается со строки

digitalwrite(13, HIGH);

Она устанавливает на выводе D13 высокий логический уровень. В Arduino UNO он равен напряжению питания (+5 В) относительно общего провода. Этим будет включен светодиод.

За ней следует строка

delay(1000);

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

digitalwrite(13, LOW);

Далее программа еще раз выдерживает паузу длительностью 1 с, после чего повторяет с начала всю последовательность операций, описанных в теле функции loop(). Так продолжается до выключения микроконтроллера.

Функцией delay() следует пользоваться с осторожностью. Если в течение указанного в ней интервала времени произойдет какое-либо важное событие (например, кратковременно сработает датчик), то программа на это событие не отреагирует.

Следует помнить, что максимальный ток, отдаваемый выводом Arduino, работающим как выход, равен 40 мА, при этом общий ток всех выходов не должен превышать 300 мА. Для питания обычных светодиодов этого достаточно, можно также напрямую подключить к выходу низковольтное герконовое реле или маломощный вибромотор от сотового телефона. Что-нибудь более мощное подключить без усилителя не получится, да это и опасно - можно испортить микроконтроллер.

Аналоговые входы A0-A5 при необходимости можно использовать наряду с D0-D13 как цифровые входы и выходы, обращаясь к ним соответственно по номерам с 14 по 19.

Теперь немного модифицируем программу. Для столь простого алгоритма эти модификации не принципиальны, но в более сложных случаях подобные изменения важны. Прежде всего, заменим комментарий на английском языке русским. Например, строку, включающую светодиод, прокомментируем так: "Включаем светодиод". Не следует писать: "Устанавливаем на линии D13 высокий уровень", это и так понятно из текста программы.

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

Далее изменим программу так, чтобы мигал светодиод, подключенный не к выводу D13, а к выводу D12 Arduino. Поскольку на плате светодиода, подключенного к D12, нет, потребуется внешний светодиод с добавочным резистором. Подключить его нужно по схеме, показанной на рис. 1. Добавочный резистор подбирают так, чтобы токче-рез светодиод находился в пределах 5...10 мА. Это обеспечит достаточно яркое свечение большинства светодиодов. Плата Arduino UNO с подключенным внешним светодиодом изображена на рис. 2.

Arduino. Операции цифрового ввода-вывода
Рис. 1. Схема подключения светодиода

Arduino. Операции цифрового ввода-вывода
Рис. 2. Плата Arduino UNO с подключенным внешним светодиодом

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

Чтобы управлять светодиодом, подключенным не к D13, а к D12, в рассматриваемом случае было бы достаточно исправить в тексте программы все числа 13 на 12. Не считая комментариев, число 13 фигурирует в тексте программы всего три раза, так что изменить его нетрудно. Однако с увеличением объема программы ситуация принципиально меняется. Одно дело заменить три числа и совсем другое несколько десятков одинаковых чисел в разных местах длинной программы. К тому же может оказаться, что где-нибудь это число обозначает что-то совсем другое и менять его не нужно.

Чтобы подобные изменения проводить было проще, объявим в начале программы переменную и присвоим ей значение, соответствующее номеру нужного вывода:

int LEDPIN = 12;

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

Модифицированная программа приведена в табл. 2. Ее необходимо загрузить в память микроконтроллера платы Arduino. Для этого следует выбрать в главном меню IDE пункт "Файл→Загрузить". Если набранная в окне редактирования программа не была сохранена в файл заранее, IDE попросит указать имя файла, в котором и сохранит ее. Спустя некоторое время, необходимое IDE Arduino на трансляцию программы в понятные микроконтроллеру машинные коды, на плате начнут мигать светодиоды "Rx" и "Tx", сигнализируя о приеме и передаче сообщений через последовательный интерфейс микроконтроллера.

Таблица 2

Arduino. Операции цифрового ввода-вывода

Если все было сделано правильно, в нижней части окна программы появится отчет о корректной загрузке. В нем будет выведена информация о том, какую часть из имеющихся 32 Кбайт программной памяти микроконтроллера заняла загруженная программа и сколько оперативной памяти требуется для размещения переменных. Светодиод, подключенный к выводу D12, начнет мигать с периодом 2 с.

Если подключить к выводам D8-D12 Arduino линейку из пяти светодиодов (рис. 3) и загрузить в микроконтроллер программу, приведенную в табл. 3, она будет поочередно включать на 500 мс каждый из этих светодиодов и подключенный к D13 светодиод, установленный на плате. Эта программа могла оказаться значительно длиннее, если бы задача решалась "в лоб", простым повторением нужное число раз в функции setup() строки с разными числовыми номерами выводов, настраивающей их на выход, а в функции loop() - последовательности строк, включающих очередной светодиод, выдерживающих паузу и выключающих его. Сократить программу помогли операторы цикла for.

Arduino. Операции цифрового ввода-вывода
Рис. 3. Линейка из пяти светодиодов

Таблица 3

Arduino. Операции цифрового ввода-вывода

В круглых скобках после ключевого слова for указаны начальное значение переменной цикла - LEDPIN=8, условие выполнения тела цикла - LEDPIN<14 и операцию, выполняемую с переменной цикла после каждого исполнения его тела - LEDPIN++, что означает увеличение значения переменной на единицу. При необходимости параметры цикла for могут быть легко изменены.

Тело цикла в операторных скобках следует за условием. В первом случае (в функции setup()) оно состоит из одной строки, которая будет выполнена шесть раз со значениями LEDPIN от 8 до 13. Во втором случае (в функции loop()) оператор цикла задает шестикратное выполнение последовательности из трех строк с такими же значениями переменной.

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

При напряжении питания 5 В, а в Arduino UNO оно именно такое, цифровые входы микроконтроллера гарантированно воспринимают как логически высокое (соответствующее логической единице) напряжение более +3 В, а как логически низкое (соответствующее логическому нулю) - напряжение менее +1,5 В. Промежуточные значения (в том числе, когда вход никуда не подключен) дают непредсказуемый, зависящий от экземпляра микроконтроллера, напряжения его питания, температуры и других факторов, хаотически изменяющийся результат. Поэтому желательно, чтобы на цифровой вход всегда было подано напряжение заведомо высокого или низкого логического уровня.

Простейший датчик - обычная кнопка без фиксации, подключенная по показанной на рис. 4 схеме к одному из внешних выводов платы Arduino, в данном случае к D7. При отпущенной кнопке SB1 уровень напряжения на входе микроконтроллера будет низким (его обеспечит резистор R1), при нажатой - высоким. Если поменять кнопку и резистор местами (рис. 5), то поменяются местами и уровни. Теперь резистор R1 обеспечит высокий уровень при отпущенной кнопке, а нажатие на нее установит низкий уровень.

Arduino. Операции цифрового ввода-вывода
Рис. 4. Схема подключения датчика

Arduino. Операции цифрового ввода-вывода
Рис. 5. Схема подключения датчика

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

Учтите, что для выполнения функции резистора R1 в микроконтроллере имеются внутренние резисторы. По умолчанию они отключены. Однако, чтобы подключить, скажем, к входу D2 внутренний резистор, достаточно внести в функцию setup() строку

pinMode(2, INPUT_PULLUP);

Рассмотрим цифровой ввод на примере приведенной в табл. 4 программы, гасящей подключенный к выводу 13 светодиод при нажатии на кнопку, подключенную к выводу D7. Она основана на условном операторе

if (условие)

{

/*Действия в случае, если условие выполнено*/

}

else

{

/*Действия в случае, если условие не выполнено*/

}

Таблица 4

Arduino. Операции цифрового ввода-вывода

Он служит для выбора действия в зависимости от того, выполнено или нет указанное в нем условие. Если при невыполненном условии ничего делать не нужно, фрагмент else {...} может быть опущен. Использование условных операторов придает программе гибкость. В зависимости от состояния внешних датчиков они изменяют порядок действий программы и поведение оснащенного микроконтроллером устройства.

Собственно проверку состояния кнопки выполняет логический оператор

digitalRead(BUT) = HIGH

В рассматриваемом случае он сравнивает значение, возвращаемое функцией чтения состояния вывода BUT, к которому подключена кнопка, с логической константой HIGH, и, если они равны, принимает значение TRUE (истина), а в противном случае - FALSE (ложь). Обратите внимание, что операция проверки равенства обозначена двумя подряд знаками равенства. А одним знаком равенства обозначают операцию присваивания значения переменной. Не путайте их, это приводит к трудно обнаруживаемым ошибкам.

На примере только что рассмотренной программы легко убедиться, к чему приводит неаккуратное использование функции delay(). Если "раскомментировать" (убрать две предшествующих дробных черты) функцию delay( 10000) в предпоследней строке программы, то после каждого выполнения тела функции loop() программа станет ждать 10 с, прежде чем продолжит свою работу. Естественно, все нажатия на кнопку за этот промежуток времени будут проигнорированы.

Очень полезна способность Arduino взаимодействовать с персональным компьютером через последовательный интерфейс. Ее можно использовать не только для загрузки программы в микроконтроллер, но и для двухстороннего обмена информацией в процессе ее выполнения. По этому интерфейсу Arduino может передавать в компьютер собранную информацию для сложной обработки или хранения и получать от него команды и исходные данные. Так могут взаимодействовать и два микроконт-роллерных устройства. Последовательный порт микроконтроллера использует цифровые выводы платы D0 и D1, поэтому при организации и использовании связи через последовательный порт их нельзя применять ни для чего другого.

Для примера рассмотрим программу, приведенную в табл. 5, которая передает в компьютер информацию о состоянии вывода D12. Если уровень на нем высокий, программа посылает в компьютер код символа H, а если он низкий - код символа L. Принимать эту информацию может любая программа, способная работать с COM-портом компьютера. Среда разработки Arduino IDE имеет встроенный монитор последовательного порта, с помощью которого компьютер может выводить на экран полученные от платы Arduino текстовые сообщения и передавать ему сообщения, набранные пользователем на клавиатуре компьютера.

Таблица 5

Arduino. Операции цифрового ввода-вывода

Строка Serial.begin(9600) в функции setup() инициализирует последовательный порт микроконтроллера и устанавливает скорость передачи и приема 9600 Бод. Можно задавать и другие стандартные значения скорости: 1200, 2400, 4800, 9600, 19200, 38400, 57600 или 115200 Бод. При этом скорость, установленная в микроконтроллере, должна совпадать со скоростью, на которую настроен COM-порт компьютера или другого устройства, с которым должен идти обмен информацией. Допустимая скорость, при которой обеспечивается надежный прием информации, зависит от длины кабеля, соединяющего Arduino c компьютером. Например, по стандартному USB-кабелю длиной 1,8 м компьютер примет от Arduino информацию даже со скоростью 115200 Бод. А если добавить к этому кабелю пятиметровый удлинитель, допустимая скорость упадет до 4800 Бод.

Отправляет информацию в последовательный порт функция Seri-al.print(), где в круглых скобках указывают имя переменной, значение Отправить которой нужно передать, или строку символов, подлежащих передаче. Для отличия от имени переменной строку символов заключают в кавычки. Существует модификация этой функции Serial.println(). Она отличается тем, что, передав информацию, заключенную в скобках (если она есть), дополняет ее символами возврата каретки и перевода строки. Начинает новую строку и комбинация символов в передаваемой строке.

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

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

Таблица 6.

Arduino. Операции цифрового ввода-вывода

Для того чтобы программа могла определить, есть ли в буфере принятые байты, имеется функция Serial.available(), возвращающая их число. Если они есть, программа с помощью функции Serial. read() читает байт из буфера и присваивает его значение (код принятого символа) переменной C типа char. Далее условные операторы сравнивают код с образцами и при совпадении включают или выключают светодиод.

Передавать команды можно с помощью того же монитора последовательного порта, который использовался для приема информации. В верхней части его окна (рис. 6) имеется строка ввода передаваемых символов. Введя в нее с клавиатуры символ или их последовательность, нажмите на экранную кнопку "Отправить". На плате Arduino должен кратковременно вспыхнуть светодиод "Rx", что свидетельствует о приеме информации микроконтроллером. Конечно, передача кодов вручную - это простой, но далеко не лучший метод управления. Обычно для этого пишут специальную компьютерную управляющую программу.

Arduino. Операции цифрового ввода-вывода
Рис. 6. Окно программы

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

Упомянутые в статье программы для Arduino можно скачать с ftp://ftp.radio.ru/pub/2016/08/diginout.zip.

Автор: Д. Лекомцев

Смотрите другие статьи раздела Радиолюбителю-конструктору.

Читайте и пишите полезные комментарии к этой статье.

<< Назад

Последние новости науки и техники, новинки электроники:

Микропластик в атмосфере - скрытый ускоритель глобального потепления 31.05.2026

Микропластик уже давно признан одним из самых масштабных загрязнителей планеты. Он проникает в океаны, почву, организмы животных и даже в тело человека. Однако до недавнего времени мало кто задумывался о его влиянии на климатические процессы. Новое исследование показало, что микро- и нанопластик в атмосфере способен поглощать тепло, тем самым внося дополнительный вклад в глобальное потепление. Ученые обнаружили, что воздействие пластиковых частиц на климат зависит от их цвета. Светлые частицы отражают солнечный свет и способствуют некоторому охлаждению, в то время как более темные - активно поглощают тепло и излучение. Со временем пластик в атмосфере темнеет под воздействием ультрафиолета, что усиливает его согревающий эффект. Этот процесс напоминает пожелтение пластиковых парковочных талонов, оставленных на солнце. Соавтор исследования, заслуженный профессор наук о Земле в Университете Дьюка Дрю Шинделл отметил, что влияние микропластика на изменение климата пока относительно не ...>>

Универсальный бытовой робот-гуманоид GigaAI SeeLight S1 31.05.2026

Развитие робототехники постепенно переносит сложные машины из промышленных цехов прямо в повседневную жизнь людей. Китайская компания GigaAI сделала важный шаг в этом направлении, представив SeeLight S1 - первую в стране модель универсального бытового робота-гуманоида. Эта разработка призвана взять на себя рутинные домашние дела и стать настоящим помощником в повседневной жизни. Уже в конце текущего месяца сотня роботов SeeLight S1 начнет проходить испытания в специализированном жилом комплексе, предназначенном для работников высокотехнологичных отраслей. По словам генерального директора GigaAI Чжу Чжэна, в первой половине 2027 года роботы будут переданы для бесплатного тестирования обычным семьям в Ухане - столице провинции Хубэй. Такой подход позволит собрать реальные данные о работе устройства в домашних условиях. В демонстрационном видео робот, передвигающийся на колесах, уверенно справляется с множеством бытовых задач. Он нарезает овощи, жарит яйца, загружает стиральную маши ...>>

Вкусовые пристрастия формируются еще в утробе 30.05.2026

Предпочтения человека к еде закладываются задолго до первого прикорма. Современная наука подтверждает, что ребенок начинает знакомиться с ароматами и вкусами пищи еще до рождения, через околоплодные воды. Новое международное исследование показало, что регулярное потребление определенных продуктов беременной женщиной может формировать долгосрочные пищевые предпочтения у ребенка, сохраняющиеся даже спустя годы после появления на свет. Ученые из университетов Великобритании, Франции и Нидерландов провели эксперимент с участием беременных женщин. Одной группе будущих мам давали капсулы с порошком капусты кейл, другой - с порошком моркови. Реакцию детей на эти запахи проверяли в три этапа: сначала в утробе матери с помощью 4D-УЗИ на поздних сроках беременности, затем в возрасте трех месяцев и, наконец, когда детям исполнилось три года. Результаты оказались весьма убедительными. Дети женщин, принимавших порошок кейла, положительно реагировали на запах этой капусты, но негативно - на ар ...>>

Случайная новость из Архива

Прикосновение на расстоянии 02.02.2023

Японские исследователи представили систему, позволяющую пользователям передавать физические ощущения и тактильную информацию между устройствами.

Японский оператор мобильной сети NTT Docomo вместе с проектом Embodied Media Project Университета Кейо и лабораторией Haptics Нагойского технологического института разработали платформу Feel Tech, которая "сделает возможным обмениваться ощущениями, которые обычно трудно передать с помощью изображений, звука, текста или слова".

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

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

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

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

Другие интересные новости:

▪ Озеро в стакане воды

▪ Гренландия катастрофически теряет лед

▪ Плата для разработчиков LeMaker Cello

▪ Когда стены убивают

▪ Карта расширения SilverStone ECU01 добавит 4 порта USB 3.0

Лента новостей науки и техники, новинок электроники

 

Интересные материалы Бесплатной технической библиотеки:

▪ раздел сайта Прошивки. Подборка статей

▪ статья Общественное мнение. Крылатое выражение

▪ статья Какое село является родиной двух маршалов и двенадцати генералов? Подробный ответ

▪ статья Комплектовщик. Должностная инструкция

▪ статья За сторожа - телефонный звонок. Энциклопедия радиоэлектроники и электротехники

▪ статья Регулируемый блок питания, 1-37 вольт 1,5 ампера. Энциклопедия радиоэлектроники и электротехники

[an error occurred while processing this directive] Оставьте свой комментарий к этой статье:

Имя:


E-mail (не обязательно):


Комментарий:





Главная страница | Библиотека | Статьи | Карта сайта | Отзывы о сайте

www.diagram.com.ua

www.diagram.com.ua
2000-2026