Discusiones sobre Productos NI

cancelar
Mostrando los resultados de 
Buscar en lugar de 
Quiere decir: 

Comunicación serial de labview con arduino (visa)

Hola, estoy haciendo un proyecto en el cual utilizo comunicación entre una red de anillo con "n" arduinos externos y dos arduinos para enviar la información del anillo y recibirla en un centro de control mediante un sistema de telemetría. Esto se hace mediante una rutina de interrupciones y dos módulos de radiofrecuencia Xbee.

La comunicación es bidireccional. Desde Labview se deben de mandar mensajes por medio de botones desde "Arduino Centro de Control" hacia "Arduino Harlan"; mientras que al mismo tiempo se debe de recibir la información del anillo en "Arduino Harlan" y enviarla a "Arduino centro de control" para ser procesada y posteriormente enviada hacia labview por medio de comunicación Serial.

 

El problema ocurre al enviar la información procesada desde "Arduino centro de control" hacia labview, a veces se procesa la información, a veces no y a veces se envía toda la información y a veces no. Es bastante inconsistente.

 

La información se escribe desde "Arduino Harlan", se recibe en "Arduino centro de control" y de aquí se va a labview. Alguien conoce la razón de esta inconsistencia? Adjunto los archivos de arduino y labview, así como los comandos a utilizar para simular el anillo. 

 

$TEFE01# (o 00 en lugar de 01)

$TEPA01# (o 00 en lugar de 01)

$TEFN000# (o cualquier valor en lugar de los ceros)

$TEDIR000# (o cualquier valor en lugar de los ceros)

$TEUTM0000000000# (o cualquier valor en lugar de los ceros)

$TEDO000# (o cualquier valor en lugar de los ceros)

$TEAC000# (o cualquier valor en lugar de los ceros)

$TEST01# (o 00 en lugar de 01)

 

Si alguien pudiera guiarme hacia la solución sería de excelente ayuda.

 

//ARDUINO EN HARLAN
#include <stdio.h> 
#include <avr/interrupt.h> 
volatile char message[100], mCounter=0;
volatile char myMessage[20];
volatile char sendMessage[20];
ISR(USART0_RX_vect){ //Llega informacion de anillo y sale para xbee
char data;
data=UDR0;
UDR1=data; 
}
ISR(USART1_RX_vect){ //Llega informacion de xbee y sale para anillo
char data;
data=UDR1;
UDR0=data;
char ID0='T';
char ID1='E';//ID for each module
  
  if (data=='$') 
  {
    mCounter=0;  //if $ is recibed, it's a new message then restart counter 
  }
  
  message[mCounter]=data; //save each byte of the message  
  mCounter=mCounter+1;
    
if (data=='#') //A complete message was received; find the information within the message
  {   
   
      for(int i=0;message[i]!='#';i++){ //Look for initials of myMessage
          if(message[i]==ID0 && message[i+1]== ID1){   
             for(int ii=0;((myMessage[ii]!='#')&&/*||*/(myMessage[ii]!='-'));ii++){ //Define myMessage
                myMessage[ii]=message[ii+i];
             }
          break;   
          }
      }
  }
}
void setup() {
   // setup for serial communication using interruptions 
  UBRR0=103;   //setting baud rate at 9600 with U2X0=0; 
  UCSR0C=0b00001110; //Asynchronous mode,parity disable, two stop bits, 8 transmitted bits; 
  UCSR0B|= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); // Enables transmission, reception and RX interruption 
   
  UBRR1=103;   //setting baud rate at 9600 with U2X0=0; 
  UCSR1C=0b00001110; //Asynchronous mode,parity disable, two stop bits, 8 transmitted bits; 
  UCSR1B|= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1); 
  sei();  
}
void loop() {

  }
//ARDUINO EN CENTRO DE CONTROL
#include <stdio.h> 
#include <avr/interrupt.h> 
volatile char message[100], mCounter=0;
volatile char myMessage[100];
char Gauges[50]={'E','0','0','N','0','0','0','A','0','0','0','M','0','0','T','0','0','U','0','0','0','0','0','0','0','0','0','0','D','0','0','0','S','0','0','#'};
ISR(USART0_RX_vect){ //Llega informacion de Labview y sale para xbee
 char data;
data=UDR0;
UDR1=data; 
}
ISR(USART1_RX_vect){ //Llega informacion de xbee y sale para labview
char data;
data=UDR1;
myMessage[0]='T';
myMessage[1]='E';        //ID for each module
  
  if (data=='$') 
  {
    mCounter=0;  //if $ is recibed, it's a new message then restart counter 
  }
  
  message[mCounter]=data; //save each byte of the message  
  mCounter=mCounter+1;
    
if (data=='#') //A complete message was received; find the information within the message
  {   
      for(int i=0;message[i]!='#';i++){ //Look for initials of myMessage
          if(message[i]=='T'&& message[i+1]=='E'){   
             for(int ii=0;(myMessage[ii]!='#');ii++){ //Define myMessage
                myMessage[ii]=message[ii+i];
             }
          break;      
      }
  }
}
}

void setup() {
   // setup for serial communication using interruptions 
  UBRR0=103;   //setting baud rate at 9600 with U2X0=0; 
  UCSR0C=0b00001110; //Asynchronous mode,parity disable, two stop bits, 8 transmitted bits; 
  UCSR0B|= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); // Enables transmission, reception and RX interruption 
   
  UBRR1=103;   //setting baud rate at 9600 with U2X0=0; 
  UCSR1C=0b00001110; //Asynchronous mode,parity disable, two stop bits, 8 transmitted bits; 
  UCSR1B|= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1); 
  sei();  
}
void loop() {
  for(int i=0;(myMessage[i]!='#');i++)
  {
    if(myMessage[i]=='F' && myMessage[i+1]=='E')//Busca estado de freno de emergencia
    {
      Gauges[0]='E';
      Gauges[1]=myMessage[i+2];
      Gauges[2]=myMessage[i+3];
    }
    if(myMessage[i]=='F' && myMessage[i+1]=='N')//Busca porcentaje de freno aplicado
    {
      Gauges[3]='N';
      Gauges[4]=myMessage[i+2];
      Gauges[5]=myMessage[i+3];
      Gauges[6]=myMessage[i+4];
  }
    if(myMessage[i]=='A' && myMessage[i+1]=='C')//Busca porcentaje de acelerador aplicado
     { 
      Gauges[7]='A';
      Gauges[8]=myMessage[i+2];
      Gauges[9]=myMessage[i+3];
      Gauges[10]=myMessage[i+4];
  }
  if(myMessage[i]=='P' && myMessage[i+1]=='A')//Busca estado del motor
    { 
      Gauges[11]='M';
      Gauges[12]=myMessage[i+2];
      Gauges[13]=myMessage[i+3];
  }
  if(myMessage[i]=='S' && myMessage[i+1]=='T')//Busca estado de trayectoria
   {   
      Gauges[14]='T';
      Gauges[15]=myMessage[i+2];
      Gauges[16]=myMessage[i+3];
  }
  if(myMessage[i]=='U' && myMessage[i+1]=='T' && myMessage[i+2]=='M')//Busca coordenadas UTM
   {   
      Gauges[17]='U';
      Gauges[18]=myMessage[i+3];
      Gauges[19]=myMessage[i+4];
      Gauges[20]=myMessage[i+5];
      Gauges[21]=myMessage[i+6];
      Gauges[22]=myMessage[i+7];
      Gauges[23]=myMessage[i+8];
      Gauges[24]=myMessage[i+9];
      Gauges[25]=myMessage[i+10];
      Gauges[26]=myMessage[i+11];
      Gauges[27]=myMessage[i+12];
      
  }
  if(myMessage[i]=='D' && myMessage[i+1]=='I' && myMessage[i+2]=='R')//Busca angulo de direccion
   {   
      Gauges[28]='D';
      Gauges[29]=myMessage[i+3];
      Gauges[30]=myMessage[i+4];
      Gauges[31]=myMessage[i+5];
  }
  if(myMessage[i]=='D' && myMessage[i+1]=='O')//Busca situacion de seguridad
   {   
      Gauges[32]='S';
      Gauges[33]=myMessage[i+2];
      Gauges[34]=myMessage[i+3];
      Gauges[35]='#';
  }
  }
  while((UCSR0A&(1<<UDRE0))==0);
  UDR0=10;
   for(int i=0;i<36;i++)
   {
  while((UCSR0A&(1<<UDRE0))==0);
  UDR0=Gauges[i];
  }
  delay(1000);
}
Descargar todos
0 kudos
Mensaje 1 de 4
3.064 Vistas

Intenta creando un programa basado en productor - consumidor en el cual en uno estes monitoreando el cambio de valor en el interfaz y en el otro mandes el dato y en secuencia espere la lectura del Arduino. Te puedes basar en el ejemplo de LabVIEW de Continious serial write and read y con el template incluido en labVIEW de producer/consumer. 

Existe alguna razon que colocaste 2.0 en stop bits, no es un valor aceptado por el VI y ademas el tiempo entre ciclos por que lo dejas te de 1 segundo ?

0 kudos
Mensaje 2 de 4
3.001 Vistas

Hola, comparto guia para comunicar labview por medio de VISA

 

Programacion Labview - Comunicacion Serie PC microcontrolador

https://www.youtube.com/watch?v=xvAXN0orRHI

 

https://www.youtube.com/watch?v=s-0ATnkG5Nc

0 kudos
Mensaje 3 de 4
2.936 Vistas
0 kudos
Mensaje 4 de 4
2.936 Vistas