Brazo Robótico Bluetooth (T2)

     Este proyecto de Brazo Robótico controlado con Bluetooth, es muy similar al que mostramos anteriormente en este Blog (https://robotongas.blogspot.com/p/brazo-rob-simple.html), la diferencia fundamental es el control por medio de un Bluetooth, que también en uno de los proyectos de este Blog enseñamos a configurar (https://robotongas.blogspot.com/p/rele-controlado-por-bluetooth.html
     A continuación podrán ver un video con todos los detalles necesarios para llevar este proyecto a buen término.


     Para saber como subir el software Android que mostramos, pueden verlo en este link: https://youtu.be/3Dr9XNb9bMc

----- A continuación, fotografías de varios ángulos del proyecto -----






Programación Arduino

#include <SoftwareSerial.h> // Librería para definir pines como serial
#define TxD 8 // Pin 8 con transmisor
#define RxD 9 // Pin 9 con receptor
SoftwareSerial BTSerial(TxD, RxD); // Indicamos al Serial cuales son Pines Tx y Rx

// almacenar datos de anchos de pulsos para mover servos,
// con decimales para mayor precisión
float ancho_pulso_1; // servo 1
float ancho_pulso_2; // servo 2
float ancho_pulso_3; // servo 3

int g1 = 90; // Variable posición horizontal Servo 1, 90°= centro recorrido
int g2 = 0; // Variable  posición vertical, Servo 2, 0°= abajo recorrido
int g3 = 180; // Variable apertura pinzas, Servo 3, 180°= cerradas
int led1 = 2; // asignamos pines a las variables de los led
int led2 = 3;
int led3 = 4;
int estado = 0;// Variable almacenar recepción bluetooth
int luz;// Variable almacenar valores Pines 2, 3, 4 / imprimir en puerto Serial

void setup() {
  Serial.begin(9600);// Iniciamos puerto Serial / imprimir información
  Serial.println("-----------------------------------");
  Serial.println("           Sistema Listo");
  Serial.println("-----------------------------------");
  pinMode(led1, OUTPUT);// Seteamos Pines 2, 3, y 4 como salida
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);

  BTSerial.flush();// Limpiamos Serial del Bluetooth
  delay(500);// Esperamos medio segundo
  BTSerial.begin(9600);// Iniciamos puerto serial del Bluetooth
  delay(500);// Esperamos medio segundo
}

void loop() {
  if (BTSerial.available()) {//Si serial BT está habilitado...
    estado = BTSerial.read();//Almacenamos en variable 'estado' valor del serial

    if (estado == 'a')// si el valor de 'estado' = 'a'
      digitalWrite(led1, !digitalRead(led1));// Leemos valor Pin 2 y escribimos lo opuesto
    luz = digitalRead(led1);// En variable 'luz' almacenamos valor Pin 2
    Serial.print("Led 1: "); Serial.println(luz);// Imprimimos resultado en pantalla

    if (estado == 'b')
      digitalWrite(led2, !digitalRead(led2));
    luz = digitalRead(led2);
    Serial.print("Led 2: "); Serial.println(luz);

    if (estado == 'c')
      digitalWrite(led3, !digitalRead(led3));
    luz = digitalRead(led3);
    Serial.print("Led 3: "); Serial.println(luz);

    if (estado == '1')// si el valor almacenado en 'estado' = '1'
      izquierda();// vamos a la función izquierda
    if (estado == '2')
      derecha();
    if (estado == '3')
      arriba();
    if (estado == '4')
      abajo();
    if (estado == '5')
      abrir();
    if (estado == '6')
      cerrar();
    if (estado == '7')
      parar();
  }
}

void izquierda() {
  while (estado == '1') {// si valor 'estado'= 1 / seguimos en esta rutina
    if (BTSerial.available()) {// Si el serial BT está habilitado
      estado = BTSerial.read();// Almacenamos el valor en 'estado'
    }
    moverServo_1(10, g1);// vamos a la función moverServo_1
    Serial.print("izquierda: "); Serial.println(g1);// Imprimir posición servo en grados
    g1++; if (g1 > 180) {// suma de a 1 grado - si es > que 180, sea 180
      g1 = 180;
    } 
  }
}

void derecha() {
  while (estado == '2') {
    if (BTSerial.available()) {
      estado = BTSerial.read();
    }
    moverServo_1(10, g1);
    Serial.print("derecha: "); Serial.println(g1);
    g1--; if (g1 < 0) {
      g1 = 0;
    }
  } 
}

void arriba() {
  while (estado == '3') {

    if (BTSerial.available()) {
      estado = BTSerial.read();
    }
    Serial.print("arriba: "); Serial.println(g2);
    moverServo_2(11, g2);
    g2++; if (g2 > 180) {
      g2 = 180;
    }
  }
}

void abajo() {
  while (estado == '4') {
    if (BTSerial.available()) {
      estado = BTSerial.read();
    }
    Serial.print("abajo: "); Serial.println(g2);
    moverServo_2(11, g2);
    g2--; if (g2 < 0) {
      g2 = 0;
    }
  }
}

void cerrar() {
  while (estado == '6') {

    if (BTSerial.available()) {
      estado = BTSerial.read();
    }
    Serial.print("cerrar: "); Serial.println(g3);
    moverServo_3(12, g3);
    g3++; if (g3 > 180) {
      g3 = 180;

    }
  }
}

void abrir() {
  while (estado == '5') {

    if (BTSerial.available()) {
      estado = BTSerial.read();
    }
    Serial.print("abrir: "); Serial.println(g3);
    moverServo_3(12, g3);
    g3--; if (g3 < 90) {
      g3 = 90;

    }
  }
}

void parar() {
  while (estado == '7') { // si presionamos en el celular STOP, enviamos el número '7' y vamos a la                                             //función 'parar'
 // mientras estado sea = '7' nos mantenemos en esta rutina
    if (BTSerial.available()) {  //Si el Serial del BT está habilitado, leemos el envío
      estado = BTSerial.read(); // y   almacenamos el valor en 'estado'  
    }
    Serial.println("----------------------------");
    Serial.println("     sistema detenido ");
    Serial.println("     seleccione botón");
    Serial.println("----------------------------");

    Serial.print("Servo 1 = "); Serial.print(g1); Serial.print(" grados / ");
    Serial.print("ancho pulso : "); Serial.print(ancho_pulso_1 / 1000); Serial.print (" ms");
    Serial.print(" / resto ancho pulso : "); 
    Serial.print((25000 - ancho_pulso_1) / 1000); Serial.println (" ms");

    Serial.print("Servo 2 = "); Serial.print(g2); Serial.print(" grados / ");
    Serial.print("ancho pulso : "); Serial.print(ancho_pulso_2 / 1000); Serial.print (" ms");
    Serial.print(" / resto ancho pulso : "); S
    Serial.print((25000 - ancho_pulso_2) / 1000); Serial.println(" ms");

    Serial.print("Servo 3 = "); Serial.print(g3); Serial.print(" grados / ");
    Serial.print("ancho pulso : "); Serial.print(ancho_pulso_3 / 1000); Serial.print (" ms");
    Serial.print(" / resto ancho pulso : "); 
    Serial.print((25000 - ancho_pulso_3) / 1000); Serial.println(" ms");

    break;
  }
}
// Para variar posición Servo, enviamos tren de pulsos cada uno de 25 ms.
// si la duración del pulso es de 0,5 ms posición extremo 1 (0°)
//                                1,5 ms posición central (90°)
//                                2,5 ms posicion extremo 2 (180°)
void moverServo_1 (int pin, int angulo_1)// moverServo_1( pin 10, grados);
{
  pinMode(pin, OUTPUT); // pin 10 como salida
  ancho_pulso_1 = angulo_1 * 2000.0 / 180.0 + 500; // determinamos el ancho del pulso
  digitalWrite(pin, HIGH);// ponemos e  l estado del pin 10 en 5 voltios
  delayMicroseconds(ancho_pulso_1);// esperamos el ancho de pulso determinado por el ángulo
  digitalWrite(pin, LOW);// ponemos el estado del pin 10 en 0 voltio
  delayMicroseconds(25000 - ancho_pulso_1); // hasta que se complete 25 ms
}

void moverServo_2 (int pin, int angulo_2)
{
  pinMode(pin, OUTPUT);
  ancho_pulso_2 = angulo_2 * 2000.0 / 180.0 + 500;
  digitalWrite(pin, HIGH);
  delayMicroseconds(ancho_pulso_2);
  digitalWrite(pin, LOW);
  delayMicroseconds(25000 - ancho_pulso_2); delay(20);
}

void moverServo_3 (int pin, int angulo_3)
{
  pinMode(pin, OUTPUT);
  ancho_pulso_3 = angulo_3 * 2000.0 / 180.0 + 500;
  digitalWrite(pin, HIGH);
  delayMicroseconds(ancho_pulso_3);
  digitalWrite(pin, LOW);
  delayMicroseconds(25000 - ancho_pulso_3);
}


     A pesar de haber revisado el proyecto cientos de veces, de seguro deben haber algunos errores, si es así, por favor escríbenos para corregirlo. email: robot@tongas.cl

----- Diagrama del interconexionado de los componentes -----


----- Vista ideal de las conexiones en la placa de conexionado ----

     En esta primera imagen vemos la vista superior

     En esta vista vemos los caminos en espejo, para ser cortado con una CNC o dibujarlos y aplicarles el ácido para fabricar la tarjeta de conexiones.

Vista superior del diagrama anterior

Imagen de la interface del celular con el software funcionando


Bloques de programacion en App Inventor

Cualquier duda, me pueden escribir a robot@tongas.cl o gastoncenteno@vtr.net