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 ----
Vista superior del diagrama anterior
Imagen de la interface del celular con el software funcionando