Датчики. Помимо цветовых и гироскопических датчиков у вас есть еще два примечательных: ультразвуковой и инфракрасный. Мы использовали инфракрасный порт в более раннем уроке с пультом дистанционного управления, хотя у него есть еще несколько хитростей.

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

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

#!/usr/bin/env pybricks-micropython
from pybricks import ev3brick as brick
from pybricks.ev3devices import UltrasonicSensor, InfraredSensor
from pybricks.parameters import Port
from pybricks.tools import wait
ultra = UltrasonicSensor(Port.S1)
infra = InfraredSensor(Port.S2)
while True:
    distance = ultra.distance()
    distance2 = infra.distance()    
    print("ultra distance",distance,"infra distance",distance2)
    wait(500)

Все, что он делает, это определяет два датчика и сообщает о расстояниях, которые они видят каждые 1/2 секунды. Я установил их на своего робота и построил башню из лего, чтобы наблюдать, как вы можете видеть на этом фото.

Инфракрасный датчик показал значение 90 @ примерно 1200 см, за пределами этого результаты казались очень ненадежными. Ультразвук, с другой стороны, продолжал возвращать значения, пока не достиг 2550 мм. Он оказался более надежным.

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

С другой стороны, ультразвуковой датчик не смог измерить расстояние до 3 см. Инфракрасное излучение с другой стороны дало бы мне значение индекса 1 на расстоянии 5 см. В отличие от ультразвука, поскольку он дает значение индекса, он гораздо менее гранулирован, чем ультразвук.

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

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

#!/usr/bin/env pybricks-micropython
from pybricks import ev3brick as brick
from pybricks.ev3devices import UltrasonicSensor, InfraredSensor, Motor
from pybricks.parameters import Port
from pybricks.tools import wait
from pybricks.robotics import DriveBase
left_motor = Motor(Port.B)
right_motor = Motor(Port.C)
left_motor.reset_angle(0)
robot = DriveBase(left_motor, right_motor, 56, 114)
ultra = UltrasonicSensor(Port.S1)
infra = InfraredSensor(Port.S2)
speed = 5
robot.drive(-speed,0)
while True:
    print("ultra distance",ultra.distance(),"infra distance",infra.distance(),"angle",left_motor.angle())
    wait(2000)

Результаты возвращаются, выглядя примерно так.

ultra distance 835 infra distance 77 angle 0
ultra distance 839 infra distance 78 angle -18
ultra distance 849 infra distance 77 angle -38
ultra distance 857 infra distance 77 angle -59
ultra distance 864 infra distance 78 angle -80
ultra distance 877 infra distance 78 angle -100
ultra distance 886 infra distance 78 angle -120
ultra distance 901 infra distance 79 angle -140
ultra distance 908 infra distance 79 angle -160
ultra distance 916 infra distance 78 angle -180
ultra distance 929 infra distance 79 angle -200
ultra distance 940 infra distance 80 angle -220
ultra distance 947 infra distance 80 angle -241
ultra distance 955 infra distance 79 angle -261
ultra distance 969 infra distance 81 angle -280

Сценарий разумный говорит сам за себя; он просто определяет пару моторов, пару датчиков и гонит робота назад, сообщая каждые 2 секунды, что говорят датчики.

Меня, компьютерного ученого, больше беспокоит отчет, который он выдает. Как вы сами видите, нехватка единообразия. Робот движется с постоянной скоростью, и с погрешностью в один градус угол выглядит хорошим: 20/21 градус каждые 2 секунды, как только он начинает движение. Но инфракрасное измерение/индекс прыгает туда-сюда, индекс возвращает 80, потом 79, потом 81? Ультразвук продолжает увеличиваться, но с непостоянными шагами, от разницы от 9 мм до 15 мм, несмотря на то, что мы перемещались на одинаковое расстояние [очевидно].

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