Аналоговый и цифровой выход ардуино

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

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

Сердцем платформы Arduino Uno является 8-битный микроконтроллер фирмы Microchip — ATmega328P на архитектуре AVR с тактовой частотой 16 МГц.
Контроллер обладает тремя видами памяти:

  • 32 КБ Flash-памяти, из которых 0,5 КБ используются загрузчиком, который позволяет прошивать Uno с обычного компьютера через USB. Flash-память постоянна и её предназначение — хранение программ и сопутствующих статичных ресурсов.
  • 2 КБ RAM-памяти, которые предназначены для хранения временных данных, например переменных программы. По сути, это оперативная память платформы. RAM-память энергозависимая, при выключении питания все данные сотрутся.
  • 1 КБ энергонезависимой EEPROM-памяти для долговременного хранения данных, которые не стираются при выключении контроллера. По своему назначению это аналог жёсткого диска для Uno.

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

Микроконтроллер не содержит USB интерфейса, поэтому для прошивки и коммуникации с ПК на плате присутствует дополнительный микроконтроллер ATmega16U2 с прошивкой USB-UART преобразователя. При подключении к ПК Arduino Uno определяется как виртуальный COM-порт.

общается с ПК через по интерфейсу UART используя сигналы и , которые параллельно выведены на контакты и платы Uno. Во время прошивки и отладки программы, не используйте эти пины в своём проекте.

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

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

Порт USB Type-B

Разъём USB Type-B предназначен для прошивки и питания платформы Arduino. Для подключения к ПК понадобится кабель USB (A — B).

Понижающий регулятор 5V

Понижающий линейный преобразователь NCP1117ST50T3G обеспечивает питание микроконтроллера и другой логики платы при подключении питания через или пин Vin. Диапазон входного напряжения от 7 до 12 вольт. Выходное напряжение 5 В с максимальным выходным током 1 А.

Понижающий регулятор 3V3

Понижающий линейный преобразователь LP2985-33DBVR обеспечивает напряжение на пине . Регулятор принимает входное напряжение от линии 5 вольт и выдаёт напряжение 3,3 В с максимальным выходным током 150 мА.

ICSP-разъём ATmega328P

ICSP-разъём выполняет две полезные функции:

  1. Используется для передачи сигнальных пинов интерфейса SPI при подключении Arduino Shield’ов или других плат расширения. Линии ICSP-разъёма также продублированы на цифровых пинах , , и .
  2. Предназначен для загрузки прошивки в микроконтроллер через внешний программатор. Одна из таких прошивок — Bootloader для Arduino Uno, который позволяет .

А подробности распиновки .

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-х таких датчиков, подключённых одновременно.

Протокол

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

Так например, инфракрасный дальномер измеряет расстояние до объекта перед ним. Для него чем меньше расстояние, тем больше напряжение. Если объект находится на расстоянии 20 см, сенсор выдаёт ~2.5 В на сигнальном проводе; на расстоянии 60 см ~ 1 В; на расстоянии 150 см ~ 0.4 В. Точная диаграмма зависимости напряжения от расстояния для инфракрасного дальномера от Sharp приведена в его datasheet’е.

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

Функция pinMode()

Но пойдем по порядку. Мы уже знаем из Урока 6 две основные функции void setup() и void loop(). Далее мы будем работать в них.

Для нашего урока нам нужна новая функция о которой мы пока не проходили — pinMode(). Эта функция сообщает Arduino выводить напряжение или измерять напряжение на цифровом выводе. Мы будем использовать эту новую функцию именно в void setup(), т.к. наша новая функция относится к настройкам.

Функция pinMode() принимает два аргумента. Аргументы — это информация, необходимая функции для выполнения своей задачи. Они помещаются в скобки функции и разделяются запятой.

  • Первый аргумент функции pinMode() — это номер пина, т.е. 13 в нашем примере (см. схему выше).
  • Второй аргумент устанавливает режим ввода или вывода. В примере выше — вывод.

Используйте OUTPUT, если вы хотите вывести напряжение, и используйте INPUT, если вы хотите прочитать напряжение.

Мы собирались использовать режим OUTPUT, так как мы хотим отправить ток на светодиод.

Объяснение работы программы

Для того, чтобы полноценно использовать АЦП в 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!’.

Устройство и принцип работы потенциометра

Переменный резистор (потенциометр) поворотом ручки изменяет сопротивление в электрической цепи от нуля до номинального сопротивления в 10 кОм. Потенциометр сделан состоит из токопроводящей поверхности — плоского постоянного резистора с двумя контактами и скользящего по поверхности токосъемника. Потенциометр предназначен для точной регулировки напряжения в электрической цепи.


Со средней ножки потенциометра снимают значение напряжения

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

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

Язык программирования Ардуино

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

Для программирования Arduino используется упрощенная версия языка C++ с предопределенными функциями. Как и в других Cи-подобных языках программирования есть ряд правил написания кода. Вот самые базовые из них:

  • После каждой инструкции необходимо ставить знак точки с запятой (;)
  • Перед объявлением функции необходимо указать тип данных, возвращаемый функцией или void если функция не возвращает значение.
  • Так же необходимо указывать тип данных перед объявлением переменной.
  • Комментарии обозначаются: // Строчный и /* блочный */

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

Все прошивки для Arduino должны содержать минимум 2 функции. Это setup() и loop().

Функция setup

Функция setup() выполняется в самом начале и только 1 раз сразу после включения или перезагрузки вашего устройства. Обычно в этой функции декларируют режимы пинов, открывают необходимые протоколы связи, устанавливают соединения с дополнительными модулями и настраивают подключенные библиотеки. Если для вашей прошивки ничего подобного делать не нужно, то функция все равно должна быть объявлена. Вот стандартный пример функции setup():

Функция loop

Функция loop() выполняется после функции setup(). Loop в переводе с английского значит «петля». Это говорит о том что функция зациклена, то есть будет выполняться снова и снова. Например микроконтроллер ATmega328, который установлен в большинстве плат Arduino, будет выполнять функцию loop около 10 000 раз в секунду (если не используются задержки и сложные вычисления). Благодаря этому у нас есть большие возможности.

Почему 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 Mega 2560 цифровых и аналоговых портов, значительно больше, чем на Uno или Nano из-за большего размера платы и производительности микроконтроллера. В остальном характеристики и способы программирования пинов не отличаются друг от друга.

  1. Power Pins — порты питания, режим их работы нельзя запрограммировать или изменить. Они выдают стабилизированное напряжение 5V или 3,3V, Vin выдает напряжение от источника питания, а GND — это заземление (общий минус);
  2. PWM Pins — порты с ШИМ модуляцией, которые можно запрограммировать, как цифровой выход/вход. Данные порты обозначены на плате знаком тильда (˜);
  3. Analog In — порты, принимающие аналоговый сигнал от датчиков, работают на вход. Данные порты тоже можно запрограммировать, как цифровой вход/выход. Данные пины не поддерживают ШИМ модуляцию.

Режим пинов назначается в процедуре void setup с помощью pinMode(), например:

void setup() {
    pinMode(10, OUTPUT); // объявляем пин 10 как выход
    pinMode(A2, OUTPUT); // объявляем пин A2 как выход

    pinMode(12, INPUT); // объявляем пин 12 как вход
    pinMode(A1, INPUT); // объявляем пин A1 как вход
}

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

  1. к выходу 10 и A2 можно подключить светодиод, который будет включаться и выключаться при вызове команды в программе;
  2. пин 10 может использоваться для ШИМ сигнала, например, чтобы плавно включить светодиод, а пин A2 может выдавать только цифровой сигнал (0 или 1);
  3. к входу 12 и A1 можно подключить цифровой датчик и микроконтроллер будет проверять наличие сигнала на этих пинах (логический нуль или единицу);
  4. к входу A1 можно подключить аналоговый датчик тогда микроконтроллер будет получать не только сигнал но и узнавать характеристику сигнала.

Мы не случайно разделили пины с ШИМ модуляцией (PWM Pins) и аналоговые. PWM пины создают аналоговый сигнал, к ним подключают сервопривод, шаговый двигатель и другие устройства, где требуется подавать сигнал с разными характеристиками. Аналоговые пины (Analog In) используются для подключения аналоговых датчиков, с них входящий сигнал преобразуется в цифровой с помощью встроенного АЦП.

Ардуино Uno пины: шим, аналоговые, цифровые


Arduino UNO распиновка платы на русском

ШИМ (PWM) порты
(Analog Out)
3, 5, 6, 9, 10, 11
Аналоговые порты
(Analog In)
A0, A1, A2, A3, A4, A5
на некоторых платах: A6, A7
Цифровые порты
(Digital In/Out)
все порты со 2 по 13 пин
можно использовать: A0 — A7

Из таблицы видно, какие пины на Arduino UNO поддерживают шим. Аналоговые пины (Analog In) используют, как цифровые если недостаточно портов общего назначения, например, вы хотите подключить к плате 15 светодиодов. Кроме того, на плате Arduino Uno и Nano порты A4 и A5 используются для I2C протокола (SDA и SCL пины) — они работают параллельно с пинами A4 и A5. Об этом мы расскажем чуть позже.

Ардуино Nano пины: шим, аналоговые, цифровые


Arduino Nano распиновка платы на русском

ШИМ (PWM) порты
(Analog Out)
3, 5, 6, 9, 10, 11
Аналоговые порты
(Analog In)
A0, A1, A2, A3, A4, A5
на некоторых платах: A6, A7
Цифровые порты
(Digital In/Out)
все порты со 2 по 13 пин
можно использовать: A0 — A7

Если вы заметили, то пины на Arduino Nano и Uno имеют одинаковое количество и назначение. Платы отличаются лишь своими габаритами. Nano — более компактная и удобная плата, для экономии места на нее не ставят разъем питания, для этого используются пины Vin и GND на которое подается питание от источника.

Ардуино Mega пины: шим, аналоговые, цифровые


Схема распиновки платы Arduino Mega 2560 r3

ШИМ (PWM) порты
(Analog Out)
все порты со 2 по 13 пин
дополнительно: 44, 45, 46 пин
Аналоговые порты
(Analog In)
с A0 до A15
Цифровые порты
(Digital In/Out)
все порты со 2 по 13, со 22 по 52 пин
можно использовать: A0 — A15

Пины коммуникации нежелательно использовать, как обычные цифровые порты. Особенно при таком количестве портов общего назначения, как на Mega 2560. Более подробную информацию о рассмотренных платах, а также о других микроконтроллерах семейства Arduino (Pro Mini, Leonardo, Due и пр.): характеристики, описание пинов, габариты и т.д. можно узнать в разделе Микроконтроллеры на нашем сайте.

Функция analogReference()

Для правильной работы АЦП требуется опорное напряжение (эталон). Для Arduino опорное напряжение может быть в диапазоне 0…5В (или 0… 3,3В для Arduino с напряжением питания 3,3В). В зависимости от типа используемого микроконтроллера у нас могут быть разные виды опорного напряжения.

Мы можем использовать внутренний или внешний источник опорного напряжения. Функция AnalogReference() предназначена для того, чтобы установить соответствующий источник опорного напряжения. Доступны следующие параметры этой функции:

  • DEFAULT: опорное напряжение составляет 5В или 3,3В (в зависимости от питания) — то есть, оно равно напряжению питания микроконтроллера;
  • INTERNAL: опорное напряжения составляет 1,1В для ATmega168, ATmega328 и 2,56В для ATmega8;
  • INTERNAL1V1: опорное напряжение составляет 1,1В — только для Arduino MEGA;
  • INTERNAL2V56: опорное напряжение составляет 2,56В — только для Arduino MEGA;
  • EXTERNAL: внешнее опорное напряжение, приложенное к выводу AREF — от 0 до 5В.

Параметр DEFAULT выбираем, когда хотим воспользоваться опорным напряжением 5В (питание системы). Это самый простой и одновременно наименее точный способ. Здесь требуется хорошая стабильность питания.

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

Наиболее точным вариантом является использование внешнего источника опорного напряжения. Существуют специальные источники опорного напряжения (ИОН). Плюсом является возможность получения необходимого точного опорного напряжения, например, 1,024В или 2,048В, что облегчает интерпретацию данных, считываемых АЦП. К недостаткам применения внешнего источника опорного напряжения можно отнести возможное увеличение стоимости проекта.

Стенд для пайки со светодиодной подсветкой
Материал: АБС + металл + акриловые линзы. Светодиодная подсветка…

Подробнее

Синтаксис функции analogReference() показан в следующем примере:

analogReference(DEFAULT); //опорное напряжение = напряжение питания
analogReference(INTERNAL); //опорное напряжение = 1,1В или 2,56В
analogReference(EXTERNAL); //опорное напряжение = напряжение на AREF выводе

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

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

  • плата 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 (минимальное и максимальное значение аналогового входа).

Код проекта

Ниже представлены две программы: одна для главной платы и вторая для ведомой. Напоминаем, что директива #include ничего умного не делает, она просто целиком подставляет файл, который передан параметром директиве.

Для работы нам нужно обязательно загрузить библиотеку Wire, которую можно взять здесь.

Мастер код

// Код для Основной платы
#include <Wire.h> // Эта библиотека используется для связи I2C
int x;
void setup() {
  Wire.begin(); 
  Serial.begin(9600);
}
void loop() {
  x = analogRead(A0); // Чтение значения с потенциометра
  x/=4;
  Wire.beginTransmission(9); // Цифра 9 - адрес ведомой платы 
  Wire.write(x); // Передает значение потенциометра на ведомую плату           
  Wire.endTransmission(); 
  Serial.print(x);
  delay(1000);
}

Наследник

// Код для ведомой платы
#include <Wire.h>
int x;
void setup() {
  pinMode (13, OUTPUT); // Светодиод на пин (pin) 13
  Wire.begin(9); // 9 здесь адрес (упоминается также в коде основной платы) 
  Wire.onReceive(receiveEvent);
  Serial.begin(9600);
}
void receiveEvent(int bytes) {
  x = Wire.read(); // Получите значения от основной платы
  Serial.print(x);
}
void loop() {
  if (x > 88) { // Взято пороговое значение 88, вы можете изменить его на своё
    digitalWrite(LED, HIGH);
    delay(200);
  }
  else{
    digitalWrite(LED, LOW);
    delay(400);
  }
}

Чтобы подытожить идею проекту, нужно сказать, что есть много приложений для связи I2C, особенно в области IoT (Интернет вещей). Кроме того, этот пример также может быть использован в случае, когда не хватает контактов на плате для конкретного проекта и имеется несколько плат под рукой.

Чем отличается аналоговый сигнал от цифрового

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

Цифровой сигнал передается в виде единиц и нулей, для компьютеров и цифровой техники это проще реализовать (есть сигнал или нет сигнала). Для оперативной памяти в компьютерах используют конденсаторы, один заряженный конденсатор — 1 бит. На флеш-памяти используют транзисторы с плавающим затвором.


Квантование — разбиение непрерывной величины на интервалы

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

Как подключить датчик звука к Arduino

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

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

Датчик звука для Ардуино имеет на плате подписанные выходы (обозначение у каждого производителя может отличаться), но проблем с подключением датчика к Ардуино возникнуть не должно. Питание датчика производится от 5V, выход (OUT, S или AO) подключается к любому аналоговому входу на Arduino Uno, а выход DO к Pin 2, если требуется получать цифровой сигнал на Ардуино с датчика микрофона.


Фото. Как подключить датчик звука к Arduino UNO

Чтобы сделать своими руками светильник, который будет включаться по хлопку в ладоши необходимо собрать электрическую схему из следующих элементов: светодиод с резистором, плата Arduino и датчик звука для включения света своими руками. Светодиод можно подключить к любому выходу, в скетче мы использовали Pin 11. После сборки схемы, подключите Ардуино к компьютеру и загрузите скетч.

Скетч для включения света по хлопку

boolean statuslamp; // состояние лампы: true - включено, false - выключено

void setup() {
   pinMode(12,OUTPUT); // пин 12 со светодиодом будет выходом (англ. «output»)
   pinMode(A0,INPUT); // к аналоговому входу A0 подключим датчик (англ. «intput»)
   statuslamp=false; // начальное состояние - лампа выключена
   Serial.begin(9600); // подключаем монитор порта
}

void loop() {
   Serial.println (analogRead(A0)); // выводим значение датчика на монитор
  
   if(analogRead(A0)>60) {
      statuslamp=!statuslamp; // меняем статус лампы при регистрации хлопка
      digitalWrite(12,statuslamp); // переключаем светодиод на выходе 12
      delay(20); // задержка, "дребезга" хлопков
   }
}

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

  1. спецификатор используется для объявления логических значений (истина/ложь) в языке программирования C++;
  2. В строчке мы меняем статус лампы при хлопке;
  3. В строчке вместо значения можно подставить любое значение. Узнайте показания датчика звука при хлопке в ладоши на мониторе порта и поставьте свои значения в скетч, при необходимости.

Обмен данными с компьютером

У всех плат Arduino есть возможность обмена информацией с компьютером. Обмен происходит по USB-кабелю — никаких дополнительных «плюшек» не требуется. Нам нужен класс , который содержит все необходимые функции. Перед работой с классом необходимо инициализировать последовательный порт, указав при этом скорость передачи данных (по умолчанию она равна 9600). Для отправки текстовых данных в классе существуют небезызвестные методы и . Рассмотрим следующий скетч:

В Arduino IDE есть Монитор порта. Запустить его можно через Инструменты→Монитор порта. После его открытия убедитесь, что Монитор работает на той же скорости, которую вы указали при инициализации последовательного порта в скетче. Это можно сделать в нижней панели Монитора. Если всё правильно настроено, то ежесекундно в Мониторе должна появляться новая строка «». Обмен данными с компьютером можно использовать для отладки вашего устройства.

Информацию на стороне компьютера можно не только получать, но и отправлять. Для этого рассмотрим следующий скетч:

Прошиваем микроконтроллер и возвращаемся в Монитор порта. Вводим в верхнее поле 1 и нажимаем Отправить. После этого на плате должен загореться светодиод. Выключаем светодиод, отправив с Монитора . Если же отправить символ , в ответ мы должны получить строку «».

Таким способом можно пересылать информацию с компьютера на Arduino и обратно. Подобным образом можно реализовать связь между двумя Arduino.

8

Заключение

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

В следующей статье мы будем использовать полученные знания для регулировки электрических величин с помощью ШИМ.  С потенциометра мы будем считывать значение (положение его рукояти), как было показано в этой статье, использовать их для установки скважности ШИМ. Также я расскажу, что такое ШИМ и как его можно использовать в управлении светодиодами и коллекторным двигателем (моторчиком от игрушек)

Предыдущая
ArduinoМастер-класс «Люстра-паук» своими руками
Следующая
ArduinoКак управлять шаговым двигателем через Arduino

Спасибо, помогло!Не помогло

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Электрик в доме
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: