День #2: Давайте поморгаем!

Maker Advent Calendar Day 2 — Let's Get Blinky

Добро пожаловать во второй день вашего адвент-календаря «12 Проектов Кодемаса». Сегодня мы поиграем с одним из самых популярных компонентов для мейкеров — светодиодами!

Светодиоды (**С**вето **д**иоды, LED — **L**ight **E**mitting **D**iodes) — это базовый компонент для мейкеров любого уровня опыта, удобный для индикации, обратной связи или просто весёлого мигания!

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

Поехали!

Содержимое коробки #2

В этой коробке вы найдёте:

  • 1x красный светодиод 5 мм (с прозрачной линзой)

  • 1x янтарный светодиод 5 мм (с прозрачной линзой)

  • 1x зелёный светодиод 5 мм (с прозрачной линзой)

  • 3x резистора 330 Ом

  • 4x провода «папа–папа»

Компоненты второго дня

Сегодняшние проекты

Сегодня мы будем программировать светодиоды — заставлять их светиться, мигать и отображать последовательности, опираясь на код вчерашнего дня и используя GPIO-пины для управления ими.

Мы также изучим некоторые новые функции MicroPython, чтобы добавить новые элементы в ваш код. В коробке три разных цвета, что позволит нам повеселиться, создавая световые узоры.

Что такое светодиод?

Светодиод — это **Л**ight **E**mitting **D**iode (светоизлучающий диод). Эти компоненты излучают свет, когда через них протекает электрический ток.

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

Длинная ножка — это Анод (+), а короткая — Катод (-). Ток всегда должен течь от анода к катоду, поэтому внимательно следуйте инструкциям по подключению ниже, чтобы всё сделать правильно.

Резисторы

Светодиоды обычно требуют токоограничивающего резистора при использовании с микроконтроллером.

Резисторы ограничивают количество тока, которое может пройти через цепь, что помогает избежать ситуации, когда светодиод потребляет больше тока, чем могут безопасно обеспечить GPIO-пины нашего Pico, и одновременно защищает светодиод от избыточного тока.

Не имеет значения, с какой стороны от светодиода находится резистор — главное, чтобы он был там и ограничивал ток во всей цепи.

Карта пинов Raspberry Pi Pico

Ниже приведена упрощённая карта пинов Pico (известная как «пинаут»), которая поможет вам на следующих шагах и на протяжении всего календаря.

Числа в серых квадратах — это физические номера пинов, пронумерованные по порядку вокруг платы. Номера GPIO-пинов, которые мы используем в коде, обозначены зелёным цветом.

Упрощённый пинаут Raspberry Pi Pico

Сборка схемы

Для начала убедитесь, что ваш Pico отключён от USB-кабеля. Вы всегда должны делать это при изменении схемы. Затем возьмите провода, резисторы и светодиоды.

Макетные платы

Мы будем добавлять компоненты на нашу макетную плату (breadboard). Макетные платы позволяют соединять и прототипировать схему без пайки, используя провода со штырьками на концах — джамперы (иногда называемые проводами DuPont).

На этих макетных платах есть два набора горизонтальных каналов (красный/синий) с обеих сторон. Все красные пины соединены между собой, как и синие (но каждая сторона изолирована от другой). Мы используем их для создания «шин» соединений, например «Земля» (GND) для синего канала и 3,3 В для красного.

Отверстия в середине соединены вертикальными дорожками, каждая из которых имеет по 5 соединённых пинов с каждой стороны от разделителя. Разделитель не позволяет обеим сторонам соединяться друг с другом.

Схема подключения

Разместите три светодиода в нижней части макетной платы с промежутком в 1 отверстие, длинной ножкой вправо, как показано на изображении ниже.

Вы ещё не знаете, какой цвет какой, так как у этих светодиодов прозрачные линзы, но это не важно — мы вернёмся к этому чуть позже. Ваша макетная плата должна выглядеть так:

Pico со светодиодами в макетной плате

Подсказка: короткая ножка — Катод (-), длинная ножка — Анод (+).

Теперь нам нужно добавить резистор для ограничения тока, который светодиод может потреблять от наших GPIO-пинов.

Поместите резистор между левой ножкой каждого светодиода и нижним синим каналом, как показано ниже. Вскоре мы подключим этот синий канал к пину «Земля» (-).

Установленные резисторы на макетной плате

Теперь возьмите джамперы. Вам нужен один провод, соединяющий синий канал с пином «Земля» на вашем Pico — мы предлагаем использовать физический пин 38, как показано на диаграмме ниже (обращайтесь к пинауту Pico, если нужно напоминание).

Также нужно подключить правую ножку каждого светодиода к GPIO-пину. Используйте GPIO18 (физический пин 24) для красного, GPIO19 (физический пин 25) для янтарного и GPIO20 (физический пин 26) для зелёного, как показано на диаграмме ниже.

Подсказка: не важно, какого цвета джамперы вы используете — они все работают одинаково. В идеале мы бы зарезервировали чёрный цвет для соединений с землёй, а красный — для напряжения, но для простых проектов это не обязательно.

Полная схема подключения второго дня

Всё подключено — пора написать код для мигания!

Задание 1: Зажигаем каждый светодиод

Простое упражнение для начала, с использованием кода, который мы изучили вчера. Мы зажжём каждый светодиод, подождём 5 секунд, затем выключим их. Для этого нам нужно познакомить вас с новым модулем: time.

Примечание: если вы выключали компьютер после вчерашнего дня, вам, возможно, потребуется снова зайти в Thonny и выбрать **Run > Configure interpreter*, чтобы указать, с каким устройством мы работаем.*

Модуль time

Модуль time позволяет программировать задержки в коде, заставляя его ждать секунды или доли секунды перед продолжением. Это ещё один фундаментальный модуль, который вы будете использовать в большинстве своих проектов.

Код

Наш код снова импортирует pin, а также импортирует time. Затем мы определяем номер пина для каждого цвета светодиода (давая им понятное имя) и устанавливаем их как outputs (выходы).

После этого всё просто: мы устанавливаем каждый пин светодиода в состояние HIGH, ждём 5 секунд с помощью time.sleep(5), затем снова устанавливаем их все в LOW.

Скопируйте этот код в Thonny и запустите обычным способом, нажав зелёную кнопку. После того как вы зажжёте каждый светодиод и узнаете, какой цвет какой, отключите USB-кабель и переставьте их в правильном порядке: зелёный/янтарный/красный:

from machine import Pin
import time

red = Pin(18, Pin.OUT)
amber = Pin(19, Pin.OUT)
green = Pin(20, Pin.OUT)

red.value(1)
amber.value(1)
green.value(1)

time.sleep(5)

red.value(0)
amber.value(0)
green.value(0)

Задание 2: Мигающие светодиоды

Давайте сделаем вещи чуть интереснее и заставим наши светодиоды мигать!

Для этого нам нужно добавить в код циклы while. Технически можно было бы просто повторить приведённый выше код включения/выключения, но это сделало бы код очень длинным и в итоге завершалось, так что давайте рассмотрим лучший способ (хотя и не самый лучший… мы покажем вам другой способ в одном из будущих дней, когда немного освоимся с MicroPython).

Нам также нужно познакомить вас с переменными, отступами и комментариями к коду

Циклы while

Циклы while используются для повторения блока кода, пока условие остаётся истинным.

Представьте, что вы подбрасываете мяч, пока ваш друг считает прыжки. Ваше условие может быть «подбрасывать мяч, пока не досчитаете до пяти». После пяти бросков вы останавливаетесь.

Мы можем указать циклу while выполнять блок кода до тех пор, пока не будет достигнут счётчик или определённое условие, или просто запустить его вечно с помощью „while True“, что удобно для проектов, которые должны работать постоянно.

Итак, сейчас мы заставим наши светодиоды мигнуть 10 раз, а потом остановиться.

Комментарии в коде

Мы также начнём добавлять комментарии в наши примеры кода.

Вы можете добавлять комментарии в код MicroPython, добавив # перед комментарием. MicroPython будет игнорировать его.

Добавление комментариев облегчает объяснение кода другим людям или даже напоминание себе, когда вы возвращаетесь к проекту через несколько недель или месяцев. Это очень полезная привычка:

Комментарии в MicroPython коде

Переменные

Переменная — это просто место для хранения значения («контейнер»), которое мы также можем обновлять при необходимости. Когда нам нужно использовать переменную в строке кода, мы просто используем её имя.

В нашем примере ниже переменная называется counter (счётчик). Мы создаём её перед циклом while и устанавливаем начальное значение 1.

В программировании переменная может быть целым числом (*integer*), числом с десятичной точкой (*float*) или словом/текстом (*string*).

Отступы

Наш цикл while говорит: «Если счётчик меньше 11, выполни код с отступом ниже».

Отступ — это пробел в начале строки кода, обычно знак табуляции или несколько пробелов. Это очень важно в MicroPython, так как указывает Thonny, что строки принадлежат определённому блоку кода (в нашем примере ниже мы делаем отступ строк под циклом while, так как этот код принадлежит данному циклу).

Код

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

Мы запускаем цикл while с помощью while counter < 11:, что означает «пока значение переменной counter меньше 11…».

Наш код выводит счётчик, чтобы мы видели изменение значения в Thonny, затем просто поочерёдно выключает и включает все светодиоды с паузами в полсекунды между ними. Без пауз это происходило бы так быстро, что мы бы не увидели моргания!

В конце блока мы добавляем +1 к нашему счётчику, затем цикл начинается снова. Как только переменная счётчика достигает 11, цикл прекращает работу и программа завершается.

Скопируйте этот код в Thonny и запустите обычным способом, нажав зелёную кнопку:

# Imports
from machine import Pin
import time

#Set up our LED names and GPIO pin numbers
red = Pin(18, Pin.OUT)
amber = Pin(19, Pin.OUT)
green = Pin(20, Pin.OUT)

counter = 1 # Set the counter to start at 1

while counter < 11: # While count is less than 11...

    print(counter) # Print the current counter

    # LEDs all on
    red.value(1)
    amber.value(1)
    green.value(1)

    time.sleep(0.5) # Wait half a second

    # LEDs all off
    red.value(0)
    amber.value(0)
    green.value(0)

    time.sleep(0.5) # Wait half a second

    counter += 1 # Add 1 to our counter

Попробуйте изменить оба значения time.sleep на другие числа и посмотрите, что произойдёт. Это должно изменить скорость мигания светодиодов.

Вы также можете изменить цикл while так, чтобы он работал вечно. Замените строку на строку ниже, чтобы попробовать — счётчик будет продолжать увеличиваться и выводиться, но не изменит того, что делает код:

while True:

Задание 3: Последовательность светодиодов

Теперь мы заставим наши светодиоды вспыхивать один за другим в последовательности — да, как праздничное украшение!

Хотя существуют более продвинутые способы достичь этого (например, с использованием списков, которые мы рассмотрим в одном из будущих дней), мы пока сохраним простоту, пока продолжаем изучать MicroPython.

Программа для этого очень похожа, однако мы изменяем секцию управления светодиодами так, чтобы каждый светодиод включался по одному, выключая остальные по мере продвижения.

Попробуйте приведённый ниже код, обращая внимание на комментарии ВЫКЛ/ВКЛ рядом с каждой строкой управления светодиодом:

# Imports
from machine import Pin
import time

#Set up our LED names and GPIO pin numbers
red = Pin(18, Pin.OUT)
amber = Pin(19, Pin.OUT)
green = Pin(20, Pin.OUT)

counter = 1 # Set the counter to 1

while counter < 11: # While count is less than 11

    print(counter) # Print the current counter

    # Red ON
    red.value(1) # ON
    amber.value(0) # OFF
    green.value(0) # OFF

    time.sleep(0.5) # Wait half a second

    # Amber ON
    red.value(0) # OFF
    amber.value(1) # ON
    green.value(0) # OFF

    time.sleep(0.5) # Wait half a second

    # Green ON
    red.value(0) # OFF
    amber.value(0) # OFF
    green.value(1) # ON

    time.sleep(0.5) # Wait half a second

    counter += 1 # Add 1 to our counter

День #2 завершён!

Ещё один замечательный день обучения программированию с Raspberry Pi Pico и MicroPython! Сегодня вы:

  • Собрали свою первую схему!

  • Научились использовать модуль time для добавления задержек в программы

  • Научились использовать циклы while и условия

  • Узнали о переменных (наш счётчик)

  • Научились добавлять комментарии к коду

  • Создали эффектную мигающую последовательность светодиодов

Пожалуйста, не разбирайте схему, так как мы снова будем использовать её с содержимым следующей коробки — увидимся завтра!


Диаграммы схем на макетной плате для этой страницы созданы с помощью Fritzing.