Foro Navegantes

Versión completa: Leer la corredera con la Raspberry
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Para los que se les haya estropeado el display de la corredera, pero el transductor de la corredera todavia funciona o para los que tengan el viejo SeaTalk y no tienen un conversor a NMEA183,  con un sencillo programa en Python para la Raspberry, se pueden leer los pulsos de la corredera por un pin de GPIO de la Raspberry.
Solo vale para transductores de corredera que dan pulsos.

El problema es que los pulsos de corredera son de 12V, y la RAspberry solo soporta 3.3V. Para ello hay que realizar un sencillo circuito para bajar el boltaje por un divisor de tension. Aunque lo mejor es hacerlo con un optoacoplador.


[Imagen: 20160321-015449-Copy.jpg]
Donde pone molinete seria para los cables de salida de pulsos de la corredera.

En el siguiente caso usando el optoacoplador la salida de pulsos del transductor, se conectaria entre signal y masa
[Imagen: Raspberry-Optocoupler.jpg]
El script en python, es el siguiente. la variable de frequency es el valor de la frecuencia del transductor. Por ejemplo Raymarine utiliza el s300/st300 de airmar. Este tiene diferentes modelos con frecuencias de 4.8Hz(17.000pulso por NM), 5.3Hz(19.000 pulsos/NM) y 4Hz(14400 pulsos/NM).
Si no os viene el dato de la frecuencia, pero si el de los pulsos por milla nautica, para saber la frecuencia basta con dividir los pulsos por 3600 y os saldra la frecuencia.
El programa lee los pulos de la corredera cada 10 segundos. Si quereis cambiar el intervalo de tiempo, tendreis que cambiar el valor de la variable "delay".

#!/usr/bin/env python2.7

 
import RPi.GPIO as GPIO
import sys
import time
import os
import socket, pynmea2

try:
    from configparser import ConfigParser
except ImportError:
    from ConfigParser import ConfigParser  # ver. < 3.0


sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

start = time.time()
GPIO.setmode(GPIO.BCM)
 
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
 
contador = 0
frequency = 4.5
delay = 10
nm = 0
km = 0
def my_callback(channel):
    global contador
    contador = contador +1
    import time
    import sys
    sys.stdout.write('%d' % contador)
    sys.stdout.flush()
    i=1
    while i<=len(str(contador)):
        sys.stdout.write('\b')
        i = i+1;
 
GPIO.add_event_detect(23, GPIO.RISING, callback=my_callback)
while  1:
    start = time.time()
    time.sleep(delay)  # Pausa de segundo segundos
#raw_input("Press Enter Para salir del programa \n")
#GPIO.cleanup()
    nm = contador / (frequency * delay)
    km = nm * 1.852

    contador = 0
    end = time.time()
    time_elapsed = end - start
    time_in_min =  time_elapsed / 60
    vhw = pynmea2.VHW('VW', 'VHW', ('', 'T','' , 'M', str(round(nm,1)),'N',str(round(km,1)),'K'))
    vhw1=str(vhw)
    vhw2=vhw1+"\r\n"
    sock.sendto(vhw2, ('localhost', 10110))

    print vhw2
     
    print '                 tiempo transcurrido:\t{} s'.format(time_elapsed)
    print '                 tiempo transcurrido:\t{} min'.format(time_in_min)
    print nm
GPIO.cleanup()

Las sentencias "print" del script, son para comprobar su funcionamiento, asi que se pueden borrar.

Como sabeis, estos transductores, tambien tiene un sensor de temperatura. Este tambien se puede leer con la Raspi. Para ello habria que montar el conversor analogico-digital MCP3008. Este conversor lo reconoce OpenPlotter. Para ello en la ventana SPI se pueden programar las correcciones y asignarle la correspondiente sentencia de SignalK.
Si hay alagien interesado, le puedo poner el esquema de conexion del MCP3008
Joder que equipo de cracks hay en este foro electronico....
Interesante. Gracias por compartir. Supongo que el pin GPIO a utilizar seria el 23 y que los datos los volcaría en la red en formato NMEA 0183.. ¿cierto?
(28-01-2019, 06:29 PM)pinguino escribió: [ -> ]Interesante. Gracias por compartir. Supongo que el pin GPIO a utilizar seria el 23 y que los datos los volcaría en la red en formato NMEA 0183.. ¿cierto?
Cierto.
Se podría poner una variable llamada pin=número GPIO en lugar del número de GPIO, en este caso que he usado el 23
Los datos de velocidad se vuelcan en la Red NMEA. De esa manera están disponibles tanto para OP como para OpenCpn. También en la salida del conversor USB-RS422, como en WiFi.
Se podría escribir una pinimea en formato Jason para sentencias de signalK

Gesendet von meinem CLT-L29 mit Tapatalk