4. Включение светодиодов и основные понятия Python

На pyboard проще всего сделать включение светодиодов, подключённых к плате. Соедините плату с компьютером и войдите как описано в руководстве 1. Начнём с переключения светодиода. Введите в интерпретаторе:

>>> myled = pyb.LED(1)
>>> myled.on()
>>> myled.off()

Эти команды включат и выключат светодиод.

Это все очень хорошо, но мы бы хотели автоматизировать этот процесс. Откройте файл MAIN.PY на pyboard в вашем любимом текстовом редакторе. Напишите или вставьте следующие строки в файл. Если вы новичок в Python, то убедитесь, что вы сделали корректный отступ, это имеет значение!

led = pyb.LED(2)
while True:
    led.toggle()
    pyb.delay(1000)

Когда вы сохраните изменения, красный светодиод должен на секунду загореться. Чтобы запустить скрипт, сделать мягкую перезагрузку (CTRL-D). Pyboard перезапустится, и вы увидите как зеленый светодиод непрерывно мигает: включается и выключается. Успех! Первый шаг на пути к созданию армии злых роботов! Когда вам наскучит назойливый мигающий зелёный светодиод - нажмите CTRL-C в вашем терминале чтобы остановить его работу.

Итак, что же делает этот код? Для начала нам нужна терминология. Python объектно-ориентированный язык, почти всё в Python есть class и когда вы создаёте экземпляр класса - вы получаете object. У классов есть methods, связанные с ними. Метод используется для взаимодействия с объектами.

В первой строке кода создаётся LED объект, который мы называли led. При создании, этот объект принемает один параметр - число в диапазоне от 1 до 4, соответствующее четырём светодиодам на плате. Класс pyb.LED имеет три важных метода: on(), off() и toggle(). Другой метод, который мы используем: pyb.delay() - он просто ожидает в течение заданного в миллисекундах времени. Создаётся LED объект и затем, в бесконечном цикле (while True), происходит переключение (toggle()) светодиода (то есть on, off) и ожидание в 1 секунду.

Упражнение: попробуйте изменить время между переключением светодиода и изменить сам светодиод.

Упражнение: подключитесь к pyboard, создайте объект pyb.LED и включите его, используя метод on().

4.1. Дискотека на вашем pyboard

До сих пор мы использовали только один светодиод, но на pyboard их четыре. Давайте создадим объекты для каждого светодиода чтобы контролировать их. Сделаем это, создав список (массив) объектов pyb.LED:

leds = [pyb.LED(i) for i in range(1,5)]

Если вы попробуете вызвать pyb.LED() с числом за пределами данного (1..4) диапазона - поглучите сообщение об ошибке. Далее давайте создадим бесконечный цикл, который будет включать и выключать все светодиоды:

n = 0
while True:
  n = (n + 1) % 4
  leds[n].toggle()
  pyb.delay(50)

Здесь n содержит текущий светодиод и каждую следующую итерацию цикла переходим к следующему n (символ % является бинарной операцией: получение модуля числа; то есть n находится в диапазоне от 0 до 3 включительно). Получаем доступ к n-ому светодиоду и переключаем его. Когда вы запустите этот скрипт - увидите как поочерёдно включаются и выключаются светодиоды.

Вы можете заметить одну проблему: если остановить скрипт и запустить снова - светодиоды застрянут на предыдущей сессии, разрушая нашу дискотеку. Мы можем исправить это, выключив все светодиоды при инициализации с помощью блока try/finally.

One problem you might find is that if you stop the script and then start it again that the LEDs are stuck on from the previous run, ruining our carefully choreographed disco. We can fix this by turning all the LEDs off when we initialise the script and then using a try/finally block. При нажатии CTRL-C, Micro Python генерирует VCPInterrupt исключение. Исключение обычно означают что что-то пошло не так и вы можете использовать try: команду, которая “ловит” исключения. В данном случае это всего лишь пользовательское прерывание скрипта. Нам не нужно ловить ошибку - просто скажем Micro Python что он должен делать когда мы останавливаем скрипт. Используем это чтобы убедиться что все светодиоды выключены. Код:

leds = [pyb.LED(i) for i in range(1,5)]
for l in leds:
    l.off()

n = 0
try:
   while True:
      n = (n + 1) % 4
      leds[n].toggle()
      pyb.delay(50)
finally:
    for l in leds:
        l.off()

4.2. Четвёртый специальный светодиод

Синий светодиод особенный - вы можете контролировать интенсивность его свечения. Это делается с помощью специального метода intensity(). Интенсивность это число от 0 до 255, которое определяет на сколько ярко светится синий светодиод. Следующий код постепенно повышает яркость и затем выключает этот светодиод:

led = pyb.LED(4)
intensity = 0
while True:
    intensity = (intensity + 1) % 255
    led.intensity(intensity)
    pyb.delay(20)

Вы можете вызвать intensity() и для других светодиодов, но они могут быть только включены или выключены. 0 их выключает, а любое другое число до 255 - включает.