1. 1
Universidad Nacional Mayor de San Marcos
Facultad de Ingeniería de Sistemas e Informática
Arquitectura de Computadoras
Laboratorio 2 – Bluetooth
The JY-MCU module communicates with the Arduino via a serial connection. It has four pins
that we will be using:
VCC is used to power the module. It needs to be connected to the Arduino 5v pin.
GND is the ground pin. It needs to be connected to the Arduino Ground pin
TXD is used to send data from the module to the Arduino. It needs to be connected
to the serial receive pin (RX) of the Arduino, which is pin 0 in case of the Uno. If you
are using a different Arduino board, check its schematics to make sure you have the
right pin.
RXD is used to receive data from the Arduino. It needs to be connected to the the
Arduino serial transmit pin (TX) , which is pin 1 in the case of Arduino Uno.
3. 3
Como se observa la implementación de la conexión hace que los pines Rx t Tx se conecten
a los pines D0 y D1 de arduino, en ese caso se utiliza la librería serial como librería de acceso
serial en Arduino.
Sin embargo el gran problema en este caso es que no se podría utilizar el monitor serial por
que estarían ocupados sus pines en uso de conexión con Bluetooth. Por esta razón se
recomienda el uso de SoftwareSerial, el cual viene incluido en la IDE a partir de 1.0.5, con
el cual puede escogerse cualquier línea para Rx y Tx, como se vera en los siguientes
ejemplos.
a. Usando Blueterm
Es una aplicación para Android que es un emulador de terminal vt100 para conectarse a
cualquier dispositivo con puerto serie mediante un adaptador bluetooth-serie, es una
aplicación opensource que nos ayudara a enviar y recibir comandos rápidamente sin
necesidad de crear una aplicación android, aunque más adelante en otra parte de este
laboratorio, se creara una aplicación para personalizar completamente el proyecto.
Blueterm, terminal disponible en Google Play, se encuentra en la dirección
https://play.google.com/store/apps/details?id=es.pymasde.blueterm&hl=es_419
4. 4
El circuito a armar esta en la siguiente figura:
El codigo de este circuito es:
5. 5
//Programa prueba modulo bluetooth GP-GC021
//Probado con programas para android Blueterm y Amarino 2.0
//Probado con bluetooth portatil y software Octoplus Terminal
#include <SoftwareSerial.h>
const int rxPin = 4; //SoftwareSerial RX pin, conecta to JY-MCY TX pin
const int txPin = 2; //SoftwareSerial TX pin, conecta to JY-MCU RX pin
// nivel de 3.3 voltios puede ser necesario
SoftwareSerial mySerial(rxPin, txPin); // RX, TX
const int ledPin = 13; // led pin
void setup()
{
//Pin donde conectamos el led para ver el correcto funcionamiento del modulo
pinMode(ledPin,OUTPUT);
//Configuracion de la velocidad del modulo 9600 por defecto, se puede cambiar
//mediante comandos AT
mySerial.begin(9600);
digitalWrite(ledPin, LOW); // LED inicialmente esta apagado
}
void loop()
6. 6
{
//Mientras el puerto serie del modulo bluetooth esta disponible
while (mySerial.available() > 0)
{
//Guardamos en la variable dato el valor leido por el modulo bluetooth
char dato= mySerial.read();
//Comprobamos el dato
switch(dato)
{
//Si recibimos una 'w' encendemos el led 13 y enviamos para mostrar
//en Blueterm Led encendido
case 'w':
{
digitalWrite(13,HIGH);
mySerial.println("Led encendido");
break;
}
//Si recibimos una 'e' apagamos el led 13 y enviamos para mostrar
//en Blueterm Led apagado
case 'e':
{
digitalWrite(13,LOW);
mySerial.println("Led apagado");
break;
7. 7
}
//Si recibimos una 'r' encendemos y apagamos el led mediante la secuencia
//programa y mostramos en Blueterm Led intermitente
case 'r':
{
digitalWrite(13,HIGH);
delay(400);
digitalWrite(13,LOW);
delay(400);
digitalWrite(13,HIGH);
delay(200);
digitalWrite(13,LOW);
delay(200);
mySerial.println("Led intermitente");
break;
}
}
}
}
b. Usando AppInventor.
Una forma más sencilla de uso de Android con Arduino es via AppInventor en cuya versión
2, estamos desarrollando aplicaciones de demostración. En este caso encenderemos 3 leds
(Rojo, Verde y Azul) a través de botones en la interfaz del móvil. El circuito a implementar
es el siguiente:
8. 8
Los leds están conectados a los pines 8, 9 y 10 de Arduino, mientras que Rx y tx están
conectados alos pines 2 y 4.
A continuación la interfaz de la aplicación Android será la siguiente:
11. 11
El dato mas importante es la declaración de la MAC del modulo bluettoth:
Como se ve la MAC del bluetooth debe ser ingresada a la variable para poder realizar
conexión con esta tarjeta. Para conocer dicha dirección se puede usar Bluetooth Terminal,
el cual tiene la siguiente pantalla:
Se instala en el móvil y el se encarga de mostrar la MAC de los dispositivos detectados.
En el caso de Arduino, el codigo que se ha implementado para el circuito es:
12. 12
#include <SoftwareSerial.h>
const int rxPin = 4; //SoftwareSerial RX pin, conecta to JY-MCY TX pin
const int txPin = 2; //SoftwareSerial TX pin, conecta to JY-MCU RX pin
// nivel de 3.3 voltios puede ser necesario
SoftwareSerial mySerial(rxPin, txPin); // RX, TX
String dato;
//Variable de tipo cadena para guardar los datos recibidos
int rojo= 8;
int verde= 9;
int azul= 10;
void setup() {
mySerial.begin(9600);
//Iniciamos comunicación serial
//Salidas digitales
pinMode(rojo, OUTPUT);
pinMode(verde, OUTPUT);
pinMode(azul, OUTPUT);
}
13. 13
void loop() {
while (mySerial.available()) {
delay(10);
if (mySerial.available() > 0) {
char c = mySerial.read(); //Cuando se recibe un dato, se guarda como carácter
dato += c; //Cadena de caracteres formada por la suma de los datos recibidos
}
}
if (dato.length()> 0)
{
//Comprueba que la variable "dato" tenga al menos un caracter
if(dato == "1")
{
//Comparamos la cadena de caracteres con cada uno de los casos
mySerial.println("Encender led rojo"); //Muestra por el monitor serial la acción
realizada
digitalWrite(rojo, HIGH); //Enciende el led rojo
}
if(dato == "A") {
mySerial.println("Apagar led rojo");
digitalWrite(rojo, LOW);
}
if(dato == "2") {
mySerial.println("Encender led verde");
digitalWrite(verde, HIGH);
14. 14
}
if(dato == "B") {
mySerial.println("Apagar led verde");
digitalWrite(verde, LOW);
}
if(dato == "3")
{
mySerial.println("Encender led azul");
digitalWrite(azul, HIGH);
}
if(dato == "C") {
mySerial.println("Apagar led azul");
digitalWrite(azul, LOW);
}
dato=""; //Declaramos la variable "vacía" para volver a guardar de nuevo caracteres y
compararlos con cada uno de los casos
}
}
De esta manera el proyecto esta completo y funcionara correctamente.
21. 21
Donde
Tx del Bluetooth se conecta con el pin 9 de Arduino
Rx del Bluetooth se conecta con el pin 10 de Arduino
En cuanto a los leds del display…
a 2
b 3
b 4
22. 22
d 5
e 6
f 7
g 8
Codigo en Arduino:
#include <SoftwareSerial.h>
#include <stdio.h> /* printf, fgets */
#include <stdlib.h> /* atoi */
const int rxPin = 9; //SoftwareSerial RX pin, conecta to JY-MCY TX pin
const int txPin = 10; //SoftwareSerial TX pin, conecta to JY-MCU RX pin
// nivel de 3.3 voltios puede ser necesario
SoftwareSerial mySerial(rxPin, txPin); // RX, TX
String cadena;
String dato;
int valor=0;
char* numero;
char c;
byte segmentos[10][7] = {
{ 1,1,1,1,1,1,0 }, // = 0
{ 0,1,1,0,0,0,0 }, // = 1
24. 24
void loop()
{
delay(2000);
while (mySerial.available()) {
delay(10);
if (mySerial.available() > 0) {
c = mySerial.read(); //Cuando se recibe un dato, se guarda como carácter
dato += c; //Cadena de caracteres formada por la suma de los datos recibidos
}
if (dato.length()> 0)
{
//dato.toCharArray(numero,dato.length());
if(dato.charAt(0) >= '1' && dato.charAt(0) <= '9'){
//valor= atoi(numero);
valor = dato.charAt(0) - '0';
mostrar_display(valor);
cadena += valor;
mySerial.println(cadena);
mySerial.println("mostrando "+dato);
}
//Comprueba que la variable "dato" tenga al menos un caracter
25. 25
if(dato == "0"){
//apagar leds
digitalWrite(11,LOW);
digitalWrite(12,LOW);
mySerial.println("enviado "+dato);
}
if(dato == "a"){
//encender led azul
digitalWrite(11,HIGH);
mySerial.println("enviado "+dato);
}
if(dato == "v"){
//encender led verde
digitalWrite(12,HIGH);
mySerial.println("enviado "+dato);
}
}
dato=""; //Declaramos la variable "vacía" para volver a guardar de nuevo caracteres y
compararlos con cada uno de los casos
}
}
void mostrar_display(int valor1){
byte pin = 2;
for (byte segCount = 0; segCount < 7; ++segCount) {