Envío y recepción por puerto Serie de una cadena de Strings.

Recientemente tuve que buscar por la Red una solución al siguiente caso práctico:

Proyecto: Robot Scara.

Uso de un mando remoto con arduíno Nano, con conexión por SoftwareSerial de un dispositivo BT HM-19 configurado como master preparado para conectarse a su esclavo situado en el puerto Serial1 de un arduino Mega ligado a un CNC shield V3 del que se alimenta el brazo robótico.

Para la aquisición de conocimiento práctico del funcionamiento de mi robot, antes del uso del software Marlín o Grbl, voy a usar la librería AccelStepper, y estudiar los movimientos de cuatro ejes y un servo. Para ello necesito enviar desde el mando remoto cinco instrucciones siultáneas con solo pulsar un botón de forma que el arduino Mega las reciba y las procese de modo que le llegue la orden requerida a los motores y al servo.

La solución se basa en crear una cadena de Strings separadas por comas (.) que se transmitira desde el control remoto ,mientras que en el otro lado crear un array[] proporcional donde cada elemento se asocie consecutivamente a los elementos de la cadena recibida.

----------  //declaración de variables que vamos a enviar, cada uno representante 
de los valores que van a hacer moverse a los motores y al servo ademas de otrainstrucción que se requiera
.......
SoftwareSerial Bt(2,3);
int x,y,z,phi;
int g=45;
int h=0;
String data;

void loop(){
data=
String(x)+","+String(y)+","+String(phi)+","+String(z)+","+String(g)+","+String(h));
if (pulsador){Bt.println(data);delay(100);}
.............
}
//RECEPCION POR PUERTO SERIAL1


int g,x,y,phi, z;
int data[6];

string content = "";



void setup() {
  Serial1.begin(115200);
......
void loop() {
if (Serial1.available()) {
    content = Serial1.readString(); // Recepción puerto Serial1
    // Extract the data from the string and put into separate integer variables (data[] array)
    for (int i = 0; i < 7; i++) {
      int index = content.indexOf(","); // locate the first ","
      data[i] = atol(content.substring(0, index).c_str()); //Extract the number from start to the ","
      content = content.substring(index + 1); }//Remove the number from the string

 /*  // representación de la asignación de variables recibidas con los elementos del array
     data[0] - x
     data[1] - y
     data[2] - phi
     data[3] - z
     data[4] - g
    data[5] - Homing  // corresponde al valor de la variable  " h" recibida
    */


}

Ejemplo de monitorización de la recepción de una cadena de variables separadas por comas.

Observemos como va disminuyento la información recibida hasta el último elemento por la acción :

…………………. content = content.substring(index + 1); }//Remove the number from the string

Enviar una cadena de caracteres y variables:

Ampliando la visión general en este tema veamos una simulación de gcode con la funcion millis)= como variable.

Creamos la variable String data , agrupando en su interior () los caracteres que se concatenarán con las variables.

unsigned long x;
unsigned long y;
String data;

void setup() {
  Serial.begin(115200);
  
  // put your setup code here, to run once:

}

void loop() {
  x=millis()/1000;
  y=millis()/500;
  data=("G91 X"+String(x)+ " "+"Y"+String(y));
  Serial.println(data);delay(1000);

}

Comentarios 3

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Translate »