День #9 адвент-календаря мейкера: полный наклон!

День 9 адвент-календаря мейкера: полный наклон!

Добро пожаловать в девятый день вашего адвент-календаря «12 проектов Кодмаса». Сегодня мы будем использовать датчик, который определяет движение — но не как наш PIR-датчик из дня #7 — это датчик наклона, который может определять наклон под определённым углом.

Хотя мы будем использовать простой шаровой датчик наклона, который выдаёт сигнал типа ВКЛ/ВЫКЛ, в реальном мире более продвинутые версии используются в автомобильных сигнализациях, для измерения крена лодок и самолётов, в робототехнике и многом другом.

Это очень простой датчик, который выдаёт сигнал HIGH при наклоне выше определённого угла. На самом деле, этот день, наверное, покажется вам очень лёгким, учитывая все компоненты, с которыми вы уже экспериментировали!

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

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

  • 1x Датчик/переключатель наклона

  • 2x Провода-перемычки папа-папа

  • 2x Провода-перемычки папа-мама

Содержимое дня 9

Проект сегодняшнего дня

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

Конец с выводами имеет внутри два контакта, соединённых с каждым выводом. Когда шарик перекатывается к концу с выводами, он соединяет эти контакты/выводы (так как металл проводит электричество), что даёт нашему Pico сигнал HIGH. Когда мы наклоняем его обратно, шарик откатывается, соединение разрывается, и пин возвращается в состояние LOW.

Отлично подходит для робототехнических проектов в качестве автоматического выключателя, если ваш робот перевернётся!

Сборка схемы

Вы знаете правило… выключите Pico перед изменением схемы!

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

День 09 — стартовая точка

Теперь добавим датчик наклона. Он работает как переключатель, поэтому нам нужно подключить только два провода. Мы включили провода-перемычки папа-мама, чтобы вы могли подключить компонент без крепления на макетную плату — это даёт вам возможность свободно наклонять переключатель. Мы также включили провода папа-папа, если вы предпочитаете подключить его к макетной плате.

Выводы не очень прочные, поэтому, придерживая их пальцами, осторожно вставьте штырьки датчика в гнёзда-мамы проводов-перемычек, затем подключите один из этих проводов к 3.3V (физический пин 36), а другой — к GPIO 26 (физический пин 31).

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

Схема с датчиком наклона

Задание 1: базовая программа для датчика наклона

Давайте запустим небольшую программу для тестирования нашего датчика и посмотрим, как он работает.

Нам нужно лишь несколько строк кода для использования такого датчика наклона, поскольку он работает так же, как кнопка или переключатель, выдавая сигналы HIGH или LOW.

Это очень похоже на наш код для кнопки из дня #3 — мы настраиваем пин датчика с подтяжкой к земле, затем запускаем простой оператор if, ожидая, когда пин перейдёт в состояние HIGH.

# Импорты
from machine import Pin
import time

# Настройка пина датчика наклона
tilt = Pin(26, Pin.IN, Pin.PULL_DOWN)

while True: # Запускаем вечно

    time.sleep(0.01) # Короткая задержка

    if tilt.value() == 1: # Если датчик в состоянии HIGH

        print("Я наклонился!") # Выводим строку

Задание 2: Tilty McBuzzalot (зуммер при наклоне)

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

Пример ниже добавляет зуммер обратно в код (а значит, нам нужно импортировать PWM, как мы делали ранее), устанавливает частоту зуммера перед циклом while (поскольку мы не будем менять частоту), а затем просто увеличивает скважность (громкость) зуммера при обнаружении наклона.

Попробуйте!

Код

# Импорты
from machine import Pin, PWM
import time

# Настройка пина датчика наклона
tilt = Pin(26, Pin.IN, Pin.PULL_DOWN)

# Настройка пина зуммера в режиме PWM
buzzer = PWM(Pin(13)) # Устанавливаем зуммер в режим PWM

# Установка частоты PWM на 1000
buzzer.freq(1000)

while True: # Запускаем вечно

    time.sleep(0.01) # Короткая задержка

    if tilt.value() == 1: # Если датчик в состоянии HIGH

        print("***НАКЛОН ОБНАРУЖЕН***") # Выводим строку

        buzzer.duty_u16(10000) # Устанавливаем скважность (увеличиваем громкость)

        time.sleep(0.2) # Короткая задержка

        buzzer.duty_u16(0) # Скважность в ноль (выключаем звук)

Задание 3: счётчик наклонов

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

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

Пример ниже немного умнее наших предыдущих счётчиков, так как мы добавили новую переменную состояния, чтобы убедиться, что пин всегда возвращается в состояние LOW перед тем, как мы снова считаем — иначе, если мы держали бы датчик наклонённым (HIGH), он бы просто продолжал считать бесконечно!

Мы начинаем состояние с 0, затем используем and в наших операторах if для проверки двух условий (помните это с дня #3, где мы проверяли, нажаты ли обе кнопки?):

  • Первый оператор if не запустится, если состояние не равно 0 и пин не в состоянии HIGH. Когда он запускается, блок кода внутри этого оператора if меняет состояние на 1, что означает, что этот блок подсчёта не может снова запуститься, пока мы не вернём состояние обратно в 0.

  • Второй оператор if обрабатывает это. Второй оператор if запускается только если состояние равно 1 и пин в состоянии LOW… то есть мы вынуждены наклонить датчик обратно, чтобы запустить этот блок, вернуть состояние в 0, готовое для следующего наклона.

Код

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

# Импорты
from machine import Pin
import time

# Настройка пина датчика наклона
tilt = Pin(26, Pin.IN, Pin.PULL_DOWN)

# Инициализируем переменную счётчика нулём
tiltcount = 0

# Создаём переменную состояния, равную нулю
state = 0

while True: # Запускаем вечно

    time.sleep(0.1) # Короткая задержка

    if state == 0 and tilt.value() == 1: # Если состояние 0 и пин HIGH

         tiltcount = tiltcount + 1 # Прибавляем +1 к tiltcount

         state = 1 # Меняем состояние на 1

         print("наклонов =",tiltcount) # Выводим новый tiltcount

    if state == 1 and tilt.value() == 0: # Если состояние 1 и пин LOW

        state = 0 # Меняем состояние на 0

Теперь вернитесь к заданию #2 и подумайте, как можно улучшить его таким же образом, дожидаясь перехода пина в состояние LOW перед тем, как разрешить зуммеру издать звук… или, возможно, добавьте светодиоды для визуальной индикации наклона?

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

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

Сегодня вы:

  • Узнали, что такое датчик/переключатель наклона и зачем он может вам понадобиться

  • Узнали, как подключить датчик наклона к схеме (проще простого!)

  • Узнали, как использовать переменные и операторы if так, чтобы повысить надёжность и точность нашего проекта

  • Сделали простую сигнализацию наклона

  • Применили много вещей, которые уже изучили ранее!

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

Примечание

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