«Ошибка типа: отсутствует функция 1 необходимые позиционные аргументы»: Ультразвуковой датчик расстояния, взаимодействующий с Rasberry Pi Pico

#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