Урок по Arduino №2: для чего нужны аналоговые входы на Arduino и как их использовать?

KY-009, модуль RGB SMD светодиода

Модуль RGB SMD светодиода

 Заменяется на модуль 2020 или 5050 RGB SMD. Стоимость начинается от 1 р за штуку, высылается правда большими партиями, но если поискать то можно найти и поштучно, сам же модуль от 50 р.
 Довольно привлекательный модуль для начинающих. Позволяет работать с RGB матрицей и получать буквально все цвета светового спектра используя ШИМ выходы контроллера. Поставляется БЕЗ токоограничивающих резисторов, поэтому при установке не забудьте их установить. Возможно заменить на обычный RGB светодиод, все зависит от предназначения и места установки. Недостаток- занимает сразу 3 ШИМ выхода микроконтроллера для полноценной работы. Достоинства- можно визуализировать процесс переключением цветов светодиода. Например: зеленый- работа, красный- остановка или аварийный стоп, синий- настройка и т.д. Кроме того в устройствах с температурными датчиками можно визуализировать степень нагрева термоэлемента. Т.е. чем большую температуру имеет датчик тем «краснее» светодиод и наоборот, чем холоднее- тем «синее».

Схема Arduino Nano ISCP

Наконец, надо сказать о подключении программатора. Для программирования контроллеров Atmel, на котором собран модуль Arduino, используется интерфейс ICSP. Для Arduino Nano icsp распиновка выглядит выглядит следующим образом (см. верхнюю часть предыдущего рисунка):

  1. MISO (ведущий принимает от ведомого);
  2. +5V (питание);
  3. SCK (тактовый импульс);
  4. MOSI (ведущий передает ведомому);
  5. RESET (сброс);
  6. GND (земля).

Первый пин 6-контактного разъема имеет в основании форму квадратика и нумеруется по часовой стрелке, если смотреть сверху. Чтобы не возникало сомнений по порядку нумерации выводов коннектора, ниже приводится фрагмент принципиальной схемы платы Ардуино:

Этот разъем подключается к программатору с интерфейсом SPI (интерфейс последовательного программирования контроллеров Atmel). Кроме того, прошивка контроллера может меняться из среды программирования через кабель USB, так что приобретать программатор становится необязательным (он нужен только в том случае, если отсутствует программа загрузчика).

1 Назначение и описание преобразователя уровня сигнала

Для коммуникации с цифровыми устройствами (датчиками, контроллерами и т.д.) и управления ими используется цифровой сигнал. Цифровой сигнал – это такой сигнал, в котором вся необходимая информация кодируется двумя уровнями напряжения, т.н. логическим нулём и логической единицей. За логический «0» обычно (но не обязательно) принимают напряжение 0 В, за логическую «1» – высокий уровень напряжения. Высокий он называется только относительно логического нуля. По факту это обычно довольно слабые напряжения. Самые распространённые на сегодня напряжения для передачи цифрового сигнала это 5 В и 3.3 В. Техника развивается, технологии изготовления цифровых устройств не стоят на месте. Поэтому в последнее время также встречаются более низкие напряжения 2.4 и 1.2 В. Подробнее о напряжениях, применяемых в цифровой технике, можно почитать здесь.

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

В англоязычной литературе их могут называть по-разному: logic shifter, level shifter, level converter.

Они бывают одноканальные, но чаще встречаются многоканальные. Например, 2-канальные, 4-канальные, 8-канальные и другие. Число каналов показывает, сколько разных логических сигналов можно подключить к данному преобразователю. Например, если вы применяете 4-проводный интерфейс SPI для связи с вашим датчиком, то необходимо применять 4-канальный преобразователь.

Кроме того, бывают преобразователи однонаправленные и двунаправленные. Однонаправленные преобразователи уровня могут преобразовывать сигналы, идущие только в одну сторону, как правило, от контроллера к управляемому устройству. Двунаправленные преобразователи, соответственно, преобразуют сигнал и от контроллера к устройству, и в обратную сторону.

Пример 4-канального двунаправленного преобразователя уровня показан на фотографии. Его основной элемент – четыре транзистора BSS138, которые обеспечивают быструю коммутацию сигналов.

Иногда каналы обозначаются не HV и LV, а по-другому. Например, A и B.

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

Ещё один пример преобразователя напряжения уровня – модуль HW-221 на основе микросхемы TXS0108E.

Здесь уже имеются 8 вводов-выводов. Причём к выводам со стороны порта A (A1…A8) должна подключаться низковольтовая логика, а к выводам B1…B8 – высоковольтная. Соответственно, питание VCCA должно быть от 1.4 до 3.6 В, а питание VCCB – от 1.65 до 5.5 В. Напряжение VCCA должно быть не больше, чем VCCB. Также на данном модуле присутствует вход разрешения работы OE. Работа разрешена при подключении его к питанию VCCA. При подключении OE к земле, все вводы-выводы переходят в третье состояние.

Элементы платы

Arduino Nano состоит из множества элементов, в числе которых:

  • микросхемы;
  • пассивные элементы (резисторы, конденсаторы, диоды);
  • разъемы;
  • регуляторы.

Микросхема платы FT232R

Микросхема позволяет подключать плату через USB. Чип, установленный в AN, не может работать напрямую с USB-интерфейсом, поэтому FT232R преобразует его в UART-интерфейс.

Сердце платформы — микроконтроллер ATmega328P

ATmega328P — главный элемент управления платой. В него загружается написанный программистом скетч, и контроллер рассылает команды различным элементам платы. Например, микроконтроллер заставляет диоды мигать, реле — переключаться, а пьезоэлемент — издавать звуки.

Светодиодная индикация

В плату встроено 4 светодиода, у каждого из которых свое назначение:

  1. RX- и TX-светодиоды мигают, когда происходит передача данных по UART.
  2. L-диод зажигается, когда на него подается высокий уровень сигнала, и гасится при низком уровне.
  3. ON-светодиод горит при наличии питания на плате.

Дополнительно практически на любой пин микроконтроллера можно завести другие светодиоды, 7-сегментные индикаторы или даже дисплеи.

Разъем mini-USB

С помощью разъема mini-USB плату можно подключить к персональному компьютеру. Также AN может получать через этот интерфейс питание от внешних источников.

Линейный понижающий регулятор напряжения 5 В

В качестве регулятора используется микросхема LM1117MPX-5.0. Она обеспечивает преобразование сигнала питания AN в сигнал питания микроконтроллера ATmega и других логических элементов, которые не поддерживают питание более 5 В. Например, элементы транзисторно-транзисторной логики (ТТЛ) запитываются от сигнала такой величины.

Цифровые входы/выходы

В уроке про распиновку платы мы обсуждали такое понятие, как GPIO: с англ. General Purpose Input-Output, входы-выходы общего назначения. Теперь надо разобраться с такими понятиями, как пин и порт. Пин – это конкретная нога микроконтроллера, имеющая свой номер, по которому к ней можно обратиться. Порт – это совокупность пинов. Микроконтроллер спроектирован так, чтобы обеспечить хорошее быстродействие, поэтому например пины объединены в порты, в одном порте обычно до 8 пинов (потому что в байте 8 бит). Работая с микроконтроллером напрямую, мы можем за одно действие установить состояние для всех пинов одного порта. Это очень быстро. Уроки у нас базовые, поэтому сегодня поговорим о функциях для работы с пинами, которые нам предлагает Ардуино. Но сначала давайте разберёмся, какие из пинов являются цифровыми. Взглянем на распиновку платы Нано:

PD*PC*PB*DСBНа платеD0-D13A0-A5A0A7дополнительнаяA6A7

Функционал платформы

Что такое микроконтроллер?

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

Под периферийными устройствами обычно понимают порты входа/выхода, ШИМ-модуляторы, таймеры, радиочастотные приёмники и так далее.

Что такое 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, предназначенный для новичков. Он прост в использовании.  

Память

Плата Arduino Nano по умолчанию содержит три типа памяти:

Flash – флеш-память объемом 32 кБ. Это основное хранилище для команд Ардуино. Когда вы загружаете скетч (программу которую вы написали в Arduino IDE) в контроллер, то он записывается именно в эту память. Примерно 2кБ из данного объема памяти занимает bootloader-программа, которая занимается инициализацией системы, загрузкой скетча через USB и непосредственным запуска скетча.

Оперативная SRAM память объемом 2 кБ. Здесь по-умолчанию хранятся переменные и объекты, создаваемые в ходе работы скетча. Память эта энерго-зависимая, при отключении питания все данные хранящиеся в этой памяти просто напросто сотрутся.

Энергонезависимая память (EEPROM) объемом 1кБ. Здесь можно хранить данные которые использует скетч (настройки программы), которые не сотрутся при отключении питания платы Ардуино. Но процедура записи и считывания EEPROM требует использования дополнительной Ardiono библиотеки EEPROM, которая доступна в Arduino IDE по-умолчанию. Также нужно помнить об ограничении циклов перезаписи (порядка не более 10000 циклов записи/перезаписи), присущих технологии памяти EEPROM.

KY-013, аналоговый термодатчик

Модуль аналогового термодатчика

 Такой же терморезистор стоит от 3 р, в составе модуля- от 50 р
 За таким красивым названием кроется обыкновенный терморезистор! Опять же практически любые датчики изначально являются АНАЛОГЫВЫМИ. Только после соответствующей обработки сигнала они уже становятся ЦИФРОВЫМИ. Но в нашем случае изначально аналоговый датчик. Поэтому подключать его нужно к АНАЛОГОВЫМ входам ARDUINO. Диапазон рабочей температуры датчика -55…125 °C, т.е. на 1 бит 10 битного преобразования приходится (125+55)/1024= 0,17578125 градуса Цельсия ,что позволяет довольно точно измерять температуру. Кроме того датчик имеет малые размеры что позволяет снизить инерционность при измерении. Т.е. чем меньше датчик тем меньше нужно времени для достижения им температуры окружающей среды. Применяется, как и понятно из описания, для измерения температуры.

Элементы платы

Микроконтроллер ATmega328P

Сердцем платформы Arduino Nano является 8-битный микроконтроллер семейства AVR — ATmega328P с тактовой частотой 16 МГц. Контроллер предоставляет 32 КБ Flash-памяти для хранения прошивки, 2 КБ оперативной памяти SRAM и 1 КБ энергонезависимой памяти EEPROM для хранения данных.

Микросхема FT232R

Микросхема FTDI FT232R обеспечивает связь микроконтроллера ATmega328P с USB-портом компьютера. При подключении к компьютеру Nano определяется как виртуальный COM-порт.

USB-UART преобразователь общается с микроконтроллером ATmega328P по интерфейсу UART через пины и . Рекомендуем не использовать эти контакты в своём проекте.

Светодиодная индикация

Имя светодиода Назначение
RX и TXМигают при обмене данными между Arduino Nano и ПК.
LПользовательский светодиод подключённый к 13 пину микроконтроллера. При высоком уровне светодиод включается, при низком – выключается.
ONНаличие питания на Arduino Nano.

Регулятор напряжения 5 В

Линейный понижающий регулятор напряжения LM1117MPX-5.0 с выходом 5 вольт обеспечивает питание микроконтроллера ATmega328P и другой логики платформы. Максимальный выходной ток составляет 800 мА.

ICSP-разъём для ATmega328

ICSP-разъём предназначен для загрузки прошивки в микроконтроллер ATmega328 через программатор.

Также через контакты ICSP Nano общается с платами расширения по интерфейсу SPI.

Светильник с управляемой яркостью Ардуино

Для этого занятия потребуется:

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • макетная плата;
  • потенциометр;
  • 1 светодиод и резистор 220 Ом;
  • провода «папа-папа».

На этом занятии мы соберем электрическую схему светильника со светодиодом с управляемой яркостью. С помощью потенциометра мы сможем плавно изменять яркость светодиода, подключенного к пину 9. Потенциометр подключается крайними ножками к портам 5V и GND, со средней ножки снимается значение напряжения и подключается к аналоговому входу A0 микроконтроллера Ардуино.


Схема сборки светильника с управляемой яркостью

Соберите электрическую цепь, как на рисунке. Средняя ножка переменного резистора подключается к аналоговому порту A0, чтобы снимать показания напряжения. Какую из крайних ножек подключить к портам 5V и GND значения не имеет, изменится лишь направление вращения ручки потенциометра для увеличения яркости светодиода. После сборки схемы, подключите Arduino к компьютеру и загрузите скетч.

Скетч для Ардуино и потенциометра

// Присваиваем имя для пина со светодиодом (англ. «led»)
#define LED_PIN 9

// Присваиваем имя для пина с потенциометром (англ. «potentiometer»)
#define POT_PIN A0

void setup()
{
  // пин со светодиодом будет выходом (англ. «output»)
  pinMode(LED_PIN, OUTPUT);

  // пин с потенциометром будет входом (англ. «input»)
  pinMode(POT_PIN, INPUT);
  
  // Запускаем монитор последовательного порта
  // снимите комментарий // Serial.begin(9600);
}

void loop()
{
  // заявляем, что будем использовать 2 переменные - rotation и brightness
  // хранить в переменных будем только целые числа (англ. «integer»)
  int rotation, brightness;  

  // rotation равна значениям с потенциометра в интервале от 0 до 1023
  rotation = analogRead(POT_PIN);

  // переменная brightness будет равна rotation делённое на 4
  // brightness может быть только целым числом, дробная часть будет отброшена
  // в итоге переменная brightness будет находится в пределах от 0 до 255
  brightness = rotation / 4;

  // выдаём напряжение, рассчитанное по формуле brightness = rotation / 4
  analogWrite(LED_PIN, brightness);
  
  // Выдаем значение rotation на монитор последовательного порта
  // снимите комментарий // Serial.println(rotation);
  // снимите комментарий // delay(1000);
}

Пояснения к коду:

  1. с помощью директивы мы заменили номер пина 9 на имя , аналоговому входу мы задали имя ;
  2. локальная переменная пропорциональна напряжению и находится в интервале от 0 до 1023 (минимальное и максимальное значение АЦП);
  3. переменная равна делённое на 4 и находится в пределах от 0 до 255 (минимальное и максимальное значение аналогового входа).

Пишем код

После подключения схемы, давайте разберёмся с самой программой. После подключения схемы, давайте разберёмся с самой программой. В этом примере мы будем управлять светодиодом на 13 пине. То есть можно не подключать дополнительный светодиод так ка есть встроенный. Но об подключении светодиода можно почитать в 1 части Arduino для начинающих.

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

В этом коде Вы могли заметить . Сейчас объясню. Мы считываем была ли кнопка опущена. Далее небольшой задержкой определяем не было ли это ошибкой и если кнопка действительно была нажата инвертируем сигнал светодиода. То есть если светодиод горел – он перестанет гореть. И наоборот.

I2C связь двух Arduino.

Передача данных от ведущего к ведомому устройству. Здесь будем использовать две Arduino UNO: одна как ведущая, а другой как ведомая. Для реализации нашего урока за основу возьмем пример библиотеки Wire, предоставленный Arduino, вместе с IDE. Из библиотеки Wire мы используем master_writer для Arduino в качестве главного и slave_receiver для Arduino в качестве подчиненного устройства. В этом примере числовое значение будет передаваться от ведущего к ведомому, и ведомый отобразит его в последовательном мониторе порта.Используемые примеры можно найти: Файл -> Примеры -> Wire -> master_writer

#include <Wire.h>
void setup() {
  Wire.begin(); // join i2c bus (address optional for master)
}
byte x = 0;
void loop() {
  Wire.beginTransmission(8); // transmit to device #8
  Wire.write("x is ");        // sends five bytes
  Wire.write(x);              // sends one byte
  Wire.endTransmission();    // stop transmitting
  x++;
  delay(500);
}

Файл -> Примеры -> Wire -> slave_receive

#include <Wire.h>
void setup() {
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}
void loop() {
  delay(100);
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
  while (1 < Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

При использовании данного примера в мониторе порта ведомого (slave) устройства получим вот такие данные.

Как работать с аналоговым входом?

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

  1. void setup() – в ней настраивается режим работы микроконтроллера или его определенных узлов, а также назначаются его пины для работы в качестве входа или выхода.
  2. 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 и можем наблюдать какое значение у нас на аналоговом входе.

Я прокрутил ручку потенциометра от края до края и на экране значения изменились с 0 до 1023, соответственно напряжение на входе изменилось с 0 до 5 вольт. А дальше я плавно вращал ручку потенциометра и значения также изменялись, что вы можете видеть на иллюстрации ниже.

Дальше я взял фоторезистор и подключил его по схеме делителя напряжения последовательно с резистором на 1 кОм, плюс питания подключил к фоторезистору, а минус к резистору, точку соединения резистора и фоторезистора подключил к аналоговому входу.

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

Дальше я включил настольную лампу, зафиксировал изменение сигнала, после чего поставил лампу прямо над фоторезистором максимально близко.

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

Ну и напоследок, мне попался датчик воды, который оказался скорее не датчиком уровня, а датчиком наличия воды, поскольку в сухом состоянии сигнал с него был 0, при частичном погружении порядка 250-260, и при полном погружении эта цифра не изменилась, ну стала больше на 10, но значение прыгало вверх-вниз. Подключается он просто — на плате датчика обозначены «+», «-» и «S» (сигнал), подал на плату питание, а S подключил к аналоговому входу, код никак не изменял, ниже вы видите, что из этого вышло.

Аналоговый ввод/вывод

Функция 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 (сигнал подан постоянно)

Возвращаемое значение

нет

Пример

Плавное мигание светодиодом:

01.Basics | AnalogReadSerial (Чтение аналоговых выводов через потенциометр)

С помощью потенциометра мы можем менять напряжение и считывать данные с выводов.

Продолжим изучение работы с аналоговыми выводами через пример AnalogReadSerial из меню File | Examples | 01.Basics. Цель урока – плавно изменять напряжение и подавать его на аналоговый вывод, чтобы получить с него текущее значение напряжения.

Нам понадобятся плата Arduino, потенциометр и несколько проводов (или перемычек). Соединяем парные ножки с выводами на плате 5V и GND. Среднюю ножку необходимо соединить с аналоговым выводом на плате, помеченную как A0.

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

Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, подходят только порты, помеченные на плате как ANALOG IN. Они все пронумерованы с префиксом A (A0-A5).

Схема готова. Вращая регулятором потенциометра, мы можем менять сопротивление от 5 Вольт до 0. Arduino позволяет считывать текущее напряжение, которое подаётся на среднюю ножку при помощи аналогового вывода. Результаты могут колебаться от 0 до 1023.

Код

Код очень простой. При инициализации устанавливаем нужную скорость связи: Serial.begin(9600);. Далее в цикле мы постоянно считываем данные, поступающие с потенциометра при помощи метода analogRead(). Так как значения будут находиться в диапазоне от 0 до 1023, мы можем использовать тип int для переменной sensorValue.

Полученный результат будем выводить в окно последовательного монитора.

Проверка (Serial Monitor)

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

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

Цифровые выводы

Выводы платформы Arduino могут работать как входы или как выходы. Данный документ объясняет функционирование выводов в этих режимах

Также необходимо обратить внимание на то, что большинство аналоговых входов Arduino (Atmega) могут конфигурироваться и работать так же как и цифровые порты ввода/вывода

Свойства порта вводы/вывода (pin), сконфигурированного как порт ввода

Выводы Arduino (Atmega) стандартно настроены как порты ввода, таким образом, не требуется явной декларации в функции pinMode(). Сконфигурированные порты ввода находятся в высокоимпедансном состоянии. Это означает то, что порт ввода дает слишком малую нагрузки на схему, в которую он включен. Эквивалентом внутреннему сопротивлению будет резистор 100 МОм подключенный к выводу микросхемы. Таким образом, для перевода порта ввода из одного состояния в другое требуется маленькое значение тока. Это позволяет применять выводы микросхемы для подключения емкостного датчика касания, фотодиода, аналогового датчика со схемой, похожей на RC-цепь.

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

Подтягивающие (нагрузочные) резисторы

Если на порт ввода не поступает сигнал, то в данном случае рекомендуется задать порту известное состояние. Это делается добавлением подтягивающих резисторов 10 кОм, подключающих вход либо к +5 В (подтягивающие к питанию резисторы), либо к земле (подтягивающие к земле резисторы).

Микроконтроллер Atmega имеет программируемые встроенные подтягивающие к питанию резисторы 20 кОм. Программирование данных резисторов осуществляется следующим образом.

Подтягивающий резистор пропускает ток достаточный для того, чтобы слегка светился светодиод подключенный к выводу, работающему как порт ввода. Также легкое свечение светодиодов означает то, что при программировании вывод не был настроен как порт вывода в функции pinMode().

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

Примечание: Затруднительно использовать вывод микросхемы 13 в качестве порта ввода из-за подключенных к нему светодиода и резистора. При подключении подтягивающего к питанию резистора 20 кОм на вводе будет 1.7 В вместо 5 В, т.к. происходит падение напряжения на светодиоде и включенном последовательно резисторе. При необходимости использовать вывод микросхемы 13 как цифровой порт ввода требуется подключить между выводом и землей внешний подтягивающий резистор.

Свойства порта ввода/вывода, сконфигурированного как порт вывода

Выводы, сконфигурированные как порты вывода, находятся в низкоимпедансном состоянии. Данные выводы могут пропускать через себя достаточно большой ток. Выводы микросхемы Atmega могут быть источником (положительный) или приемником (отрицательный) тока до 40 мА для других устройств. Такого значения тока достаточно чтобы подключить светодиод (обязателен последовательно включенный резистор), датчики, но недостаточно для большинства реле, соленоидов и двигателей.

Короткие замыкания выводов Arduino или попытки подключить энергоемкие устройства могут повредить выходные транзисторы вывода или весь микроконтроллер Atmega. В большинстве случаев данные действия приведут к отключению вывода на микроконтроллере, но остальная часть схемы будет работать согласно программе. Рекомендуется к выходам платформы подключать устройства через резисторы 470 Ом или 1 кОм, если устройству не требуется больший ток для работы.

Заключение

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

В качестве дополнения по данной теме в прилагаемой статье приведены подробная информация «Аrduino uno.» А также в нашей группе ВК публикуются интересные материалы, с которыми вы можете познакомиться первыми. Для этого приглашаем читателей подписаться и вступить в группу. В завершение хочу выразить благодарность источникам, откуда почерпнут материал для подготовки статьи:

www.arduino.ru

www.3d-diy.ru

www.electrosam.ru

www.voltiq.ru

www.mypractic.ru

www.tproger.ru

Мне нравится1Не нравится

Следующая
ArduinoЧто такое arduino nano: особенности и область применения

Поделитесь в социальных сетях:FacebookX
Напишите комментарий