#micropython #raspberry-pi-pico
Вопрос:
Я пытаюсь определить расстояние с помощью Raspberry Pi Pico и ультразвукового датчика расстояния. Во время выполнения кода в Тонни я получаю ошибку,
TypeError: function missing 1 required positional arguments
Код выглядит следующим образом:
from machine import Pin, Timer
import utime
timer = Timer
trigger = Pin(3, Pin.OUT)
echo = Pin(2, Pin.IN)
distance = 0
def get_distance(timer):
global distance
trigger.high()
utime.sleep(0.00001)
trigger.low()
while echo.value() == 0:
start = utime.ticks_us()
while echo.value() == 1:
stop = utime.ticks_us()
timepassed = stop - start
distance = (timepassed * 0.0343) / 2
print("The distance from object is ",distance,"cm")
return distance
timer.init(freq=1, mode=Timer.PERIODIC, callback=get_distance)
while True:
get_distance()
utime.sleep(1)
Комментарии:
1. Если вы прочитаете сообщение об ошибке, оно сообщит вам, что в функции отсутствует аргумент. Когда вы вызываете get_distance (), вы, вероятно, должны передавать таймер следующим образом: get_distance(таймер).
Ответ №1:
Ваша первоначальная проблема заключается в том, что вы не используете timer
в качестве аргумента свой get_distance
вызов, но у вас есть проблемы посерьезнее. Вы используете таймер для вызова get_distance
, но вы также вызываете get_distance
в цикле. В довершение всего у вас есть 2 блокирующих while
цикла в вашей get_distance
функции. Кто знает, как долго значение echo
будет оставаться 1 или 0. Будет ли это оставаться одним из этих значений дольше, чем при следующем вызове Timer
? Если это так, у вас будут большие проблемы. Что вы хотите сделать, так это посылать периодические импульсы на вывод для проверки значений. Это можно сделать, как показано ниже. Этот код не тестируется (хотя, вероятно, он работает). Это, по крайней мере, четкое представление о направлении, в котором вы должны двигаться.
import machine, utime
trigger = machine.Pin(3, machine.Pin.OUT)
echo = machine.Pin(2, machine.Pin.IN)
def get_distance(timer):
global echo, trigger #you probably don't need this line
trigger.value(0)
utime.sleep_us(5)
trigger.value(1)
utime.sleep_us(10)
trigger.value(0)
pt = machine.time_pulse_us(echo, 1, 50000)
print("The distance from object is {} cm".format((pt/2)/29.1))
timer = machine.Timer(-1)
timer.init(mode=machine.Timer.PERIODIC, period=500, callback=get_distance)
Части этого кода были заимствованы отсюда и переформатированы в соответствии с вашим дизайном. Я был слишком ленив, чтобы понять, как эффективно избавиться от ваших while
петель, поэтому я просто позволил Интернету дать мне этот ответ ( machine.time_pulse_us(echo, 1, 50000)
).
Ответ №2:
Многие ультразвуковые устройства, такие как SRF04, номинально работают при 5 В, поэтому у вас могут возникнуть проблемы, если вы используете именно это.
v53l0x-это устройство для измерения времени полета на основе лазера. Он работает только на коротких расстояниях (около метра или около того, но он определенно работает с 3,3 В на Пико с микропифоном и Тонни
https://www.youtube.com/watch?v=YBu6GKnN4lk
https://github.com/kevinmcaleer/vl53l0x