La Taberna del Puerto

La Taberna del Puerto (https://foro.latabernadelpuerto.com/index.php)
-   Foro Náutico Deportivo (https://foro.latabernadelpuerto.com/forumdisplay.php?f=2)
-   -   Bricobarco Simulador de corredera usando 1 GPS (https://foro.latabernadelpuerto.com/showthread.php?t=90073)

jiauka 07-05-2012 00:40

Simulador de corredera usando 1 GPS
 
Hola:

Hace días que tenía pendiente 1 pequeño brico para sustituir el típico sensor airmar analógico que llevan muchos veleros (el típico con el cable de masa, rojo y verde). Lo que hace es simular los impulsos en función de la velocidad GPS (SOG), ya sé que no es muy ortodoxo, ya que no tiene en cuenta la corriente, pero no tengo ningún agujero en el casco y no quiero hacerlo.

He usado 1 placa de desarrollo arduino

http://arduino.cc/en/Main/ArduinoBoardNano

1 sensor GPS NMEA0183

http://www.hvwtech.com/products/921/...-00465-300.jpg
y 1 poco de programación en C algo cutre.
Código:

 

#define F_CPU 16000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>    // including the avr delay lib
#include "led.h"            // Header file for led
#include "usart.h"            // Header for Serial communication
#include "SoftwareSerial.h"

#define MYDEBUG(x)

// OBJECT CREATION
LED led1(0x05,5);            // Creates an object called led1 connected to PortB.5 (0x05 is the Special function register for PORTB)
LED output(0x0b,4);  //PPRTD, bit 4

SoftwareSerial mySerial(2, 3,false);
#include <avr/io.h>
#include <avr/interrupt.h>

#define FOSC F_CPU // Clock Speed
#define BAUD 115200      // Baud Rate
#define MYUBRR (((((FOSC * 10) / (16L * BAUD)) + 5) / 10) - 1)

// NMEA setences
#define NMEA_DISABLE_CGA "PSRF103,00,00,00,01"
#define NMEA_DISABLE_GLL "PSRF103,01,00,00,01"
#define NMEA_DISABLE_GSA "PSRF103,02,00,00,01"
#define NMEA_DISABLE_GSV "PSRF103,03,00,00,01"
#define NMEA_DISABLE_RMC "PSRF103,04,00,00,01"
#define NMEA_DISABLE_VTG "PSRF103,05,00,00,01"
#define NMEA_ENABLE_VTG_1HZ "PSRF103,05,00,05,01"
#define NMEA_QUERY_VTG "PSRF103,05,01,01,01"

char nmea_data[128];
char setnyb(unsigned char c)
{
  if(c<9) return c+'0';
  else return c-10+'A';
}

void send_nmea(const char *datagram) {
    int i;
    char *p=(char*)datagram;
    unsigned char checksum=0;
    i=0;
    nmea_data[i++]='$';
    while(*p) {
        nmea_data[i]=*p++;
        checksum=checksum^nmea_data[i];
        i++;
    }
    nmea_data[i++]='*';
    nmea_data[i++]=setnyb((checksum >> 4) &0x0f);
    nmea_data[i++]=setnyb(checksum &0x0f);
    nmea_data[i]=0x00;
    mySerial.println((const String &)nmea_data);
   
}
#define STAT_NMEA_NONE 0
#define STAT_NMEA_HEADER 1
#define STAT_NMEA_DATA 2
       
//    VTG-Course Over Ground and Ground Speed
//$GPVTG,309.62,T,,M,0.13,N,0.2,K
char nmea_header[5];
char nmea_field[32];   
int knots=1450,dotpos,tknots=10;

int int_counter = 0;
volatile int second = 0;
int oldSecond = 0;
long starttime = 0;
int on=0;
/* Timer2 reload value, globally available */ 
unsigned int tcnt2; 
 
// Aruino runs at 16 Mhz, so we have 1000 Overflows per second...
// 1/ ((16000000 / 64) / 256) = 1 / 1000
ISR(TIMER2_OVF_vect) {
      /* Reload the timer */ 
      TCNT2 = tcnt2; 
    int_counter++;
    if(tknots > 0 ) {
          if (int_counter >= tknots) {
            if(on) {
                led1.on();
                output.on();
                on=0;
            }
              else {
                  led1.off();
                output.off();
                on=1;
            }
            int_counter = 0;
        }
    }
};
 
 void timer_setup() { 
 
  TIMSK2 &= ~(1<<TOIE2); 
 
  /* Configure timer2 in normal mode (pure counting, no PWM etc.) */ 
  TCCR2A &= ~((1<<WGM21) | (1<<WGM20)); 
  TCCR2B &= ~(1<<WGM22); 
 
  /* Select clock source: internal I/O clock */ 
  ASSR &= ~(1<<AS2); 
 
  /* Disable Compare Match A interrupt enable (only want overflow) */ 
  TIMSK2 &= ~(1<<OCIE2A); 
 
  /* Now configure the prescaler to CPU clock divided by 128 */ 
  TCCR2B |= (1<<CS22)  | (1<<CS20); // Set bits 
  TCCR2B &= ~(1<<CS21);            // Clear bit 
 
  /* We need to calculate a proper value to load the timer counter.
  * The following loads the value 131 into the Timer 2 counter register
  * The math behind this is:
  * (CPU frequency) / (prescaler value) = 125000 Hz = 8us.
  * (desired period) / 8us = 125.
  * MAX(uint8) + 1 - 125 = 131;
  */ 
  /* Save value globally for later reload in ISR */ 
  tcnt2 = 131; 
 
  /* Finally load end enable the timer */ 
  TCNT2 = tcnt2; 
  TIMSK2 |= (1<<TOIE2); 


int main(void)
{
    char c,*p;
    unsigned char stat=STAT_NMEA_NONE;
    int i,head_counter,nmea_field_counter,nmea_field_data_counter;
    // INITIALIZATIONS
    DDRB = 0b00100000;    //B5 output: board LED
    USART_Init(MYUBRR); // Initializes the serial communication

    mySerial.begin(4800);
    mySerial.listen();
    tknots=10000/knots;
    timer_setup();
    _delay_ms(1000);
    sei();
    send_nmea(NMEA_DISABLE_CGA);
    send_nmea(NMEA_DISABLE_GLL);
    send_nmea(NMEA_DISABLE_GSA);
    send_nmea(NMEA_DISABLE_GSV);
    send_nmea(NMEA_DISABLE_RMC);
    send_nmea(NMEA_DISABLE_VTG);
    send_nmea(NMEA_ENABLE_VTG_1HZ);
    while(1)
    {
        sei();
       
        if (mySerial.available()) {
            c=mySerial.read();
            MYDEBUG(USART_Sendbyte(c));
            if( c < 0x20) {
                stat=STAT_NMEA_NONE;
            }
            if( c == 0x0a) {
                _delay_ms(100);
                send_nmea(NMEA_QUERY_VTG);
            }
            switch (stat) {

                case STAT_NMEA_HEADER:
                    if(head_counter < 5 ) {
                        nmea_header[head_counter++] = c;
                        if(head_counter==5) {
                            if(strncmp(nmea_header,"GPVTG",5) ==0) {
                                MYDEBUG(USART_Send_string("GPVTG\r\n"));
                                stat=STAT_NMEA_DATA;
                                nmea_field_counter=0;
                                head_counter=0;
                            } else {
                                stat=STAT_NMEA_NONE;
                            }                           
                        }
                    } else {
                        stat=STAT_NMEA_NONE;
                    }                           
           
                break;
                case STAT_NMEA_DATA:
                    if(c == ',') {
                        if(nmea_field_counter==5) {
                            p=nmea_field;
                            dotpos=0;
                            knots=0;
                            while(*p) {
                                if(*p >= '0' && *p <= '9') {
                                    knots=knots*10+*p-'0';
                                }
                                p++;
                            }
                            sprintf(nmea_field,"\r\nspeed=%d\n\r",knots);
                            USART_Send_string(nmea_field);
                            if(knots>0)
                                tknots=10000/knots;
                            else
                                tknots=0;
                        }                           
   
                        nmea_field_counter++;
                        nmea_field_data_counter=0;
                        nmea_field[0]=0;
                    }
                    if(nmea_field_counter==5) {
                        nmea_field[nmea_field_data_counter++]=c;
                        nmea_field[nmea_field_data_counter]=0;
                    }
                    break;
                case STAT_NMEA_NONE:
                default:
                    if(c=='$') {
                        stat=STAT_NMEA_HEADER;
                        head_counter=0;
                    }
                break;
            }
        }
    }
}

Si hay alguien interesado en esquema, etc... para hacerse 1 que me lo diga y miro de pasarlo a limpio.

Clapton 07-05-2012 09:54

Re: Simulador de corredera usando 1 GPS
 
Hola Jiauka, buen invento, ¿entonces con este receptor y el driver en C puedes simular la corredera y conectarlo al equipo de viento?

Yo tengo una aguja de viento a la que al no conectar corredera no tengo viento real. Llamé a Simrad para preguntarles si podía hacerlo con la salida NMEA del GPS y me dijeron no, tiene que ser con corredera, el problema técnico (no me lo explicaron en detalle), tenia que ver con velocidad de transferencia o sincronismo.

Me ofrezco de conejillo de indias :D para probarlo.

:cid5::cid5:

jiauka 07-05-2012 10:28

Re: Simulador de corredera usando 1 GPS
 
Si estás por barcelona, lo probamos

Clapton 07-05-2012 11:26

Re: Simulador de corredera usando 1 GPS
 
No he trabajado nunca a bajo nivel, (PLC's, EPROM's, etc), pero de rascar código de todo un poco llevo muchas horas de vuelo, (y me sigue gustando).

Se ve que ya tienes el engendro sino hecho casi hecho, la verdad es que no se de que te podría ayudar, curiosidad en cambio :sip: mucha.

Te mando un MP Jaume, gracias.

:brindis::brindis:

jiauka 07-05-2012 11:30

Re: Simulador de corredera usando 1 GPS
 
El engendro está hecho y funcionando en tierra, falta probarlo en 1 barco, pero seguro que va.

LoboBlanco 10-05-2012 12:57

Re: Simulador de corredera usando 1 GPS
 
Jiauka : Me parece muy interesante. A mi por lo menos me gustaría ver ese esquema. Y también saber dónde localizaste el sensor de Gps y cuanto te costo

Gracias :gracias:

jiauka 10-05-2012 18:15

Re: Simulador de corredera usando 1 GPS
 
Adjunto el esquema y el codigo fuente, no tiene mucho secreto, el GPS y el modulo están comprado en dealextreme:

http://www.dealextreme.com/p/arduino...0-81877?item=2

http://www.dealextreme.com/p/em-411-...t-80037?item=2

En los adjuntos está el esquema y el codigo fuente del software para el AVR studio 5.1

Y unas fotos del invento.

https://lh5.googleusercontent.com/-C...0/IMG_1918.JPG

https://lh3.googleusercontent.com/-b...0/IMG_1919.JPG

https://lh4.googleusercontent.com/-3...0/IMG_1920.JPG

Akakus 10-05-2012 22:04

Re: Simulador de corredera usando 1 GPS
 
Yo quiero uno ! Te mando un privado y me dices el precio, si me lo quieres hacer.

El final de las correderas con caracolillo !

vertijean 11-05-2012 00:14

Re: Simulador de corredera usando 1 GPS
 
Mandame el precio por MP
:brindis:

LoboBlanco 11-05-2012 12:00

Re: Simulador de corredera usando 1 GPS
 
Muchas gracias Jiauka, está genial :cid5:

¿Que utilizas como pantalla?

jiauka 14-05-2012 09:23

Re: Simulador de corredera usando 1 GPS
 
Cita:

Originalmente publicado por LoboBlanco (Mensaje 1290713)

¿Que utilizas como pantalla?

Como pantalla, la que lleves en el barco, yo uso 1 SIMRAD IS12 combi, aunque lo he porbado en 1 NAVMAN 100 y en raymarine ST40 y ST60 y funciona en todos ellos.
http://www.simrad-yachting.com/uploa...ight_front.jpg

Lo que hace mi "invento" es sustituir el SENSOR de la corredera, el típico que siempre está sucio y no funciona.

http://www.imarineusa.com/images/pro...lay/ST800P.jpg

macroll 14-05-2012 09:57

Re: Simulador de corredera usando 1 GPS
 
El invento me parece muy interesante, me pregunto si los valores que da el gps y salen en pantalla cambian muy rapidamente, en nuestro caso tomamos datos de una antena gps y salen en la radio y en el pc a traves del opencn, resulta que los valores sog oscilan a toda marcha y no hay forma de quedarse con un resultado mas o menos estable de velocidad.
Salud

Islanautica 14-05-2012 10:04

Re: Simulador de corredera usando 1 GPS
 
:cid5: Buen trabajo :cid5:

:brindis::brindis::brindis:

jiauka 14-05-2012 10:13

Re: Simulador de corredera usando 1 GPS
 
Cita:

Originalmente publicado por macroll (Mensaje 1292231)
El invento me parece muy interesante, me pregunto si los valores que da el gps y salen en pantalla cambian muy rapidamente, en nuestro caso tomamos datos de una antena gps y salen en la radio y en el pc a traves del opencn, resulta que los valores sog oscilan a toda marcha y no hay forma de quedarse con un resultado mas o menos estable de velocidad.
Salud

En los que he probado cambia suave, de todas formas es muy sencillo hacer una interpolación de avrios valores o 1 pequeño filtro FIR por software. También depende del módulo GPS usado, algunos filtran mejor que otros las pequeñas variaciones.

Y si usas opencpn, en "toolbox settings" tienes la opción de filtrar los datos del GPS para que no sean tan erráticos.

fuente:

http://opencpn.org/ocpn/toolbox

"Filter NMEA Course and Speed Data:
Providing a rolling average of COG/SOG, with configurable sampling period. This feature is useful, for example, if you find that course and speed from the gps is varying erratically due to the sea state. The Dashboard plugin is not affected by this setting - COG and SOG are updated about once per second."

Clapton 14-05-2012 11:10

Re: Simulador de corredera usando 1 GPS
 
Hola Jiauka, ojala me fuera bien a mi este invento ...

Para la corredera no tengo problemas porque yo sí tengo agujero en el casco y sacandola cuando no navego la mantengo en buen estado.

Mi problema es que mi lector de viento solo me da el aparente. Tengo un SIMRAD IS15 que para calcular el viento real necesita que le lleguen velocidad y rumbo en formato NMEA 0813.

Yo había pensado sacar esos datos de la antena activa GPS que tengo para la DSC de la radio y conectado al IS15 vía cable ROBLINK de SIMRAD.

¿Tu crees que me puede funcionar?

Te enviaría el manual del IS15 pero no puedo subir al foro ficheros pdf > 200 KB's.

Unas :brindis::brindis:

Akakus 14-05-2012 12:01

Re: Simulador de corredera usando 1 GPS
 
Probado y va fabuloso. Se acabaron los agujeros en el casco (para esto) y el molinete de la corredera como biotopo de diversidad marina:cagoento:

olaje 09-10-2012 18:32

Re: Simulador de corredera usando 1 GPS
 
No había visto este hilo.

Me parece una fantástica idea, además porque uso una placa Arduino para el sistema de telemetría de a bordo, así que con tu permiso, copio la idea y añado tu invento a mi sistema :adoracion:.

... Y la corredera cambiada por el tapón :cunao:

Salu2. Carmelo ( O L A J E )

:brindis:

jiauka 09-10-2012 18:38

Re: Simulador de corredera usando 1 GPS
 
Cita:

Originalmente publicado por olaje (Mensaje 1375434)
No había visto este hilo.

Me parece una fantástica idea, además porque uso una placa Arduino para el sistema de telemetría de a bordo, así que con tu permiso, copio la idea y añado tu invento a mi sistema :adoracion:.

... Y la corredera cambiada por el tapón :cunao:

Salu2. Carmelo ( O L A J E )

:brindis:

Y sin el :), por eso he publicado el fuente completo ;).

Ya me contarás como te va cuando lo montes :brindis:

lidiana 09-10-2012 18:49

Re: Simulador de corredera usando 1 GPS
 
Muchas gracias Jiauka :adoracion:

Acabo de hacer el pedido en el dealextreme :sip:

Estoy ansioso por probarlo, tengo una pantalla bidata, pero solo me funciona la sonda, la corredera no la tengo puesta, llevo el tapón, pero se que funciona.

Bueno, cuando monte tu invento ya te comentaré :gracias:

lidiana 10-10-2012 13:05

Re: Simulador de corredera usando 1 GPS
 
Hola Jiauka :brindis:!

Me he bajado tu código, y el software de arduino para windows, y veo que no puedo cargar tu código. Luego he visto que el código que has subido es para el AVRStudio. :o
Bueno me he bajado y instalado el AVRStudio en mi PC, ya he podido abrir tu proyecto y lo he compilado sin errores.

Ahora vienen las dudas ¿Como se programa el Arduino?

Todavía no tengo el arduino Nano, pero me han dejado un arduino mega adk, y quería probar como se programa el arduino. Pero conecto mi arduino Mega al USB, y parece que me falta el driver :confused:

Supongo que en AVRStudio, en Tools-> Avr Programing debería de detectar que tengo un arduino conectado al USB para que me deje programarlo :nosabo:

Quizas cuando me llegue el arduino nano y lo conecte al usb ya me lo detectará?

¿Como tendré que hacer para programar el arduino nano?

Saludos y gracias por todo :adoracion:

jiauka 10-10-2012 13:17

Re: Simulador de corredera usando 1 GPS
 
Cita:

Originalmente publicado por lidiana (Mensaje 1375953)
Hola Jiauka :brindis:!

Me he bajado tu código, y el software de arduino para windows, y veo que no puedo cargar tu código. Luego he visto que el código que has subido es para el AVRStudio. :o
Bueno me he bajado y instalado el AVRStudio en mi PC, ya he podido abrir tu proyecto y lo he compilado sin errores.

Ahora vienen las dudas ¿Como se programa el Arduino?

Todavía no tengo el arduino Nano, pero me han dejado un arduino mega adk, y quería probar como se programa el arduino. Pero conecto mi arduino Mega al USB, y parece que me falta el driver :confused:

Supongo que en AVRStudio, en Tools-> Avr Programing debería de detectar que tengo un arduino conectado al USB para que me deje programarlo :nosabo:

Quizas cuando me llegue el arduino nano y lo conecte al usb ya me lo detectará?

¿Como tendré que hacer para programar el arduino nano?

Saludos y gracias por todo :adoracion:

El arduino lleva 1 boot que lo detecta el AVRStudio, creo :(, hace días que no hago nada con él. :nosabo::nosabo:
Si cuando lo tienes no te va, enviame 1 priv. Ahora mismo no tengo ni 1 solo PC con Windows.

lidiana 10-10-2012 13:31

Re: Simulador de corredera usando 1 GPS
 
Cita:

Originalmente publicado por jiauka (Mensaje 1375959)
El arduino lleva 1 boot que lo detecta el AVRStudio, creo :(, hace días que no hago nada con él. :nosabo::nosabo:
Si cuando lo tienes no te va, enviame 1 priv. Ahora mismo no tengo ni 1 solo PC con Windows.


Ok!!

A ver lo que tardo en recibir el paquete del Dealextreme :rolleyes:.
La última vez me tardó mas de 3 semanas :cagoento:.

Saludos y gracias por todo :adoracion:

vertijean 10-10-2012 13:39

Re: Simulador de corredera usando 1 GPS
 
jiauka , tienes un MP :D
:brindis:

0tilio 10-10-2012 14:07

Re: Simulador de corredera usando 1 GPS
 
Cita:

Originalmente publicado por jiauka (Mensaje 1287556)
Hola:

Hace días que tenía pendiente 1 pequeño brico para sustituir el típico sensor airmar analógico que llevan muchos veleros (el típico con el cable de masa, rojo y verde). Lo que hace es simular los impulsos en función de la velocidad GPS (SOG), ya sé que no es muy ortodoxo, ya que no tiene en cuenta la corriente, pero no tengo ningún agujero en el casco y no quiero hacerlo.

He usado 1 placa de desarrollo arduino

http://arduino.cc/en/Main/ArduinoBoardNano

1 sensor GPS NMEA0183

http://www.hvwtech.com/products/921/...-00465-300.jpg
y 1 poco de programación en C algo cutre.
[code]

..........................................

Si hay alguien interesado en esquema, etc... para hacerse 1 que me lo diga y miro de pasarlo a limpio.

Al contrario, mucho mejor olvidarse de la corriente y usar SOG si quieres tener datos exactos del viento real.
¿Y los Raymarine tragan esos datos tal cual, sin Seatalk de por medio?
Gran invento, lo tengo que probar.
:brindis:

Nuba 10-10-2012 14:25

Re: Simulador de corredera usando 1 GPS
 
Yo saqué numerito para la cola hace tiempo... a ver si lo encuentro en algún sitio
:meparto::meparto::meparto:


Todas las horas son GMT +1. La hora es 19:12.

Powered by vBulletin® Version 3.7.0
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
© La Taberna del Puerto