Skocz do zawartości

Pi Pico i Ultradźwiękowy czujnik odległości ME007YS - w jaki sposób uzyskać odległość?


Pomocna odpowiedź

Napisano

Cześć,

 

Zakupiłem czujnik odległości Ultradźwiękowy czujnik odległości ME007YS i chciałbym go połączyć z Pi Pico. Byłem pewien, że połączenie będzie tak samo proste jak z HC-SR04, ale niestety okazało się inaczej 😉 Na stronie producenta jest tylko kod dla Arduino uno oraz Raspberry Pi. 

Czy sensor ten w ogóle da się w jakikolwiek sposób podłączyć i z niego korzystać?

Poniżej moje podłączenie:

RX i TX podłączyłem pod piny GP0 i GP1. Używam kodu jak poniżej:


from machine import Pin
from utime import sleep, sleep_us, ticks_us

# Devices
led_onboard = Pin(25, Pin.OUT) 

trigger = Pin(0, Pin.OUT) # czujnik odl RX
echo = Pin(1, Pin.IN, Pin.PULL_DOWN) # czujnik odl TX
# ds.date_time([2022, 08, 03, 0, 17, 07, 00, 0]) # set datetime.
state = 0


def measure():
    global state
    if state == 0:
        trigger.low()
        sleep_us(2)
        trigger.high()
        sleep_us(5)
        trigger.low()
        print('Test1')
        while echo.value() == 0:
           signaloff = utime.ticks_us()
        print('After while 1')
        while echo.value() == 1:
           signalon = ticks_us()
           print(echo.value())
        print('After while 2')
        timepassed = signalon - signaloff
        distance = (timepassed * 0.0343) / 2
        print("The distance from object is ",distance,"cm")
        with open('results.txt', 'a') as file:
           file.write(str(distance) + "\n") # use `json.loads` to do the reverse


while True:
    led_onboard.value(1)
    sleep(2)
    led_onboard.value(0)
    sleep(2)
    measure()

 

85afd772a69073b31465a2ebe6c8784d.jpg

Czy zastosowałeś konwersję poziomów po drodze na GPIO i zasilasz czujnik z 5V? Bo z tego co widzę, to czujnik żyje w świecie 5V, Pi Pico 3.3V. Tak poza tym nie widać tu nic, co miałoby powodować, że mógłby nie działać.

(edytowany)
28 minut temu, trainee napisał:

Czy zastosowałeś konwersję poziomów po drodze na GPIO i zasilasz czujnik z 5V? Bo z tego co widzę, to czujnik żyje w świecie 5V, Pi Pico 3.3V. Tak poza tym nie widać tu nic, co miałoby powodować, że mógłby nie działać.

Pytanie, co masz na myśli pisząc konwersje poziomów na GPIO? Nie mogę nigdzie na google znaleźć tego dla Pi Pico. Zasilam czujnik 5 V z VBUS (z USB). Docelowo będzie zasilane 5V z zasilacza. 

 

5v.thumb.jpg.1420702f2278f802ced856897d7d72c1.jpg

Edytowano przez Lukasc

Jest o tym np. w https://learn.sparkfun.com/tutorials/logic-levels/all. Jedno z urządzeń ułatwiających takie podłączenie to https://botland.com.pl/konwertery-napiec/8590-konwerter-poziomow-logicznych-dwukierunkowy-8-kanalowy-5904422336660.html.

Chodzi o to, że różne urządzenia mogą mieć różną koncepcję tego co jest stanem niskim, co stanem wysokim, jak i jak wysoko może sięgnąć ten stan wysoki. Dlatego jeżeli podłączasz czujnik dający 5V do procesora pracującego w logice 3.3V, możesz doprowadzić do jego uszkodzenia. Możesz, nie musisz. Plus ponieważ te zakresy się częściowo pokrywają, to czasami takie podłączenie ze zignorowaniem napięć działa. Aczkolwiek dodam, że nie patrzyłem uważniej w Twój kod.

Zapomniałem o tym, że Pi Pico pracuje w logice 3,3 V…. To w takim wypadku pytanie o wpinane inne urządzenia takie jak np. Wyświetlacze HD44780?

Każdy samouczek jaki widziałem dla Pi Pico każe wyświetlacze podłączać pod 5V ( na VSYS, VBUS). I na pinie jest wtedy 5V. Rozumiem, że w takim wypadku taki wyświetlacz również wpuszczamy najpierw w wyżej wspomniany konwerter tak? Tak aby przez piny nigdy nie przychodziło napięcie większe niż 3,3 V.

 

ps. Jak przyjdzie konwerter to sprawdzę czy działa sensor w temacie.

Wyświetlacze takie jak podałeś pracują równie dobrze z logiką 5V, jak i 3.3V bez żadnych konwerterów. Co do innych - zawsze trzeba sprawdzić w dokumentacji.

(edytowany)

Podłączyłem wszystko przez konwerter poziomów i idzie 5V na czujnik. 3,3v na piny. Standardowe podejście tak jak  do czujnika HC-SR04 nie działa. 

Biblioteka oraz przykładowy kod na Raspberry Pi czy na Arduino mówi o połączeniu Serial. Nieudolnie próbowałem coś skonstruować, kod poniżej

Czy ktoś ma jakiś pomysł? 

from machine import UART, Pin
import time
import ubinascii, uhashlib

#uart1 = UART(1, baudrate=9600, tx=Pin(8), rx=Pin(9))

uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
print(uart0)
#txData = b'hello world\n\r'
#uart1.write(txData)
time.sleep(0.1)


rxData = bytes()
# rxData = []
#while uart0.any() > 0:
#    rxData += uart0.read(1)

for i in range(0, 4):
    print(i, 'Komunikat: ', uart0.read(i))
    rxData+=uart0.read(1)
    # str = rxData.decode('UTF-8')
    # print(str)
    # rxData = rxData + uart0.read(i)
    
distance=(rxData[1]<<8)+rxData[2]
#print(rxData.decode('utf-8'))

Coś zaczyna się w końcu dziać, ale nie umiem tego przetworzyć

UART(0, baudrate=9600, bits=8, parity=None, stop=1, tx=0, rx=1, txbuf=256, rxbuf=256, timeout=0, timeout_char=2, invert=None)
0 Komunikat:  b''
1 Komunikat:  b'\xc0'
2 Komunikat:  b'\xc0\xe0'
Traceback (most recent call last):
  File "<stdin>", line 21, in <module>
TypeError: unsupported types for __iadd__: 'bytes', 'NoneType'

 

Zgodnie z informacja od producenta musze wykonać jakąś operację na bitach, ale nie za bardzo wiem jak za to się zabrać. 

operacja.thumb.PNG.c22e39edda82669783bdae6a80320d3e.PNG

Edytowano przez Lukasc
Kolejne próby zabawy z bitami
  • 1 rok później...
(edytowany)

Witam

Przepraszam, że odgrzewam temat, ale zainteresował mnie na tyle, że nabyłem w/w czujnik i postanowiłem z nim i RP PICO poeksperymentować.

Podaję poniżej kod (wynik moich wypocin) :-)

from machine import UART, Pin
import time

led = Pin(25, Pin.OUT)
uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
print(uart0)

while True:
    Data = bytes()
    distance = 0
    
    if uart0.any() == 4:
        for i in range(0, 4):
            Data += uart0.read(1)
        print('Data: ', Data)

        if Data[3] == ((Data[0] + Data[1] + Data[2]) & 0x00FF):
            distance = (Data[1] * 256 + Data[2]) / 10
            print('distance:', distance, 'cm')
            if distance < 40:
                led.high()
                print('led ON')
            else:
                led.low()
                print('led OFF')
        else:
            print('error checksum')
   
        time.sleep(0.05)

A to jest wynik z konsoli :

UART(0, baudrate=9600, bits=8, parity=None, stop=1, tx=0, rx=1, txbuf=256, rxbuf=256, timeout=0, timeout_char=2, invert=None)

Data:  b'\xff\x01\x9c\x9c'
distance: 41.2 cm
led OFF
Data:  b'\xff\x01ww'
distance: 37.5 cm
led ON
Data:  b'\xff\x01``'
distance: 35.2 cm
led ON
 ...

U mnie to działa. Może komuś się przyda.

PS

Ze strony producenta:

Cytat

When "RX" floats or input High level, the module outputs processed value, the data is more steady, response time: 100-300ms; when input Low level, the module outputs real-time value, response time: 100ms.

wynika, że RX najlepiej podłączyć do GND.

Edytowano przez pakarl
  • Lubię! 1
  • 1 miesiąc później...

@pakarl dzięki za rozwikłanie tematu. Mi się nie udało i zamówiłem inny czujnik, który również spełnia swoje zadanie już kolejny rok. Ale z ciekawości porównam swoje wypociny z tego czujnika aby zobaczyć jaki błąd zrobiłem. 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...