el 05-02-2018 09:31 PM
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);
}
05-09-2018 04:12 PM - editado 05-09-2018 04:22 PM
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 ?
el 06-03-2018 09:12 PM
Hola, comparto guia para comunicar labview por medio de VISA
Programacion Labview - Comunicacion Serie PC microcontrolador
https://www.youtube.com/watch?v=xvAXN0orRHI
06-03-2018 09:13 PM - editado 06-03-2018 09:40 PM
Hola, comparto guia para comunicar labview por medio de VISA
https://www.youtube.com/watch?v=BgHCLJcorBA
el 01-10-2025 11:25 AM
Un saludo
Comparto mi aporte en español para la comunicación serial visa espero que ayude
https://www.youtube.com/playlist?list=PLLO-IQy_X-hVf-eOnImaS-mPYdP5VT3PM
Cordial ssaludo