28-01-2019, 12:25 AM
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.
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
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
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.
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
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