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 и вы увидите как включаются различные светодиоды относительно того как наклонена плата.