Ардуино шим: расшифровка, определение, примеры

Что такое ШИМ и как она используется в Arduino

Давайте разберёмся, что скрывается за аббревиатурой ШИМ, как это работает, для чего нужно и как мы можем использовать её в работе с Arduino.

Нам понадобится:

  • Arduino UNO или иная совместимая плата;
  • светодиод (вот из такого набора, например);
  • резистор номиналом 190…240 Ом (вот отличный набор резисторов самых распространённых номиналов);
  • персональный компьютер со средой разработки Arduino IDE.

Инструкция по использованию ШИМ в Arduino

1Общие сведенияо широтно-импульсной модуляции

Цифровые выводы Arduino могут выдавать только два значения: логический 0 (LOW, низкий уровень) и логическую 1 (HIGH, высокий). На то они и цифровые. Но есть у Ардуино «особые» выводы, которые обозначаются PWM.

Их иногда обозначают волнистой чертой “~” или обводят кружочками или ещё как-то выделяют среди прочих.

PWM расшифровывается как Pulse-width modulation или широтно-импульсная модуляция, ШИМ.

Обозначение выходов с ШИМ на Arduino Leonardo

Широтно-импульсно модулированный сигнал – это импульсный сигнал постоянной частоты, но переменной скважности (соотношение длительности импульса и периода его следования).

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

С помощью задания скважности можно менять среднее напряжение на выходе ШИМ.

Если скважность равняется 100%, то всё время на цифровом выходе Arduino будет напряжение логическая “1” или 5 вольт. Если задать скважность 50%, то половину времени на выходе будет логическая “1”, а половину – логический “0”, и среднее напряжение будет равняться 2,5 вольтам. Ну и так далее.

Принцип работы широтно-импульсной модуляции (ШИМ)

В программе скважность задаётся не в процентах, а числом от 0 до 255. Например, команда analogWrite(10, 64) скажет микроконтроллеру подать на цифровой PWM выход №10 сигнал со скважностью 25%.

Выводы Arduino с функцией широтно-импульсной модуляции работают на частоте около 500 Гц. Значит, период следования импульсов – около 2 миллисекунд, что и отмеряют зелёные вертикальные штрихи на рисунке.

Получается, что мы можем сымитировать аналоговый сигнал на цифровом выходе! Интересно, правда?!

Как же мы можем использовать ШИМ? Применений масса! Например, управлять яркостью светодиода, скоростью вращения двигателя, током транзистора, звуком из пьезоизлучателя и т.д.…

2Схема для демонстрации широтно-импульсной модуляции в Arduino

Давайте рассмотрим самый базовый пример – управление яркостью светодиода с помощью ШИМ. Соберём классическую схему.

Схема для демонстрации ШИМ в Arduino

3Пример скетча с ШИМ

Откроем из примеров скетч “Fade”: Файл Образцы 01.Basics Fade.

Открываем скетч для Arduino с использованием ШИМ

Немного изменим его и загрузим в память Arduino.

int ledPin = 3; // объявляем пин, управляющий светодиодом int brightness = 0; // переменная для задания яркости int fadeAmount = 5; // шаг изменения яркости void setup() { pinMode(ledPin, OUTPUT); } void loop() { analogWrite(ledPin, brightness); // устанавливаем яркость brightness на выводе ledPin brightness += fadeAmount; // изменяем значение яркости /* при достижении границ 0 или 255 меняем направление изменения яркости */ if (brightness == 0 || brightness == 255) { fadeAmount = -fadeAmount; // изменяем знак шага } delay(30); // задержка для большей видимости эффекта }

4Управление яркостью светодиода с помощью PWM и Arduino

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

Управление яркостью светодиода – пример широтно-импульсной модуляции, используемой в Arduino

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

Источник: https://soltau.ru/index.php/arduino/item/375-chto-takoe-shim-i-kak-ona-ispolzuetsya-v-arduino

Arduino и PWM. Широтно-импульсная модуляция (ШИМ)

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

Мы уже рассматривали функцию digitalWrite() и знаем, что значение, которое она записывает, может быть двух вариантов – высокий или низкий уровень. В данном случае нам поможет функция analogWrite(). “Формулировки” функций различаются только начальными приставками, поэтому их легко запомнить.

Функция analogWrite(), так же как и digitalWrite(), содержит в скобках два аргумента и работает по тому же словесному принципу: “куда, что”. Главным различием является возможность записи широкого диапазона значений вместо привычного LOW или HIGH. Это и позволит нам регулировать яркость светодиода.

Главное замечание, которое необходимо учитывать, это то, что данная функция работает только на определенных контактах. Эти контакты обозначены символом “~”. Этот символ означает, что это PWM-контакт. PWM (pulse-width modulation) звучит по-русски как ШИМ (широтно-импульсная модуляция).

Принцип работы основан на изменении длительности импульса. Графически это можно изобразить так:

Давайте попробуем разобраться как это работает, рассмотрев простой пример. Для этого необходимо подключить светодиод к PWM-контакту через резистор номиналом 150 Ом и “зашить” в Arduino простенькую программу. Схема подключения и код скетча представлены ниже:

Думаю, что в целом код понятен, но необходимо уделить немного внимания циклу for(). Существует такое понятие как разрешение. Поскольку мы работаем с 8-битным разрешением (это будет рассмотрено несколько позднее), то минимальному значению будет соответствовать 0, а максимальному – 255. В конце каждой итерации мы установили временную задержку в 10мс.

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

Визуально скетч стал несколько сложнее. На самом деле здесь все просто и давайте в этом разберемся. Нам необходимо идентифицировать все подключенные светодиоды, но вместо привычного int led мы используем массив, каждый элемент которого является PWM-контактом на Arduino. В теле функции void setup() мы тоже поступили хитрым образом. “Перечислять” все контакты мы доверили циклу for(), с каждой итерацией которого производится конфигурация соответствующего контакта на OUTPUT. Переходим к функции void loop(). Функция debounce() и начальное условие if() остается без изменений. У нас по-прежнему идет проверка уровней двух переменных: предыдущее значение (изначально LOW) и текущее состояние кнопки. При выполнении этих условий значение переменной enable инвертируется. Учитывая это, мы добавили еще два простых условия if(). Если enable = true, то гирлянда включается, плавностью “перетекания” которой управляет цикл for(). Если же enable = false, то все светодиоды выключены. По окончанию условий переменная lastButton принимает текущее состояние кнопки. Тестируя нашу программу, мы заметили, что все работает не должным образом. Помните, в прошлом уроке мы сделали поправку, что при большом значении временной задержки кнопка срабатывает по её истечению? В прошлом примере, при включенной гирлянде, суммарная задержка в теле функции void loop() составляла 85мс. Это давало нам возможность успеть “попасть” в определенной отрезок времени. В данном скетче, при том же условии, задержка отличается в несколько раз. Возможно, при желании выключить гирлянду напрашивается слово “прервать”. Это и будет являться решением данной задачи!

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

Источник: http://arduinokit.blogspot.com/2013/05/arduino-pwm.html

Урок 37. Широтно-импульсная модуляция в Ардуино

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

Предыдущий урок     Список уроков     Следующий урок

Прервемся на урок от разработки контроллера холодильника, для того чтобы научиться работать с широтно-импульсным модулятором Ардуино.

В нашей разработке используется именно такой способ регулирования мощности на элементе Пельтье.

Широтно-импульсная модуляция.

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

Можно выделить две основные области применения широтно-импульсной модуляции:

  • Во вторичных источниках питания, различных регуляторах мощности, регуляторах яркости источников света, скорости вращения коллекторных двигателей и т.п. В этих случаях применение ШИМ позволяет значительно увеличить КПД системы и упростить ее реализацию.
  • Для получения аналогового сигнала с помощью цифрового выхода микроконтроллера. Своеобразный цифро-аналоговый преобразователь (ЦАП). Очень простой в реализации, требует минимума внешних компонентов. Часто достаточно одной RC цепочки.

Принцип регулирования с помощью ШИМ – изменение ширины импульсов при постоянной амплитуде и частоте сигнала.

На диаграмме можно увидеть основные параметры ШИМ сигнала:

  • Ui – амплитуда импульсов ;
  • Ton – время активного (включенного) состояния сигнала;
  • Toff – время отключенного состояния сигнала;
  • Tpwm – время периода ШИМ.

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

Это соотношение определяет коэффициент заполнения ШИМ:

Kw = Ton / Tpwm.

Он показывает, какую часть периода сигнал находится во включенном состоянии.  Может меняться:

  •  от 0 – сигнал всегда выключен;
  •  до 1 – сигнал все время находится во включенном состоянии.

Чаще используют процентный коэффициент заполнения. В этом случае он находится в пределах от 0 до 100%.

Среднее значение электрической мощности на нагрузке строго пропорционально коэффициенту заполнения. Когда говорят, что ШИМ равен, например, 20%, то имеют в виду именно коэффициент заполнения.

Формирование аналогового сигнала.

Если сигнал ШИМ пропустить через фильтр низких частот (ФНЧ), то на выходе фильтра мы получим аналоговый сигнал, напряжение которого пропорционально коэффициенту заполнения ШИМ.

U = Kw * Ui

В качестве ФНЧ можно использовать простейшую RC цепочку.

Из-за неидеальной характеристики такого фильтра частота среза должна быть минимум на порядок меньше частоты ШИМ. Для простого RC фильтра частота среза вычисляется по формуле:

F = 1 / (2 π R C).

  • При повышении частоты среза ФНЧ на выходе фильтра увеличиваются пульсации с частотой ШИМ.
  • При уменьшении частоты среза фильтра снижается время реакции выходного аналогового сигнала на изменения ширины импульсов.

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

Я бы рекомендовал:

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

Даже простейшие моделирующие программы вычисляют уровень пульсаций достаточно точно. Вот результаты моделирования на SwCAD для ШИМ частотой 500 Гц и RC фильтрами с частотами среза 500 Гц, 50 Гц и 5 Гц. Зеленым цветом показана диаграмма ШИМ, синим – напряжение на выходе RC фильтра.

Частота среза 500 Гц (10 кОм, 32 нФ).

Частота среза 50 Гц (10 кОм, 320 нФ).

Частота среза 5 Гц (10 кОм, 3,2 мкФ).

Точность преобразования широтно-импульсных модуляторов определяется погрешностью амплитуды импульсов (т.е.

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

Добиться высокой точности ШИМ преобразования можно с помощью дополнительной схемы с аналоговыми ключами и источником опорного напряжения.

К недостаткам использования широтно-импульсных модуляторов в качестве ЦАП также следует отнести высокое выходное сопротивление. Оно определяется сопротивлением резистора RC фильтра и не может быть низким из-за малой нагрузочной способности выходов микроконтроллера.

Широтно-импульсные модуляторы в Ардуино.

Платы Ардуино на базе микроконтроллеров ATmega168/328 имеют 6 аппаратных широтно-импульсных модуляторов. Сигналы ШИМ могут быть сгенерированы на выводах 3, 5, 6, 9, 10, 11.

Управление аппаратными ШИМ осуществляется с помощью системной функции analogWrite().

void analogWrite(pin, val)

Функция переводит вывод в режим ШИМ и задает для него коэффициент заполнения. Перед использованием analogWrite() функцию pinMode() для установки вывода в режим “выход” вызывать необязательно.

Аргументы:

  • pin – номер вывода для генерации ШИМ сигнала.
  • val – коэффициент заполнения ШИМ. Без дополнительных установок  диапазон val от 0 до 255 и соответствует коэффициенту заполнения от 0 до 100 %. Т.е. разрядность системных ШИМ в Ардуино 8 разрядов.
Читайте также:  Wltoys q222k: обзор и спецификации - arduino+

analogWrite(9, 25);  // на выводе 9 ШИМ = 10%

Частота ШИМ Ардуино 488,28 Гц.

Для генерации ШИМ используются все три таймера Ардуино.

Таймер Используется для генерации ШИМ на выводах
Таймер  0 выводы 5 и 6
Таймер  1 выводы 9 и 10
Таймер  2 выводы 3 и 11

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

Поэтому, при использовании библиотек MsTimer2, TimerOne или им подобных некоторые выводы в качестве ШИМ сигналов использовать нельзя.

Увеличение частоты и разрядности ШИМ Ардуино.

Система Ардуино устанавливает на всех выводах ШИМ параметры:

  • частота 488,28 Гц;
  • разрешение 8 разрядов (0…255).

Очень низкая частота. Для большинства приложений совершенно не допустимая.

В разработке контроллера элемента Пельтье, начатой в предыдущем уроке, частота ШИМ должна быть не менее 30-50 кГц. В интернете достаточно много предложений по увеличению частоты ШИМВо всех описываются методы увеличения частоты до 31 кГц. В принципе приемлемый вариант, но мне захотелось большего.

Я разобрался с Таймером 1 микроконтроллера ATmega168/328, перевел ШИМ в быстродействующий режим и добился частоты ШИМ Ардуино до 62,5 кГц. Заодно я научился менять разрядность ШИМ. Чтобы в следующий раз не копаться в документации на микроконтроллеры ATmega168/328 я свел всевозможные варианты ШИМ для таймера 1 в таблицу.

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

Варианты параметров ШИМ на выводах 9 и 10 Ардуино (таймер 1).

Разрешение Частота ШИМ Команды установки режима
8 бит 62 500 Гц TCCR1A = TCCR1A & 0xe0 | 1;TCCR1B = TCCR1B & 0xe0 | 0x09;
7 812,5 Гц TCCR1A = TCCR1A & 0xe0 | 1;TCCR1B = TCCR1B & 0xe0 | 0x0a;
976,56 Гц TCCR1A = TCCR1A & 0xe0 | 1;TCCR1B = TCCR1B & 0xe0 | 0x0b;
244,14 Гц TCCR1A = TCCR1A & 0xe0 | 1;TCCR1B = TCCR1B & 0xe0 | 0x0c;
61,04 Гц TCCR1A = TCCR1A & 0xe0 | 1;TCCR1B = TCCR1B & 0xe0 | 0x0d;
9 бит 31 250 Гц TCCR1A = TCCR1A & 0xe0 | 2;TCCR1B = TCCR1B & 0xe0 | 0x09;
3 906,25 Гц TCCR1A = TCCR1A & 0xe0 | 2;TCCR1B = TCCR1B & 0xe0 | 0x0a;
488,28 Гц TCCR1A = TCCR1A & 0xe0 | 2;TCCR1B = TCCR1B & 0xe0 | 0x0b;
122,07 Гц TCCR1A = TCCR1A & 0xe0 | 2;TCCR1B = TCCR1B & 0xe0 | 0x0c;
30,52 Гц TCCR1A = TCCR1A & 0xe0 | 2;TCCR1B = TCCR1B & 0xe0 | 0x0d;
10 бит 1 5625 Гц TCCR1A = TCCR1A & 0xe0 | 3;TCCR1B = TCCR1B & 0xe0 | 0x09;
1 953,13 Гц TCCR1A = TCCR1A & 0xe0 | 3;TCCR1B = TCCR1B & 0xe0 | 0x0a;
244,14 Гц TCCR1A = TCCR1A & 0xe0 | 3;TCCR1B = TCCR1B & 0xe0 | 0x0b;
61,04 Гц TCCR1A = TCCR1A & 0xe0 | 3;TCCR1B = TCCR1B & 0xe0 | 0x0c;
15,26 Гц TCCR1A = TCCR1A & 0xe0 | 3;TCCR1B = TCCR1B & 0xe0 | 0x0d;

Следующий скетч генерирует на выводе 9 ШИМ с частотой 62,5 кГц и коэффициентом заполнения примерно 10 %.

void setup() {
  // ШИМ 8 разрядов, 62,5 кГц
  TCCR1A = TCCR1A & 0xe0 | 1;
  TCCR1B = TCCR1B & 0xe0 | 0x09; 
  analogWrite(9, 25); // на выводе 9 ШИМ=10%
}

void loop() {
}

Это максимально возможная частота ШИМ Ардуино для большинства плат (с частотой генератора 16 мГц).

В следующем уроке вернемся к разработке контроллера элемента Пельтье.

Предыдущий урок     Список уроков     Следующий урок

Источник: http://mypractic.ru/urok-37-shirotno-impulsnaya-modulyaciya-v-arduino.html

Затухающий светодиод с использованием ШИМ выхода Arduino

Функция analogWrite() используется для затухания свтодиода и его постепенного включения.

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

Что вам понадобится для проекта

  • Плата Arduino
  • Макетная плата (breadboard)
  • Светодиод
  • Резистор на 220 Ом

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

Подключите анод (более длинная, позитивная нога) светодиода к цифровому пину 9 платы Arduino через резистор 220 Ом. Подключите катод (более короткая, нога с отрицательным зарядом) к земле.

Описание программы для Arduino

После объявления 9 пина в качестве ledPin, тело функции setup() можно не наполнять.

Функция analogWrite() которую вы будете использовать в главном цикле main, требует два аргумента: один для определения пина, на который будут записываться и второй – для отображения записываемого ШИМ-значения.

Для того, чтобы постепенно зажигать и тушить ваш светодиод, постепенно увеличивайте ШИМ значение от 0 до 255, после – опять до 0, чтобы завершить цикл. В скетче ниже, ШИМ-значение используется для переменной под названием brightness. Каждый раз по завершению цикла она увеличивает значение переменной.

Если brightness достигает своего предельного значения (0 или 255), fadeAmount меняет свое значение на отрицательное. Другими словами, если fadeAmount равно 5, его значение меняется на -5. При следующей итерации цикла это приводит к изменению переменной brightness.

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

Скетч для Arduino IDE

/*

Fade

Данный пример показывает как обеспечить затухание на 9 пине с использованием функции analogWrite().

*/

int led = 9; // пин, к которому подключен светодиод

int brightness = 0; // яркость светодиода

int fadeAmount = 5; // на сколько увеличить яркость светодиода

// функция setup отрабатывает один раз после перезагрузки платы:

void setup() {

// объявляет 9 пин в качестве выхода:

pinMode(led, OUTPUT);

}

// цикл loop повторяется бесконечно:

void loop() {

// устанавливает яркость 9 пина:

analogWrite(led, brightness);

// изменение яркости на следующей итерации с помощью цикла:

brightness = brightness + fadeAmount;

// меняет значение затухания на аналогичное с противоположным знаком при граничных значениях:

if (brightness == 0 || brightness == 255) {

fadeAmount = -fadeAmount ;

}

// задержка в 30 для отслеживания эффекта затухания

delay(30);

Источник: http://arduino-diy.com/arduino-zatukhayushchiy-svetodiod-s-ispolzovaniyem-SHIM-vykhoda

Осиливаем ШИМ в теплой компании Arduino и RGB светодиода

Широтно-импульсная модуляция (ШИМ, PWM) – веселая штука, и особенно прикольно с ее помощью управлять сервомоторами, однако сегодня мы применим ее к трехцветному светодиоду. Это позволит нам управлять его цветом и получить некое подобие красоты.

ШИМ

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

Теперь разберемся, что это значит. Пусть есть обычный такой прямоугольный сигнал:

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

Если у нас максимальное напряжение равно 5 В, то напряжение, получаемое на выходе ШИМ равно скважность умножить на 5 В (и делить на 100% чтобы формал-nazi не привязывались):

Arduino позволяет записать на ШИМ-выход значение от 0 до 255, а это значит, что мы можем получить напряжение с дискретностью примерно 20 мВ. 

Трехцветный светодиод Вот он, четырехногий красавец:Самая длинная нога – это общий анод, а все остальные – это катоды, каждый отвечает за свой цвет: (смотрим на рисунок) самая нижняя – красный, вторая сверху – зеленый, самая верхняя – синий. Если подать на длинную ногу +5В, а на все остальные 0В, то получится белый свет (умоляю, предохраняйтесь – ставьте ограничивающие резисторы!). Насколько он белый, можно судить по следующему видео:Но получать белый цвет на нем как раз-таки неинтересно. Посмотрим, как заставить его переливаться разными цветами.

ШИМ на Arduino 

Частота ШИМ на Arduino – примерно 490 Гц. На плате Arduino UNO выводы, которые могут быть использованы для ШИМ – 3,5,6, 9, 10 и 11. На плате к этому есть подсказка – шелкографией перед номерами ШИМ-выводов есть тильда или диез.

Нет ничего проще, чем управлять ШИМ на Arduino! Для этого используется одна единственная функция analogWrite(pin, value), где pin – номер вывода, а value – значение от 0 до 255.

При этом ничего не надо писать в void setup()!

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

Совсем немного работаем

Сделаем так, чтобы светодиод переливался разными цветами. Пусть один цвет плавно гаснет, в то время как другой разгорается. Поочередно будем менять пару цветов, и цвет будет переходить по кругу из красного в зеленый, из зеленого в синий, из синего в красный. Соберем незамысловатую схему:И напишем незамысловатый код:
//обзываем выводы соответственно цвету
int REDpin = 9;
int GREENpin = 10;
int BLUEpin = 11;

void setup(){}

void loop(){
  for(int value = 0 ; value

Источник: http://greenoakst.blogspot.com/2012/02/arduino-rgb.html

ШИМ-регулятор на Arduino

  Простой ШИМ-регулятор легко можно сделать с помощью Arduino. Для примера возьмём всем известный контроллер Arduino UNO , который построен на ATmega328.

  Он имеет 14 цифровых входов/выходов ( 6 из которых могут использоваться как выходы ШИМ)  и  6 аналоговых входов. Arduino UNO недорого можно купить здесь – http://ali.

pub/y24f1

   Для наших целей понадобится один аналоговый вход – А0, который используем для подключения переменного резистора, а также один выход ШИМ – возьмём 11. Соберём простую схему : 

 

      И напишем простую программу для управления яркостью светодиода , подключённого к 11 выходу ШИМ. Регулировать будем переменным резистором, который подключен к аналоговому входу А0.

   Получаем первый результат  –  яркость светодиода изменяется с помощью переменного резистора. Для управления какой-нибудь силовой нагрузкой включённой в сеть 220 вольт такой ШИМ тоже сгодится, только желательно сделать гальваническую развязку между силовой частью и Arduino.  Можно взять готовый кусочек схемы из предыдущей страницы ” ШИМ-регулятор 220 В( IGBT)”

    Провёл небольшие испытания этого ШИМ-регулятора – сначала как обычно подключил активную нагрузку ( лампочку накаливания) а затем и коллекторный двигатель. Всё работает. Снял видео – 

                                       

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

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

и подал это сигнал на аналоговый вход  А1.  Для защиты входа Ардуино от перенапряжения поставил ещё стабилитрон на 5.1  вольт. Получилась такая схема

 Для написания программы  управления оборотами коллекторного двигателя  использовал библиотеку PID – регулятора для Arduino.

#include // подключаем библиотеку PID-регулирования

double pwmSet, pwmSpeed, pwmOut; //  //переменные для пид-регулятора PID myPID(&pwmSpeed, &pwmOut, &pwmSet, 0.2, 0.5, 0, DIRECT); // Подобрал коэфф пид-регулятора Kp=0.2, Ki=0.5, Kd=0 . #define PWM_PIN   11 // выход ШИМ #define SET_PIN    0 // установка оборотов  0-5 вольт  мин-макс #define TACHO_PIN  1 // сигнал от таходатчика 0-5 вольт  мин-макс void setup() {     myPID.SetMode(AUTOMATIC); } void loop()  {     pwmOut = constrain ( pwmOut , 0, 250); // это необязательно – по умолчанию 0-255     pwmSet  =  analogRead(SET_PIN); // считываем показания потенциометра регулировки скорости     pwmSpeed = analogRead(TACHO_PIN); // считываем показания таходатчика     myPID.Compute(); //  здесь происходят вычисления пид-регулятора – то есть pwmOut     analogWrite(PWM_PIN, pwmOut);//  получаем выходной сигнал ШИМ }

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

Источник: http://www.motor-r.info/p/blog-page_19.html

Аналоговые измерения с Arduino | РОБОТОША

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

Читайте также:  Покупка нового смартфона cubot s550 на aliexpress.com - arduino+

Сегодня я расскажу об использовании и проведу тест производительности аналого-цифрового преобразователя (АЦП) Arduino. Тест я буду производить, используя оригинальную плату Arduino Mega 2560, в основе которой лежит микроконтроллер ATMega2560, работающий на частоте 16 Мгц.

Микроконтроллер ATMega328, на котором основаны Arduino Uno и Arduino Nano, также работает на частоте 16 МГц, так что все вышеизложенное, скорее всего, справедливо и для этих и аналогичных плат.

analogRead

Давайте посмотрим сколько же времени занимает аналого-цифровое преобразование с использованием стандартной функции analogRead.

Для определения моментов начала и конца преобразования я буду использовать 12 вывод в качестве маркера. Для начала повторим эксперимент, который я описывал в статье Оптимизируем digitalWrite на Arduino. Будем изменять уровень напряжения на 12 цифровом пине между состояниями LOW и HIGH. Для чистоты эксперимента я помещу внутрь loop бесконечный цикл.

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

void setup(){DDRB = B01000000; //устанавливаем 12 пин в режим выхода}void loop(){while(1){  PORTB = B01000000; // устанавливаем пин 12 в состояние HIGH    PORTB = B00000000; // устанавливаем пин 12 в состояние LOW}}

Воспользуемся осциллографом и посмотрим на временные параметры работы этой программы:

Отсюда видно, что время переключения состояния пина занимает у нас 62 нс (длительность положительного импульса).

Теперь немного изменим скетч и добавим между переключениями функцию чтения аналогового сигнала analogRead на 3 аналоговом пине:

123456789101112131415161718 int analogPin = 3; // входной аналоговый пинint analogValue = 0; // значение аналогового сигналаvoid setup(){DDRB = B01000000; // устанавливаем 12 пин в режим выхода}void loop(){while(1){  PORTB = B01000000; // устанавливаем пин 12 в состояние HIGH  analogValue = analogRead(analogPin); // читаем аналоговый сигнал  PORTB = B00000000; // устанавливаем пин 12 в состояние LOW  analogValue = analogRead(analogPin); // читаем аналоговый сигнал}}

Осцилограмма сигнала на 12 цифровом пине теперь будет выглядеть следующим образом:

Длительность переключения в 62 нс и время циклического возврата к началу работы программы в 124 нс не превышают погрешность измерения на этом временном масштабе и мы можем пренебречь этими временными промежутками. Отсюда видно, что время, которое затрачивается на аналого-цифровое преобразование примерно равно 112 мкс, поэтому максимальная частота выборки при использовании функции analogRead не превышает 8.9 кГц.

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

Используем прерывания АЦП

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

Такую выборку можно реализовать несколько более сложным способом, используя прерывания.

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

Разовая выборка

Разовая выборка — это на самом деле то, что Arduino делает при вызове функции analogRead. Мы не сможем получить значительных преимуществ, реализовав разовую выборку с помощью других средств. Поскольку перед запуском АЦП, в первую очередь проверяется флаг готовности АЦП, то это означает, что проверка флага в цикле ничем не отличается от того, что делает Arduino.

Непрерывная выборка

Хорошей идеей при непрерывной выборке сигнала является использование прерываний. Микроконтроллеры ATMega328 и ATMega2560 могут быть переведены в режим непрерывной выборки (free running mode).

В этом режиме АЦП запускается автоматически после завершения предыдущей обработки.

Каждый раз преобразование заканчивается генерированием прерывания, которое вызывает функцию обработки прерывания ISR (ADC_vect), в которой результат аналого-цифрового преобразования может быть считан и обработан.

Для включения режима непрерывной выборки необходимо установить три регистра: ADMUX, ADCSRA и ADCSRB. Детальное описание этих регистров можно найти в технических руководствах к микроконтроллерам.

Внутреннее опорное напряжение 1.1 В и входной аналоговый канал ADC3 выбираются при помощи ADMUX. Тактовая частота задается при помощи ADCSRA и в нашем примере установлена в виде делителя ÷16.

Одно аналоговое преобразование занимает 13 тактовых периодов. Частота дискретизации может быть вычислена, исходя из тактовой частоты микроконтроллера: 16 Мгц/(16*13) ≈ 77 кГц.

Установкой 6 бита регистра ADCSRA в состояние HIGH,  запускается непрерывная выборка.

Результат аналого-цифрового преобразования считывается в функцию обработки прерывания ISR (ADC_vect). Поскольку, результат имеет длину 10 бит, то он делится на два регистра ADCL и ADCH, размером в один байт каждый. Для корректного чтения значения сначала нужно считать значение регистра ADCL, а затем — регистра ADCH.

Пример скетча, в котором результат, полученный из АЦП копируется в целочисленную переменную analogValue:

12345678910111213141516171819202122232425 int analogValue = 0; // значение аналогового сигналаvoid setup(){DDRB = B01000000; // pin 12 в режиме OUTPUTDIDR0 = 0x3F; // отключаем цифровые входыADMUX = 0x43; // измеряем на ADC3, используем внутреннее опорное напр.= 1.1ВADCSRA = 0xAC; // включаем АЦП, разрешаем прерывания, делитель = 16ADCSRB = 0x40; // включаем АЦ коналы MUX, режим скользящей выборкиbitWrite(ADCSRA, 6, 1); // Запускаем преобразование установкой бита 6 (=ADSC) в ADCSRAsei(); // устанавливаем флаг прерывания}void loop(){}/*** Процедура обработки прерывания АЦП ***/ISR(ADC_vect){PORTB = B00000000; // пин 12 переводим в состояние LOWanalogValue = ADCL; // сохраняем младший байт результата АЦПanalogValue += ADCH

Источник: http://robotosha.ru/arduino/analog-measurements-arduino.html

Arduino — описание выводов на примере Arduino UNO

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

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

На рисунке ниже приведены платы Arduino UNO и Arduino MEGA:

Arduino MEGA совместима с версией UNO в области основных выводов. Дополнительные выводы MEGA расположены отдельно, что позволяет сохранить совместимость с Arduino UNO.

Распиновка Arduino Uno

Рядом с USB разъемом есть кнопка «RESET». Он позволяет вернуться к исходному состоянию программы, которое бывает при включении питания. После нажатия кнопки «RESET» данные в ОЗУ микроконтроллера сбрасываются и Arduino начинает выполнять программу с самого начала.

Интерфейс USB позволяет программировать Arduino и взаимодействовать и поддерживать связь с Serial монитором. Кроме того, непосредственно через USB вы можете запитать плату.

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

Для этого в Arduino имеет разъем для подключения внешнего источника питания. Напряжение питания может составлять от 5 до 20 В. Фактически, оптимальное напряжение должно находиться в диапазоне 7-12 В.

Если напряжение питания будет меньше 7В, то напряжение на выходе встроенного стабилизатора будет меньше 5 В. Если же входное напряжение питания будет больше 12 В, то это приведет к значительному нагреву стабилизатора напряжения.

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

Arduino оснащена одним или двумя шестиконтактными разъемами, которые используются для программирования микроконтроллера. Разъемы обозначаются как ICSP1 и ICSP2.

Разъем ближе к основному микроконтроллеру позволяет загружать BOOTLOADER, а разъем ближе к USB-порту позволяет загружать программу USB-UART преобразователя.

Второй разъем используется только в платах Arduino, где в качестве USB-UART преобразователя используется микроконтроллер Atmega. Если установлен FT232, то второй разъем на плате отсутствует.

Плата Arduino оснащена группой, по крайней мере, из 4 светодиодов. Два из них помечены как «RX» и «TX» расположены рядом с микросхемой FT232 или Atmega.

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

По их свечению вы можете визуально определить, происходит ли передача данных (программирование) или нет.

Еще один светодиод, обозначенный как «ON», является индикатором питания платы. Последний светодиод, как правило, — это светодиод, анод которого подключен к выводу 13, а катод к минусу питания. Поэтому высокий логический уровень на выводе 13 приведет к включению светодиода, в то время как низкий уровень приведет к его выключению.

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

Левая часть (POWER) обеспечивает доступ к питанию и управлению:

  • IOREF — указывает каким напряжением питается процессор Arduino (это важно для некоторых шилдов)
  • RESET — сброс Arduino
  • 3V3 – система питание модулей, требующих 3,3 В
  • 5V — система питания TTL
  • GND – масса
  • GND — масса
  • VIN — напряжение питания от внешнего источника

Правая часть (ANALOG IN) обеспечивает считывание аналоговые сигналов. Аналого-цифровой преобразователь (АЦП) позволяет считывать значения напряжения от 0 до AREF или 0…5 В.

Считанное значение может быть 8-битным или 10-битным. Аналоговые входы подписаны как A0, A1, A2, A3, A4, A5. Несмотря на их основное предназначение, выводы A0 — A5 так же могут быть использованы как цифровые входы или выходы.

Верхний ряд контактов также разделен на две части. Правая часть пронумерована от 0 до 7, левая от 8 до 13. Этот ряд содержит контакты цифрового входа/выхода.

Контакты 0 и 1 являются специальными выводами, на которые дополнительно выведены линии последовательного порта (RX и TX). Их можно использовать для последовательной связи с другой платой.

Контакты 3, 5, 6, 9, 10, 11 обозначаются как «~» или PWM. Они могут работать в режиме ШИМ, иногда называемым аналоговым выходом. Конечно же, это не реальные аналоговые выходы. Они только позволяют контролировать ширину импульса, которая часто используется в цифровой электронике для изменения «аналогового» сигнала.

И последние два вывода — это GND и AREF, которые используется для подключения внешнего опорного напряжения для аналого-цифрового преобразователя.

В итоге Arduino UNO имеет 14 цифровых линий входа/выхода и 6 аналоговых входов (которые могут служить в качестве цифровых входов/выходов).

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

Допустимое входное напряжение не должно превышать 5В или 3,3В (у плат с питанием от 3,3В). В случае если необходимо обработать сигнал напряжением больше 5В (3,3В для Arduino Pro Mini), то следует воспользоваться делителем напряжения.

Нагрузочная способность выходов при питании от 5 В составляет 40мА, при питании от 3,3 В — 50 мА. Это означает, что к одному выходному контакту можно подключить, например, до двух светодиодов, предполагая, что рабочий ток каждого из них составляет 20 мА.

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

Источник: http://www.joyta.ru/10674-arduino-opisanie-vyvodov-na-primere-arduino-uno/

Широтно-импульсная модуляция (ШИМ)

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

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

Читайте также:  Инженер-электроник

В данной статье я хочу рассказать еще об одном способе кодирования информации – широтно-импульсной модуляции – оскращенно ШИМ или PWM в английском эквиваленте.

Идея ШИМ проста до безобразия. Пусть передача производится с частотой h = 1/T. Будем считать, что импульс, равный периоду Т, задает максимальное значение (100% некой величины, нечто целое). Примем также, что отсутствие импульса (т.е. его длина равна нулю) – это минимальное значение (0%).

Далее остается предположить, что все варианты длины импульса от 0 до T задают доли или проценты от целого значения. Таким образом передаваемое значение кодируется шириной передаваемого импульса. Это очень удобно для передачи аналоговых сигналов.

Проще всего продемонстрировать работу ШИМ на примере все того же светодиода.

В предыдущих статьях была написана программа, в которой мы либо зажигали либо гасили светодиод. Т.е. последний горели или с максимальной яркостью, или не горел вовсе. Использование ШИМ позволяет нам управлять яркостью светодиода. Вот код простой программы, которая заставляет гореть светодиод на выводе D10 нашей Arduino UNO с яркостью 50% от максимума.

int led = 10; void setup() {               pinMode(led, OUTPUT);    

  analogWrite(led, 128);

} void loop() {

}

В этом примере была использована функция analogWrite(). В качестве аргументов она принимает два значения: первое – это номер вывода, на котором будет формироваться сигнал, а второй – это собственно значение сигнала.

Тут надо отметить, что значение задается не в процентах, а в целочисленных “попугаях” от 0 до 255. Почему так? Для того, чтобы понять ответ на этот вопрос надо вернуться к “машинной азбуке”. Функция принимает на вход значение в один байт (или 8 бит).

При помощи одного байта можно закодировать любое целое число в диапазоне от 0 до 255… 🙂

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

Пока же, чтоб понимать какие выводы мы можем использовать для вывода ШИМ достаточно обратиться к схематическому описанию назначения контактов (распиновке) нашей платы Arduino. Выводы с пометкой PWM или ~ могут использоваться для вывода ШИМ. В книге Днищенко В.А.

“Дистанционное управление моделями” очень хорошо описано применение ШИМ для пропорционального управления моделями. Я не буду тут пересказывать всю книгу, а остановлюсь лишь на примере управления сервоприводом. За многие годы стандарт сигнала управления для выше означенных аналоговых устройств успел устояться.

Так любая сервомашинка будет работать с сигналом ШИМ с частотой 50Гц и шириной импульса от 1000 до 2000 микросекунд. Для некоторой среднестатистической сервы это будет означать следующее:

Угол поворота сервы равен -60 градусов

Угол поворота сервы равен 0 градусов (центральное положение)

Угол поворота сервы равен 60 градусов.

Для формирования ШИМ с такими характеристиками в стандартную Arduino IDE включена библиотека Servo. Надо сказать, что в отличие от analogWrite, эта библиотека может управлять сервоприводом на любом выводе Arduino. Вот пример кода из этой библиотеки:

#include //цепляем библиотеку Servo к нашей программе   Servo myservo;  // Создаем переменную myservo объектного типа                 // сам тип как раз и описан в библиотеке Servo   int pos = 0;    // переменная для хранения угла отклонения сервопривода   void setup() {   myservo.

attach(9);  // говорим программе, что наш сервопривод прицеплен к выводу 9 Arduino }   void loop() {   for(pos = 0; pos =0; pos-=1)     // Заставляем поворачиваться сервопривод в обратную сторону.   {                                     myservo.

write(pos);                delay(15);                      }

}

Библиотека предполагает, что качалка сервопривода поворачивается на 180 градусов и средним положением является угол в 90 градусов. Для удобства восприятия я перевел все комментарии на русский язык.

При подключении сервопривода к Arduino надо быть внимательным и подключать его точно в соответствии с маркировкой: черный – GND(земля), красный – +5В, белый – управляющий сигнал с цифрового вывода. Если перепутать белый и черный провода, то сервопривод просто не будет работать.

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

Перепутать сигнал с землей тут еще можно, а вот +5В и что-то еще – уже гораздо сложнее.

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

Источник: http://rc-master.ucoz.ru/publ/27-1-0-115

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

Опубликовано 06.07.2014 13:29:00

На наш взгляд, первое, с чего можно начать знакомство с платформой Arduino это её цифровые выводы. Они нам пригодятся для подключения различной периферии: светодиоды, реле модули и т.п

На плате Arduino UNO их 14 (D0-D13). Они могут работать как входы, как выходы и как выходы с поддержкой ШИМ. 

Конфигурация выводов как вход либо выход задается в void setup

  // Инициализируем цифровой pin 3 как выход
  pinMode(3, OUTPUT);
  // Инициализируем цифровой pin 3 как вход   
  pinMode(3, INPUT);

После конфигурации цифрового вывода как выхода, мы можем придать ему два значения:

// Устанавливает высокий уровень напряжения на 3 пине  
digitalWrite(3, HIGH); // Устанавливает низкий уровень напряжения на 3 пине
  digitalWrite(3, LOW);

При высоком уровне выход  работает как “источник питания” с напряжением 5 Вольт, при низком же уровне выход соединяется с землей МК. В двух этих режимах порт может выдать либо принять ток до 40мА. Это позволит подключать к плате Arduino маломощные нагрузки. При превышении тока в 40мА может выгореть либо отдельно порт, либо весь камень.

В качестве первого примера выполним некий “Hello, World!” в тематике Arduino – помигаем светодиодом. 

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

Для эксперимента нам понадобятся:

Плата Arduino, соединительные провода “папа-папа”, макетная плата на 400 контактов, светодиод, резистор 220 – 1000Ом.

Описание примера:

При установке высокого уровня (HIGH), на выводе D3 появляется напряжение, которое протекая через светодиод (LED1) заставляет его светиться. При установке низкого уровня (LOW), напряжение больше не подается и светодиод не горит. Резистор (R1) необходим для ограничения потребляемого светодиодом тока.

На реальной макетной плате всё будет выглядеть следующим образом:

Примечания по сборке:

Вывод D3 соединяется с анодом светодиода, а катод уходит на резистор. У резистора нет полярности и его можно устанавливать любой стороной.

Пример программного кода:

void setup() {   // Инициализируем цифровой pin 3 как выход
  pinMode(3, OUTPUT); } // void loop прокручивает все записанное в нем раз за разом:
void loop() {
  digitalWrite(3, HIGH); // Включаем светодиод (HIGH выставляет высокий уровень)
  delay(1000); // Ждем секунду
  digitalWrite(3, LOW); // Выключаем светодиод (LOW выставляет высокий уровень)
  delay(1000); // Ждем секунду
}

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

// Присваиваем имя цифровому выводу 3 int led = 3; void setup() {   // Инициализируем цифровой pin 3 как выход
  pinMode(led, OUTPUT); } void loop() {
  digitalWrite(led, HIGH); // Включаем светодиод (HIGH выставляет высокий уровень)
  delay(1000); // Ждем секунду
  digitalWrite(led, LOW); // Выключаем светодиод (LOW выставляет высокий уровень)
  delay(1000); // Ждем секунду
}

2) Цифровые выходы с поддержкой ШИМ

ШИМ (Широтно-Импульсная Модуляция) или PWM (Pulse Width Modulation) представляет собой программное, завязанное на внутренний таймер контроллера, чередование высокого и низкого уровней на порту контроллера с задаваемой скважностью. ШИМ это очень полезная штука, которая пригодится для регулирования яркости светодиодов либо управления скоростью вращения моторов (Более подробно что такое ШИМ).

Не все цифровые выводы имеют поддержку ШИМ. У Arduino UNO их 6 (D3, D5, D6, D9, D10, D11). У других плат количество может отличаться. Смотрите в спецификации.

В программном коде скважность задается числом от 0(min) до 255(max)

// Устанавливает ШИМ сигнал на 3 пине со скважностью 150  
analogWrite(3, 150);

В качестве наглядного примера поупрявляем яркостью светодиода с помощью ШИМ модуляции.

Как уже говорилось, Arduino имеет на своем борту встроенный светодиод подключенный к выводу D13. Однако, этот вывод не имеет поддержки ШИМ. ШИМ поддержку имеет вывод D3. К нему, как и в предыдущем примере, мы подключим светодиод

Для эксперимента нам понадобятся:

Плата Arduino, соединительные провода “папа-папа”, макетная плата на 400 контактов, светодиод, резистор 220 – 1000Ом.

Описание примера:

При установке высокого уровня (HIGH), на выводе D3 появляется напряжение, которое протекая через светодиод (LED1) заставляет его светиться. При установке низкого уровня (LOW), напряжение больше не подается и светодиод не горит. Резистор (R1) необходим для ограничения потребляемого светодиодом тока.

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

Принципиальная схема остается такой же как и в первом примере.

На реальной макетной плате всё будет выглядеть следующим образом:

Примечания по сборке:

Вывод D3 соединяется с анодом светодиода, а катод уходит на резистор. У резистора нет полярности и его можно устанавливать любой стороной.

Пример программного кода:

// Присваиваем имя цифровому выводу 3  
int led = 3; void setup() {   // Инициализируем цифровой pin 3 как выход
  pinMode(led, OUTPUT); } void loop() {
  /* Задаем значение ШИМ равное 25 (10% от max)
   Иными словами (1/10 времени HIGH, 9/10 LOW)
   Такое мигание находится в диапазоне воспринимаемой человеком. 
   Глаз видит мигание */
  analogWrite(led, 25);   delay(4000); // Ждем 4 секунды   /* Задаем значение ШИМ равное 150 (60% от max)
   Иными словами (6/10 времени HIGH, 4/10 LOW)
   Частота смены картинки велика, выше воспринимаемой глазом человека, но не максимальна
   Глаз воспринимает как постоянно горящий светодиод с определенной яркостью */
  analogWrite(led, 150);   delay(4000);   /* Задаем значение ШИМ равное 255 (100% от max)
   Иными словами (10/10 времени HIGH, 0/10 LOW)
   При максимальном значении ШИМ светодиод горит постоянно */
  analogWrite(led, 255);   delay(4000);   // И для финального примера прогоним значения ШИМ от min до max
  for (int i = 0; i < 255; i++)   {     analogWrite (led, i);     delay(50);   }   for (int i = 255; i > 0; i–)
  {
    analogWrite (led, i);
    delay(50);
  }
}

3) Цифровые входы 

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

// Считываем значение с цифрового порта 4
  digitalRead(4);

В ответ получаем значения HIGH или LOW. 

Если к считываемому порту ничего не подключено, то функция digitalRead () может беспорядочно возвращать значения HIGH или LOW. Во избежание ложных срабатываний, входы необходимо подтягивать резистором 10-20кОм. При замыкании кнопки на землю – подтягивать к питанию, при замыкании на питание – к земле.

В данном примере считаем состояние кнопки (нажата/не нажата) и выведем в монитор порта.

Для эксперимента нам понадобятся:

Плата Arduino, соединительные провода “папа-папа”, макетная плата на 400 контактов, кнопка 6×6, резистор 10кОм.

Описание примера:

При нажатии на кнопку (S1) она будет замыкаться на линию +5V. Во избежание ложных срабатываний, порт контроллера притянут к земле резистором R1.

На реальной макетной плате всё будет выглядеть следующим образом:

Пример программного кода:

void setup() {
  Serial.begin(9600); // Скорость работы монитор порта
  pinMode(4, INPUT); // Инициализируем цифровой pin 4 как вход
} void loop() {
  int sensorValue = digitalRead(4); // Задаем переменную sensorValue для считывания состояния
  Serial.println(sensorValue, DEC); // Выводим состояние кнопки в порт
  delay(500); // Ждем пол секунды
}

 

Читать ранее:

•  Урок 0. Монитор порта

Читать далее:

•  Урок 2. Аналоговые входы

В данный момент еще реализованы не все элементы нашего сообщества. Мы активно работаем над ним и в ближайшее время возможность комментирования статей будет добавлена.

Источник: http://zelectro.cc/arduino_lesson_1

Ссылка на основную публикацию
Adblock
detector