Список деталей для эксперимента
Для дополнительного задания
еще 1 светодиод
еще 1 резистор номиналом 220 Ом
еще 2 провода
Принципиальная схема
Схема на макетке
Обратите внимание
Мы подключили «землю» светодиода и переменного резистора (потенциометра) к длинной рельсе «-» макетной платы, и уже ее соединили с входом GND микроконтроллера. Таким образом мы использовали меньше входов и от макетки к контроллеру тянется меньше проводов.
Подписи «+» и «-» на макетке не обязывают вас использовать их строго для питания, просто чаще всего они используются именно так и маркировка нам помогает
Не важно, какая из крайних ножек потенциометра будет подключена к 5 В, а какая к GND, поменяется только направление, в котором нужно крутить ручку для увеличения напряжения. Запомните, что сигнал мы считываем со средней ножки
Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, как цифровой, подходят только порты, помеченные на плате как «ANALOG IN» и пронумерованные с префиксом A . Для Arduino Uno - это A0-A5.
Скетч
p030_pot_light.ino // даём разумные имена для пинов со светодиодом // и потенциометром (англ potentiometer или просто «pot») #define LED_PIN 9 #define POT_PIN A0 void setup() { // пин со светодиодом - выход, как и раньше... pinMode(LED_PIN, OUTPUT) ; // ...а вот пин с потенциометром должен быть входом // (англ. «input»): мы хотим считывать напряжение, // выдаваемое им pinMode(POT_PIN, INPUT) ; } void loop() { // заявляем, что далее мы будем использовать 2 переменные с // именами rotation и brightness, и что хранить в них будем // целые числа (англ. «integer», сокращённо просто «int») int rotation, brightness; // считываем в rotation напряжение с потенциометра: // микроконтроллер выдаст число от 0 до 1023 // пропорциональное углу поворота ручки rotation = analogRead(POT_PIN) ; // в brightness записываем полученное ранее значение rotation // делённое на 4. Поскольку в переменных мы пожелали хранить // целые значения, дробная часть от деления будет отброшена. // В итоге мы получим целое число от 0 до 255 brightness = rotation / 4 ; // выдаём результат на светодиод analogWrite(LED_PIN, brightness) ; }
Пояснения к коду
С помощью директивы #define мы сказали компилятору заменять идентификатор POT_PIN на A0 - номер аналогового входа. Вы можете встретить код, где обращение к аналоговому порту будет по номеру без индекса A . Такой код будет работать, но во избежание путаницы с цифровыми портами используйте индекс.
Переменным принято давать названия, начинающиеся со строчной буквы.
Чтобы использовать переменную, необходимо ее объявить, что мы и делаем инструкцией:
Переменные одного типа можно объявить в одной инструкции, перечислив их через запятую, что мы и сделали
Функция analogRead(pinA) возвращает целочисленное значение в диапазоне от 0 до 1023, пропорциональное напряжению, поданному на аналоговый вход, номер которого мы передаем функции в качестве параметра pinA
Обратите внимание, как мы получили значение, возвращенное функцией analogRead() : мы просто поместили его в переменную rotation с помощью оператора присваивания = , который записывает то, что находится справа от него в ту переменную, которая стоит слева
Вопросы для проверки себя
Можем ли мы при сборке схемы подключить светодиод и потенциометр напрямую к разным входам GND микроконтроллера?
В какую сторону нужно крутить переменный резистор для увеличения яркости светодиода?
Что будет, если стереть из программы строчку pinMode(LED_PIN, OUTPUT) ? строчку pinMode(POT_PIN, INPUT) ?
Зачем мы делим значение, полученное с аналогового входа перед тем, как задать яркость светодиода? что будет, если этого не сделать?
Функция analogWrite() используется для затухания свтодиода и его постепенного включения.
AnalogWrite использует широтно-импульсную модуляцию (PWM), которая дает возможность включать/включать цифровой пин с большой скоростью, генерируя эффект затухания.
Что вам понадобится для проекта
- Плата Arduino
- Макетная плата (breadboard)
- Светодиод
- Резистор на 220 Ом
Схема подключения светодиода к Arduino
Подключите анод (более длинная, позитивная нога) светодиода к цифровому пину 9 платы Arduino через резистор 220 Ом. Подключите катод (более короткая, нога с отрицательным зарядом) к земле.
Электросхема подключенного к Arduino светодиода
Вариант шилда со светодиодом для Arduino
Описание программы для Arduino
После объявления 9 пина в качестве ledPin, тело функции setup() можно не наполнять.
Функция analogWrite() которую вы будете использовать в главном цикле main, требует два аргумента: один для определения пина, на который будут записываться и второй - для отображения записываемого ШИМ-значения.
Для того, чтобы постепенно зажигать и тушить ваш светодиод, постепенно увеличивайте ШИМ значение от 0 до 255, после - опять до 0, чтобы завершить цикл. В скетче ниже, ШИМ-значение используется для переменной под названием brightness. Каждый раз по завершению цикла она увеличивает значение переменной.
Если brightness достигает своего предельного значения (0 или 255), fadeAmount меняет свое значение на отрицательное. Другими словами, если fadeAmount равно 5, его значение меняется на -5. При следующей итерации цикла это приводит к изменению переменной brightness.
analogWrite() обеспечивает быструю смену ШИМ значения, так что задержка в конце скетча контролирует скорость затухания. Попробуйте изменить значение задержки задержки и отследить, как отработает программа.
Скетч для Arduino IDE
Данный пример показывает как обеспечить затухание на 9 пине с использованием функции analogWrite().
int led = 9; // пин, к которому подключен светодиод
int brightness = 0; // яркость светодиода
int fadeAmount = 5; // на сколько увеличить яркость светодиода
// функция setup отрабатывает один раз после перезагрузки платы:
// объявляет 9 пин в качестве выхода:
pinMode(led, OUTPUT);
// цикл loop повторяется бесконечно:
// устанавливает яркость 9 пина:
analogWrite(led, brightness);
// изменение яркости на следующей итерации с помощью цикла:
brightness = brightness + fadeAmount;
// меняет значение затухания на аналогичное с противоположным знаком при граничных значениях:
if (brightness == 0 || brightness == 255) {
fadeAmount = -fadeAmount ;
// задержка в 30 для отслеживания эффекта затухания
Потенциометр — это переменный резистор, который при повороте ручки изменяет свое сопротивление.
Что требуется для проекта:
- Arduino UNO или любой другой аналог
- Макетная плата
- Потенциометр
- Светодиод
- Резистор 220 Ом
Схема подключения на макетной плате.
Для того, чтобы регулировать яркость светодиода, подключим его к разъему, который поддерживает ШИМ, в нашем случае это цифровой пин 3. Разъемы VCC и GND потенциометра подключаем к рельсе питания и земли макетной платы. Разъем A0 подключаем к аналоговому пину A0.
После удачной сборки схемы загружаем данный скетч:
#define LED 3 #define POT A0 void setup() { pinMode(LED, OUTPUT); //настройка пина в режим выхода pinMode(POT, INPUT); //настройка пина в режим входа } void loop() { //заявляем целочисленные переменные int turn, brightness; //считываем в turn напряжение потенциометра, его значения //будут варьироваться от 0 до 1023 turn = analogRead(POT); //в переменную brightness записываем значение turn, //деленное на 4. Будет принимать значения от 0 до 255 brightness = turn / 4; //включаем светодиод с яркостью, равной значению brightness analogWrite(LED, brightness); }
Теперь попробуем написать код для этой же схемы, но на чистом СИ в среде AtmelStudio 7. Выглядеть это будет так.
#include Теперь попробуем разобраться с этими двумя примерами. Дело в том, что среда Arduino задумывалась для быстрого старта начинающим. Если надо помигать светодиодом или пощелкать реле, то это можно осуществить за считанные минуты. Среда Arduino полностью изолированна от железа микроконтроллера и поэтому в ней все осуществляется через функции, которые написаны разработчиками данного софта. Эти функции и их внутренности сокрыты в недрах программы. Обычному пользователю остается только вызывать нужные функции для настроек аппаратных узлов МК. Казалось бы это намного упрощает программирование. В принципе это так и есть. Поэтому среда и платы Arduino очень популярны среди начинающих любителей проектов на МК. Однако есть и минусы, например те, кто программируют Arduino, не могут запрограммировать микроконтроллеры, которые не поддерживает среда Arduino IDE. Например, запрограммировать любую модель МК Attiny AVR представляется уже невозможным. Да и другие модели Atmega, которых нет в платах Arduino, тоже остаются за бортом. В принципе если проекты не особо сложные, так побаловатся, то и среды Arduino достаточно. Если же надо что то большое и сложное, то тут конечно рулит чистый СИ. Но тогда придется разбираться в регистрах МК, в том как работают те или иные узлы МК. Надо читать документацию, изучить и понимать сам СИ. Однако если у вас уже есть опыт написание скетчей в среде Arduino, то со временем разобраться в СИ тоже будет возможно. Теперь попробуем рассмотреть код на СИ и поймем что это не так страшно. К примеру строка #include DDRC = 0< Эти строки настраивают нужные нам выводы платы Arduino на вход или на выход. PC0
это то же что и А0
на плате, этот вывод надо настроить на вход, так как к ней подключаетя потенциометр. И с этого вывода будет считываться значение АЦП. Регистром ADMUX
и ADCSRA
настраиваем сам узел АЦП в нужный нам режим. В частности настраиваем так что АЦП будет автоматически постоянно считывать значение с вывода А0
и сохранять это значение в регистре ADCH
. В МК есть аппаратные таймеры, это тоже такие узлы которые дают возможность работать с ШИМ выводами, например ШИМ вывод ~3 к которому подключен светодиод, принадлежит внутреннему Timer2
. В Atmega 328 есть еще Timer0
и Timer1
. Так вот с помощью регистров TCCR2A
и TCCR2B
, настроим наш Timer2 на режим FAST_PWM
, это дает нам возможность работать с выводом ~3 платы Arduino. Ну и в главном цикле программы сразу передаем значение из АЦП в наш Timer2
. Делается это одной строчкой OCR2B=ADCH
. Вопрос только в том как залить в нашу ардуину код написанный на СИ в AtmelStudio? Сделать это можно с помощью прямо из среды AtmelStudio. Правда перед этим надо из платы ардуино этим же программатором считать и сохранить загрузчик. Иначе потом плата ардуино не сможет работать со средой Arduino. В любое время можно обратно программатором вернуть загрузчик на место. В этом эксперименте мы добавляем порцию яркости светодиоду одной кнопкой и убавляем другой.
На этом примере Вы научитесь изменять яркость светодиода, используя резисторы с различным сопротивлением. 1 светодиод диаметром 5 мм 1 резистор на 270 Ом (красный, фиолетовый, коричневый) 1 резистор на 470 Ом (желтый, фиолетовый, коричневый) 1 резистор на 2.2 кОм (красный, красный, красный) 1 резистор на 10 кОм (коричневый, черный, оранжевый) Светодиоды отлично служат в устройствах для разного рода индикации. Они потребляют мало электричества и при этом долговечны. В данном примере мы используем самые распространенные светодиды диаметром 5 мм. Также распространены светодиоды диаметром 3 миллиметра, ну и большие светодиоды диаметром 10 мм. Подключать светодиод напрямую к батарейке или источнику напряжения не рекомендуется. Во-первых, надо сначала разобраться, где именно у светодиода отрицательная и положительная ноги. Ну а во вторых, необходимо использовать токоограничивающие резисторы, иначе светодиод очень быстро перегорит. Если вы не будете использовать резистор со светодиодом, последний очень быстро выйдет из строя, так как через него будет проходить слишком большое количество тока. В результате светодиод нагреется и контакт, генерирующий свет, разрушится. Различить позитивную и негативную ноги светодиода можно двумя способами. Первый – позитивная нога длиннее. Второй – при входе в корпус самого диода на коннекторе негативной ноги есть плоская кромка. Если вам попался светодиод, на котором плоская кромка на более длинной ноге, длинная нога все равно является позитивной. Resist – сопротивление (англ.) Из названия можно догадаться, что резисторы сопротивляются потоку электричества. Чем больше номинал (Ом) резистора, тем больше сопротивление и тем меньше тока пройдет по цепи, в которой он установлен. Мы будем использовать это свойство резисторов для регулирования тока, который проходит через светодиод и, таким образом, его яркость. Но сначала погорим немного о резисторах. Единицы, в которых измеряется сопротивление – Ом, которые во многих источниках обозначаются греческой буквой Ω – Омега Так как Ом – маленькое значение сопротивления (практически незаметное в цепи), мы часто будем оперировать такими единицами как кОм - килоом (1000 Ом) и МОм мегаом (1000000 Ом). В данном примере мы будем использовать резисторы с четырьмя различными номиналами: 270 Ω, 470 Ω, 2.2 кΩ и 10 кΩ. Размеры этих резисторов одинаковы. Цвет тоже. Единственное, что их различает – цветные полоски. Именно по этим полоскам визуально определяется номинал резисторов. Для резисторов, у которых три цветные полоски и последняя золотистая, работают следующие соответствия: Коричневый 1 Красный 2 Оранжевый 3 Зеленый 5 Фиолетовый 7 Первые две полоски обозначают первые 2 числовых значения, так что красный, филетовый означает 2, 7. Следующая полоска – количество нулей, которые необходимо поставить после первых двух цифр. То есть, если третья полоска коричневая, как на фото выше, будет один нуль и номинал резистора равен 270 Ω. Резистор с полосками коричневого, черного, оранжевого цветов: 10 и три нуля, так что 10000 Ω. То есть, 10 кΩ. В отличии от светодиодов, у резисторов нет положительной и и отрицательной ног. Какой именно ногой подключать их к питанию/земле – неважно. Подключите в соответствии со схемой, приведенной ниже: На Arduino есть пин на 5 В для питания периферийных устройств. Мы будем его использовать для питания светодиода и резистора. Больше вам от платы ничего не потребуется, только лишь подключить ее через USB к компьютеру. С резистором на 270 Ω, светодиод должен гореть достаточно ярко. Если вы вместо резистора на 270 Ω установите резистор номиналом 470 Ω, светодиод будет гореть не так ярко. С резистором на 2.2 кΩ, светодиод должен еще немного затухнуть. В конце-концов, с резистором 10 кΩ, светодиод будет еле виден. Вполне вероятно, чтобы увидеть разницу на последнем этапе вам придется вытянуть красный переходник, использовав его в качестве переключателя. Тогда вы сможете увидеть разницу в яркости. Кстати, можно провести этот опыт и при выключенном свете. В момент, когда к одной ноге резистора подключено 5 В, вторая нога резистора подключается к позитивной ноге светодиода, а вторая нога светодиода подключена к земле. Если мы переместим резистор так, что он будет располагаться за светодиодом, как показано ниже, светодиод все равно будет гореть. Мы можем подключить светодиод к выходу Arduino. Переместите красный провод от пина питания 5V к D13, как это показано ниже. Теперь загрузите пример “Blink”, который мы рассматривали . Обратите внимание, что оба светодиода – встроенный и установленный вами внешний начали мигать. Давайте попробуем использовать другой пин на Arduino. Скажем, D7. Переместите коннектор с пина D13 на пин D7 и измените следующую строку вашего кода: Загрузите измененный скетч на Arduino. Светодиод продолжит мигать, но на этот раз, используя питание от пина D7.
подключает заголовочный файл в котором выбирается наш нужный МК. Среда AtmelStudio 7 делает это автоматически при создании нового проекта.СПИСОК ДЕТАЛЕЙ ДЛЯ ЭКСПЕРИМЕНТА
- 1 плата Arduino Uno;
- 1 беспаечная макетная плата;
- 2 тактовых кнопки;
- 1 резистор номиналом 220 Ом;
- 1 светодиод;
- 7 проводов «папа-папа».
ПРИНЦИПИАЛЬНАЯ СХЕМА
СХЕМА НА МАКЕТНОЙ ПЛАТЕ
ОБРАТИТЕ ВНИМАНИЕ
СКЕТЧ
скачать скетч для Arduino IDE
#define PLUS_BUTTON_PIN 2
#define MINUS_BUTTON_PIN 3
#define LED_PIN 9
int brightness = 100;
boolean plusUp = true;
boolean minusUp = true;
void setup()
{
pinMode(LED_PIN, OUTPUT);
pinMode(PLUS_BUTTON_PIN, INPUT_PULLUP);
pinMode(MINUS_BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
analogWrite(LED_PIN, brightness);
// реагируем на нажатия с помощью функции, написанной нами
plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +35);
minusUp = handleClick(MINUS_BUTTON_PIN, minusUp, -35);
}
// Собственная функция с 3 параметрами: номером пина с кнопкой
// (buttonPin), состоянием до проверки (wasUp) и градацией
// яркости при клике на кнопку (delta). Функция возвращает
// (англ. return) обратно новое, текущее состояние кнопки
boolean handleClick(int buttonPin, boolean wasUp, int delta)
{
boolean isUp = digitalRead(buttonPin);
if (wasUp && !isUp) {
delay(10);
isUp = digitalRead(buttonPin);
// если был клик, меняем яркость в пределах от 0 до 255
if (!isUp)
brightness = constrain(brightness + delta, 0, 255);
}
return isUp; // возвращаем значение обратно, в вызывающий код
}
ПОЯСНЕНИЯ К КОДУ
ВОПРОСЫ ДЛЯ ПРОВЕРКИ СЕБЯ
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ
Для данного примера вам понадобятся
Светодиоды - общие сведения
Резисторы - общие сведения
Схема подключения
Разные варианты установки резистора
Мигание светодиодом