¿Nos ayudas a pagar el Hosting?

Compartir en facebook Compartir en twitter Compartir en linkedin

Medir distancias con Orange Pi.

Publicado en Junio de 2017

Medir distancias con Orange Pi con el sensor HC-SR04. Esta práctica nos puede servir para comprender un poco más el funcionamiento de GPIO y usar este módulo para proyectos en los que necesitemos conocer la distancia a un objeto o si tenemos delante espacios vacios, como, por ejemplo, un robot autónomo, un vehículo que esquive obstáculos e incluso un sensor de aparcamiento instalado en el coche o en nuestra plaza de garage. No hay que confundir con un Sensor de presencia, del que ya hablamos en este otro artículo.

Que necesitas:

Sensor de proximidad
Sensor de proximidad
Resistencias
Resistencias

Empezamos con un Armbian actualizado y la librería orangepi_PC_gpio_pyH3. Si no la tienes instalada, sigue esta guía.

El módulo HC-SR04, de la gama de ultrasonidos, proporciona medida de distancia sin contacto de 2cm a 400cm. La precisión puede alcanzar los 3mm. Los módulos incluyen transmisor ultrasónico, receptor y circuito de control. El principio básico de trabajo es muy similar al sonar:

  1. El sensor espera una señal de entrada (pulso de activación) de al menos 10uS para lanzar el ciclo.
  2. El módulo envía automáticamente ocho picos de 40 kHz y detecta si hay una señal de retorno.
  3. Mide y devuelve el tiempo de la señal de retorno.

podemos conocer la distancia con la siguiente fórmula: Distancia = (señal x velocidad del sonido (340m/s) / 2

Las conexiones del módulo:

  • Vcc - +5V
  • Trig - Entrada de pulso de activación
  • Echo - Salida de pulso de retorno
  • GND - 0V GND

Este sensor trabaja a 5v pero el GPIO de la Orange Pi trabaja con 3.3v por lo que si conectamos directamente la salida a un pin podríamos dañar la placa. Por lo tanto, vamos a usar un divisor de tensión. Un divisor de tensión conseguirá que llegue un pulso atenuado a nuestra placa. Para saber más sobre como funcionan los divisores de tensión (algo que recomiendo encarecidamente), haced una búsqueda en google y encontraréis muchos y muy buenos artículos que explican como funciona y la forma de calcularlas. Para resumir, explicar que si a la salida del pin Echo tenemos 5v y lo hacemos pasar a través de una resistencia con otra conectada a masa, la tensión quedará reducida a la mitad. R2 debe ser el doble de R1. Yo he usado R1 = 330Ω y R2 = 660Ω(2 resistencias en serie de 330Ω porque no tenía otra cosa a mano ...).

Ahora monta el siguiente esquema:

VCC al pin 4, GND al pin 6, TRIG al pin 26 y Echo a un divisor de tensión. Del medio del divisor al pin 24. No olvides conectar a Tierra (GND) el final del divisor de tensión. Yo he usado este código:

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# author    : "javier pérez santos para orangepiweb.es"
# credits   : "javier pérez santos, orangepiweb.es"
# copyright : "Copyright 2017, orangepiweb.es"
"""
   ___                             ____  ___        __   _
  / _ \ _ __ __ _ _ __   __ _  ___|  _ \(_) \      / /__| |__   ___  ___
 | | | | '__/ _` | '_ \ / _` |/ _ \ |_) | |\ \ /\ / / _ \ '_ \ / _ \/ __|
 | |_| | | | (_| | | | | (_| |  __/  __/| | \ V  V /  __/ |_) |  __/\__ \
  \___/|_|  \__,_|_| |_|\__, |\___|_|   |_|  \_/\_/ \___|_.__(_)___||___/
                        |___/

HC-SR04 sensor ultrasónico
"""

from pyA20.gpio import gpio
from pyA20.gpio import port
import time

TRIG = port.PA21
ECHO = port.PC3

gpio.init()

print "Midiendo distancia..."

gpio.setcfg(TRIG, gpio.OUTPUT)
gpio.setcfg(ECHO, gpio.INPUT)

gpio.output(TRIG, 0)

while True:
        gpio.output(TRIG, 1)
        time.sleep(0.00001)
        gpio.output(TRIG, 0)

        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("Distancia: " + str(distance) + "cm")
        if (distance < 20):
        	print("Está muy cerca:")
        	time.sleep(0.2)
        else:
        	time.sleep(2)
        	

Este ejemplo sólo lanza por pantalla la distancia en centímetros, pero podemos chequear la variable distance y con el código if (distance < x) lanzar eventos a través de cualquier otro pin de nuestra placa para encender unos leds, activar un relé, lanzar otro código que dispare cualquier evento... ¿El limite? De nuevo, nuestra imaginación.

Espero que te haya sido de utilidad, no dudes en escribir un comentario si ves algún error o si puedo ayudarte.


Utiliza este espacio si quieres añadir algún comentario adicional o si tienes alguna duda.
No olvides añadir tu distribución y tu placa.

Todos los comentarios serán validados antes de su publicación.

Lalo Acuña

Se puede utilizar este ejemplo con un sensor de proximidad VL53L0X?. Saludos


Administrador OrangePiWeb.es

Hola Lalo. Tendrías que usar un ads1115 para poder las lecturas digitales, o buscar una librería para Orange Pi, que yo creo que no existe. O, si necesitas conectarlo a una Orange Pi, hacerlo a través de un Arduino. Tendría que hacer pruebas, pero en principio no. Saludos.


Nombre*

Email* Nunca será publicado ni compartido

Comentario*



Copyright © 2024 desde 2016. Todos los derechos reservados | Diseño JaviPSantos

Solicitamos su permiso para obtener datos estadísticos de su navegación en esta web, en cumplimiento del Real Decreto-ley 13/2012. Si continúa navegando consideramos que acepta el uso de cookies.

OK | Más información