Skocz do zawartości

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


Lukasc

Pomocna odpowiedź

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

Link do komentarza
Share on other sites

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ć.

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

@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. 

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.