6. Акселерометр

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

6.1. Использование акселерометра

На puboard есть акселерометр (крошечная гирька на крошечной пружине) который можно использовать для того, чтобы обнаружить угол и движение платы. Есть и другой датчик для каждого измерения x, y, z. Для получения значения акселерометра, создайте объект pyb.Accel() и вызовите x() метод.

>>> accel = pyb.Accel()
>>> accel.x()
7

Этот метод возвращает целое число от -30 до 30. Обратите внимание, что результат измерений очень зашумлён; так что даже если вы будите держать плату идеально ровно - будут неболшьшие изменения в значениях, полученных от измерительных функций. Поэтому вы не должны использовать точные значения функции x() - работать следует с диапазоном значений.

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

accel = pyb.Accel()
light = pyb.LED(3)
SENSITIVITY = 3

while True:
    x = accel.x()
    if abs(x) > SENSITIVITY:
        light.on()
    else:
        light.off()

    pyb.delay(100)

Мы создали Accel и LED объекты, затем получили значение акселерометра оси x. Если абсолютная величина значения x больше чем определённая константа SENSITIVITY, то светодиод включается, в противном случае - выключается. Цикл имеет небольшую задержку pyb.delay(): если бы его не было, то светодиод бы очень чато мигал при значениях x близких к SENSITIVITY. Попробуйте запустить этот код на вашем микроконтроллере и покрутите его влево/вправо, чтобы активировать светодиод.

Упражнение: измените предыдущий скрипт так, чтобы синий светодиод становился тем ярче чем больший угол наклона будет у платы. Совет: Вам нужно будет масштабировать значения, шнтенсивность светодиода 0-255.

6.2. Создаём уровень

Пример выше бал чувствителен только лишь к наклонам относительно оси x, но если мы используем значения y() и больше светодиодов - то можем превратить pyboard в уровень.

xlights = (pyb.LED(2), pyb.LED(3))
ylights = (pyb.LED(1), pyb.LED(4))

accel = pyb.Accel()
SENSITIVITY = 3

while True:
    x = accel.x()
    if x > SENSITIVITY:
        xlights[0].on()
        xlights[1].off()
    elif x < -SENSITIVITY:
        xlights[1].on()
        xlights[0].off()
    else:
        xlights[0].off()
        xlights[1].off()

    y = accel.y()
    if y > SENSITIVITY:
        ylights[0].on()
        ylights[1].off()
    elif y < -SENSITIVITY:
        ylights[1].on()
        ylights[0].off()
    else:
        ylights[0].off()
        ylights[1].off()

    pyb.delay(100)

Мы начинаем с создания кортежа LED объектов для x, y. Кортежи - неизменяемые объекты в python, это означает что их нельзя изменить при создании. Затем мы делаем то же, что и раньше, но включаем разные светодиоды для положительного и отрицательного наклонов относительно оси x. Далее делаем то же самое для оси y. Не особенно изощрённый метод, но он работает. Запустите это на вашем pyboard и вы увидите как включаются различные светодиоды относительно того как наклонена плата.