• 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: 1 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect