Функционал платформы
Что такое микроконтроллер?
Микроконтроллер представляет собой микросхему, которая используется для управления электронными устройствами. Типичный микроконтроллер сочетает на одном кристалле функции процессора и периферийных устройств, содержит ОЗУ и (или) ПЗУ. По сути, это однокристальный компьютер, способный выполнять относительно простые задачи. Не стоит путать с микропроцессором, так как он не содержит в себе периферийных устройств.
Под периферийными устройствами обычно понимают порты входа/выхода, ШИМ-модуляторы, таймеры, радиочастотные приёмники и так далее.
Что такое Arduino?
Arduino – эффективная аппаратно-программная платформа для проектирования и создания новых устройств, состоящая из самой платы и программного обеспечения.
Arduino применяется для создания электронных устройств с возможностью приема сигналов от различных цифровых и аналоговых датчиков, которые могут быть подключены к нему, и управления различными исполнительными устройствами. Проекты устройств, основанные на Arduino, могут работать самостоятельно или взаимодействовать с программным обеспечением на компьютере.
Arduino Uno – есть эталонная модель платформы типа Arduino.Существуют и другие модели, такие как Arduino Nano и Arduino Mega.
Его состав следующий:
- количество цифровых входов и выходов составляет 14 (а шесть из них имеют возможность использовать как выходы ШИМ; для ШИМ используются выводы за номерами 3,5, 6, 9,10,11).
- число аналоговых входов составляет шесть (A0 – A5).
- 16 МГц – кварцевый резонатор.
- имеется разъём для питания.
- есть разъём, предназначенный для ICSP-программирования внутри самой схемы.
- присутствует кнопка для сброса (вывод Reset).
Как программировать Arduino?
Микроконтроллер Arduino программируется на специальном языке программирования, основанном на C/C ++. Язык программирования Arduino является разновидностью C++ и называется Wiring, другими словами, отдельного языка программирования для Arduino не существует.
C++ – компилируемый, статически типизированный язык программирования общего назначения. Код на таком языке состоит из отдельных блоков, называемых методами и функциями.
В программах для Arduino существуют две обязательные функции и . Их присутствие обязательно в любой программе на C++ для Arduino. Они могут ничего и не делать, но должны быть написаны. Так как любая программа состоит из отдельных блоков, то начало блока в C/C++ обозначается левой фигурной скобкой { , а конец-правой фигурной скобкой } .
Пример:
void setup() { pinMode(3, OUTPUT); } void loop() { digitalWrite(3, HIGH); }
Ardublockly – это графический язык программирования для Arduino, предназначенный для новичков. Он прост в использовании.
Почему analogRead() возвращает значение от 0 до 1023?
Это связано с разрешением АЦП. Разрешение (в рамках этой статьи) – это степень, в которой что-то может быть представлено численно. Чем выше разрешение, тем выше точность, с которой что-то можно представить. Мы измеряем разрешение в терминах количества бит разрешения.
Например, 1-битное разрешение позволит использовать только два (два в степени одного) значения – ноль и единицу. 2-битное разрешение позволило бы получить четыре (два в степени двух) значения – ноль, один, два и три. Если мы попытаемся измерить диапазон в пять вольт с двухбитным разрешением, а измеренное напряжение будет равно четырем вольтам, наш АЦП вернет числовое значение 3 – при падении четырех вольт между 3,75 и 5В. Проще представить это с изображением выше.
Таким образом, в нашем примере АЦП с 2-битным разрешением может представлять напряжение только с четырьмя возможными результирующими значениями. Если входное напряжение падает между 0 и 1,25, АЦП возвращает цифру 0; если напряжение падает между 1,25 и 2,5, АЦП возвращает числовое значение 1. И так далее. С диапазоном АЦП нашего Arduino от 0 до 1023 – у нас есть 1024 возможных значения – или от 2 до 10, поэтому у наших Arduino есть АЦП с 10-битным разрешением.
Объяснение работы программы
Для того, чтобы полноценно использовать АЦП в Arduino Uno, необходимо сделать следующие вещи:
Прежде всего необходимо отметить что каналы АЦП Arduino Uno имеют по умолчанию опорное значение 5 В (опорное напряжение). Это означает, что максимальное входное значение напряжения для каждого канала АЦП Arduino составляет 5 В. Но некоторые датчики имеют выходное напряжение в диапазоне 0-2,5 В, поэтому если мы будем использовать опорное напряжение по умолчанию (5 В), то мы потеряем в точности измерений. В связи с этим полезно иметь возможность изменения значения опорного напряжения, для Arduino Uno это делается с помощью команды “analogReference();”.
По умолчанию мы имеем разрешающую способность АЦП, равную 10 бит, разрешение АЦП мы также можем изменить используя команду “analogReadResolution(bits);”. Это может быть полезно в ряде случаев.
Теперь, если все установки параметров работы АЦП нами сделаны, мы можем считать значение АЦП с канала ‘0’ просто используя инструкцию “analogRead(pin);”, где “pin” означает контакт (вывод), на который мы подаем аналоговый сигнал, в нашем случае это будет контакт “A0”. Значение с выхода АЦП может быть преобразовано в число типа integer, например, с помощью инструкции “int ADCVALUE = analogRead(A0);”, в результате выполнения этой инструкции значение с используемого канала АЦП после проведения преобразования (то есть АЦП) сохраняется в переменной целого типа (integer) под названием “ADCVALUE”.
Теперь несколько слов о работе с ЖК дисплеем 16×2. Сначала мы должны подключить необходимый заголовочный файл с помощью команды ‘#include <LiquidCrystal.h>’, этот заголовочный файл содержит все необходимые функции для работы с ЖК дисплеем. По умолчанию функционал этого файла настроен для работы с ЖК дисплеем в 4-битном режиме. С помощью этого заголовочного файла нам не нужно будет заботиться о том, чтобы передавать данные в ЖК дисплей бит за битом и писать какие либо собственные функции для работы с ЖК дисплеем.
Далее мы должны указать какой именно тип ЖК дисплея мы будем использовать. Существуют различные типы ЖК дисплеев, например, 20×4, 16×2, 16×1 и т.д. Мы в нашем проекте будем использовать ЖК дисплей 16×2, поэтому мы должны будем записать команду ‘lcd.begin(16, 2);’. А если бы у нас был дисплей 16×1, то нам бы пришлось использовать команду ‘lcd.begin(16, 1);’.
Далее мы Arduino Uno должны указать, к каким ее контактам мы подключили ЖК дисплей. В нашем случае мы к Arduino Uno подключили следующие выводы ЖК дисплея: “RS, En, D4, D5, D6, D7”. Мы подключили их к контактам 0, 1, 8, 9, 10, 11 Arduino Uno, поэтому в нашем случае соответствующая команда будет иметь следующий вид: “LiquidCrystal lcd(0, 1, 8, 9, 10, 11);”.
После всего этого мы можем приступит к передаче данных на ЖК дисплей. Сделать это можно, к примеру, с помощью следующей команды: “lcd.print(«hello, world!»);”. В результате выполнения этой команды на экран ЖК дисплея будет выведена строка ‘hello, world!’.
Делитель напряжения.
Здесь мы разберем потенциальную и вполне себе реальную ситуацию — пусть нам требуется измерить напряжение, которое заведомо может превышать опорное. Физически на аналоговый вход не рекомендуется, более того, воспрещается, подавать сигнал более 5.5 В (для Arduino Uno). Это просто-напросто может вывести микроконтроллер из строя.
Поэтому для того, чтобы измерить напряжение, допустим, от 0 до 12 В, можно использовать простейший делитель напряжения, представляющий из себя два резистора. Подключение производится следующим образом:
Про делитель напряжения в целом написано около миллиарда статей, поэтому дублировать не буду, а сейчас рассмотрим конкретный пример расчета. Приведу финальную формулу для напряжения в точке 1:
U_1 = \frac{U_2 \cdot R_1}{R_1 + R_2}
По условию нашей выдуманной задачи измеряемый сигнал (U_2 \medspace) может принимать максимальное значение равное 12 В. В качестве опорного напряжения — 5 В, то есть максимальное напряжение на аналоговом входе (U_1 \medspace) составляет столько же, 5 В. Кстати, технически мы можем подать сигнал от 5 до 5.5 В, что допустимо для данного контроллера. Но практической ценности в этом минимум — любое значение, превышающее опорное напряжение, даст результат равный 1023.
Возвращаемся к примеру: из всего вышесказанного следует простой факт, что 12 Вольтам в точке 2 должны соответствовать 5 Вольт в точке 1. Исходя из этих простых сведений производим расчет делителя напряжения, то есть номиналов резисторов. Ток, потребляемый аналоговым входом Ардуино очень мал, поэтому его значением пренебрегаем. В итоге получаем, что по цепи точка 2 — точка 1 — GND течет один и тот же ток:
И рассчитать его можно следующим образом (в точке GND напряжение равно 0 В):
I = \frac{U_1 - 0}{R_1} = \frac{U_2 - U_1}{R_2}
При этом мы уже знаем величины напряжений, они попросту являются входным данными в нашей задаче:
U_2 = 12 \medspace В \\ U_1 = 5 \medspace В
Подставив значения в предыдущую формулу получим соотношение:
\frac{R_2}{R_1} = \frac{U_2 - U1}{U_1} = \frac{7}{5} = 1.4
Таким образом, мы теперь знаем, каким должно быть соотношение сопротивлений резисторов. Абсолютные же величины выбираются исходя из требований конкретной задачи, мы не будем в это углубляться в этой статье. В двух словах, если разрабатывается, например, устройство, критичное к потребляемой мощности, то стоит постараться уменьшить ток через делитель и взять сопротивления побольше, поскольку по закону Ома, как вы помните, ток обратно пропорционален сопротивлению:
I = \frac{U}{R}
В нашем же случае ограничим себя «средними» величинами от 0 до 10-20 КОм. То есть сумма R_1 + R_2 пусть будет в районе этих самых 10-20 КОм. Остается подобрать величины исходя из ряда номиналов, чтобы их отношение было максимально близко к 1.4. Выбираем:
R_2 = 5.1 \medspace КОм \\ R_1 = 3.6 \medspace КОм
Тогда при напряжении в точке 2, равном 12 В, в точке 1 получим:
U_1 = \frac{U_2 \cdot R_1}{R_1 + R_2} = \frac{12 \cdot 3.6}{3.6 + 5.1} = 4.96 \medspace В
То есть мы заведомо не превысим ограничение в 5 В на аналоговом входе Ардуино, что нас полностью устраивает. Получаем итоговую принципиальную схему:
И вот теперь уже самое время продвинуться к практической части!
Практическая часть.
Электронный модуль
Модуль – это специальная удобная плата на базе какой-то микросхемы или электронного компонента. Модуль может быть датчиком, драйвером, интерфейсом, памятью, дисплеем и так далее. Зачем использовать модуль, почему не взять конкретный компонент? Если вы хотите делать электронное устройство на печатной плате – конечно же лучше собирать его из голых компонентов, а не из модулей, потому что в большинстве случаев это выйдет дешевле, а также изготовление такой платы можно заказать вместе со сборкой на производстве (например на JLCPCB). Но мы с вами собираемся сначала научиться программировать, поэтому модули имеют неоспоримые преимущества:
- Основная концепция Ардуино – электронный конструктор, быстрое и простое создание прототипов электронных устройств без помощи паяльника.
- Микросхема очень маленькая, подключать её к чему-то – не очень приятная затея. У модуля выведена рейка для подключения проводов и работы на макетной плате.
- Чтобы подключить голую микросхему – понадобится изучить документацию. У модуля все нужные для подключения пины выведены и подписаны.
- Для корректной работы большинства микросхем требуются дополнительные компоненты (драйверы, контроллеры, резисторы, стабилизаторы, конденсаторы, индуктивности, кварцевые генераторы), посчитанные, выбранные и установленные согласно документации. На плате модуля всё это уже есть.
- У некоторых модулей на плате предусмотрена настройка: крутилки, джамперы, переключатели, перемычки для спайки паяльником.
4Описание датчика тока,напряжения и мощности INA219
Датчик INA219 – цифровой датчик тока, напряжения и мощности. Он позволяет измерять напряжения от 0 до 26 вольт и ток от 0 до 3,2 ампер. Питается датчик напряжением от 3 до 5,5 В. Существуют модули, полностью готовые к подключению к Arduino. Один из таких модулей GY-219:
Модуль GY-219 с датчиком тока INA219: назначение выводов и частей
Датчик INA219 выполняется в двух разновидностях: A и B. Последняя отличается повышенной точностью и меньшей погрешностью. На фото ниже как раз модификация INA219B.
Модуль GY-219 с датчиком тока INA219
Датчик INA219 имеет 12-разрядный АЦП, соответственно при максимуме измерений ±3,2 А получается разрешающая способность 0,8 мА. Однако можно настроить датчик таким образом, чтобы уменьшить диапазон измеряемой силы тока до ±400 мА; при этом разрешающая способность датчика увеличится до 0,1 мА. При этом можно откалибровать датчик, записав калибровачные данные в специальный регистр. Измеренные данные силы тока, напряжения и можности хранятся в трёх соответствующих регистрах. Кстати, датчик INA219 позволяет осуществлять аппаратную фильтрацию по 128 отсчётам, если измеряемый ток имеет сильные наводки.
Для конфигурирования датчика INA219 и для считывания показаний с него используется последовательный интерфейс I2C. Причём адрес на шине можно задать с помощью перемычек A0 и A1 на модуле. Допустимые адреса:
- 0x40 (без перемычек);
- 0x41 (с перемычкой A0);
- 0x44 (с перемычкой A1);
- 0x45 (установлены обе перемычки).
Соответственно, на одной шине IIC можно иметь до 4-х таких датчиков, подключённых одновременно.
Преобразование с контролем границ
Микроконтроллеры серии 1986ВЕ9х и 1901ВЦ1Т имеют в своём арсенале 2 независимых АЦП – ADC1, ADC2, которые входят в состав блока АЦП. Общая схема приведена на рисунке 1.
Основной идеей данного примера является использование контроля уровня входного сигнала. В начале примера зададим следующие переменные:
которые являются границами и за которыми МК будет следить. Изменять на входе напряжение будем с помощью подстроечного резистора, который согласно описанию платы, подключен к 7 каналу АЦП. Для этого необходимо установить перемычку на разъём XP6 в положение “TRIM” (рисунок 2).
Таким образом, в случае нарушения данных границ, то есть выхода за границы интервала от 0x800 до 0x900, МК возведёт флаг Flg REG AWOIFEN в регистре ADCx_STATUS.
Как работать с аналоговым входом?
С теорией разобрались, перейдем к практике. В любой программе ардуино есть две основных функции:
- void setup() – в ней настраивается режим работы микроконтроллера или его определенных узлов, а также назначаются его пины для работы в качестве входа или выхода.
- void loop() — это непосредственно программа, которая выполняется циклично строчка за строчкой.
Перед void setup() указываются библиотеки, которые будут использованы в программе, задаются какие-то переменные и прочее.
Для начала выберем аналоговый пин и настроим его для работы в качестве входа для этого пишем
Здесь A0 – номер аналогового входа, input – режим работы в качестве входа.
Если вы не знаете какие пины и для чего могут использоваться – вам поможет карта пинов ардуино, вы можете найти её для каждой версии платы по запросу «adruino uno pinout», если плата Arduino UNO, если у вас другая модификация, например, nano, пишем соответственно «arduino nano pinout» и так далее для каждого случая.
Здесь мы видим, что аналоговые выходы, они выделены зеленым цветом, кстати, цифровые номера пинов сохраняются и вы можете использовать вместо A0, например, просто цифру 14 — pinMode(14, input) — это аналогичное выражение в коде. В Arduino UNO аналоговых входов 6, в nano их уже 8 (несмотря на то что она построена на таком же микроконтроллере), а в Mega их аж 16.
Добавим к коду возможность чтения данных с последовательного порта. Это нужно для того, чтобы микроконтроллер передавал компьютеру какую-то информацию, и мы могли её прочитать. Для этого нужно использовать команду со следующим синтаксисом Serial.begin(9600) (размеры букв важны, нужно писать именно так), тогда код примет вид:
На этом настройка микроконтроллера завершена.
Пока что оставим программирование. Мы рассмотрим, как изменяются данные с аналогового входа на примере потенциометра. Для этого подключим его крайние выводы к источнику питания, а средний вывод ко входу А0.
Потенциометр подойдет на 1….10 кОм. Собираем элементарную схему и открываем Arduino IDE. Дальше будем использовать такой код:
Подключим по указанной схеме потенциометр, у меня оказался чуть меньше чем на 9.2 кОм.
И соберем схему, обратите внимание, если датчик питается от одного, а ардуино от другого источника питания, как у меня, то нужно соединить их минусы (gnd), иначе работать не будет. Дальше включаем монитор порта в Arduino IDE и можем наблюдать какое значение у нас на аналоговом входе. Дальше включаем монитор порта в Arduino IDE и можем наблюдать какое значение у нас на аналоговом входе
Дальше включаем монитор порта в Arduino IDE и можем наблюдать какое значение у нас на аналоговом входе.
Я прокрутил ручку потенциометра от края до края и на экране значения изменились с 0 до 1023, соответственно напряжение на входе изменилось с 0 до 5 вольт. А дальше я плавно вращал ручку потенциометра и значения также изменялись, что вы можете видеть на иллюстрации ниже.
Дальше я взял фоторезистор и подключил его по схеме делителя напряжения последовательно с резистором на 1 кОм, плюс питания подключил к фоторезистору, а минус к резистору, точку соединения резистора и фоторезистора подключил к аналоговому входу.
Освещение на первых снимках слабое, ранее пасмурное утро, света с окна почти нет, свет в большинстве своем падает от монитора, я закрыл пальцем, чтобы увидеть, какой сигнал будет в максимально тёмном состоянии, а затем убрал его.
Дальше я включил настольную лампу, зафиксировал изменение сигнала, после чего поставил лампу прямо над фоторезистором максимально близко.
Таким образом, определив значения сигналов при разной степени освещенности, вы можете использовать их для управления чем-либо, простейший пример — сделать фотореле, в котором можете тонко настроить пороги срабатывания в программе.
Ну и напоследок, мне попался датчик воды, который оказался скорее не датчиком уровня, а датчиком наличия воды, поскольку в сухом состоянии сигнал с него был 0, при частичном погружении порядка 250-260, и при полном погружении эта цифра не изменилась, ну стала больше на 10, но значение прыгало вверх-вниз. Подключается он просто — на плате датчика обозначены «+», «-» и «S» (сигнал), подал на плату питание, а S подключил к аналоговому входу, код никак не изменял, ниже вы видите, что из этого вышло.
2 Пример подключения преобразователя логического уровня
Давайте посмотрим на практическом примере, как работает преобразователь уровня.
Для этого подключимся к какому-нибудь 3-вольтовому датчику, например, датчику температуры и влажности HTU21D. Этот датчик управляется по интерфейсу I2C, и ему необходим 3-вольтовый сигнал управления. В то же время Arduino генерирует 5-вольтовый сигнал. Тут нам и придёт на помощь преобразователь логического уровня. Соединим устройства по такой схеме:
Схема подключения датчика HTU21D к Arduino через преобразователь логического уровня
Работа с датчиком HTU21D посредством Arduino и преобразователя
Более подробно о работе с сенсором HTU21D рассказывается в следующей статье.
Ардуино Использование Аналоговых Входов Как Цифровых
Как можно увидеть на картинке, микроконтроллер это не вся плата как принято считать, а лишь ее часть. С помощью всех остальных элементов, таких как: порты ввода и вывода, конвертеры, индикаторы, стабилизаторы и кнопки, работать с микроконтроллером становится удобно и безопасно (в основном для устройств, с которыми вы хотите общаться).
Итак, приступим:Не смотря на то, что на плате множество различных элементов, взаимодействовать мы можем только с тремя их группами: пины питания (GND, 5V, 3.3V, Vin, IOREF, RESET ), аналоговые пины (A0-А5) и цифровые пины (1-13).
- Пины А0-А5 имеют возможность считывать извне псевдо-аналоговый сигнал, а также передавать его на внешние устройства.
- Что такое псевдо-аналоговый сигнал? Аналоговым является непрерывный сигнал, например свет и звук. Для его представления в памяти микроконтроллера он переводится в цифровой путем измерения «высоты» сигнала через определенный промежуток времени. Для получения сигнала, максимально приближенного к аналоговому, необходимо увеличить частоту дискретизации сигнала, т.е. увеличить количество замеров «высоты» аналогового сигнала за секунду.
- Для того, чтобы иметь возможность обратиться к этим пинам, в программе необходимо использовать команды:
- Порты А4 и А5 поддерживают I2C
Чаще всего аналоговые пины используются для передачи и чтения сигнала извне, когда нам принципиально важна «высота» сигнала.
Блок пинов ANALOG IN на Arduino
- Цифровые пины, обозначаемые как digital, используются для чтения и передачи цифрового сигнала, т.е. «0» или «1» («есть сигнал», «нет сигнала»).
- Для обращения к этим пинам используются команды:
- Также у цифровых портов (3,5,6,9,10,11), имеющих обозначения «~» есть особенность, они поддерживают ШИМ (Широтно-импульсную модуляцию). ШИМ используется для управления, например, оборотами коллекторного мотора через драйвер (подробнее в следующей статье).
- И еще одна особенность цифрового блока это пины 0 и 1, они поддерживают последовательный интерфейс UART (1 — ТХ, 2 — RX).
- ICSP-разъём предназначен для внутрисхемного программирования микроконтроллера ATmega328P. С использованием библиотеки SPI данные выводы могут осуществлять связь с платами расширения по интерфейсу SPI. Линии SPI выведены на 6-контактный разъём, а также продублированы на цифровых пинах 10(SS), 11(MOSI), 12 (MISO), 13(SCK). Микроконтроллер ATmega328P.
- Сердцем платформы Arduino Uno является 8-битный микроконтроллер семейства AVR-ATmega 328
Программирование на Arduino. Урок 1. Аналоговые и цифровые пины. » SYSTOP
3.3V — для некоторых датчиков ( например, барометр BMP180) питание в 5 V слишком высокое, именно поэтому на плате дополнительно выведено питание в 3.3 V. С точки зрения пользователя, кроме номинала выходного напряжения, этот выход питания ничем не отличается от своего «соседа» 5V.
Мнение эксперта
It-Technology, Cпециалист по электроэнергетике и электронике
Задавайте вопросы «Специалисту по модернизации систем энергогенерации»
Микроконтроллеры платформа Arduino UNO АЦП, цифровая обработка сигналов — online presentation Специфика данного занятия состоит в том, что учащимся объясняется теоретический материал, а затем, на практике, показывается как все работает. Спрашивайте, я на связи!
Сфера применения
Места использования можно перечислять долго, так как возможности ее ничем не ограничены. С помощью этого устройства можно спроектировать множество различных систем, которые будут помогать человеку в бытовых условиях, а также в промышленном производстве, медицине и других областях нашей жизни. В настоящее время в мире наблюдается «ардуиномания». Этому миниатюрному устройству посвящено множество статей и форумов в интернете. Вот некоторые популярные области использования этого устройства:
- система «умный дом»;
- всевозможные датчики;
- робототехника;
- автоматические вентиляторы;
- светофоры;
- охранные системы;
- мини метеостанции;
- мультитестеры;
- квадрокоптеры.
Недостатки
Слишком простая оболочка программы. Это очень неудобный редактор кода. Для программирования придется переходить на более удобный редактор, но кодовый редактор Arduino IDE все равно необходимо оставлять открытым. Малая частота микропроцессора. Нет возможности ее изменить. Малый объем памяти для сохранения программ.
01.Basics | AnalogReadSerial (Чтение аналоговых выводов через потенциометр)
С помощью потенциометра мы можем менять напряжение и считывать данные с выводов.
Продолжим изучение работы с аналоговыми выводами через пример AnalogReadSerial из меню File | Examples | 01.Basics. Цель урока – плавно изменять напряжение и подавать его на аналоговый вывод, чтобы получить с него текущее значение напряжения.
Нам понадобятся плата Arduino, потенциометр и несколько проводов (или перемычек). Соединяем парные ножки с выводами на плате 5V и GND. Среднюю ножку необходимо соединить с аналоговым выводом на плате, помеченную как A0.
Не важно, какая из крайних ножек потенциометра будет подключена к 5V, а какая к GND, поменяется только направление, в котором нужно крутить ручку для изменения напряжения. Сам сигнал считывается со средней ножки, которая связана с аналоговым портом. Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, подходят только порты, помеченные на плате как ANALOG IN
Они все пронумерованы с префиксом A (A0-A5)
Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, подходят только порты, помеченные на плате как ANALOG IN. Они все пронумерованы с префиксом A (A0-A5).
Схема готова. Вращая регулятором потенциометра, мы можем менять сопротивление от 5 Вольт до 0. Arduino позволяет считывать текущее напряжение, которое подаётся на среднюю ножку при помощи аналогового вывода. Результаты могут колебаться от 0 до 1023.
Код
Код очень простой. При инициализации устанавливаем нужную скорость связи: Serial.begin(9600);. Далее в цикле мы постоянно считываем данные, поступающие с потенциометра при помощи метода analogRead(). Так как значения будут находиться в диапазоне от 0 до 1023, мы можем использовать тип int для переменной sensorValue.
Полученный результат будем выводить в окно последовательного монитора.
Проверка (Serial Monitor)
Запустите программу, а также откройте окно последовательного монитора. Вращая регулятором потенциометра, вы можете наблюдать, как в окне будут меняться значения от 0 до 1023.
Пример интересен своей универсальностью. Потенциометр является ручным делителем напряжения. Существуют другие детали, которые выполняют такую же работу. Например, фоторезистор меняет напряжение в зависимости от освещённости. Также напряжение может меняться от нажатия, от температуры и т.д. При этом нам не нужно менять программу, просто одну деталь меняем на другую и код будет выполняться. Единственное различие будет в выводимых результатах – каждый делитель напряжения имеет свои характеристики и, соответственно, будет давать свои показания.
Аналоговый ввод/вывод
Функция analogRead()
Описание
Считывает значение из указанного аналогового пина.
На большинстве плат содержится многоканальный 10-битный аналого-цифровой преобразователь, поэтому результатом будет значение в приделах от 0 до 1023. На платах Arduino Due и Arduino Zero преобразователь 12-битный, но результат по-умолчанию все равно отдается в 10 битах для совместимости с другими платами. Чтобы использовать 12 бит, нужно явно указать это через вызов analogReadResolution(), тогда результат будет в пределах 0-4095.
Синтаксис
analogRead(pin)
Параметры
pin – номера аналогового пина. Для большинства плат – значение от A0 до A5, для Arduino Mini и Nano – от A0 до A7, для arduino mega – от A0 до A15
Возвращаемое значение
Целое значение в приделах от 0 до 1023 или от 0 до 4095 для плат Arduino Duo и Arduino Zero (нужна настройка)
Пример
Примечания
Аналоговые пины работают не так, как цифровые, и для работы с ними не нужно устанавливать режим работы. Вызывать для них pinMode() нужно только если вы хотите использовать их в качестве цифровых.
Функция analogReference()
Описание
Функция задает опорное напряжение, относительно которого происходят изменения значений аналоговых пинов. Те значения, которые возвращает функция analogRead(), как раз зависят от опорного напряжение, а также пропорционально входному напряжению.
Синтаксис
analogReference(type)
Параметры
type – используемое опорное напряжение (DEFAULT, INTERNAL, EXTERNAL)
Возвращаемое значение
нет
Пример
Примечания
Значения параметра для Arduino AVR плат (Uno, Mega и др.):
- DEFAULT – стандартное опорное напряжение 5 В (на платформах с напряжением 5 В) или 3.3 В (на платформах с напряжением 3.3 В);
- INTERNAL – встроенное опорное напряжение 1.1 В на микроконтроллерах ATmega168 и ATmega328 и 2.56 В на ATmega8 (не доступно на Arduino Mega);
- EXTERNAL – внешний источник опорного напряжение, подключенный к выводу AREF (возможно от 0 В до 5 В);
- INTERNAL1V1 – напряжение в 1.1 В (только для Arduino Mega);
- INTERNAL2V56 – напряжение в 2.56 В (только для Arduino Mega);
Значения параметра для Arduino SAMD плат (Zero и тд.):
- AR_DEFAULT – стандартное опорное напряжение 3.3 В;
- AR_INTERNAL – встроенное опорное напряжение 2.23 В;
- AR_INTERNAL1V0 – встроенное опорное напряжение 1.0 В;
- AR_INTERNAL1V65 – встроенное опорное напряжение 1.65 В;
- AR_INTERNAL2V23 – встроенное опорное напряжение 2.23 В;
- AR_EXTERNAL – внешний источник опорного напряжение, подключенный к выводу AREF.
Значения параметра для Arduino SAM плат (Duo):
AR_DEFAULT – стандартное опорное напряжение 3.3 В. Для Arduino Duo доступно только это значение.
Функция analogWrite()
Описание
Функция выдает на пин аналоговую величину (ШИМ-сигнала или ШИМ-волну). Это может быть полезно например для управления яркостью светодиода или для задания скорости вращения мотора.
Могут использоваться только пины, помеченные символом “~”. На Arduino Uno и на других платах на микроконтроллерах ATmega168 и ATmega328P это пины 3, 5, 6, 9, 10 и 11. На пинах 5 и 6 частота ШИМ-сигнала составляет около 980 Гц, а на остальных пинах – примерно 490 Гц. На плате Arduino Mega можно использовать пины 2–13 и 44–46. На Arduino DUE – пины 2–13, а также контакты DAC0 и DAC1. Причем DAC0 и DAC1 являются цифро-аналоговыми преобразователями и действуют как настоящие аналоговые выходы.
Перед использованием не требует вызова функции pinMode().
Синтаксис
analogWrite(pin, value)
Параметры
pin – номер пина, на который следует подать ШИМ-сигнал
value – период рабочего цикла от 0 (сигнал всегда выключен) до 255 (сигнал подан постоянно)
Возвращаемое значение
нет
Пример
Плавное мигание светодиодом: