Блог

● Проект 5: RGB-светодиод. Широтно-импульсная модуляция. Переливаемся цветами радуги

Опубликовано: 23.04.2018
В этом эксперименте мы рассмотрим широтно-импульсную модуляцию, которая позволяет Arduino выводить аналоговые данные на цифровые выводы, и применим эти знания для создания прозвольных цветов свечения с помощью RGB-светодиода.

Необходимые компоненты:

контроллер Arduino UNO R3;
плата для прототипирования;
RGB-светодиод;
резистор 220 Ом;
провода папа-папа.

Arduino не может на цифровой вывод выдавать произвольное напряжение. Выдается либо +5 В (HIGH), либо 0 В (LOW). Но уровнем напряжения управляется многое: например, яркость светодиода или скорость вращения мотора. Для симуляции неполного напряжения используется ШИМ (широтно-импульсная модуляция, или PWM).
ШИМ – это операция получения изменяющегося аналогового значения посредством цифровых сигналов. Цифровой сигнал на выходе постоянно переключается между максимальным и минимальным значениями. Переключение имеет частоту в тысячи герц. Глаз не замечает мерцания более 50 Гц, поэтому нам кажется, что светодиод не мерцает, а горит в неполную силу. Длительность включения максимального значения называется шириной импульса. Для получения различных аналоговых величин изменяется ширина импульса (см. рис. 5.1).
Arduino-функция analogWrite() выдает ШИМ-сигнал на цифровой вывод Arduino. После вызова analogWrite() на выходе будет генерироваться постоянная прямоугольная волна с заданной шириной импульса до следующего вызова analogWrite(), частота выдаваемого ШИМ-сигнала равна 490 Гц. На платах Arduino Nano и UNO ШИМ поддерживают выводы 3, 5, 6, 9, 10 и 11, на плате Mega – выводы 2–13. Данные выводы отмечены знаком тильды ˜.

Рис. 5.1. Зависимость значений ШИМ от ширины импульса

В данном эксперименте мы используем RGB-светодиод. RGB расшифровывается как аббревиатура Red, Green, Blue, при помощи этих цветов можно получить любой цвет путем смешения. Светодиод RGB отличается от обычного тем, что содержит 3 небольших кристалла R, G, B, которые смогут синтезировать любой цвет или оттенок. RGB-светодиод имеет 4 вывода (см. рис. 5.2). Подключим RGB-светодиод к плате Arduino и заставим переливаться его цветами радуги. На рис. 5.3 показана схема подключения RGB-светодиода к плате Arduino.
Теперь перейдем к написанию скетча. На самом деле радуга имеет множество цветов, а 7 цветов были придуманы только потому, что эти цвета наиболее устойчиво воспринимаются и определяются глазом и мы их можем назвать и вспомнить поговоркой «Каждый Охотник Желает Знать, Где Сидит Фазан».


Рис. 5.2. Выводы RGB-светодиода


Arduino проект www.arduino-kit.ru
Рис. 5.3. Схема подключения RGB-светодиода

Список этих 7 основных цветов радуги с разложением по компонентам R, G и B представлен в табл. 5.1.

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

1. Примем за начальную точку отсчета красный цвет (255, 0, 0).
2. Будем постепенно увеличивать значение зеленой составляющей G, пока не достигнем значения оранжевого (255, 125, 0), а затем и желтого цвета (255, 255, 0).
3. Постепенно уменьшим значение красной составляющей R до значения зеленого цвета (0, 255, 0).
4. Постепенно увеличим значение синей составляющей B до значения голубого цвета (0, 255, 255).
5. Постепенно уменьшим количество зеленой составляющей G до значения синего цвета (0, 0, 255).
6. Постепенно увеличим количество красной составляющей R до значения фиолетового цвета (255, 0, 255).
7. Выдерживаем небольшую паузу и переходим к шагу 1. Содержимое скетча показано в листинге 5.1.

const int RED=11; // вывод красной ноги RGB-светодиода
const int GREEN=10; // вывод зеленой ноги RGB-светодиода
const int BLUE=9; // вывод синей ноги RGB-светодиода
int red; // переменная для хранения R-составляющей цвета
int green; // переменная для хранения G-составляющей цвета
int blue; // переменная для хранения B-составляющей цвета
void setup()
{;}
void loop()
{
// от красного к желтому
red=255;green=0;blue=0;
for(green=0;green<=255;green++)
setRGB(red,green,blue);
// от желтому к зеленому
for(red=255;red>=0;red--)
setRGB(red,green,blue);
// от зеленого к голубому
for(blue=0;blue<=255;blue++)
setRGB(red,green,blue);
// от голубого к синему
for(green=255;green>=0;green--)
setRGB(red,green,blue);
// от синего к фиолетовому
for(red=0;red<=255;red++)
setRGB(red,green,blue);
delay(2000);
} // функция установки цвета RGB-светодиода
void setRGB(int r,int g,int b)
{
analogWrite(RED,r);
analogWrite(GREEN,g);
analogWrite(BLUE,b);
delay(10);
}

Порядок подключения:

1. Чтобы видеть смешивание трех компонент R, G, B, а не отдельные составляющие, необходимо сделать поверхность светодиода шероховатой небольшой обработкой напильником или накрыть RGB-светодиод матовой пластиной.
2. Подключаем RGB-светодиод по схеме на рис. 5.3.
3. Загружаем в плату Arduino скетч из листинга 5.1.
4. Наблюдаем свечение светодиода переливающимися цветами радуги.

Листинги программ скачать
Читать далее

● Проект 4: Светодиодная шкала 10 сегментов. Вращением потенциометра меняем количество светящихся светодиодов

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

Необходимые компоненты:

контроллер Arduino UNO R3;
плата для прототипирования;
• потенциометр 2 кОм;
светодиодная шкала 10 сегментов;
резистор 220 Ом;
провода папа-папа.

В предыдущих экспериментах мы рассматривали работу с цифровыми выводами Arduino, они имеют только два возможных состояния: включено или выключено, HIGH или LOW, 1 или 0. Но для получения информации об окружающем мире необходимо работать с аналоговыми данными, имеющими бесконечное число возможных значений в данном диапазоне. Для получения аналоговых данных Arduino имеет аналоговые входы, оснащенные 10-разрядным аналого-цифровым преобразователем для аналоговых преобразований. Точность АЦП определена разрешением. 10-разрядный означает, что АЦП может разделить аналоговый сигнал на 210 различных значений. Следовательно, Arduino может присвоить 210 = 1024 аналоговых значения, от 0 до 1023. Опорное напряжение определяет максимальное напряжение, его значение соответствует значению 1023 АЦП. При напряжении 0 В на контакте АЦП возвращает значение 0, опорное напряжение возвращает значение 1023. Несмотря на то что можно изменить опорное напряжение, мы будем использовать опорное напряжение 5 В.

Рассмотрим, как использовать потенциометр в качестве аналогового датчика. Рисунок 4.1 показывает, как правильно подключить ваш

Arduino проект www.arduino-kit.ru
Рис. 4.1. Схема подключения потенциометра в качестве аналогового датчика

потенциометр к Arduino в качестве аналогового датчика. Мы подключаем один из крайних выводов на землю, другой крайний вывод – к +5 В. Средний вывод потенциометра подключаем к аналоговому входу A0 платы Arduino. Для считывания данных с аналогового порта в Arduino есть функция analogRead().
Загружаем на плату Arduino скетч из листинга 4.1 для считывания значений из аналогового порта и вывода их в монитор последовательного порта Arduino.

const int POT=0; // Аналоговый вход A0 для подключения потенциометра
int valpot = 0; // переменная для хранения значения потенциометра
void setup()
{
Serial.begin(9600);
}
void loop()
{
valpot = analogRead(POT); // чтение данных потенциометра
Serial.println(valpot); // вывод значений в последовательный порт
delay(500); // задержка 0.5 сек
}

Порядок подключения:

1. Подключаем потенциометр по схеме на рис. 4.1.
2. Загружаем в плату Arduino скетч из листинга 4.1.
3. Запускаем в Arduino IDE монитор последовательного порта.
4. Поворачиваем ручку потенциометра и наблюдаем вывод аналоговых значений потенциометра в монитор последовательного порта (см. рис. 4.2).


Рис. 4.2. Вывод аналоговых значений потенциометра в монитор последовательного порта


Теперь визуализируем аналоговые данные потенциометра с помощью 10-разрядной линейной светодиодной шкалы. Шкала представляет собой сборку из 10 независимых светодиодов с катодами со стороны надписи на корпусе. Для подключения шкалы к Arduino будем использовать 10 цифровых выводов D3–D12. Схема соединений показана на рис. 4.3. Каждый из светодиодов шкалы выводом анода соединен с цифровым выводом Arduino, а катодом на землю через последовательно соединенный ограничивающий резистор 220 Ом. Аналоговые данные потенциометра (0–1023) масштабируем в данные шкалы (0–10) с помощью функции map() и зажигаем соответствующее количество светодиодов. Скетч приведен в листинге 4.2.

const int POT=0; // Аналоговый вход A0 для подключения потенциометра
int valpot = 0; // переменная для хранения значения потенциометра
// список контактов подключения светодиодной шкалы
const int pinsled[10]={3,4,5,6,7,8,9,10,11,12};
int countleds = 0; // переменная для хранения значения шкалы
void setup()
{
for(int i=0;i<10;i++)
{
// Сконфигурировать контакты подсоединения шкалы как выходы
pinMode(pinsled[i],OUTPUT);
digitalWrite(pinsled[i],LOW);
{
}
void loop()
{
valpot = analogRead(POT); // чтение данных потенциометра
// масштабируем значение к интервалу 0-10
countled=map(valpot,0,1023,0,10);
// зажигаем количество полосок на шкале, равное countled
for(int i=0;i<10;i++)
{
if(i<countleds) // зажигаем светодиод шкалы
digitalWrite(pinsled[i],HIGH);
else // гасим светодиод шкалы
digitalWrite(pinsled[i],LOW);
}
}



Порядок подключения:

1. Подключаем потенциометр по схеме на рис. 4.1.
2. Подключаем выводы светодиодной шкалы контактами анодов через ограничительные резисторы номиналом 220 Ом к выводам Arduino D3–D12, контактами катодов – на землю (см. рис. 4.3).
3. Загружаем в плату Arduino скетч из листинга 4.2.
4. Поворачиваем ручку потенциометра и наблюдаем на светодиодной шкале уровень значения потенциометра от максимального номинала.

Arduino проект www.arduino-kit.ru

Рис. 4.3. Схема подключения линейной светодиодной шкалы
 
Листинги программ скачать
Читать далее

● Проект 3: Потенциометр. Показываем закон Ома на примере яркости светодиода

Опубликовано: 20.04.2018
В этом эксперименте мы познакомимся с потенциометром и будем управлять яркостью светодиода и изменением сопротивления потенциометра.

Необходимые компоненты:

контроллер Arduino UNO R3;
плата для прототипирования;
• потенциометр 2 кОм;
светодиод;
резистор 220 Ом;
провода папа-папа.

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

Закон Ома определяется следующим образом:
V = I×R,
где V – напряжение в вольтах; I – ток в амперах; R – сопротивление в омах.

В электрической схеме каждый компонент имеет некоторое сопротивление, что снижает напряжение. Светодиоды имеют предопределенное падение напряжения на них и предназначены для работы в определенном значении тока. Чем больше ток через светодиод, тем ярче светодиод светится, до предельного значения. Для наиболее распространенных светодиодов максимальный ток составляет 20 мА. Обычное значение падения напряжения для светодиода – около 2 В.
Напряжение питания 5 В должно упасть на светодиоде и резисторе, поскольку доля светодиода 2 В оставшиеся 3 В должны упасть на резисторе. Зная максимальное значение прямого тока через светодиод (20 мА), можете найти номинал резистора.
R = V/I = 3/0,02 = 150 Ом.
Таким образом, со значением резистора 150 Ом ток 20 мА протекает через резистор и светодиод. По мере увеличения значения сопротивления ток будет уменьшаться. 220 Ом немного более, чем 150 Ом, но все же позволяет светиться светодиоду достаточно ярко, и резистор такого номинала очень распространен. Если мы будем увеличивать номинал резистора, то будем уменьшать ток, проходящий через светодиод, и, соответственно, яркость светодиода. Для изменения яркости светодиода мы будем использовать потенциометр. Потенциометры являются переменными делителями напряжения и выглядят как ручки. Они бывают разных размеров и форм, но все имеют три вывода. Номинал потенциометра определяет сопротивление между крайними выводами, оно неизменно, поворотом ручки мы изменяем сопротивление между средним и крайним выводами от 0 до номинала потенциометра либо от номинала до нуля.
В эксперименте потенциометр мы подключаем последовательно с резистором 220 Ом, чтобы не уменьшить значения ограничивающего резистора для светодиода до нуля и не сжечь светодиод. Схема подключения представлена на рис. 3.1.

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

Скетч эксперимента приведен в листинге 3.1. Он совсем простой – нам необходимо просто включить светодиод, подключенный к цифровому выводу D10 Arduino.

const int LED=10; // вывод для подключения светодиода 10 (D10)void setup(){// Конфигурируем вывод подключения светодиода как выход (OUTPUT)pinMode(10, OUTPUT);// включаем светодиод, подавая на вывод 1 (HIGH)digitalWrite(LED,HIGH);}void loop(){;}

Порядок подключения:

1. Длинную ножку светодиода (анод) подключаем к цифровому выводу D10 Arduino, другую (катод) – к одной из ног резистора 220 Ом (см. рис. 3.1).
2. Свободную ногу резистора 220 Ом подключаем к средней ножке потенциометра, вторую (любую крайнюю) подсоединяем к GND (см. рис. 3.1).
3. Загружаем в плату Arduino скетч из листинга 3.1.
4. Поворачиваем ручку потенциометра и наблюдаем изменение яркости светодиода от полного выключения до почти полной яркости.

Листинги программ скачать


 
Читать далее

● Проект 2: Обрабатываем нажатие кнопки на примере зажигания светодиода

Опубликовано: 20.04.2018
Это эксперимент по работе с кнопкой. Мы будем включать светодиод по нажатии кнопки и выключать по отпускании кнопки. Рассмотрим понятие дребезга и программные методы его устранения.

Необходимые компоненты:

контроллер Arduino UNO R3;
плата для прототипирования;
кнопка;
светодиод;
резистор 220 Ом;
резистор 10 кОм;
провода папа-папа.

В данном эксперименте мы будем использовать контакт D2 Arduino в качестве входа. Это позволяет подключить к нему кнопку для взаимодействия с проектом в режиме реального времени. При использовании Arduino в качестве входов используют pull-up- и pulldown-резисторы, чтобы вход Arduino не находился в «подвешенном» состоянии (в этом состоянии он будет собирать внешние наводки и принимать произвольные значения), а имел заранее известное состояние (0 или 1). Резисторы pull-up подтягивают вход к питанию +5 В, pull-down-резисторы подтягивают вход к GND. Кроме этого, pull-up- и pull-down-резисторы гарантируют, что кнопка не создаст короткого замыкания между +5 В и землей при нажатии. В нашем эксперименте для подключения кнопки мы будем использовать pulldown-резистор. Схема подключения представлена на рис. 2.1.

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

Когда кнопка отключена, вход D2 будет подтянут к «земле» через резистор номиналом 10 кОм, который будет ограничивать поток тока, и на входном контакте будет установлено значение напряжения LOW. При нажатии на кнопку входной контакт напрямую связан с 5 В. Большая часть тока будет протекать по пути наименьшего сопротивления через замкнутую кнопку, и на входе генерируется уровень HIGH. При нажатии на кнопку включаем светодиод, при отпускании – гасим.
Код данного скетча приведен в листинге 2.1.

const int LED=10; // вывод для подключения светодиода 10 (D10)
void setup()
{
// Конфигурируем вывод подключения светодиода как выход (OUTPUT)
pinMode(LED, OUTPUT);
}
void loop()
{
// включаем светодиод, подавая на вывод 1 (HIGH)
digitalWrite(LED,HIGH);
// пауза 1 сек (1000 мс)
delay(1000);
// выключаем светодиод, подавая на вывод 0 (LOW)
digitalWrite(LED,LOW);
// пауза 1 сек (1000 мс)
delay(1000);
}  

Порядок подключения:

1. Длинную ножку светодиода (анод) подключаем к цифровому выводу D10 Arduino, другую (катод) – через резистор 220 Ом к выводу GND (см. рис. 2.1).
2. Один вход кнопки подключаем к +5 В, другой – через резистор 10 кОм к GND, выход кнопки подключаем к входу D2 Arduino (см. рис. 2.1).
3. Загружаем в плату Arduino скетч из листинга 2.1.
4. При нажатии на кнопку светодиод должен гореть, при отпускании – затухнуть.

Усложним задачу – будем переключать состояние светодиода (включен/выключен) при каждом нажатии кнопки. Загрузим на плату Arduino скетч из листинга 2.2.

const int LED=10; // Контакт 10 для подключения светодиода
const int BUTTON=2; // Контакт 2 для подключения кнопки
int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки
int prevButton = LOW; // Переменная для сохранения предыдущего состояния
// к нопки
boolean ledOn = false; // Текущее состояние светодиода (включен/выключен)
void setup()
{
// Сконфигурировать контакт светодиода как выход
pinMode (LED, OUTPUT);
// Сконфигурировать контакт кнопки как вход
pinMode (BUTTON, INPUT);
}
void loop()
{
tekButton=digitalRead(BUTTON);
if (tekButton == HIGH && prevButton == LOW)
{
// нажатие кнопки – изменить состояние светодиода
ledOn=!ledOn;
digitalWrite(LED, ledOn);
}
prevButton=tekButton;
}


При нажатии кнопки светодиод должен изменять свое состояние. Но это будет происходить не всегда. Виной тому – дребезг кнопок.
Кнопки представляют из себя механические устройства с системой пружинного контакта. Когда вы нажимаете на кнопку вниз, сигнал не просто меняется от низкого до высокого, он в течение нескольких миллисекунд меняет значение от одного до другого, прежде чем контакты плотно соприкоснутся и установится значение HIGH.
Микроконтроллер зафиксирует все эти нажатия, потому что дребезг неотличим от настоящего нажатия на кнопку. Устранить влияние дребезга можно программно. Алгоритм следующий:

1. Cохраняем предыдущее состояние кнопки и текущее состояние кнопки (при инициализации LOW).
2. Cчитываем текущее состояние кнопки.
3. Если текущее состояние кнопки отличается от предыдущего состояния кнопки, ждем 5 мс, потому что кнопка, возможно, изменила состояние.
4. После 5 мс считываем состояние кнопки и используем его в качестве текущего состояния кнопки.
5. Если предыдущее состояние кнопки было LOW, а текущее состояние кнопки HIGH, переключаем состояние светодиода.
6. Устанавливаем предыдущее состояние кнопки для текущего состояния кнопки.
7. Возврат к шагу 2. Добавляем к нашему скетчу подпрограмму устранения дребезга.
Получаем код, показанный в листинге 2.3.

const int LED=10; // Контакт 10 для подключения светодиода
const int BUTTON=2; // Контакт 2 для подключения кнопки
int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки
int prevButton = LOW; // Переменная для сохранения предыдущего состояния
// к нопки
boolean ledOn = false; // Текущее состояние светодиода (включен/выключен)
void setup()
{
// Сконфигурировать контакт светодиода как выход
pinMode (LED, OUTPUT);
// Сконфигурировать контакт кнопки как вход
pinMode (BUTTON, INPUT);
}
// Функция сглаживания дребезга. Принимает в качестве
// аргумента предыдущее состояние кнопки и выдает фактическое.
boolean debounce(boolean last)
{
boolean current = digitalRead(BUTTON); // Считать состояние кнопки,
if (last != current) // если изменилось...
{
delay(5); // ждем 5 м с
current = digitalRead(BUTTON); // считываем состояние кнопки
return current; // возвращаем состояние кнопки
}
}
void loop()
{
tekButton = debounce(prevButton);
if (prevButton == LOW && tekButton == HIGH) // если нажатие...
{
ledOn = !ledOn; // инвертировать значение состояния светодиода
}
prevButton = tekButton;
digitalWrite(LED, ledOn); // изменить статус состояния светодиода
}


Загружаем скетч в плату Arduino и проверяем работу. Теперь все работает нормально, каждое нажатие кнопки приводит к изменению состояния светодиода.

Листинги программ скачать
Читать далее

Главное меню

Каталог

Полезные ссылки

Цена
от
до