Discusiones sobre Productos NI

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

Arduino due and Labview wirelss serial communication using Xbee

Hello.

 

I am controlling a mobile robot using the Arduino due and labview

 

PWM value caculated on the labview is sent to Arduino due and then Due controls the robot.

 

These communicate wirelessly by xbee.

 

 

Now, I'd like to increase the communication speed between Arduino due and Labview.

 

but, when i set the value of the "Wait(ms)" function to below 10ms  in Labview, communication has unstability.

 

so please let me know how increase the communication speed.

 

thank you.

 

-experiment image-

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

 

그림2.gif

 

 

- Arduino source-

 

#include <string.h>

int PWM1 = 5;  
int DIR1 = 4; //direc
int PWM2 = 6;       
int DIR2 = 7; //dir 

float readNumber = 0;
float In1, In2, pwm, newtime, A;

float newposition1 = 0;
float newposition2 = 0;

unsigned int Aold1 = 0;
unsigned int Bnew1 = 0;

unsigned int Aold2 = 0;
unsigned int Bnew2 = 0;

volatile long encoder1Pos = 0;
volatile long encoder2Pos = 0;

int encoder1PinA = 8;//Encoder A pin
int encoder1PinB = 9;//Encoder B pin
int encoder2PinA = 11;//Encoder A pin
int encoder2PinB = 12;//Encoder B pin
int Direction1, Direction2;

float pwm1_limit=255;
float pwm2_limit=255;
float count_old = 0;
float power1_old, power1_old2, power1_old3, power1_old4, power1_old5;

void setup() {
  // put your setup code here, to run once:
  pinMode(DIR1, OUTPUT);   
  pinMode(DIR2, OUTPUT); 

  Serial.begin(115200);
  Serial.flush();
  Serial2.begin(115200);
  Serial2.flush();
  
  pinMode(encoder1PinA, INPUT);
  digitalWrite(encoder1PinA, HIGH);       // turn on pullup resistor
  pinMode(encoder1PinB, INPUT);
  digitalWrite(encoder1PinB, HIGH);       // turn on pullup resistor
  
  pinMode(encoder2PinA, INPUT);
  digitalWrite(encoder2PinA, HIGH);       // turn on pullup resistor
  pinMode(encoder2PinB, INPUT);
  digitalWrite(encoder2PinB, HIGH);       // turn on pullup resistor
  
  attachInterrupt(encoder1PinA, d1EncoderA, CHANGE);
  attachInterrupt(encoder1PinB, d1EncoderB, CHANGE);
  attachInterrupt(encoder2PinA, d2EncoderA, CHANGE);
  attachInterrupt(encoder2PinB, d2EncoderB, CHANGE);
  
}

void loop() {
    if(Serial2.available()>0){
        String first  = Serial2.readStringUntil('!');//랩뷰에서 받는 2개의 값을 분리하기 위한 소스("!"앞까지 끊고, "@"앞까지 끊음 ex)123!456@을 받으면 123과 456으로 나눔)
        String second = Serial2.readStringUntil('@');//http://stackoverflow.com/questions/29504679/splitting-a-comma-separated-string-through-serial-arduino
        
       float x = first.toFloat();//위에서 분리된 문자를 float형으로 바꿔줌
       float y = second.toFloat();
       
        newposition1 = -encoder1Pos; //Encoder signal
        newposition2 = encoder2Pos; //Encoder signal
        
           count_old = 0;
        
       float power1 = x;
       float power2 = y;
            
       
 ////**************************************/////
if(power1 >= 0){
   Direction1 = LOW;
}

else{
   Direction1 = HIGH;
}
 /*////******************************************////
 
  if(power2 >= 0){
   Direction2 = HIGH;
}

else {
   Direction2 = LOW;
}
////*****************************************///////

        power1 = abs(power1);
        power2 = abs(power2);
        
 if(power1 > pwm1_limit){
    power1 = pwm1_limit;
  }    
  
if(power2 > pwm2_limit){
    power2 = pwm2_limit;
  }  
        
digitalWrite(DIR1, Direction1);  //HIGH = back, LOW = forward
digitalWrite(DIR2, Direction2);  //HIGH = back, LOW = forward

    analogWrite(PWM1, power1);//PWM Speed Control
    analogWrite(PWM2, power2);//PWM Speed Control
        
    String strValue = String(newposition1);//숫자를 문자형으로 변환
    String Q = "!";
    String strValue2 = String(newposition2);
    String stringThree = strValue + Q + strValue2;//문자 합치기
 
     Serial2.println(stringThree);//Send encoder pulse to Labview
    
   }

else {//when Serial communication stop
   float count = count_old+1;
  if(count > 10000){
        newposition1 = 0; //Encoder initialization
        newposition2 = 0; //Encoder initialization
        encoder1Pos = 0;
        encoder2Pos = 0;
              }
      else{
         newposition1 = newposition1; //Encoder signal
         newposition2 = newposition2; //Encoder signal
      }
      count_old = count;
      Serial.println(count);
}
}


////////////////////////////////////////////////////////////////////////
//Encoder Read//////////////////////////////////////////////////////////
void d1EncoderA()
{
  Bnew1^Aold1 ? encoder1Pos++ : encoder1Pos--;
  Aold1 = digitalRead(encoder1PinA);
}
void d1EncoderB()
{
  Bnew1 = digitalRead(encoder1PinB);
  Bnew1^Aold1 ? encoder1Pos++ : encoder1Pos--;
}

void d2EncoderA()
{
  Bnew2^Aold2 ? encoder2Pos++:encoder2Pos--;
  Aold2=digitalRead(encoder2PinA);
}
void d2EncoderB()
{
  Bnew2=digitalRead(encoder2PinB);
  Bnew2^Aold2 ? encoder2Pos++:encoder2Pos--;
}
0 kudos
Mensaje 1 de 1
4.093 Vistas