Эксперимент 2. Маячок с нарастающей яркостью
← Маячок | Оглавление | Светильник с управляемой яркостью →
В этом эксперименте мы задаем различные уровни яркости светодиода.
Видеоурок
Прочтите перед выполнением
Список деталей для эксперимента
- 1 плата Arduino Uno
- 1 беспаечная макетная плата
- 1 резистор номиналом 220 Ом
- 2 провода «папа-папа»
Для дополнительного задания
- еще 1 светодиод
- еще 1 резистор номиналом 220 Ом
- еще 2 провода
Принципиальная схема
Схема на макетке
Обратите внимание
- Не любой порт Arduino поддерживает широтно-импульсную модуляцию, если вы хотите регулировать напряжение, вам подойдут пины, помеченные символом тильда «~». Для Arduino Uno это пины 3, 5, 6, 9, 10, 11
Скетч
- p020_pulse_light.ino
// даём разумное имя для пина №9 со светодиодом // (англ. Light Emitting Diode или просто «LED») // Так нам не нужно постоянно вспоминать куда он подключён #define LED_PIN 9 void setup() { // настраиваем пин со светодиодом в режим выхода, // как и раньше pinMode(LED_PIN, OUTPUT); } void loop() { // выдаём неполное напряжение на светодиод // (он же ШИМ-сигнал, он же PWM-сигнал). // Микроконтроллер переводит число от 0 до 255 к напряжению // от 0 до 5 В. Например, 85 — это 1/3 от 255, // т.е. 1/3 от 5 В, т.е. 1,66 В. analogWrite(LED_PIN, 85); // держим такую яркость 250 миллисекунд delay(250); // выдаём 170, т.е. 2/3 от 255, или иными словами — 3,33 В. // Больше напряжение — выше яркость! analogWrite(LED_PIN, 170); delay(250); // все 5 В — полный накал! analogWrite(LED_PIN, 255); // ждём ещё немного перед тем, как начать всё заново delay(250); }
Пояснения к коду
- Идентификаторы переменных, констант, функций (в этом примере идентификатор
LED_PIN
) являются одним словом (т.е. нельзя создать идентификаторLED PIN
). - Идентификаторы могут состоять из латинских букв, цифр и символов подчеркивания
_
. При этом идентификатор не может начинаться с цифры.
PRINT // верно PRINT_3D // верно MY_PRINT_3D // верно _PRINT_3D // верно 3D_PRINT // ошибка ПЕЧАТЬ_3Д // ошибка PRINT:3D // ошибка
- Регистр букв в идентификаторе имеет значение. Т.е.
LED_PIN
,LED_pin
иled_pin
с точки зрения компилятора — различные идентификаторы - Идентификаторы, создаваемые пользователем, не должны совпадать с предопределенными идентификаторами и стандартными конструкциями языка; если среда разработки подсветила введенный идентификтор каким-либо цветом, замените его на другой
- Директива
#define
просто говорит компилятору заменить все вхождения заданного идентификатора на значение, заданное после пробела (здесь9
), эти директивы помещают в начало кода. В конце данной директивы точка с запятой;
не допустима - Названия идентификаторов всегда нужно делать осмысленными, чтобы при возвращении к ранее написанному коду вам было ясно, зачем нужен каждый из них
- Также полезно снабжать код программы комментариями: в примерах мы видим однострочные комментарии, которые начинаются с двух прямых слэшей
//
и многострочные, заключённые между/* */
// однострочный комментарий следует после двойного слеша до конца строки /* многострочный комментарий помещается между парой слеш-звездочка и звездочка-слеш */
комментарии игнорируются компилятором, зато полезны людям при чтении давно написанного, а особенно чужого, кода
- Функция
analogWrite(pin, value)
не возвращает никакого значения и принимает два параметра:pin
— номер порта, на который мы отправляем сигналvalue
— значение скважности ШИМ, которое мы отправляем на порт. Он может принимать целочисленное значение от 0 до 255, где 0 — это 0%, а 255 — это 100%
Вопросы для проверки себя
- Какие из следующих идентификаторов корректны и не вызовут ошибку?
13pin
MOTOR_1
контакт_светодиода
sensor value
leftServo
my-var
distance_eval2
- Что произойдет, если создать директиву
#define HIGH LOW
? - Почему мы не сможем регулировать яркость светодиода, подключенного к порту 7?
- Какое усреднённое напряжение мы получим на пине 6, если вызовем функцию
analogWrite(6, 153)
? - Какое значение параметра
value
нужно передать функцииanalogWrite
, чтобы получить усреднённое напряжение 2 В?
Задания для самостоятельного решения
- Отключите питание, отключите светодиод от 9-го порта и подключите к 11-му. Измените программу так, чтобы схема снова заработала
- Измените код программы так, чтобы в течение секунды на светодиод последовательно подавалось усреднённое напряжение 0, 1, 2, 3, 4, 5 В
- Возьмите еще один светодиод, резистор на 220 Ом и соберите аналогичную схему на этой же макетке, подключив светодиод к пину номер 3 и другому входу GND, измените программу так, чтобы светодиоды мигали в противофазу: первый выключен, второй горит максимально ярко и до противоположного состояния