03-31-2015 12:01 PM
Buenas tardes, estoy realizando un proyecto con Arduino y Labview, en el que tomo datos de un Shield GPS y otros sensores en el Arduino, al tomar los datos del GPS no tengo problema, mi inconveniente es al querer tomar los demas datos, realizo la interrupcion para leer los sensores pero igual no me toman los datos, al parecer al hacer eso me genera conflicto leyendo todos los datos, alguien alguna idea de como solucionar este problema? Muchas gracias
04-01-2015 09:46 AM
Hola Cesar;
Podrías por favor colocar tu código; este problema de sincronización se puede dar debido a que no se respeta el flujo de datos en LabVIEW.
Exito
04-06-2015 10:16 AM
Hola, claro este es el codigo de Labview y el del arduino, pero para el arduino es necesario instalar 2 librerias nuevas.
#include "TinyGPS.h"
#include "DHT.h"
TinyGPS gps;
#define GPS_TX_DIGITAL_OUT_PIN 5
#define GPS_RX_DIGITAL_OUT_PIN 6
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
char in;
int temp, hum;
long startMillis;
long secondsToFirstLocation = 0;
#define DEBUG
float latitude = 0.0;
float longitude = 0.0;
float alture=0.0;
void setup()
{
#ifdef DEBUG
Serial.begin(9600);
#endif
dht.begin();
// Serial1 is GPS
Serial1.begin(9600);
// prevent controller pins 5 and 6 from interfering with the comms from GPS
pinMode(GPS_TX_DIGITAL_OUT_PIN, INPUT);
pinMode(GPS_RX_DIGITAL_OUT_PIN, INPUT);
startMillis = millis();
Serial.println("Starting");
}
void loop()
{
readLocation();
if(Serial.available() >0 )
{
in=(byte)Serial.read()& ~(0x20);
if(in=='T'){
temp= dht.readTemperature();
Serial.println(temp);
}
else if (in=='H'){
hum=dht.readHumidity();
Serial.println(hum);
}
}
}
//--------------------------------------------------------------------------------------------
void readLocation(){
bool newData = false;
unsigned long chars = 0;
unsigned short sentences, failed;
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start < 1000;)
{
while (Serial1.available())
{
int c = Serial1.read();
Serial.print((char)c); // if you uncomment this you will see the raw data from the GPS
++chars;
if (gps.encode(c)) // Did a new valid sentence come in?
newData = true;
}
}
if (newData)
{
// we have a location fix so output the lat / long and time to acquire
if(secondsToFirstLocation == 0){
secondsToFirstLocation = (millis() - startMillis) / 1000;
Serial.print("Acquired in:");
Serial.print(secondsToFirstLocation);
Serial.println("s");
}
unsigned long age;
gps.f_get_position(&latitude, &longitude,&age);
latitude == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : latitude;
longitude == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : longitude;
alture == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : alture;
Serial.print("Location: ");
Serial.print(latitude, 6);
Serial.print(" , ");
Serial.print(longitude, 6);
Serial.println("");
Serial.print(alture, 6);
Serial.println("");
}
if (chars == 0){
// if you haven't got any chars then likely a wiring issue
Serial.println("Check wiring");
}
else if(secondsToFirstLocation == 0){
// still working
}
}
04-06-2015 10:49 AM - edited 04-06-2015 10:52 AM
Hola cesar;
Te recomendaría colocar tus tres adquisiciones en el mismo lazo y conectar sus terminales de error para asegurar que una ocurra después de la otra; de lo contrario, te arriesgas a que los tres ciclos traten de obtener un valor del puerto al mismo tiempo ocasionando entonces un conflicto de recursos; algo así
Te recomendaría colocar el código repetido en un subVI para hacer más pequeño el programa
La segunda opción sería la de colocar semáforos para proteger el acceso a recursos compartidos; aquí un tutorial
Exito
04-06-2015 11:03 AM
Si intente eso amigo, pero al hacer eso no me lee nada el buffer, y no obtengo datos ni del gps ni del sensor, y aplicando el programa en arduino si me funciona, pero al pasar al labview muere todo, algun consejo?
04-06-2015 11:08 AM
Hola!
Ahorita lo que estas haciendo es enviar el comando H a tu sensor, probablemente, el error ocurre porque el comando es incorrecto;como se menciona aquí
Has intentado usar el toolkit de Arduino en lugar de VISA?
Exito
04-06-2015 11:11 AM - edited 04-06-2015 11:18 AM
Si intente usar lifa_base, pero no me sirve para leer los datos del gps, me tocaria modificar el codigo del lifa para eso, por eso opte por trabajar de manera directa con visa, y si pongo solo el GPS si me funciona correctamente, pongo la parte del sensor y muere todo, no se por que? intente de varias formas, pero no logro obtener el dato del sensor DHT22 de ninguna forma en labview, el sensor esta conectado al arduino te adjunto una foto.
04-06-2015 11:20 AM
Eran 2 codigos separados, que los uni para trabajar, el GPS y el sensor, en el lector serial de arduino me lee perfectamente, pero al querer leer en LAbview muere la parte del sensor, si uno muere todo.
04-06-2015 11:23 AM
A ver si entendía bien...
Tienes un Arduino que contiene un GPS, un sensor de temp y uno de humedad.
Lees desde LabVIEW con VISA el GPS sin problemas
Lees desde LabVIEW con el toolkit de Arduino sin problemas
El detalle es cuando tratas de leer con visa los sensores de humedad y temp o con el de arduino el GPS?
Tienes la hoja de datos de los sensores???
Que tarjeta de Arduino estas usando?
04-06-2015 11:29 AM
Estoy usando un arduino MEGA, y no uso el Arduino toolkit para nada, todo leo mediante VISA,el problema es que Labview no me manda ningun dato cuando pongo todo en un mismo lazo, cuando pongo por separado me manda del GPS, pero no del sensor, y si uso solo el programa del sensor cargado en el Arduino y hago el programa en LAbview solo para eso si me lee el sensor, mi problema es al mezclar ambos programas, no se como discriminar ambos datos, porque no me lee todo junto.
En el anterior mensaje te envie una foto de como esta conectado el Arduino Mega con el GPS y el Sensor.
Muchas gracias por tu ayuda.