Эта часть нашего обзора, определённо, является одной из самых важных. До этого момента мы рассматривали микрокомпьютер Raspberry Pi, но не раскрывали его главную изюминку, «zest» так сказать — то, как можно его использовать для управления не только программами и различной виртуальной информацией, но и для осуществления управления и контроля над внешними отдельными физическими устройствами (external devices). Другими словами, до этого мы рассматривали этот микрокомпьютер как бюджетную и функциональную альтернативу существующим компьютерам (десктопам, планшетам и ноутбукам), а теперь наступило самое время выкладывать козыри!

Когда люди думают о «программировании» или «кодинге», они обычно (и вполне естественно) думают о программном обеспечении. Однако программирование может касаться не только программного обеспечения: оно может влиять на реальный мир через оборудование. Это называется физические вычисления (physical computing). Буквально говоря — это управление вещами (оборудованием, а не программным обеспечением) в реальном мире с помощью написанных вами, в том числе, программ. Когда вы устанавливаете программу на стиральной машине, меняете температуру на программируемом термостате или нажимаете кнопку на светофоре, чтобы перейти дорогу, вы используете физические вычисления.
Raspberry Pi — отличное устройство для изучения физических вычислений благодаря одной ключевой функции: разъему GPIO — интерфейсу ввода / вывода общего назначения (general-purpose input/output, GPIO).

 

Представляем разъём GPIO

Разъём GPIO, расположенный на верхнем крае печатной платы Raspberry Pi и похожий на два длинных ряда металлических контактов, предназначен для подключения оборудования, такого как, к примеру, светодиоды (LED), и позволяет включать их под управлением программам, которые вы создаете на Raspberry Pi. Название может показаться немного запутанным, но оно хорошо описывает этот элемент: его выводы могут использоваться как для ввода, так и для вывода, у них нет фиксированной цели, а когда ряды выводов выстроены в ряд на печатной плате, они называются разъём, поэтому-то и «разъём ввода / вывода общего назначения».

Разъём GPIO Raspberry Pi состоит из 40 штырей (пинов, выводов). Часть из них доступна для использования в ваших проектах физических вычислений, некоторые выводы обеспечивают питание, а какие-то — зарезервированы для связи с дополнительным оборудованием, таким как платы расширения Sense HAT (Hardware attached on top, HAT) — эти устройства мы рассмотрим в следующей части нашего обзора.
Есть несколько категорий типов контактов, каждая из которых выполняет определенную функцию. Мы специально будем называть их так же, как и на устройстве (т.е. без перевода с английского языка), чтобы вы запомнили эти стандартные названия, которыми будете пользоваться в дальнейшем огромное количество раз и даже уже не будете о них особо задумываться. Итак, рассмотрим типы контактов:

Код Расшифровка Перевод Назначение
3V3 3.3 volts power Питание 3,3В Постоянно включенный источник питания с напряжением 3,3 В — таким же, как внутреннее напряжение в Raspberry Pi.
5V 5 volts power Питание 5В Постоянно включенный источник питания с напряжением 5 В — таким же, какое Raspberry Pi выдаёт на разъем питания micro USB.
Ground (GND) 0 volts ground Заземление, уровень нуля (0В) Заземление, используемое для замыкания цепи, подключенной к источнику питания.
GPIO XX General-purpose input/output pin number ‘XX’ Пин №ХХ разъема GPIO Контакты GPIO, доступные для ваших программ, обозначаются числом от 2 до 27.
ID EEPROM Reserved special purpose pins Зарезервированные пины специального назначения Контакты зарезервированы для использования с платами расширения и другими аксессуарами

 

 

Обратите внимание!
Разъём GPIO Raspberry Pi — это интересный и безопасный способ экспериментировать с физическими вычислениями, но к нему нужно относиться осторожно. Будьте осторожны, чтобы не погнуть контакты при подключении и отключении оборудования. Никогда не соединяйте два контакта напрямую вместе, случайно или намеренно, если это явно не указано в инструкциях к проекту: это называется коротким замыканием и, в зависимости от контактов, может навсегда вывести из строя ваш Raspberry Pi.

 

 

Электронные компоненты

Разъем GPIO — это только часть того, что вам понадобится для начала работы с физическими вычислениями; другая часть — это электрические компоненты, устройства, которыми вы будете управлять через разъем GPIO. Доступны тысячи различных компонентов, но большинство проектов GPIO создаются с использованием следующих общих частей.

 

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

 

Перемычки (jumper wires, jumper leads) соединяют компоненты с Raspberry Pi и, если вы не используете макетную плату, то и друг с другом. Они доступны в трех версиях:

  • «папа-мама» (male-to-female, M2F), которые понадобятся для подключения макета к контактам GPIO;
  • «мама-мама» (female-to-female, F2F), которые можно использовать для соединения отдельных компонентов вместе, в случае, если вы не используете макетную плату;
  • «папа-папа» (male-to-male, M2M), которые используются для соединения одной части макета с другой.

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

 

Кнопочный переключатель (push-button switch), также известный как переключатель мгновенного действия (momentary switch) — это тип переключателя, который используется для управления игровой консолью. Обычно они доступны с двумя или четырьмя ножками — любой тип будет работать с Raspberry Pi. Кнопка является устройством ввода (input device): вы можете указать своей программе следить за ее нажатием, а затем выполнять задачу. Другой распространенный тип переключателя — переключатель с фиксацией (latching switch). Если переключатель мгновенного действия активен только тогда, когда вы его нажимаете, то переключатель с фиксацией (защелкой) — активируется и начинает работать, когда вы его нажимаете (включаете) один раз, а затем остается активным, пока вы не нажмете (выключите) его снова.

Светоизлучающий диод, светодиод (light-emitting diode, LED)устройство вывода (output device). Вы можете управлять им прямо из своей программы. Светодиод загорается, когда он включен. Возможно вы не задумывались, но вы можете найти их по всему дому: от маленьких, которые сообщают вам, когда вы оставили стиральную машину включенной, до больших, которые могут освещать ваши комнаты. Светодиоды доступны в широком диапазоне форм, цветов и размеров, но не все подходят для использования с Raspberry Pi: избегайте всех тех, на которых написано, что они предназначены для источников питания 5 В или 12 В.

 

Резисторы, сопротивления (Resistors) — это компоненты, которые контролируют поток электрического тока (electrical current), и доступны в различных значениях, измеряемых с помощью единицы, называемой Ом (ohms, Ω). Чем выше число Ом, тем больше сопротивление. Для проектов физических вычислений Raspberry Pi их наиболее распространенное применение — это защита светодиодов от чрезмерного потребления тока и, как следствие, повреждения самих себя или даже Raspberry Pi. Обычно применяются резисторы с номинальным сопротивлением около 330 Ом, хотя многие поставщики электротехники продают удобные наборы резисторов, содержащие ряд различных значений сопротивлений, чтобы обеспечить вам большее удобство. Если на корпусе резистора не указано его сопротивление в цифровом коде, то обязательно будет нанесена цветовая маркировка в виде полосок различной толщины и цвета. По специальным таблицам вы легко сможете определить цифровое значение сопротивления конкретного прибора, а наиболее ходовые — даже запомнить на память.

 

Пьезоэлектрический зуммер (piezoelectric buzzer), обычно называемый просто зуммером или звуковым оповещателем, является еще одним устройством вывода. В то время как светодиод излучает свет, зуммер издает шум — жужжащий звук. Внутри пластикового корпуса зуммера находится пара металлических пластин; в активном состоянии эти пластины вибрируют друг относительно друга, производя жужжащий звук. Есть два типа зуммера: активные зуммеры (active buzzers) и пассивные зуммеры (passive buzzers). Убедитесь, что у вас есть активный зуммер, так как они самые простые в использовании.

 

Другие распространенные электрические компоненты:

  • двигатели, к которым требуется специальная плата управления для подключения к Raspberry Pi,
  • инфракрасные датчики, которые обнаруживают движение,
  • датчики температуры и влажности, которые могут использоваться для прогнозирования погоды,
  • фоторезисторы (light dependent resistors, LDR) — устройства ввода, которые работают как обратный светодиод, обнаруживая свет, и многое другое.

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

 

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

  • 3 светодиода: красный, зеленый и желтый (или оранжевый);
  • 3 резистора с сопротивлением 330 Ом;
  • 2 кнопочных переключателя;
  • 1 активный зуммер;
  • Перемычки «папа-мама» (M2F) и «мама-мама» (F2F)
  • Опционально: макетная плата и перемычки M2M.

 

 

Считывание цветовых кодов резисторов

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

Чтобы прочитать значение резистора, расположите его так, чтобы группа полос была слева, а одиночная полоса - справа. Начиная с первого диапазона (1-st Band), посмотрите его цвет в столбце «1st/2nd Band» таблицы, чтобы получить первую и вторую цифры. В нашем примере есть две оранжевые полосы (1st Band и 2nd Band), каждая из которых означает «3», что в сумме составляет «33». Если у вашего резистора четыре сгруппированных полосы вместо трех, запишите также значение третьей полосы (для пяти / шестиполосных резисторов см. ссылку  Rpf.io/5-6band).

Перейдя к последней сгруппированной полосе (третьей или четвертой), посмотрите ее цвет в столбце «Множитель» (Multiplier). Это подскажет вам, на какое число следует умножить текущее число, чтобы получить фактическое значение сопротивления резистора. В этом примере есть коричневая полоса, что означает ‘×10¹’. Это может показаться запутанным, но это просто научное обозначение: ‘умножить на 10’ просто означает «добавить один ноль в конец вашего числа». Если бы он был синим, то для ‘×106;’ это означало бы «добавить шесть нулей в конец вашего числа».

Примечание к таблице с цветовой кодировкой:

Black — чёрный цвет;

Brown — коричнеый;

Red — красный;

Orange — оранжевый;

Yellow — жёлтый;

Green — залёный;

Blue — синий;

Violet — фиолетовый;

Grey — серый;

White — белый;

Gold — золотистый;

Silver — серебряный;

None — цвет отсутствует.

 

Таким образом, число 33, полученное из оранжевых полос, плюс добавленный ноль из коричневой полосы, дает нам 330 — значение резистора, измеренное в омах.

Последняя полоса справа — это допуск резистора (Tolerance). Это просто то, насколько реальное значение сопротивления может отклоняться от заявленного (номинального). У более дешевых резисторов может быть серебряная полоса, указывающая, что она может быть на 10 процентов выше или ниже своего номинала, или вообще не иметь последней полосы, что означает, что она может быть на 20 процентов выше или ниже; самые дорогие резисторы имеют серую полосу, что указывает на то, что она будет в пределах 0,05% от номинала. Для проектов, связанных с любителями, точность не так важна: любая толерантность обычно работает нормально.

Если сопротивление резистора превышает 1000 Ом (1000 Ом), оно обычно выражается в киломах (кОм); если оно превышает миллион Ом, это мегаом (МОм). Резистор 2200 Ом будет записан как 2,2 кОм; резистор 2200000 Ом будет записан как 2,2 МОм.

 

Вопросы на закрепление материала:

  • Какие цветные полосы будут у резистора 100 Ом?
  • Какие цветные полосы будут у резистора 2,2 МОм?
  • Если бы вы хотели найти самые дешевые резисторы, какой диапазон допуска по цвету вы бы искали?

 

 

Ваша первая программа для физических вычислений: Hello, LED!

Подобно тому, как вывод на экран «Hello, World» — фантастический первый шаг в изучении языка программирования, включение светодиода — это традиционное введение в изучение физических вычислений.
Для этого проекта вам понадобятся светодиод и резистор 330 Ом (330 Ω) или как можно ближе к 330 Ом, а также перемычки «мама-мама» (F2F).

 

РЕЗИСТОР ЖИЗНЕННО ВАЖЕН!
Резистор является жизненно важным компонентом в этой цепи: он защищает Raspberry Pi и светодиод, ограничивая количество электрического тока, который может потреблять светодиод. Без него светодиод может потреблять слишком большой ток и сгореть сам, или  испортить Raspberry Pi. При такой роли резистор служит для ограничения тока (current limiting resistor). Точное значение резистора, которое вам нужно, зависит от используемого светодиода, но 330 Ом подходит для большинства обычных светодиодов. Чем выше значение сопротивления — тем блежнее светодиод; чем ниже значение — тем ярче светодиод. Никогда не подключайте светодиод к Raspberry Pi без ограничивающего ток резистора, если вы не уверены, что светодиод имеет встроенный в свою конструкцию резистор соответствующего номинала.

 

Начните с проверки того, что ваш светодиод работает. Поверните Raspberry Pi так, чтобы разъем GPIO находился вверху с правой стороны. Подключите один конец резистора 330 Ом к первому контакту 3,3 В (обозначенному 3V3) с помощью перемычки «мама-мама», затем подключите другой его конец к длинной (положительной или анодной) ножке вашего светодиода с помощью второй перемычки «мама-мама». Возьмите третью перемычку «мама-мама» подключите короткую (отрицательную или катод) ножку вашего светодиода к первому контакту заземления (обозначенному GND). Должно выйти вот так:

Если ваш микрокомпьютер Raspberry Pi включен, то светодиод должен загореться. Если это не так, внимательно проверьте свою схему: убедитесь, что вы не использовали слишком высокое сопротивление резистора, что все провода правильно подключены и что вы определенно выбрали правильные контакты GPIO, которые соответствуют схеме.

Также проверьте ножки светодиода, так как светодиоды будут работать только в одном направлении: более длинная ножка подключена к положительной стороне цепи, а более короткая - к отрицательной.

Когда светодиод заработает, пора его запрограммировать. Отсоедините перемычку от вывода 3,3 В (обозначенного 3V3) и подключите его к контакту GPIO 25 (обозначенному GP25). Светодиод погаснет, но не волнуйтесь - это нормально.

Теперь вы полностью готовы для создания программы с помощью Scratch и Python для включения и выключения светодиода.

 

Обратите внимание!

Реализация этого проекта требует, чтобы вы хотя бы базово владели Scratch 3 и интегрированной средой разработки (IDE) Thonny Python. Если это не так, то изучите данные разделы по ссылкам: 

Изучаем Raspberry Pi. Часть 4. Программирование на Scratch 3

Изучаем Raspberry Pi. Часть 5. Программирование на Python

 

 

Управление светодиодом в Scratch

Загрузите Scratch 3 и щелкните значок «Добавить расширение»  (Add Extension). Прокрутите вниз, чтобы найти расширение «Raspberry Pi GPIO», затем щелкните по нему. Это загрузит блоки, необходимые для управления разъёмом GPIO Raspberry Pi из Scratch 3. Вы увидите, что появились новые элементы в палитре блоков; теперь, когда они вам понадобятся, они будут доступны в категории «Raspberry Pi GPIO».

Начните с перетаскивания блока событий  (при нажатии) в область кода, затем поместите блока  (установить  GPIO для вывода «высокий») под ним. Вам нужно будет выбрать номер используемого пина: нажмите маленькую стрелку, чтобы открыть раскрывающийся список, и нажмите «25», чтобы сообщить Scratch, что вы управляете контактом GPIO 25.


Щелкните зеленый флаг, чтобы запустить вашу программу. Вы увидите, как загорится ваш светодиод: вы запрограммировали свой первый физический вычислительный проект!

Щелкните красный восьмиугольник, чтобы остановить программу: заметили, что светодиод всё ещё горит? Это потому, что ваша программа указала Raspberry Pi только включить светодиод — это как раз и означает указание «output high» из вашего набора команд .  Чтобы выключить его, снова нажмите на стрелку вниз в конце блока и выберите «низкий» (low) из списка. Теперь указания выглядят так:


Щелкните зеленый флаг еще раз, и на этот раз ваш светодиод погаснет. Чтобы сделать вещи более интересными, добавьте блок управления  (навсегда) и пару блоков ожидания в 1 секунду , чтобы создать программу, которая будет мигать светодиодом каждую секунду.

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

 

ЗАДАНИЕ:

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

 

 

Управление светодиодами в Python

Загрузите Thonny из раздела Programming меню raspberry, затем нажмите кнопку New, чтобы начать новый проект, и Save, чтобы сохранить его как Hello LED. Чтобы использовать выводы GPIO с помощью Python, вам понадобится библиотека под названием GPIO Zero. Для этого проекта вам понадобится только часть библиотеки для работы со светодиодами. Импортируйте только этот раздел библиотеки, набрав в строке оболочки (Shell) Python:

Затем вам нужно сообщить GPIO Zero, к какому выводу GPIO подключен светодиод. Введите следующее:

Вместе эти две строки дают Python возможность управлять светодиодами, подключенными к контактам GPIO Raspberry Pi, и сообщать ему, каким контактом (или контактами) управлять, если у вас более одного светодиода в схеме . Чтобы фактически управлять светодиодом, введите следующее:

Для выключения светодиода введите:

Поздравляем, теперь у вас есть контроль над контактами GPIO вашего Raspberry Pi в Python! Попробуйте ввести эти две инструкции еще раз. Если светодиод уже выключен, led.off () ничего не сделает; то же самое верно, если светодиод уже горит и вы вводите led.on ().
Чтобы создать настоящую программу, введите в область сценария следующее:

Эта программа импортирует функцию светодиода LED из библиотеки gpiozero (GPIO Zero) и функцию сна sleep из библиотеки времени time, затем создает бесконечный цикл, чтобы включить светодиод на секунду, выключить его на секунду и повторить. Нажмите кнопку «Выполнить», чтобы увидеть, как это работает: ваш светодиодный индикатор начнет мигать. Как и в случае с программой Scratch, обратите внимание на поведение, в момент, когда вы нажимаете кнопку «Стоп»: когда светодиод горит, и когда не горит.

 

ЗАДАНИЕ:

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

 

 

Использование макетной платы

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

На макетной плате проделаны отверстия и разнесены в пространстве так, чтобы соответствовать компонентам, т.е. на расстоянии 2,54 мм (1/10 дюйма) друг от друга. Под этими отверстиями находятся металлические полоски, которые действуют как перемычки, которые вы использовали до сих пор. Они располагаются рядами по плате, при этом у большинства плат есть зазор посередине, чтобы разделить их на две половины. На многих макетных платах сверху есть буквы, а по бокам - цифры. Это позволяет вам найти конкретное отверстие: A1 - это верхний левый угол, B1 - отверстие справа, а B2 - одно отверстие ниже. A1 соединен с B1 скрытыми металлическими полосками, но ни одно отверстие никогда не соединяется с какими-либо двумя отверстиями, если вы сами не добавите перемычку.
У больших макетных плат также есть полосы отверстий по бокам, обычно отмеченные красными и черными или красными и синими полосами. Это шины питания (power rails), они предназначены для упрощения проводки: вы можете подключить один провод от контакта заземления Raspberry Pi к одной из шин питания, обычно отмеченных синей или черной полосой и символом минуса, чтобы обеспечить общее заземление (common ground) для множества компонентов на макетной плате, и вы можете сделать то же самое, если вашей схеме требуется питание 3,3 В или 5 В.
Добавить электронные компоненты к макетной плате просто: просто совместите их выводы (выступающие металлические детали) с отверстиями и осторожно нажмите, пока компонент не встанет на место. Для соединений, которые вам нужно сделать помимо тех, которые делает для вас макет, вы можете использовать перемычки «папа-папа» (M2M); для подключения от макета к Raspberry Pi используйте перемычки «папа-мама» (M2F).


Никогда не пытайтесь втиснуть более одного вывода компонента или перемычки в одно отверстие на макетной плате! 

 

Помните: отверстия соединены в столбцы, за исключением разделения посередине, поэтому вывод компонента в A1 электрически соединяется со всем, что вы добавляете к B1, C1, D1 и E1.

 

 

Следующий шаг: Считывание кнопки

Устройства вывода, такие как, к примеру, светодиоды — это одно, но часть «вход / выход» в «GPIO» означает, что вы также можете использовать контакты в качестве входов. Для этого проекта вам понадобится макетная плата, перемычки «папа-папа» (M2M) и «папа-мама» (M2F), а также кнопочный переключатель. Если у вас нет макетной платы, вы можете использовать перемычки «мама-мама» (F2F), но на кнопку будет намного сложнее нажать без случайного разрыва цепи, поскольку она не будет надёжно закреплена.

Начните с добавления кнопки на макетную плату. Если у вашей кнопки только две ножки, убедитесь, что они находятся в разных пронумерованных рядах макета; если у него четыре ножки, поверните его так, чтобы стороны, из которых выступают ножки, находились вдоль рядов макета, а плоские стороны без ножек находились сверху и снизу. Подключите шину заземления макетной платы к контакту заземления Raspberry Pi (обозначенному GND) с помощью перемычки «папа-мама», затем подключите одну ножку кнопки к шине заземления с помощью штыревого кабеля «папа-папа». Наконец, подключите вторую ножку — ту, которая находится на той же стороне, что и стойка, которую вы только что подключили, при использовании четырехполюсного переключателя — к контакту GPIO 2 (отмечен GP2) Raspberry Pi с перемычкой «папа-мама».

 

Считывание кнопки в Scratch

Запустите новую программу Scratch и перетащите блок событий  (при нажатии) в область кода.
Подключите блок   (установить gpio к входу «вытянутый верхний») и выберите число 2 из раскрывающегося списка, чтобы оно соответствовало контакту GPIO, который вы использовали для кнопки.

Если сейчас щелкнуть зеленый флажок, ничего не произойдет. Это потому, что вы указали Scratch использовать пин в качестве входа, но не что с этим входом делать. Перетащите блок  (навсегда) в конец вашей последовательности, затем перетащите блок  (если-то-иначе) внутрь него. Найдите блок  (gpio высокий?), перетащите его в ромбовидное белое пространство в части блока (если-то) и используйте раскрывающийся список, чтобы выбрать номер 2, для указания какой вывод GPIO проверять. Перетащите блок   (Сказать Привет! в течение 2 секунд) в другую часть блока  и отредактируйте его, чтобы сказать ‘Button pushed!’ («Кнопка нажата!»). Оставьте пока часть блока пустой.

В этой программе много действий, поэтому начните с тестирования: щелкните зеленый флаг, затем нажмите кнопку на макете. Ваш спрайт должен сообщить вам, что кнопка была нажата: вы успешно прочитали ввод данных с разъема GPIO!
Вы могли заметить, что часть блока  (если gpio 2 «высокий»? тогда) пуста. Код, который запускается, когда кнопка фактически нажата, тем временем находится в  части блока. Это сбивает с толку, ведь при нажатии на кнопку он поднимается «вверх»? На самом деле в данном конкретном случае все наоборот: по умолчанию мы подтянули вывод GPIO к «высокому» (high) уровню, а нажатие кнопки опускает его на «низкое» (low).
Посмотрите на свою схему еще раз: посмотрите, как кнопка подключена к контакту GPIO 2, который обеспечивает положительную часть схемы, и контакту заземления. Когда кнопка нажата, напряжение на контакте GPIO понижается через контакт заземления, и ваша программа Scratch перестает запускать код в вашем блоке  и вместо этого запускает код в  части блока.

Если все это звучит озадачивающе, просто помните: при нажатии кнопки пин становится «низким» (low). Обратите внимание, что это происходит из-за конструкции этой конкретной схемы.

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

Перетащите блок кнопки  (сказать Кнопка нажата! на 2 секунды)из области кода на палитру блоков, чтобы удалить ее, затем замените ее блоком   (установить gpio 25 для выхода «высокий»), помня, что вам придется изменить номер GPIO с помощью стрелки раскрывающегося списка. Добавьте блок  (установить gpio 25 для выхода «низкий»), не забывая изменить значения — на в настоящее время пустую часть блока  (если gpio 2 «высокий», то).

Щелкните зеленый флаг и нажмите кнопку. Светодиод будет гореть, пока вы удерживаете кнопку нажатой; отпустите кнопку — и он снова погаснет. Поздравляем: вы управляете одним выводом GPIO на основе ввода от другого!

 

ЗАДАНИЕ:

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

 

 

Считывание кнопки в Python

Нажмите кнопку «Создать» в Thonny, чтобы начать новый проект, и кнопку «Сохранить», чтобы сохранить его как 'Button Input.'. Использование вывода GPIO в качестве входа для кнопки очень похоже на использование вывода в качестве выхода для светодиода, но вам необходимо импортировать другую часть библиотеки GPIO Zero. Введите в область сценария следующее:

Чтобы код запускался при нажатии кнопки, GPIO Zero предоставляет функцию wait_for_press. Введите следующее:

Нажмите кнопку «Выполнить», затем нажмите кнопочный переключатель. Ваше сообщение будет напечатано в оболочке Python в нижней части окна Thonny, другими словами, вы успешно прочитали ввод с разъема GPIO! Если вы хотите снова попробовать свою программу, вам нужно будет снова нажать кнопку «Выполнить». Поскольку в программе нет цикла, она завершает работу, как только завершает печать сообщения в оболочке.

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

Чтобы управлять светодиодом, а также считывать состочния кнопки, вам необходимо импортировать функции кнопки Button и светодиода LED из библиотеки GPIO Zero. Вам также понадобится функция сна sleep из библиотеки времени time. Вернитесь к началу вашей программы и введите следующее в качестве новых первых двух строк:

Ниже строки button = Button(2), напечатайте:

Удалите строку print("You pushed me!") и замените её на:

Теперь программа должна выглядеть так:

Нажмите кнопку «Выполнить», затем нажмите кнопочный переключатель: светодиод загорится на три секунды, затем снова погаснет, и программа закончит своё выполнение.

Поздравляем: вы можете управлять светодиодом с помощью кнопки в Python!

 

ЗАДАНИЕ:

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

 

 

Давайте пошумим: управление зуммером

Светодиоды — отличные устройства вывода, но от них мало толку, если вы смотрите в другую сторону. Решение: зуммеры, издающие шум, который можно услышать в любом месте комнаты. Для этого проекта вам понадобится макетная плата, перемычки «папа-мама» (M2F) и активный зуммер. Если у вас нет макетной платы, вы можете подключить зуммер с помощью перемычек «мама-мама» (F2F).

Активный зуммер можно рассматривать как светодиод с точки зрения схемы и программирования. Повторите схему, которую вы сделали для светодиода, но замените светодиод активным зуммером и оставьте резистор отключенным, так как зуммеру потребуется больше тока для работы. Подключите одну ножку зуммера к 15-му контакту разъема GPIO (обозначенному GP15), а вторую — к контакту заземления (обозначенному GND), используя макетную плату и перемычки «папа-мама».

Если у вашего зуммера три ножки, убедитесь, что ножка, помеченная знаком минуса (-), подключена к контакту заземления, а ножка, отмеченная буквой «S» или «СИГНАЛ», подключена к GPIO 15, затем подключите оставшуюся ножку (обычно это средняя ножка)  на вывод 3,3 В (обозначен как 3V3).

 

Управление зуммером в Scratch

Создайте заново ту же программу, что и для управления светодиодом, или загрузите ее, если вы сохранили ее до создания проекта с кнопкой. Используйте раскрывающийся список в блоке  (установить gpio для вывода «высокий»), чтобы выбрать номер 15, для того, чтобы Scratch контролировал правильный вывод GPIO.

Щелкните зеленый флаг, и ваш зуммер начнет гудеть: на одну секунду он включается, и на одну секунду выключается. Если вы слышите щелчок зуммера только один раз в секунду, вы используете пассивный зуммер, а не активный зуммер. Активный зуммер самгенерирует быстро изменяющийся сигнал, известный как колебание (oscillation), чтобы заставить металлические пластины вибрировать, пассивному же зуммеру требуется колебательный сигнал. Когда вы просто включаете его с помощью Scratch, пластины перемещаются только один раз и останавливаются, издавая звук щелчка до тех пор, пока ваша программа не включит или не выключит его в следующий раз.

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

 

ЗАДАНИЕ:

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

 

 

Управление зуммером в Python

Управление активным зуммером через библиотеку GPIO Zero почти идентично управлению светодиодом, поскольку он может быть включен и выключен. Однако вам нужна другая функция: зуммер buzzer. Запустите новый проект в Thonny и сохраните его как 'Buzzer', затем введите следующее:

Как и в случае со светодиодами, GPIO Zero необходимо знать, к какому выводу подключен ваш зуммер, чтобы управлять им. Введите следующее:

Далее ваша программа почти идентична той, которую вы написали для управления светодиодом; единственная разница (кроме другого номера контакта GPIO) заключается в том, что вы используете зуммер вместо светодиода. Введите следующее:

Нажмите кнопку «Выполнить», и ваш зуммер начнет гудеть: на одну секунду он включается, и на одну секунду выключается. Если вы используете пассивный зуммер, а не активный зуммер, вы будете слышать только краткий щелчок каждую секунду вместо непрерывного гудка: это потому, что у пассивного зуммера отсутствует осциллятор для создания быстро меняющегося сигнала, который заставляет пластины внутри зуммера вибрировать.

Нажмите кнопку «Стоп», чтобы выйти из программы, но убедитесь, что зуммер в это время не издает звуков, иначе он будет продолжать гудеть, пока вы снова не запустите программу!

 

ЗАДАНИЕ:

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

 

 

Проект Scratсh: светофор

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

Для этого проекта вам понадобятся:

  • макетная плата;
  • красный, желтый и зеленый светодиоды;
  • три резистора 330 Ом;
  • зуммер;
  • выключатель кнопочный;
  • набор перемычек «папа-папа» (M2M) и «папа-мама» (M2F).

Начните с построения этой схемы, подключив зуммер к контакту GPIO 15 (обозначен GP15), красный светодиод — к контакту GPIO 25 (помечен GP25), желтый светодиод — к GPIO 8 (GP8), зеленый светодиод на GPIO 7 (GP7) и переключатель на GPIO 2 (GP2). Не забудьте подключить резисторы 330 Ом между выводами GPIO и длинными ножками светодиодов, а вторые ножки на всех ваших компонентах подключить к шине заземления макетной платы. Наконец, подключите шину заземления к контакту заземления (обозначенному GND) на Raspberry Pi, чтобы замкнуть цепь.

 

Запустите новый проект Scratch 3, затем перетащите блок (при нажатии) в область кода. Затем вам нужно сообщить Scratch, что контакт GPIO 2, который подключен к кнопочному переключателю в вашей схеме, является входом, а не выходом: перетащите блок  (установить gpio, чтобы ввести вытянутый «высокий»)  из Raspberry Pi GPIO категории палитры блоков под вашим блоком (при нажатии). Щелкните стрелку вниз рядом с «0» и выберите число 2 из раскрывающегося списка.

Далее вам нужно создать последовательность сигналов светофора. Перетащите блок   (навсегда) в свою программу, а затем заполните его блоками, чтобы светодиоды светофора включались и выключались по определенной схеме. Запомните, к каким контактам GPIO подключен какой компонент: когда вы используете контакт 25, вы используете красный светодиод, контакт 8 — желтый светодиод, а контакт 7 — зеленый светодиод.

Щелкните зеленый флаг и следите за своими светодиодами: сначала загорится красный, затем к красному добавится желтый, затем загорится зеленый, но погаснут красный и желтый, затем загорится желтый, и, наконец, желтый погаснет и загорится красный: вся последовательность повторится еще раз. Этот шаблон соответствует шаблону работы светофоров в Великобритании (за исключением временных промежутков); при желании вы можете отредактировать последовательность для соответствия образцу в вашей стране.

Чтобы имитировать пешеходный переход, вам необходимо, чтобы программа отслеживала нажатие кнопки. Щелкните красный восьмиугольник, чтобы остановить программу, если она запущена. Перетащите блок  (если-то-иначе) в область сценария и подключите его так, чтобы он находился прямо под блоком , с последовательностью светофора в разделе «if then». Оставьте пока ромбовидный зазор пустым.

Настоящий пешеходный переход не меняет свет на красный сразу после нажатия кнопки, а вместо этого ждет следующего красного светофора в последовательности. Чтобы встроить это в нашу программу, перетащите блок  (когда gpio находится на «низком»), в область кода и выберите «2» из его раскрывающегося списка. Затем перетащите под ним блок  (установите нажатый на 1).

Этот стек блоков следит за нажатием кнопки, а затем устанавливает для переменной ‘pushed’ («нажатой») значение 1. Установка переменной таким образом позволяет сохранить факт нажатия кнопки, даже если вы не собираетесь действовать сразу.

Вернитесь к исходному стеку блоков и найдите блок (если-то). Перетащите ромбовидный блок оператора внутрь блока , а затем перетащите блок  (нажатый) в первое пустое место. Введите '0' вместо '50' в правой части блока.

Щелкните зеленый флаг и наблюдайте, как огни светофора меняют свою последовательность. Нажмите на кнопочный переключатель: сначала будет казаться, что ничего не происходит, но как только последовательность достигает своего конца - когда горит только желтый светодиод — огни светофора погаснут и останутся выключенными, благодаря вашей переменной ‘pushed’ («нажатой»).

Все, что осталось сделать — это заставить кнопку пешеходного перехода делать что-то, кроме выключения света. В стеке основного блока найдите блок  и перетащите блок  (установить gpio 25 для вывода «высокий»), не забудьте изменить номер контакта GPIO по умолчанию, чтобы он соответствовал контакту, к которому подключен ваш красный светодиод.

Под ним, в том же блоке , создайте шаблон для зуммера: перетащите блок  (повторить 10), затем заполните его установкой  (установить gpio 15 для вывода высокого уровня), далее блок  (подождите 0,2 секунды),   и ещё раз блок , изменяя значения вывода GPIO, чтобы они соответствовали контакту компонента зуммера.

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

Программа будет выглядеть так:

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

Поздравляем: вы запрограммировали собственный полнофункциональный светофор с пешеходным переходом!

 

ЗАДАНИЕ:

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

 

 

 

Проект на Python: Игра для проверки реакции

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

Для этого проекта вам понадобятся:

  • макетная плата,
  • светодиод,
  • резистор 330 Ом,
  • два кнопочных переключателя,
  • несколько перемычек «папа-мама» (M2F)
  • несколько перемычек «папа-папа» (M2M).

 

Начните с построения этой схемы: подключите первый переключатель на левой стороне макетной платы к 14-му контакту GPIO (обозначен GP14), второй переключатель на правой стороне макета к 15-му контакту разъема GPIO (с маркировкой GP15), длинную ножку светодиода к резистору 330 Ом, который затем подключается к 4-му контакту разъема GPIO (с маркировкой GP4) на Raspberry Pi, а вторые ножки на всех ваших компонентах — к шине заземления макетной платы. Наконец, подключите шину заземления к контакту заземления Raspberry Pi (помеченному GND).

Начните новый проект в Thonny и сохраните его как 'Reaction Game'. Вы собираетесь использовать функции светодиодов LED и кнопок button из библиотеки GPIO Zero, а также функцию сна sleep из библиотеки времени time. Однако вместо того, чтобы импортировать две функции GPIO Zero в две отдельные строки, вы можете сэкономить время и импортировать их вместе, используя символ запятой (,) для их разделения. Введите следующее в области сценария:

Как и раньше, вам нужно будет указать GPIO Zero, к каким контактам подключены две кнопки и светодиод. Введите следующее:

Теперь добавьте инструкции по включению и выключению светодиода, чтобы вы могли убедиться, что он работает правильно:

Нажмите кнопку «Выполнить»: светодиод загорится на пять секунд, затем погаснет, и программа закроется. Однако для целей игры на реакцию, если светодиод гаснет ровно через 5 секунд каждый раз, это немного предсказуемо. Добавьте следующее под строкой from time import sleep:

Библиотека random, как следует из названия, позволяет генерировать случайные числа (здесь с равномерным распределением - см. Rpf.io/uniform). Найдите строку sleep (5) и измените ее на:

Нажмите кнопку «Выполнить» еще раз: на этот раз светодиод будет гореть в течение случайного количества секунд от 5 до 10. Посчитайте, чтобы увидеть, сколько времени потребуется, чтобы светодиод погас, затем нажмите кнопку «Выполнить» еще несколько раз: вы увидете, что будет разное время для каждого прогона, соответственно программа будет менее предсказуемой.

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

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

Запустите вашу программу и на этот раз попробуйте нажать одну из двух кнопок, как только светодиод погаснет. Вы увидите сообщение о том, что первая кнопка будет нажата в оболочке Python в нижней части окна Thonny. К сожалению, вы также будете видеть сообщения при каждом нажатии любой кнопки — и они используют для кнопки номер контакта разъема, а не понятное имя игрока.

Чтобы исправить это, сначала спросите игроков, как их зовут. Затем под строкой from random import uniform  введите следующее:

Вернитесь к своей функции и замените строку print(str(button.pin.number) + "won the game") на:

Нажмите кнопку «Выполнить», затем введите имена обоих игроков в область оболочки Python. Когда вы нажмете кнопку на этот раз, не забывая делать это как можно быстрее после того, как светодиод погаснет, вы увидите, что имя игрока печатается вместо номера контакта.

Чтобы решить проблему, когда все нажатия кнопок сообщались как выигравшие, вам необходимо добавить новую функцию из библиотеки sys (сокращение от system): exit. Под последней строкой import введите следующее:

Затем в конце функции под строкой print(right_name + " won the game") введите следующее:

Здесь важен отступ: _exit (0) должен иметь отступ в четыре пробела, выровненный по вертикали с else и if  над ним. Эта инструкция сообщает Python, чтобы он остановил программу после нажатия первой кнопки, то есть игрок, чья кнопка была нажата второй, не получит никакой награды за проигрыш!

Готовая программа должна выглядеть так:

Нажмите кнопку «Выполнить», введите имена игроков, дождитесь, пока индикатор не погаснет, и вы увидите имя победившего игрока. Вы также увидите сообщение от самого Python: Backend terminated or disconnected . Use 'Stop/Restart' to restart ... (Backend завершен или отключен. Используйте 'Stop / Restart' для перезапуска ...) Это просто означает, что Python получил вашу команду _exit (0) и остановил программу, но вам нужно щелкнуть значок Stop, чтобы полностью выйти и подготовить вашу программу к следующему раунду.

Поздравляем! Вы только что закончили свою первую физическую игру!

 

ЗАДАНИЕ:

  • Попробуйте изменить программу, добавив цикл, чтобы игра работала непрерывно (не забудьте сначала удалить инструкцию _exit (0)).
  • Можете ли вы добавить счетчик очков, чтобы видеть, кто выигрывает в нескольких раундах?
  • Как насчет таймера, чтобы вы могли видеть, сколько времени вам потребовалось, чтобы отреагировать в игре?

 

 

Подводя итог этой части обзора Raspberry Pi, важно отметить две вещи:

1. В конце каждого рассмотренного проекта есть раздел  "ЗАДАНИЕ", который помогает в развитии навыков работы с языками программирования и физическими устройствами. Старайтесь не только прочесть информацию о проектах, но и обязательно выполнить задание. Это не займёт много времени, но ваш уровень профессионализма будет стремительно расти вверх.

2. Рассмотренные проекты, конечно, являются очень лёгкими. Они специально приведены для легкого их понимания и помощи новичкам в освоении функций Raspberry Pi. Для желающих попробовать реализовать более сложные проекты мы рекомендуем ознакомиться с разделом "Изучаем Raspberry Pi. Дополнение 4. Что ещё пригодится для изучения Raspberry Pi" и исследовать раздел проектов.

Важно помнить, что самые сложные и объёмные проекты начинаются всего лишь с первой строки кода и большинство из нас обязаны этому двум словам: Hello world!

 

В следующей части обзора мы рассмотрим работу Raspberry Pi с платами расширения.