Pic
shadow

Hay quien es un verdadero apasionado de los PIC, otros les intimida y prefieren decantarse por otro tipo de plataformas que simplifican parte del trabajo cómo puede ser Arduino o Pinguino. Tanto para unos cómo para otros vamos a descubrir lo sencillo que controlar via Bluetooth uno de estos pequeños chip.

Para este ejemplo vamos a utilizar un PIC16F628A, pero con cualquier otro modelo sería muy similar.

Para simplificar el aprendizaje vamos a limitarnos a encender y apagar un Led, pero podríamos controlar motores de corriente continua, relés.. el proceso es el mismo con algunas modificaciones evidentes.

IMPORTANTE: Cada módulo Bluetooth tiene una disposición distinta de sus patillas.Asegurate de saber dónde tiene las patillas correspondientes a Vcc,GND, Tx y Rx tu módulo.

El circuito que conecta el PIC con el módulo bluetooth y con el Led sería este:

circuito

Por desgracia tenemos que complicarlo un poco, los módulos bluetooth suelen funcionar a 3.3V, mientras que el PIC lo hace a 5V, así que necesitamos un pequeño circuito que pase de 5V a 3.3V y estabilice este voltaje para conseguir conexiones más estables. Para ello sólo necesitamos un regulador de tensión cómo el MCP1700 que rebajará el voltaje y un par de condensadores que lo estabilicen:

  • Protoboard Ampliar
    Esquema Ampliar

Cómo vemos hemos separado los dos circuitos para simplificar su comprensión, uno sigue exactamente igual que lo teniamos antes (añadiendo la alimentación) y el otro circuito será el que convierta los 5V con los que alimentamos al PIC en 3.3V para el módulo

Ahora viene la parte del software. Vamos a escribirlo en C para ahorrarnos el trago del hacerlo en ensamblador y despues lo compilaremos para nuestro PIC usando alguna de las herramientas disponibles (existen multiples dependiendo del sistema operativo, las hay gratuitas, de pago...con una simple busqueda en Google darás con la que más te guste. )

#include "conf.h"
#include <string.h>

//dirección del registro TRISA
#byte TRISA = 85  

//dirección del puerto A
#byte puerto_a = 05   
#bit RA0 = puerto_a.0 


#int_RDA
//Cuando entra un mensaje se produce una interrupción
void  RDA_isr(void) {

   char entrada[5]="\0";

   //Guardamos el mensaje recibido
   fgets(entrada,BLUE); 

   char led1[3]="\0"; 
   char led2[3]="\0"; 

   led1="1";
   led2="2";
 
 //Comparamos el mensajes recibido para saber que hacer:
 
   if(strcmp(entrada,led1)==0)RA0=0; //ON
   else if(strcmp(entrada,led2)==0)RA0=1;//OFF
  else {
  	int i;
   	for( i=1; i<=10; i++){ 
 		puerto_a=0x00;delay_us(300);puerto_a=0x03;delay_us(700); 
 		puerto_a=0x00;delay_ms(50); puerto_a=0x03;delay_ms(50);
 	}   
 }
 
}


void main() {  
   //Desactivamos los comparadores
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   //Activamos las interrupciones
   enable_interrupts(INT_RDA); 
   enable_interrupts(GLOBAL);  

   //configuramos el puerto A
   set_tris_a( 0xfe); 
   puerto_a =0x01;

   putc('Z'); 

	//como el mensaje produce una interrupción, el resto del tiempo estamos en un bucle infinito sin hacer nada
   while(true){     

    }                                
 }
	

Cómo podemos ver al principio del programa, se incluye un fichero llamado conf.h. Este fichero contiene las configuraciones necesarias para que el PIC funcione, simplemente debemos crearlo en el mismo directorio e incluir esto:

		#include <16F628A.h>

		#FUSES NOWDT                    //No Watch Dog Timer
		#FUSES INTRC_IO                 //Internal RC Osc
		#FUSES NOPUT                    //No Power Up Timer
		#FUSES NOPROTECT                //Code not protected from reading
		#FUSES NOBROWNOUT               //No brownout reset
		#FUSES NOMCLR                   //Master Clear pin used for I/O
		#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
		#FUSES NOCPD                    //No EE protection
		#FUSES RESERVED                 //Used to set the reserved FUSE bits

		#use delay(clock=4000000)
		#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,STREAM=BLUE,errors)

	

Y ya esta listo. Podemos usar un ordenador con un Bluetooth y un programa cómo el Hyperterminal para enviar mensajes a nuestro circuito.Concretamente un 0 para encender y un 1 para apagar.

Tambien podemos crear una pequeña aplicación para un telefono movil o una tablet y controlarlo desde allí. Si estas interesado en cómo hacer esto te aconsejo que consultes nuestros cursos.