Robot Sanduino controlado via Bluetooth con Android

Robot Sanduino A01 con Bluetooth

En esta entrada mostramos como conectar un robot Sanduino A01 (basado en Arduino UNO) con módulo bluetooth a un teléfono Android, utilizando una aplicación creada por nosotros mismos.

Para esto necesitaremos el programa MIT App Inventor 2

DescargaAplicación en Linea

Y la libreria SoftwareSerial para Arduino

SoftwareSerialLibrary

Conexión del módulo Bluetooth a la placa Arduino


#include <SoftwareSerial.h>

int estado=0;
int multi=0;
#define RxD 10
#define TxD 11
SoftwareSerial BTSerial(RxD, TxD);
  

void setup(){
  Serial.begin(9600);
  BTSerial.flush();
  delay(500);
  BTSerial.begin(9600);
  //Insertar aquí
}

void loop(){
  if(BTSerial.available()>0){
    estado = BTSerial.read();
    Serial.write(estado);
    Serial.print("\r\n");
    //Insertar aquí
  }
}

Para controlar el robot Sanduino


#include <SoftwareSerial.h>

int tRetrocede = 500;
int tAvanza = 50;
int tAlto = 40;
int tGiro = 70;

int estado=0;
int multi=0;
#define RxD 10
#define TxD 11
SoftwareSerial BTSerial(RxD, TxD);
  
void setup(){
  Serial.begin(9600);
     BTSerial.flush();
  delay(500);
  BTSerial.begin(9600);

  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  
}

void loop(){
  if(BTSerial.available()>0){
    estado = BTSerial.read();
    Serial.write(estado);
    Serial.print("\r\n");
    digitalWrite(9,HIGH);
  }
  if (estado == '1') {
    avanza(100);
    Serial.print("Avanza");
  }
  if (estado == '2') {
    derecha(100);
    Serial.print("Derecha");
  }
  if(estado == '3') {
    retrocede(100);
    Serial.print("Retrocede");
  }
  if(estado == '4') {
    izquierda(100);
    Serial.print("Izquierda");
  }
  if(estado == '5') {
    alto(0);
    Serial.print("Alto");
  }
}

void alto(int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  delay(ms);
}

void derecha (int ms) {
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(ms);
}
void izquierda (int ms) {
  digitalWrite (6, LOW);
  digitalWrite (7, HIGH);
  digitalWrite (8, HIGH);
  digitalWrite (9, LOW);
  delay (ms);
}
void avanza (int ms) {
  digitalWrite (6, HIGH);
  digitalWrite (7, LOW);
  digitalWrite (8, HIGH);
  digitalWrite (9, LOW);
  delay (ms);
}

void retrocede (int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(ms);
}

Las funciones para mover el robot son las mismas funciones básicas describas en la entrada Robot Sanduino Control con funciones.

iRoX – Escuela de Verano Robótica 2017 – Segunda llamada

El Instituto de Robótica de Xalapa invita al público en general a su Escuela de Verano Robótica 2017 para niños, jóvenes y adultos, que se llevará a cabo del 14 al 22 de julio en Xalapa, Veracruz, México. Donde impartiremos cursos de robótica (y Raspberry Pi) independientes de dos o cuatro días:
  • Curso Raspberry Pi, 14 y 15 de julio, intensivo, 12 horas, dirigido a jóvenes y adultos.
  • Curso Robótica Lego NXT, 17 al 20 de julio, matutino, 16 horas, dirigido a niños y jóvenes.
  • Curso Robótica Arduino, 17 al 20 de julio, vespertino, 16 horas, dirigido a niños y jóvenes.
  • Curso Robótica Lego EV3, 21 y 22 de julio, intensivo, 12 horas, dirigido a jóvenes y adultos.

¿Conoces a algún niño o joven fuera de Xalapa a quien le gustaría aprender de robótica? Llévalo a Xalapa un fin de semana a tomar nuestro Curso Robótica Lego Ev3, o mejor aún, una semana completa para tomar dos o tres cursos de robótica.

NOTA: Tenemos descuentos en inscripción temprana, hasta el 30 de junio.

Puedes ver más información en nuestra página Escuela de Verano Robótica 2017, o escribirnos en nuestra página de contacto o al correo electrónico irox@robotsa.com.

El iRoX es sede de los equipos de robótica Galácticos, formados por niños que han obtenido los siguientes logros:

Lego Mindstorms EV3 código fuente disponible

Xander Soldaat publicó en 2013 un artículo en su blog botbench.com, dando a conocer que el código fuente del Lego Mindstorms EV3 está disponible para uso personal. Ver Enlace.

El código fuente está cargado en el espacio Mindboards Github: [LINK]. De donde se puede clonar el repositorio.

Entre los requisitos que Xander menciona para modificar el código fuente están:

  • Una máquina con Linux (puede ser virtual).
  • Eclipse.
  • Java JRE.
  • Code Sourcery Lite para ARM.
  • Un adaptador USB a puerto serial.
  • Una tarjeta SD.
  • Alicates de punta plana.
  • Un adaptador Netgear WNA1100 WiFi.

Si te gustan los robots Lego Mindstorms EV3, los retos de programación y te gustaría entra al mundo del desarrollo de código abierto (open source), este es un proyecto donde podrás aprender mucho e incluso hacer tus propias aportaciones.

Esta es la página de Xander: http://botbench.com/blog/2013/07/31/lego-mindstorms-ev3-source-code-available/

Robot Lego NXT Curiosito, un explorador… ¿de planetas?

Mars Rover – Lego Mindstorms NXT – Robot tipo Rover para exploración de Marte.

curiosity-mars-rover-medEn esta página se muestra el robot Lego Mindstorms NXT Curiosito, tipo Mars Rover (explorador de Marte) para simular la exploración de planetas o satélites. Está inspirado en el diseño de los robots exploradores del planeta Marte como Spirit, Oportunity o Curiosity.

Actualmente, Curiosity está explorando el planeta Marte, y se puede leer mucha información de la misión en el sitio web de la NASA, en la dirección http://mars.nasa.gov/msl/.

La misión de Curiosity es responder la pregunta: ¿Alguna vez pudo haber en Marte pequeñas formas de vida llamadas microbios?

El robot Lego NXT Curiosito, un explorador… ¿de planetas?

La intención de construir este robot fue como ejemplo para el curso Robótica en la exploración espacial del Instituto de Robótica de Xalapa, por motivo de su participación en la Semana Mundial del Espacio 2016, coordinado por la Agencia Espacial Mexicana.

lego-nxt-curiosito

Este robot está armado con las siguientes piezas:

  • Piezas de Lego Mindstorms NXT
  • 1 NXT
  • 3 Servomotores del Lego Mindstorms NXT
  • 4 ruedas omnidireccionales para eje Lego
  • 1 Cámara GoPro Hero 3

No hay instructivo, la idea de esta página es que el lector haga su propio robot Lego NXT Curiosito. En lugar de las ruedas omnidireccionales se pueden usar simplemente rines, sin la llanta para que el robot pueda girar libremente. También, en lugar de la cámara GoPro se puede usar un teléfono celular.

Robot Sanduino – Control con funciones

El uso de funciones en los lenguajes de programación es fundamental para escribir programas más compactos y legibles. Por ejemplo, para un robot Sanduino que hace lo siguiente de forma repetida:

  • Avanza 2 segundos
  • Retrocede 1 segundo
  • Avanza 1 segundo
  • Retrocede 2 segundos

Se puede tener el siguiente programa:

/* Programa: Sanduino_avretro.ino
   Autor: Julio Sandria (Enero 2015)
   Requiere: Robot Sanduino A01, con puente H
   y Arduino UNO conectados.
   Mueve el motor izquierdo con pines 6 y 7
   Mueve el motor derecho con pines 8 y 9
*/

void setup() {
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
}

void loop() {
  // Robot avanza 2 segundos
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  delay(2000);
  
  // Robot retrocede 1 segundos
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(1000);

  // Robot avanza 1 segundos
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  delay(2000);
  
  // Robot retrocede 2 segundos
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(2000);  
}

Se puede hacer un programa más compacto y que hace lo mismo usando las funciones avanza() y retrocede():

/* Programa: Sanduino_avretrof.ino
   Autor: Julio Sandria (Enero 2015)
   Requiere: Robot Sanduino A01, con puente H
   y Arduino UNO conectados.
   Mueve el motor izquierdo con pines 6 y 7
   Mueve el motor derecho con pines 8 y 9
*/

void setup() {
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
}

void loop() {
  avanza(2000);
  retrocede(1000);
  avanza(1000);
  retrocede(2000); 
}

void avanza(int tiempo) {
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  delay(tiempo);
}

void retrocede(int tiempo) {  
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(tiempo);
}

En la función loop se hacen las llamadas siguientes:

  avanza(2000);
  retrocede(1000);
  avanza(1000);
  retrocede(2000);

Observa que esto prácticamente se puede leer así: avanza 2000, retrocede 1000, avanza 1000, retrocede 2000 (los tiempos en milisegundos). Esto es mucho más fácil de leer y entender que el contenido de loop() del primer programa.

Después de la función loop() están las definiciones de las funciones avanza() y retrocede().

Robot Sanduino – Busca negro

El programa siguiente, hace que el robot Sanduino avance mientras detecta el suelo blanco. Cuando en el suelo detecta el color negro se detiene.

/* Programa: SanduinoBuscaNegro.ino
   Autor:    Julio Sandria (Enero 2015)
             Taller de Robótica 2015
   Robot Sanduino usando un sensor de luz 
*/

int pinSensorLuz = 2;
int valorSensorLuz = 0;
int tAvanza = 50;
int tAlto = 40;

void setup() {
  pinMode(pinSensorLuz,INPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  delay(3000);
}

void loop() {
  valorSensorLuz = digitalRead(pinSensorLuz);

  if( valorSensorLuz == 0 ) avanza(tAvanza);

  alto(tAlto);
}

/* Se define la función avanza()
   ms = tiempo en milisegundos */
void avanza(int ms) {
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  delay(ms);
}

/* Se define la función alto()
   ms = tiempo en milisegundos */
void alto(int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  delay(ms);
}

Copia el programa en el software Adruino y cárgalo a la tarjeta Arduino del Robot Sanduino. El robot debe tener conectado el sensor de luz izquierdo al pin 2 de Arduino.

Prueba el robot colocándolo en una superficie blanca o clara y déjalo avanzar hacia un superficie negra u obscura.

Observa el uso de las funciones avanza() y alto(), las cuales permiten unir cierta funcionalidad que siempre se repite.

De este ejemplo se deriva el programa para el Robot Sanduino Seguidor de línea.

Rotob Sanduino seguidor de línea

En el siguiente video se muestra el Robot Sanduino A01 seguidor de línea.

El programa siguiente, es la versión inicial para lograr que el robot siga la línea como se muestra en el video.

/* Programa: SanduinoSigueLinea.ino
   Autor:    Julio Sandria (Enero 2015)
             Taller Robótica 2015
   Robot Sanduino seguidor de línea 
   con dos sensores de luz             
*/

int pinSensorLuzI = 2;
int pinSensorLuzD = 4;
int valorSensorLuzI = 0;
int valorSensorLuzD = 0;
int tAvanza = 50;
int tGiro = 50;
int tAlto = 50;

void setup() {
  pinMode(pinSensorLuzI,INPUT);
  pinMode(pinSensorLuzD,INPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  delay(3000);
}

void loop() {
  valorSensorLuzI = digitalRead(pinSensorLuzI);
  valorSensorLuzD = digitalRead(pinSensorLuzD);

  if( valorSensorLuzI == 0 && valorSensorLuzD == 0 ) {
    avanza(tAvanza); 
  } 
  
  if( valorSensorLuzI == 1 ) {
    izquierda(tGiro);
  } 
  
  if( valorSensorLuzD == 1 ) {
    derecha(tGiro);
  }  
  
  alto(tAlto);
}

void avanza(int ms) {
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  delay(ms);
}

void retrocede(int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(ms);  
}

void izquierda(int ms) {
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(ms);  
}

void derecha(int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  delay(ms);
}

void alto(int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  delay(ms);
}

Copia el programa en el software Arduino y cárgalo a la tarjeta Arduino del Robot Sanduino A01.

¿Quieres aumentar la velocidad del robot? Prueba cambiando poco a poco las variables tAvanza, tGiro y tAlto.

 

Robot Sanduino – Sensor ultrasónico

El robot Sanduino A01 está equipado con un sensor ultrasónico HC-SR04 como el de la figura siguiente.

sensor-ultrasonico-hc-sr04_3

Para usar este sensor debes descargar la librería NewPing que está en esta dirección: http://playground.arduino.cc/Code/NewPing.

Es un archivo comprimido en formato zip que debes descomprimir, y la carpeta NewPing copiarla a la carpeta Arduino\libraries que debe estar en tu carpeta Documentos.

Este sensor lo puedes probar con el siguiente programa.

/* Programa: SensorUltrasonico.ino
 Autor: Julio Sandria (Enero 2015)
 Taller Robótica 2015 
*/

// Descargar NewPing: http://playground.arduino.cc/Code/NewPing
// Copia la carpeta NewPing en la carpeta ..\Arduino\libraries
#include <NewPing.h>

// PIN TRIGGER de sensor ultrasónico a PIN 11 de Arduino.
#define PIN_TRIGGER 11
// PIN ECHO de sensor ultrasónico a PIN 12 de Arduino:
#define PIN_ECHO 12
// Máxima distancia a medir en centímetros:
#define MAX_DISTANCIA 200 
// La distancia máxima del sensor es 400-500 cm. 

// La siguiente linea configura pines y distancia.
NewPing sonar(PIN_TRIGGER, PIN_ECHO, MAX_DISTANCIA);

int uS, distancia;

void setup() {
 // Abrir monitor serial a 9600 bauds/seg para ver resultados:
 Serial.begin(9600); 
}

void loop() {
 // Esperar 500ms entre pings (cerca de 20 pings/sec).
 // 29ms debe ser el menor tiempo entre pings.
 delay(500); 
 
 // Envía ping, obtiene tiempo ping en microsegundos (uS): 
 uS = sonar.ping();
 
 // Convertir tiempo ping a distancia.
 // (0 = distancia fuera de rango, no hay eco de ping).
 distancia = uS / US_ROUNDTRIP_CM; 
 
 Serial.print("Distancia: ");
 Serial.print(distancia); // Imprimir distancia 
 Serial.println("cm");
}

Copia el programa en el software Arduino y cárgalo a la tarjeta Arduino. Una vez cargado el programa y con la tarjeta aún conectada a la computadora, abre el Monitor Serial, en el cual podrás ver la lectura del sensor ultrasónico.

Acerca un objeto al sensor para verificar que esté funcionando apropiadamente.

Robot Sanduino – Sensores de luz

El robot Sanduino A01 está equipado con dos sensores de luz TCRT5000. Este sensor emite una luz infrarroja y detecta la cantidad de luz que se refleja en los objetos.

Sensor-de-luz-TCRT5000-300x200

Al colocar el emisor/receptor hacia el piso, puede detectar una línea negra colocada sobre un piso claro. Al usarlo así se le llama también sensor de línea. El emisor/receptor debe estar a una distancia aproximada de 5mm del piso y colocado como lo muestra la siguiente figura.

Sensores-de-linea-Sanduino-800x400

Cada sensor de luz tiene cuatro conectores, ambos sensores se deben conectar así en el robot Sanduino:

  • VCC – Al positivo del protoboard, que está conectado a 5V de Arduino.
  • GND – Al negativo del protoboard, que está conectado a GND de Arduino.

Para el sensor izquierdo:

  • DO (Data Output) – Al pin 2 de Arduino.
  • AO (Analog Output) – No lo usamos.

Para el sensor derecho:

  • DO (Data Output) – Al pin 4 de Arduino.
  • AO (Analog Output) – No lo usamos.

Con estas conexiones, se puede probar este programa ejemplo:

/* Programa: SensorLuz1.ino 
   Autor:    Julio Sandria (Enero 2015)
   Requiere un sensor de luz TCRT5000 conectado al
   pin 2 de Arduino.
*/

int pinSensorLuz1 = 2;
int valorSensorLuz1 = 0;
int valorSensorLuz1anterior = -1;

void setup() {
  pinMode(pinSensorLuz1,INPUT);
  Serial.begin(9600);
  Serial.println("Esperando 3 segundos...");
  delay(3000);
}

void loop() {
  valorSensorLuz1 = digitalRead(pinSensorLuz1);
  if( valorSensorLuz1 != valorSensorLuz1anterior ) {
    Serial.print( "valorSensorLuz1 = " );
    Serial.println( valorSensorLuz1 ); 
  }
  valorSensorLuz1anterior = valorSensorLuz1;
  delay(1000);
}

Copia el programa en el software Arduino y cárgalo a la tarjeta Arduino. Una vez cargado en Arduino, abre el Monitor Serial.

Observa lo que se muestra en el Monitor Serial cuando apuntas el sensor a una superficie clara y a una superficie obscura.

Robot Sanduino – Motores CD

El Robot Sanduino A01 usa dos motores de Corriente Directa (CD), los cuales se pueden conectar como se muestra en la siguiente figura.

SanduinoA01-MotoresCD

El puente H y la tarjeta Arduino UNO deben estar atornillados a la base superior del Robot Sanduino A01, usando un espaciador entre cada tarjeta de circuitos y la base superior, para evitar que las tarjetas se tuerzan al apretar los tornillos.

Las líneas de colores que unen conectores representan cables, que no necesariamente son de los colores mostrados.

Con el siguiente programa, puedes probar que todo el sistema esté apropiadamente conectado.

/* Programa: Sanduino_Motores.ino
   Autor: Julio Sandria (Enero 2015)
   Requiere: Robot Sanduino A01, con puente H
   y Arduino UNO conectados.
   Mueve el motor izquierdo con pines 6 y 7
   Mueve el motor derecho con pines 8 y 9
*/

void setup() {
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
}

void loop() {
  // Robot avanza 2 segundos
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  delay(2000);
  
  // Robot retrocede 2 segundos
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(2000);  
}

Carga el programa en la tarjeta Arduino UNO del robot.

NOTA: Asegúrate de conectar una fuente de energía al interruptor y otra fuente de energía a Arduino UNO.

Al iniciar el programa, el robot debe avanzar dos segundos. Si en lugar de esto el robot retrocede, entonces hay que cambiar la polaridad de los cables conectados a los motores y al puente H.

Si al iniciar el programa, el robot gira hacia un lado dos segundos, hay que invertir la polaridad de los cables del motor conectado hacia el lado que gira.