Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Лабораторная работа №2. Подключение светодиода к Аrduino, управление осуществляем ШИМ сигналом, включаем через кнопку.




Лабораторная работа №2. Подключение светодиода к Аrduino, управление осуществляем ШИМ сигналом, включаем через кнопку.

 

Микроконтроллеры обычно не могут выдавать произвольное напряжение. Они могут выдать либо напряжение питания (например, 5 В), либо землю (т. е. 0 В)

Применение

Выход микроконтроллера переключается между землёй и Vcc тысячи раз в секунду. Или, как ещё говорят, имеет частоту в тысячи герц. Глаз не замечает мерцания более 50 Гц, поэтому нам кажется, что светодиод не мерцает, а горит в полсилы.

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

Скважность

Отношение полного периода к времени включения называют скважностью (англ. duty cycle). Рассмотрим несколько сценариев при напряжении питания Vcc равным 5 вольтам.

50% — преобразуется в 2, 5 В

10% — преобразуется в 0, 5 В

90% — преобразуется в 4, 5 В

 

 

Но уровнем напряжения управляется многое: например, яркость светодиода или скорость вращения мотора. Для симуляции неполного напряжения используется ШИМ (Широтно-Импульсная Модуляция, англ. Pulse Width Modulation или просто PWM)

Управление яркостью светодиода ШИМ сигналом, при помощи кнопки. Подключившись к выводам контроллера, поддерживающим ШИМ, можно регулировать интенсивность свечения с помощью функции analogWrite(). Указываем номер вывода и значение из диапазона от 0 до 255. Чем больше число, тем ярче будет светить светодиод. Для вывода 3 код будет выглядеть так: analogWrite (3, 255) или analogWrite (3, 100). В первом случае яркость будет максимально возможная, во втором свечение будет меньше. У Arduino Uno, Nano, основанных на ATMEGA328, ШИМ поддерживают выводы 3, 5, 6, 9, 10, 11. Ниже приведен пример плавного включения светодиода на Arduino с помощью ШИМ (PWM). Дополнительно понадобяться.

1. Резистор номиналом около 100-400 ом. Для ограничения тока.

2. Резистор номиналом около 10 ком. Для подтягивания логических уровней на входе Arduino.

3. Светодиод АЛ307.

4. Тактовая кнопка.

 

Пример 1 кода подключения светодиода к Ардуино, управление осуществляем ШИМ сигналом, с кнопкой.

*/

int switchPin = 10; // задаем имя «switchPin» для 10 вывода

int ledPin = 13; // задаем имя «ledPin» для 13 вывода

void setup() // Блок «Setup» запускается только 1 раз при запуске Arduino, он нужен для инициализации.

{

pinMode(switchPin, INPUT); // Конфигурируем 10 вывод Arduino на вход. Т. к. мы будем считывать состояние кнопки.

pinMode(ledPin, OUTPUT); // Конфигурируем 13 вывод Arduino на выход. С помощью него мы будем включать светодиод.

}

void loop() // Блок «loop» это цикл, который работает бесконечно

{

if (digitalRead(switchPin) == HIGH) // Если кнопка нажата, наша переменная switchPin будет иметь значение HIGH (логическую 1) и выполниться код на след. строке

{

digitalWrite(ledPin, HIGH); // Зажигаем светодиод, выставив логическую 1 (уровень HIGH) на выходе 13

}

else // Если кнопка не нажата выполниться код идущий ниже.

{

digitalWrite(ledPin, LOW); // Выключаем светодиод

}

}

Пример 2 код программы, когда при нажатии кнопки светодиод загорался и горел до тех пор пока не нажмем еще раз кнопку.

*/

int switchPin = 10; // задаем имя «switchPin» для 10 вывода

int ledPin = 13; // задаем имя «ledPin» для 13 вывода

boolean lastButton = LOW; // В этой переменной мы будем хранить состояние кнопки во время предыдущей обработки нашего цикла, а также установим его в ноль.

boolean ledOn = false; // В этой переменной мы будем хранить состояние светодиода, чтобы мы могли переключать его

void setup() // Блок «Setup» запускается только 1 раз при запуске Arduino, он нужен для инициализации.

{

pinMode(switchPin, INPUT); // Конфигурируем 10 вывод Arduino на вход. Т. к. мы будем считывать состояние кнопки.

pinMode(ledPin, OUTPUT); // Конфигурируем 13 вывод Arduino на выход. С помощью него мы будем включать светодиод.

}

void loop() // Блок «loop» это цикл, который работает бесконечно

{

if (digitalRead(switchPin) == HIGH & & lastButton == LOW) // Если кнопка нажата, и последнее состояние кнопки было «не нажата», тогда выполняем следующий код

{

ledOn =! ledOn; // Меняем значение ledOn на противоположное

lastButton = HIGH; // Меняем значение lastButton на логическую единицу

}

else

{

lastButton = digitalRead(switchPin); // Устанавливаем в переменную lastButton такое же значение как в переменной switchPin

}

digitalWrite(ledPin, ledOn); // будем зажигать и выключать светодиод

}

Чтобы избежать дребезга кнопки нам придется ввести задержку по времени:

*/

int switchPin = 10; // задаем имя «switchPin» для 10 вывода

int ledPin = 13; // задаем имя «ledPin» для 13 вывода

boolean lastButton = LOW; // В этой переменной мы будем хранить состояние кнопки во время предыдущей обработки нашего цикла, а также установим его в ноль.

boolean ledOn = false; // В этой переменной мы будем хранить состояние светодиода, чтобы мы могли переключать его

boolean currentButton = LOW; // Переменная для нашей функции debounce

void setup() // Блок «Setup» запускается только 1 раз при запуске Arduino, он нужен для инициализации.

{

pinMode(switchPin, INPUT); // Конфигурируем 10 вывод Arduino на вход. Т. к. мы будем считывать состояние кнопки.

pinMode(ledPin, OUTPUT); // Конфигурируем 13 вывод Arduino на выход. С помощью него мы будем включать светодиод.

}

boolean debounce(boolean last) //функция для устранения дребезга контактов кнопки, будет возвращать предыдущее её состояние

{

boolean current = digitalRead(switchPin); // Пишем в current текущее состояние кнопки

if (last! = current) // Проверяем изменилось ли состояние кнопки

{

delay(5); // Если да, делаем задержку 5 миллисекунд, для того чтобы кнопка перестала «дребезжать»

current = digitalRead(switchPin); // Считываем значение кнопки после паузы, дребезг уже должен пройти

}

return current; // возвращаем стабильное значение кнопки

}

void loop() // Блок «loop» это цикл, т. е. который работает бесконечно

{

currentButton = debounce(lastButton); // передаем в currentButton результат работы функции debounce с переданным в него состоянием кнопки

if (lastButton == LOW & & currentButton == HIGH) // Проверяем была ли нажата кнопка

{

ledOn =! ledOn; // Меняем значение ledOn на противоположное

}

lastButton = currentButton; // Устанавливаем в переменную lastButton такое же значение как в переменной currentButton

digitalWrite(ledPin, ledOn); // будем зажигать и выключать светодиод

}

Теперь напишем программу таким образом, чтобы после каждого нажатия кнопки менялась яркость светодиода, для этого мы будем использовать ШИМ сигнал (PWM). Контакт №11 поддерживает PWM, не любой порт Arduino поддерживает широтно-импульсную модуляцию, если вы хотите регулировать напряжение, вам подойдут пины, помеченные символом тильда «~». Для Arduino Uno это пины 3, 5, 6, 9, 10, 11, следовательно, нам нужно изменить схему подключения следующим образом:

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

Схема электрическая принципиальная к Arduino c PWM.

Схема собрана на макетной плате:

 

Рис.

Пояснение к работе ШИМ сигнала.

Рис.

Рис.

Изменяя так называемое “заполнение” ШИМ сигнала можно менять “суммарное” напряжение (интегрированное) за некоторый период. Чем больше заполнение ШИМ, тем выше напряжение.

Рис.

При помощи ШИМ сигнала можно даже модулировать сложные аналоговые сигналы, например – синусоиду. На картинке ниже показан ШИМ (снизу) и этот же ШИМ после фильтров:

Рис.

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

pin — номер вывода, на который отправляем сигнал

value — значение скважности ШИМ, которое мы отправляем на порт. Он может принимать целочисленное значение от 0 до 255, где 0 — это 0%, а 255 — это 100%. Характеристики ШИМ:

Timer 0 на выводах D5 и D6 с частотой 976 Гц, разрешение 8 бит (0-255); Timer 1 на выводах D9 и D10 с частотой 488 Гц,   разрешение 8 бит (0-255); Timer 2 на выводах D3 и D11 с частотой 488 Гц, разрешение 8 бит (0-255).

*/

int switchPin = 10; // задаем имя «switchPin» для 10 вывода

int ledPin = 11; // задаем имя «ledPin» для 11 вывода

boolean lastButton = LOW; // В этой переменной мы будем хранить состояние кнопки во время предыдущей обработки нашего цикла, а также установим его в ноль.

int ledLevel = 0; // В этой переменной мы будем хранить яркость свечения светодиода, яркость может иметь значение от 0 до 255, в момент инициализации установим его в 0, чтобы светодиод не светился

boolean currentButton = LOW; // Переменная для нашей функции debounce

void setup() // Блок «Setup» запускается только 1 раз при запуске Arduino, он нужен для инициализации.

{

pinMode(switchPin, INPUT); // Конфигурируем 10 вывод Arduino на вход. Т. к. мы будем считывать состояние кнопки.

pinMode(ledPin, OUTPUT); // Конфигурируем 13 вывод Arduino на выход. С помощью него мы будем включать светодиод.

}

boolean debounce(boolean last) //функция для устранения дребезга контактов кнопки, будет возвращать предыдущее её состояние

{

boolean current = digitalRead(switchPin); // Пишем в current текущее состояние кнопки

if (last! = current) // Проверяем изменилось ли состояние кнопки

{

delay(5); // Если да, делаем задержку 5 миллисекунд, для того чтобы кнопка перестала «дребезжать»

current = digitalRead(switchPin); // Считываем значение кнопки после паузы, когда дребезг уже должен пройти

}

return current; // возвращаем стабильное значение кнопки

}

void loop() // Блок «loop» это цикл, т. е. код который работает раз за разом бесконечно

{

currentButton = debounce(lastButton); // передаем в currentButton результат работы функции debounce с переданным в него состоянием кнопки

if (lastButton == LOW & & currentButton == HIGH) // Проверяем была ли нажата кнопка

{

ledLevel = ledLevel + 51; // Меняем значение яркости на 51

}

lastButton = currentButton; // Устанавливаем в переменную lastButton такое же значение как в переменной currentButton

if (ledLevel > 255) ledLevel = 0; // Ограничиваем макс. значение в 255

analogWrite(ledPin, ledLevel); // зажигаем светодиод с нужной яркостью

}

Пример кода для 9 вывода микроконтроллера.

#define LED_PIN 9

 void setup()

{

// настраиваем вывод со светодиодом в режим выхода,

pinMode(LED_PIN, OUTPUT);

}

 

void loop()

{

// напряжение на светодиод

// (ШИМ-сигнал).

// Микроконтроллер переводит число от 0 до 255 к напряжению

// от 0 до 5 В., например, 85 — это 1/3 от 255,

// т. е. 1/3 от 5 В, т. е. 1, 66 В.

analogWrite(LED_PIN, 85);

// длительность яркости 350 миллисекунд

delay(350);

 

// выдаём 170, т. е. 2/3 от 255, или иными словами — 3, 33 В.

// Больше напряжение — выше яркость

analogWrite(LED_PIN, 170);

delay(350);

 

// все 5 В — полный накал!

analogWrite(LED_PIN, 255);

// длительность перед тем, как начать всё заново

delay(350);

}

Пример использования ШИМ.

int pwm;

Void setup () {

}

Void loop () {

pwm = analogRead (0); // смотрим потенциометр в А0

pwm = map (pwm, 0, 1023, 0, 255); // 0-255

pwm = constrain (pwm, 0, 255); // вводим ограничение

analogWrite (3, pwm); //шим на 3 вывод

}

 

Задания для самостоятельного выполнения.

1. Отключите питание, отключите светодиод от 9-го порта и подключите к 11-му. Измените программу так, чтобы схема снова заработала

2. Измените код программы так, чтобы в течение секунды на светодиод последовательно подавалось усреднённое напряжение 0, 1, 2, 3, 4, 5 В

3. Возьмите еще один светодиод, резистор на 220 Ом и соберите аналогичную схему на этой же макетке, подключив светодиод к пину номер 3 и другому входу GND, измените программу так, чтобы светодиоды мигали в противофазу: первый выключен, второй горит максимально ярко и до противоположного состояния.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...