• Benvenuti su RaspberryItaly!
Benvenuto ospite! Login Login con Facebook Registrati Login with Facebook


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
hc pi raspberry zero sr04 w

HC-SR04 raspberry pi zero w
#1
Salve,

sto cercando di collegare il sensore ad ultrasuoni sul pi zero w ma c'è qualcosa che non va.

questo è il circuitino:[img]<a href=[/img]
[Immagine: Cattura.jpg]

invece delle classiche resistenze ho utilizzato un level shifter (ho fatto male?).

Quindi:

-sensore/shifter

 vcc->hv
 gnd->gnd
 trig->ch1
 echo->ch2

-shifter/raspberry

 lv->3.3v
 gnd->gnd
 ch1->pin23
 ch2->pin24

Fatto questo ho usato un codice non scritto da me (devo citare dove l'ho preso?) dove ho modificato solamente le parentesi (correggetemi se ho scordato qualcosa) dei comandi print in quanto era scritto per pyton 2:

Codice:
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) TRIG = 23 ECHO = 24 print ("Distance Measurement In Progress") GPIO.setup(TRIG,GPIO.OUT) GPIO.setup(ECHO,GPIO.IN) GPIO.output(TRIG, False) print ("Waiting For Sensor To Settle") time.sleep(2) GPIO.output(TRIG, True) time.sleep(0.00001) GPIO.output(TRIG, False) while GPIO.input(ECHO)==0:  pulse_start = time.time() while GPIO.input(ECHO)==1:  pulse_end = time.time() pulse_duration = pulse_end - pulse_start distance = pulse_duration * 17150 distance = round(distance, 2) print ("Distance:",distance,"cm") GPIO.cleanup()

Detto ciò, una volta fatto partire lo script resta fermo su "Sensor To Settle".]

Il level shifter utilizzato è questo: link amazon

[img]<a href=[/img][Immagine: 20170908_180517.jpg]

Grazie!


[Immagine: jxVUTa]
Risposta
#2
Non credo tu abbia fatto male. A scanso di equivoci andrei diretto con GND e 5V.
Ti consiglio, però, di usare una libreria più moderna e più semplice per il GPIO, come gpiozero.
Ecco l'esempio dalla documentazione ufficiale, con i tuoi pin
Codice:
from gpiozero import DistanceSensor from time import sleep sensor = DistanceSensor(echo=24, trigger=23) while True: print('Distanza: ', sensor.distance * 100) sleep(1)
Risposta
#3
(08/09/2017, 18:16)Zzed Ha scritto: A scanso di equivoci andrei diretto con GND e 5V.

In che senso? Utilizzando le resistenze, solo per l'echo, al posto dello shifter? Huh
Risposta
#4
Lo shifter sicuramente non serve per i +5V e GND per l'alimentazione, se li prendi dai piedini corrispondenti del RaspberryPi no? Chiedo, lo posseggo anche io ma non ci ho ancora "giocato" per mancanza di tempo.
Risposta
#5
(08/09/2017, 19:40)Zzed Ha scritto: Lo shifter sicuramente non serve per i +5V e GND per l'alimentazione, se li prendi dai piedini corrispondenti del RaspberryPi no? Chiedo, lo posseggo anche io ma non ci ho ancora "giocato" per mancanza di tempo.

veramente me lo ero chiesto anche io.. ma credo sia come dici tu.
Ora provo sia in questo modo che facendo tutto senza lo shifter e usando un partitore con 300/450ohm.

Niente da fare, non vuole andare. Utilizzando la libreria più moderna, dopo circa un minuto, inizia a restituire continuamente

Distanza:100
Distanza:100
Distanza:100
...

cosa che succede anche se stacco il sensore, quindi non sta funzionando qualcosa :/
Risposta
#6
Alla fine sono riuscito a far funzionare tutto, sembrerebbe che la nuova libreria da te consigliata non funzioni sul mio raspi.

Adesso il mio codice fa una serie di misure e restituisce il valor medio, il problema è che talvolta fa una falsa misura.
Ad esempio su 10 misure è possibile che 1 o 2 al massimo siano falsate.

Vorrei fare in modo che date le 10 misure lui scarti quelle che si discostano entro un certo range dalle altre e faccia la media solo tra quelle corrette. Qualche consiglio su come potrei fare?

questo è il pezzo di codice incriminato:

Codice:
# Importazione librerie Python from __future__ import print_function import time import RPi.GPIO as GPIO # Referenze BCM GPIO anziche i numeri fisici dei pin. GPIO.setmode(GPIO.BCM) # Definizione dei  GPIO. GPIO_TRIGGER = 18 GPIO_ECHO    = 17 # Velocita  del suono in cm/s con temperatura temperature = 20 speedSound = 33100 + (0.6*temperature) # Impostazione pin output e input GPIO.setup(GPIO_TRIGGER,GPIO.OUT)  # Trigger GPIO.setup(GPIO_ECHO,GPIO.IN)      # Echo tot = 0          #inizializzazione somma delle misurazioni for x in range(1): # Set trigger to False (Low)    GPIO.output(GPIO_TRIGGER, False) # Attendi la stabilizzazione del sensore    time.sleep(0.5) # Invia un impulso di 10us al trigger    GPIO.output(GPIO_TRIGGER, True) # Aspetta 10us    time.sleep(0.00001)    GPIO.output(GPIO_TRIGGER, False)    start = time.time()    while GPIO.input(GPIO_ECHO)==0:      start = time.time()    while GPIO.input(GPIO_ECHO)==1:      stop = time.time() # Lunghezza impulso    elapsed = stop-start # La distanza percorsa dall'impulso va moltiplicata # per la velopcita del suono(cm/s)    distance = elapsed * speedSound # Distanza effettiva(one-way)    distance = distance / 2        tot=tot+distance    print(distance) distance=tot/1 print("Distanza : {0:5.1f}".format(distance),"cm") # Reset GPIO settings GPIO.cleanup()

Grazie!
Risposta
#7
Quel che cerchi di chiama "media troncata" in matematica.
In Python, puoi impostare una funzione che la applichi, sulla falsariga della funzione trimmean in Matlab, tipo
Codice:
from numpy import mean def mediatroncata(arr, percentuale): n = len(arr) k = int(round(n*(float(percentuale)/100)/2)) return mean(arr[k+1:n-k])

Dove passi come argomenti la lista dei valori e la percentuale di essi che vuoi scartare come estremi.
Mettila all'inizio del tuo script e poi richiamala nel programma quando serve

fonte
Risposta
#8
Perfetto! Fa il suo dovere, grazie. Aggiungo soltanto che la lista in questione deve, ovviamente, essere ordinata.
Risposta
  


Vai al forum:


Navigazione: 2 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect