Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Equipo de viento
#16

(26-09-2018, 07:48 PM)Sumatra escribió:  He encontrado que NASA vende el repuesto de la parte mecanica del equipo de viento sin pantalla y a un precio asequible.
El esquema de sus conexiones, a mi parecer, es sencellio, pero no tengo los conocimientos adecuados sobre Rasperry.
Los 5 cables de las conexiones son:
Plata: Ground
Rojo: + 5V de la unidad de visualización
Blanco: datos de velocidad del viento, 1 pulso de 5V 10ms por revolución de anemometro.
Negro = 1 a 4V (aprox.) Según el ángulo de la veleta (SIN) 
Azul = 1 a 4V (aprox.) Según el ángulo de la veleta ( COS) 
(estos dos anteriores están 90 grados desfasados) 

¿Es factible conectar a la Raspberry y escribir un programa que lea los datos o hace falta algo mas en la parte de hardware que transforme las señales para la Rp?

(26-09-2018, 08:17 PM)Sumatra escribió:  Este es el equipo:
https://www.svb24.com/en/nasa-mast-unit-...plays.html[Imagen: 8903f169e6765948047e51e87c3bbd97.jpg]

(26-09-2018, 09:14 PM)pinguino escribió:  Supongo que necesitas algún tipo de conversor analogico-digital y ademas crear sentencias NMEA0183 a partir de los datos digitales o analogicos... no estoy seguro. Creo que se necesitaria hardware adicional, aunque desconozco cual.

Yo tiraría directamente por equipos de viento con salida NMEA0183 ya listos para usar. Por unos 500 € hay alguno y creo que merece la pena.

Efectivamente Pinguino tiene otra vez razon. Hay que usar un conversor analogico-digital para poder leer el angulo del viento. Para la velocidad del viento no es necesario. Conversores A_D  para la Raspberry tenemos el MCP3008 de 10 bits y el MCP3208 de 12 Bits con 8 canales analogicos de entrada. El precio creo que es menos de 10€. Se conecta a la Raspberry por el interface SPI. OpenPlotter puede leer estos chips (carpeta SPI) pero no  podra convertir la lectura de los datos en  angulo de viento. Habria que escribir un programa para calcular el angulo de viento en funcion del voltaje. Para leer la velocidad se  puede hacer conectando el cable a un GPIO por medio de un divisor de tension con dos resistencias para bajar de 5V del sensor a 3V de la Raspi. Tambien hay que escribir un programa para convertir los pulsos en velocidad. La ventaja de escribir el programa es que se pueden poner los datos en formato SugnalK o NMEA183. Este programa lo podria escribir yo y si Sailoog tiene tiempo y ganas, lo podria integrar a OP.
Tambien he visto que el sensor de corredera de NASA tiene un buen precio. Como este tambien emite pulsos, se podria leer como la velocidad del viento, en un GPIO (tambien con divisor de tension).
En resumen,  esos sensores de NASA se pueden utilizar para leerlos directamente con la Raspi.  El precio final seria bastante asequible.

[img][Imagen: MCP3008_Bild.jpg][/img]

Aqui una foto del chip  convertido AD

[img][Imagen: Conexion_MCP3008.jpg][/img]

Aqui una foto de como  se conecta

[img][Imagen: 20160221_200405_Copy.jpg][/img]

Aqui una foto e un anemometro que hice con 4 sensores de hilo caliente cuyas salidad las lee un MCP3008 y conectado a la raspberry con un programa en Python los convertia a NMEA183
Responder
Agradecido por: pinguino, Drac
#17

Estoy usando una placa Arduino china, ELEGOO UNO R3, como conversor de analogico a digital y mandando las salidas por el serial usb a la raspberry. Tenía ya un equipo de viento NASA roto, la pantalla con la pbc oxidada y las conexiones comunicadas. La parte que va en el mástil al parecer estaba bien aunque creo que no.

El codigo funciona, pero los valores que da no son coherentes. Esto creo que es culpa de que la unidad de mastil tambien esta en mal estado (las pbc estan algo sulfatadas).

Luego subo el código para que lo reviséis. A ver si alguien puede convertir las salidas en sentencias legibles por nmea.

[Imagen: Lazo-amarillo-2-300x161.jpg]
Responder
Agradecido por:
#18

Cita:#define bsize 10
#include <FlexiTimer2.h>

const int APin2 = A1; //direccion1, azul
const int APin4 = A0; //direccion2, negro
const int PulsePin = 3; // rotor viento, blanco
//rojo a 5v, gris a ground

struct buffer {
  int data[bsize];
  byte bptr;
  int total;
  int average;
};

struct buffer V2bf, V4bf;
int heading = 0;
int V2 = 0;
int V4 = 0;
int period=0;

void getHeading(){
  V2= analogRead(APin2);
  V4= analogRead(APin4);

  V2bf.total-=V2bf.data[V2bf.bptr];
  V2bf.data[V2bf.bptr]=V2;
  V2bf.total+=V2bf.data[V2bf.bptr];
  V2bf.average=V2bf.total/bsize;
  V2bf.bptr++;
  if (V2bf.bptr>=bsize) V2bf.bptr=0;
  V2=V2bf.average;

  V4bf.total-=V4bf.data[V4bf.bptr];
  V4bf.data[V4bf.bptr]=V4;
  V4bf.total+=V4bf.data[V4bf.bptr];
  V4bf.average=V4bf.total/bsize;
  V4bf.bptr++;
  if (V4bf.bptr>=bsize) V4bf.bptr=0;
  V4=V4bf.average;
  if (V2<=180){//1er cuadrante, 1-90, basado en V4
    // V4 toma valores
    heading=(-89.0/58*V4/10+3382.0/29);
  }
  if (V4<=220){ //2do cuadrante, 91-180, basado en V2, fase entre (18,90) & (76,179)
    heading=(89.0/58*V2/10+1809.0/29);
  }
  if (V2>=758){ //3er cuadrante, 181-270, basado en V4
    heading=(89.0/54*V4/10+3881.0/27);
  }
  if (V4>=758){ //4to cuadrante, 271-360 basado en V2, fase entre (76,270) & (18,359)
    heading=(-89.0/57*V2/10+1166.0/3);
  }
  if (heading>=360) heading-=360;
  if (heading<0) heading+=360;
}

void pulse(){ //comienza cuando recibe pulso del rotor
  static int msecs=0;
  int temp;
  temp=millis();
  period=temp-msecs;
  msecs=temp;
}

void setup() {
  Serial.begin(9600);
  Serial.print("Equipo viento");
  FlexiTimer2::set(50, getHeading); // periodo de 50ms
  attachInterrupt (1, pulse, FALLING);
  FlexiTimer2::start();
}
void loop() {
  Serial.print(" direccion=");
  Serial.print(heading);

  Serial.print(" periodo=");
  Serial.print(period);

  Serial.print(" V2=");
  Serial.print(V2);

  Serial.print(" V4=");
  Serial.print(V4);
  Serial.println(" ");
  delay(100);

[Imagen: Lazo-amarillo-2-300x161.jpg]
Responder
Agradecido por:
#19

Sigo con el codigo

Cita:#define bsize 8
#include <FlexiTimer2.h>

const int APin2 = A1; //direccion1, azul
const int APin4 = A0; //direccion2, negro
const int PulsePin = 3; // rotor viento, blanco
//rojo a 5v, gris a ground

struct buffer {
  int data[bsize];
  byte bptr;
  int total;
  int average;
};

struct buffer V2bf, V4bf;
int heading = 0;
int V2 = 0;
int V4 = 0;
int period=0;
int knt=0;
int var=0;

void getHeading(){
  V2= analogRead(APin2);
  V4= analogRead(APin4);

  V2bf.total-=V2bf.data[V2bf.bptr];
  V2bf.data[V2bf.bptr]=V2;
  V2bf.total+=V2bf.data[V2bf.bptr];
  V2bf.average=V2bf.total/bsize;
  V2bf.bptr++;
  if (V2bf.bptr>=bsize) V2bf.bptr=0;
  V2=V2bf.average;

  V4bf.total-=V4bf.data[V4bf.bptr];
  V4bf.data[V4bf.bptr]=V4;
  V4bf.total+=V4bf.data[V4bf.bptr];
  V4bf.average=V4bf.total/bsize;
  V4bf.bptr++;
  if (V4bf.bptr>=bsize) V4bf.bptr=0;
  V4=V4bf.average;
  if (V2<=180){//1er cuadrante, 1-90, basado en V4
    // V4 toma valores
    heading=(-89.0/58*V4/10+3382.0/29);
  }
  if (V4<=220){ //2do cuadrante, 91-180, basado en V2, fase entre (18,90) & (76,179)
    heading=(89.0/58*V2/10+1809.0/29);
  }
  if (V2>=758){ //3er cuadrante, 181-270, basado en V4
    heading=(89.0/54*V4/10+3881.0/27);
  }
  if (V4>=758){ //4to cuadrante, 271-360 basado en V2, fase entre (76,270) & (18,359)
    heading=(-89.0/57*V2/10+1166.0/3);
  }
  if (heading>=360) heading-=360;
  if (heading<0) heading+=360;
}

void pulse(){ //comienza cuando recibe pulso del rotor
  static int msecs=0;
  int temp;
  temp=millis();
  period=((temp-msecs)/1000)*60;
  msecs=temp;
  knt=(45/period)*1.9438;  //45 valor dado por coeficiente del anemometro, normalmente entre 30 y 60 rpm/(m/s)
}
void setup() {
  delay(2000);
  Serial.begin(1200);
  Serial.println(" Equipo viento V0.1");
  Serial.println("");
  FlexiTimer2::set(1000, getHeading); // periodo de 1seg
  attachInterrupt (1, pulse, FALLING);
  FlexiTimer2::start();
}
void loop() {
  while (var<6){
    Serial.print(" direccion=");
    Serial.print(heading);
    Serial.print("grados");
    if(heading < 22)
      Serial.print(" N");
    else if (heading < 67)
      Serial.print(" NE");
    else if (heading < 112)
      Serial.print(" E");
    else if (heading < 157)
      Serial.print(" SE");
    else if (heading < 212)
      Serial.print(" S");
    else if (heading < 247)
      Serial.print(" SW");
    else if (heading < 292)
      Serial.print(" W");
    else if (heading < 337)
      Serial.print(" NW");
    else
      Serial.print(" N");

    Serial.print(" knts=");
    Serial.print(knt);

    Serial.print(" rpm=");
    Serial.print(period);

    Serial.print(" V2=");
    Serial.print(V2);

    Serial.print(" V4=");
    Serial.print(V4);
    Serial.println(" ");
    delay(1000);
    var++;
  }
  Serial.println("");
  Serial.println(" Equipo viento V0.1");
  Serial.println("");
  var = 0;
}
[Imagen: f5e211ee85c7693d6cf8eb3e86c22fd5.jpg]

[Imagen: Lazo-amarillo-2-300x161.jpg]
Responder
Agradecido por:
#20

La verdad que no me entero muy bien que es lo que promedias. Segun entiendo lees hasta que se llena un buffer y luego promedias los datos del mismo. No tengo ni idea de arduino.

Si, como supongo, el convertidor lee datos continuamente con el ciclo que tu programes. Como no veo programado un ciclo de lectura y no se como funciona la funcion read en arduino no te puedo ayudar.

Programando en C otros microprocesadores , o en Python en la Raspi, lees sentencias cada x milisegundos. Entonces en un cuarto de segundo dispones de un monton de sentencias del mismo canal. En lugar de mostrarla tal como entran (eso haria que el valor oscile continuamente), cada x sentencias se hace una promediacion, de esta manera la señal medida aparace mas estable. Cuanto mayor es la promediacion, mas estable aparece.  Dependiendo de la velocidad de entrada de datos puedes llegar a hacer incluso 1000 promediaciones.  Es posible que este sea el problema, que la promediacion es muy escasa.

Tu segunda pregunta es como pasarlos a NMEA. Para ello se puede hacer un programa en Python.
Aqui te muestro como lo hice yo para convertir los datos de mi anemometro de hilo caliente a NMEA y como meeterlos en el localhos 10110 que genera Openplotter

Lenguaje Python
import socket, pynmea2

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

# instantiate
config = ConfigParser()

# parse existing file
config.read('win_openplotter.ini')
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

  mwv = pynmea2.MWV('OS', 'MWV', (str(round(W_Direccion,1)),'R',str(round(Win_MPH_Vector,1)),'N','A'))
  mwv1=str(mwv)
  mwv2=mwv1+"\r\n"
  sock.sendto(mwv2, ('localhost', 10110))

donde w_Direccion es el valor de la direccion del viento, Win_MPH_Vector es el valor de la intensidad del viento en nudos.

Lo llame vector porque en el anemometro de aire caliente era el valor del vector de un cuadrante entre dos sensores de hilo caliente.
Responder
Agradecido por:


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje
Último mensaje por Asante
14-04-2021, 05:23 PM

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)