Go Down

Topic: Mano Robotica HC05 (Read 259 times) previous topic - next topic

pocedani

Buenas tardes.
Les comento... Estoy trabajando en un proyecto que consiste en el control de una mano impresa en 3D mediante un guante con sensores de flexión incorporados.
Cada sensor envía una señal analógica al servo el cual debe moverse de 0 a 180º.
cual es mi problema? que por mas que busco información por Internet no veo nada y mis conocimientos sobre arduino son escasos.
les adjunto los dos códigos que tengo para el Maestro y el Esclavo.
Por cierto la comunicación de los dos HC05 la hace bien y se comunican correctamente.
Gracias por adelantado.

pocedani

            //    MAESTRO

// Incluir la libreria del servomotor para agregar funciones de servo-control:
#include <SoftwareSerial.h>
#define BT_SERIAL_TX 2
#define BT_SERIAL_RX 3
SoftwareSerial BluetoothSerial(BT_SERIAL_TX, BT_SERIAL_RX);


// Definir la entrada analogica a la que ira conectado cada sensor-flex:

const int flexpin1 = A0;
const int flexpin2 = A1;
const int flexpin3 = A2;
const int flexpin4 = A3;
const int flexpin5 = A4;

  int flexposition1;
  int flexposition2;
  int flexposition3;
  int flexposition4;
  int flexposition5;
  int sensorMin = 760;
  int sensorMax = 950;

char flex1[4];
char flex2[4];
char flex3[4];
char flex4[4];
char flex5[4];

String strflex1;
String strflex2;
String strflex3;
String strflex4;
String strflex5;


void setup()
{

 Serial.begin(57600);
 BluetoothSerial.begin(57600);
}
void loop()
{
  flexposition1 = analogRead(flexpin1);
  flexposition1 = map(flexposition1, sensorMin, sensorMax, 0, 175);
  flexposition1 = constrain(flexposition1, 0, 180);
  flexposition2 = analogRead(flexpin2);
  flexposition2 = map(flexposition2, sensorMin, sensorMax, 0, 175);
  flexposition2 = constrain(flexposition2, 0, 180);
  flexposition3 = analogRead(flexpin3);
  flexposition3 = map(flexposition3, sensorMin, sensorMax, 0, 175);
  flexposition3 = constrain(flexposition3, 0, 180);
  flexposition4 = analogRead(flexpin4);
  flexposition4 = map(flexposition4, sensorMin, sensorMax, 0, 175);
  flexposition4 = constrain(flexposition4, 0, 180);
  flexposition5 = analogRead(flexpin5);
  flexposition5 = map(flexposition5, sensorMin, sensorMax, 0, 175);
  flexposition5 = constrain(flexposition5, 0, 180);


  strflex1=String(flexposition1);
  strflex1.toCharArray(flex1,4);
  BluetoothSerial.write("flex1 ");
  BluetoothSerial.write(flex1);
  BluetoothSerial.write("\n");

  strflex2=String(flexposition2);
  strflex2.toCharArray(flex2,4);
  BluetoothSerial.write("flex2 ");
  BluetoothSerial.write(flex2);
  BluetoothSerial.write("\n");

  strflex3=String(flexposition3);
  strflex3.toCharArray(flex3,4);
  BluetoothSerial.write("flex3 ");
  BluetoothSerial.write(flex3);
  BluetoothSerial.write("\n");

  strflex4=String(flexposition4);
  strflex4.toCharArray(flex4,4);
  BluetoothSerial.write("flex4 ");
  BluetoothSerial.write(flex4);
  BluetoothSerial.write("\n");

  strflex5=String(flexposition5);
  strflex5.toCharArray(flex5,4);
  BluetoothSerial.write("flex5 ");
  BluetoothSerial.write(flex5);
  BluetoothSerial.write("\n");


 Serial.print(" sensor1: ");
  Serial.print(flexposition1);
   Serial.print(" sensor2: ");
  Serial.print(flexposition2);
   Serial.print(" sensor3: ");
  Serial.print(flexposition3);
   Serial.print(" sensor4: ");
  Serial.print(flexposition4);
   Serial.print(" sensor5: ");
  Serial.println(flexposition5);
  delay(100);

}

pocedani

 //ESCLAVO

#include <SoftwareSerial.h>
#define BT_SERIAL_TX 2
#define BT_SERIAL_RX 3
SoftwareSerial BluetoothSerial(BT_SERIAL_TX, BT_SERIAL_RX);
#include <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
unsigned int flexposition1;
unsigned int flexposition2;
unsigned int flexposition3;
unsigned int flexposition4;
unsigned int flexposition5;
int servoposition1;
int servoposition2;
int servoposition3;
int servoposition4;
int servoposition5;
int sensorMin = 730;
int sensorMax = 940;


char cmd[100];
int cmdIndex;



void exeCmd(){

if( cmd[0]=='f' &&
 cmd[1]=='l' &&
 cmd[2]=='e' &&
 cmd[3]=='x' &&
 cmd[4]=='1' &&
 cmd[5]==' ' ) {
   
  int val = 0;
  for(int i=6; cmd!=0; i++) { // number begins at cmd[6]
    val = val*10 + (cmd-'0');
  }

 servo1.write(val);


}


if( cmd[0]=='f' &&
 cmd[1]=='l' &&
 cmd[2]=='e' &&
 cmd[3]=='x' &&
 cmd[4]=='2' &&
 cmd[5]==' ' ) {
   
  int val = 0;
  for(int i=6; cmd!=0; i++) { // number begins at cmd[6]
    val = val*10 + (cmd-'0');
  }
 

 servo2.write(val);

}

if( cmd[0]=='f' &&
 cmd[1]=='l' &&
 cmd[2]=='e' &&
 cmd[3]=='x' &&
 cmd[4]=='3' &&
 cmd[5]==' ' ) {
   
  int val = 0;
  for(int i=6; cmd!=0; i++) { // number begins at cmd[6]
    val = val*10 + (cmd-'0');
  }
 

 servo3.write(val);;
}

if( cmd[0]=='f' &&
 cmd[1]=='l' &&
 cmd[2]=='e' &&
 cmd[3]=='x' &&
 cmd[4]=='4' &&
 cmd[5]==' ' ) {
   
  int val = 0;
  for(int i=6; cmd!=0; i++) { // number begins at cmd[6]
    val = val*10 + (cmd-'0');
  }
 

 servo4.write(val);
}

if( cmd[0]=='f' &&
 cmd[1]=='l' &&
 cmd[2]=='e' &&
 cmd[3]=='x' &&
 cmd[4]=='5' &&
 cmd[5]==' ' ) {
   
  int val = 0;
  for(int i=6; cmd!=0; i++) { // number begins at cmd[6]
    val = val*10 + (cmd-'0');
  }
 

 servo5.write(val);
}



}


void setup()
{
Serial.begin(57600);
BluetoothSerial.begin(57600);
servo1.attach(8);
servo2.attach(9);
servo3.attach(10);
servo4.attach(11);
servo5.attach(12);


cmdIndex = 0;
}



void loop()


if (BluetoothSerial.available()>0){

char c = (char)BluetoothSerial.read();
   

if(c=='\n') {
 cmd[cmdIndex] = 0;
 exeCmd();  // ejecutar command
 cmdIndex = 0; // reset cmdIndex
} else {      
 cmd[cmdIndex] = c;
 if(cmdIndex<99) cmdIndex++;
}

}

}

_jose_

Porfavor repasa las normas del foro ,sobre todo en lo referente a como adjuntar codigo y modifica tu post para adecuarlo a dichas normas.gracias.

_jose_

#4
Feb 23, 2018, 09:01 am Last Edit: Feb 23, 2018, 11:44 am by _jose_
Bien dicho esto,creo que te complicas demasiado con las conversiones a diferentes formatos que al final gastan tiempo de proceso innecesariamente.Si solo vas a enviar posiciones de servo ,quizas seria mas eficiente enviar algun tipo de codigo numerico.Una posible solucion seria una variable tipo int que puedes dividir en dos bytes ,numero de servo y posicion y en el maestro enviar esta variable que contiene los dos datos, separaradas por algun caracter no numerico para poder usar en el esclavo  Serial.parseInt() para recoger los comandos y separar el numero de servo de la posicion.

ArduMyth

¿Qué no hay nada en internet?
¿Cómo o qué has buscado?

Muchos modelos de manos protésicas en 3D suelen tener un enlace a github con el código... Y hablo de las dos principales de 3D con contenido gratuito...

Tienes que usar map con el valor analógico de los sensores usando un debounce vía hardware o por software.

Y si usas un bluetooth sólo tienes que enviar un valor para cada servo y a continuación la posición. Es trabajar con la cadena que envías y algún caracter de separación.

No hay más. Desde luego no hay que usar tantas líneas.

Saludos.

Go Up