Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Управление светом при помощи ШИМ

Поиск

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

Как я подсказывал в первом примере главы 4, если вы измените цифры в функции задержки чтобы светодиод перестал мигать, вы заметите что светодиод, похоже, светится в половину своей нормальной яркости. Теперь измените цифры так, чтобы светодиод был включен на четверть того времени, пока он выключен. Запустите скетч и вы увидите, что яркость понизилась до 25%. Такая техника называется широтно-импульсная модуляция (ШИМ) - фантастический способ, определяемый так: если мигать светодиодом достаточно быстро, вы не увидите самих миганий, но вы можете изменять яркость светодиода меняя отношение между временем его включенного и выключеного состояния.

Рис. 5-3 показывает как это работает.

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

Экспериментируя, вы увидите, что мигать светодиодом, расставляя задержка в коде, немного неудобно, так как когда вам понадобится считать датчик или отправить данные по последовательному порту, светодиод будет мерцать из-за задержек чтения датчика. К с частью, процессор на плате Arduino, имеет аппаратную часть, которая может очень эффективно мигать тремя сетодиодами в то время, когда ваш скетч делает что-то другое. Эта часть реализована на выводах 9, 10 и 11, которые могут управляться командой analogWrite().

Рис. 5-3. ШИМ в действии

Например, запись analogWrite(9,128) установить яркость светодиода, подключённого к выводу 9 в 50%. Почему 128? analogWrite() требует число от 0 до 255 в качестве аргумента, где 255 означает полную яркость, а 0 - выключено.

Примечание: Наличие трёх каналов - просто отлично, так как вы можете купить красный, зелёный и синий светодиоды и смешивать их цвета для получения любого другого цвета по своему желанию!

Давайте попробуем. Соберите схему по рис. 5-4. Заметьте, что у светодиода есть полярность: длинная ножка (анод) должна быть справа, а короткая (катод) - слева. Также большинство светодиодов имеют плоскую фаску на стороне катода, как показано на рисунке.

Рис. 5-4. Светодиод, подключённый к выводу ШИМ

 

Далее, создайте новый скетч в Arduino и используйте пример 5-1 (его вы также можете загрузить с www.makezine.com/getstartedarduino):

Пример 5-1. Плавное включение и выключение светодиода, подобное режиму сна в компьютере Apple.

#define LED 9 // the pin for the LED

int i = 0; // We'll use this to count up and down

void setup() {

pinMode(LED, OUTPUT); // tell Arduino LED is an output

}

 

void loop(){

 

for (i = 0; i < 255; i++) { // loop from 0 to 254 (fade in)

analogWrite(LED, i); // set the LED brightness

delay(10); // Wait 10ms because analogWrite

 

// is instantaneous and we would

// not see any change

}

 

for (i = 255; i > 0; i--) { // loop from 255 to 1 (fade out)

 

analogWrite(LED, i); // set the LED brightness

 

delay(10); // Wait 10ms

}

}

 

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

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

Чтобы создать эту данную, вам надо соединить схему, которую вы только-что построили (рис. 5-4) со схемой с кнопкой, показанной на рис. 4-6. Если хотите, можете просто собрать отдельно обе эти схемы на плате; у вас на ней достаточно места. Однако, одно из преимуществ подобной платы- это то, что в ней есть пара шин, которые проходят горизонтально поверху и понизу. Одна из них отмечана красным (плюс), а вторая - синим (минус).

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

Если вы не готовы сделать это, не расстраивайтесь: просто подключите схемы к Arduino как показано на рисунках 4-6 и 5-4. Вы увидите пример, использующий отрицательную и положительную шины в главе 6.

Возвращаясь к нашему следующему примеру, если у нас есть только одна кнопка, как мы будем управлять лампой? Мы изучим ещё одно действие в технике создания: определение того, как долго была нажата кнопка. Чтобы сделать такое, нам надо изменить пример 4-5 из главы 4 чтобы добавить плавную регулировку. Идея состоит в том чтобы создать "интерфейс", в котором нажатие и отпускание кнопки приводит к включению и выключению света, а нажатие и удерживание той-же кнопки изменяет яркость.

Давайте рассмотрим скетч:

Пример 5-2. Включить светодиод при нажатии кнопки, оставить включённым после её отпускания с использованием простого антидребезга. Если кнопка нажата, изменять яркость.

#define LED 9 // the pin for the LED

#define BUTTON 7 // input pin of the pushbutton

 

int val = 0; // stores the state of the input pin

 

int old_val = 0; // stores the previous value of "val"

int state = 0; // 0 = LED off while 1 = LED on

 

int brightness = 128; // Stores the brightness value

unsigned long startTime = 0; // when did we begin pressing?

 

void setup() {

 

pinMode(LED, OUTPUT); // tell Arduino LED is an output

pinMode(BUTTON, INPUT); // and BUTTON is an input

}

 

void loop() {

 

 

val = digitalRead(BUTTON); // read input value and store it

// yum, fresh

 

// check if there was a transition

if ((val == HIGH) && (old_val == LOW)) {

 

 

state = 1 - state; // change the state from off to on

// or vice-versa

 

startTime = millis(); // millis() is the Arduino clock

// it returns how many milliseconds

 

// have passed since the board has

// been reset.

 

// (this line remembers when the button

// was last pressed)

delay(10);

}

// check whether the button is being held down

 

if ((val == HIGH) && (old_val == HIGH)) {

 

// If the button is held for more than 500ms.

if (state == 1 && (millis() - startTime) > 500) {

 

 

brightness++; // increment brightness by 1

delay(10); // delay to avoid brightness going

// up too fast

 

if (brightness > 255) { // 255 is the max brightness

 

brightness = 0; // if we go over 255

// let's go back to 0

}

}

}

 

old_val = val; // val is now old, let's store it

 

if (state == 1) {

analogWrite(LED, brightness); // turn LED ON at the

// current brightness level

} else {

analogWrite(LED, 0); // turn LED OFF

 

}

}

 

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

А теперь давайте разберёмся как использовать более интересные сенсоры.



Поделиться:


Последнее изменение этой страницы: 2016-06-29; просмотров: 519; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.143.237.54 (0.006 с.)