COMUNICACIÓN SERIAL ASÍNCRONA ENTRE DOS TARJETAS ARDUINO
Este ejemplo básico realiza la comunicación entre un Arduino que hace de emisor y otro de receptor
En este ejemplo se emplea la función Serial.write() para enviar un numero entero que puede ser cualquier valor entre 0 a 255, es decir el dato de 1 Byte
En el receptor se declara una variable entera para almacenar el valor leído por medio de la función Serial.read() la variable de almacenamiento también puede ser de tipo char pero en este caso se tendrá en cuenta el valor equivalente en código ASCII para realizar la comparación, por ejemplo las equivalencias en las estructuras condicionales serian:
if(Dato==48) equivale a if(Dato=='0') si Dato es de tipo char en lugar de int
En este ejemplo se debe de tener en cuenta que la lectura de datos se realiza dos veces mas rápido de lo que se hace el envío gracias a funciones de retardo realizadas tanto en el receptor como en el emisor.
Ejemplo Realizado En 123D Circuits
En este ejemplo se conectan dos tarjetas un que envía la que tiene la conexión en TX y otra que recibe la que tiene la conexión en RX.
int Dato; void setup(){ Serial.begin(9600); pinMode(13,OUTPUT);//Led que trae incorporado la tarjeta Arduino }
void loop(){ if (Serial.available() > 0) {//Verifica que hay datos en el buffer de recepcion Dato = Serial.read();//Lee dato Serial.print("Dato Recibido = ");//Muestra que dato fue leido en el Serial Monitor Serial.println(Dato); if(Dato==48){ digitalWrite(13,LOW);//Apaga Led } if(Dato==49){ digitalWrite(13,HIGH);//Enciende Led } delay(100);//Retardo entre lecturas de datos } }
Código de Arduino que recibe:
int Dato; void setup(){ Serial.begin(9600); pinMode(13,OUTPUT);//Led que trae incorporado la tarjeta Arduino }
void loop(){ if (Serial.available() > 0) {//Verifica que hay datos en el buffer de recepcion Dato = Serial.read();//Lee dato Serial.print("Dato Recibido = ");//Muestra que dato fue leido en el Serial Monitor Serial.println(Dato); if(Dato==48){ digitalWrite(13,LOW);//Apaga Led } if(Dato==49){ digitalWrite(13,HIGH);//Enciende Led } delay(100);//Retardo entre lecturas de datos } }
EJEMPLO DE UN MENÚ DE NAVEGACIÓN EMPLEANDO PANTALLA LCD
Los menús son una forma ordenada de ejecución de un programa que permita configurar y seleccionar diferentes procesos.
En este ejemplo se configura y se ejecuta el encendido y apagado de un led, los parámetros a configurar son:
El retardo de encendido que puede ir de 100 a 1000 milisegundos
El numero de veces que se ejecutar el ciclo de encendido y apagado del LED
Se emplearan 4 pulsadores para poder navegar en el menú y configurar los parámetros.
Hay dos ejemplos de código, uno realizado con switch - case donde cada caso es una opción del menú. El otro ejemplo emplea estructuras cíclicas while donde un cada ciclo while contiene una opción de menú.
Esta publicación muestra la conexión básica de un decodificador para display de 7 segmentos, tanto para Arduino como Pinguino. En la siguiente figura se muestra la distribución de terminales de un display de 7 segmentos de cátodo común, el de ánodo común tendrá el terminal central conectado a VCC (5V)
Display de 7 segmentos
CONEXIÓN A UN DISPLAY DE CÁTODO COMÚN
Un display de cátodo común tiene su terminal común a tierra (GND).
La conexión aquí mostrada emplea un decodificador BCD para display de 7 segmentos de cátodo común con el circuito integrado cd4511 siendo equivalente también el 74HC48.
El montaje y simulación de este circuito se realizo con la herramienta 123D Circuits al final de este articulo esta el enlace respectivo.
Conexión con el cd4511
CONEXIÓN A UN DISPLAY DE ÁNODO COMÚN
Un display de ánodo común tiene su terminal común a VCC (5V).
La
conexión aquí mostrada emplea un decodificador BCD para display de 7
segmentos de cátodo común con el circuito integrado 7447.
Conexión Arduino con el 7447
Conexión Pinguino 7447
CÓDIGO DE EJEMPLO 1
El siguiente programa emplea escritura directa al puerto D de la tarjeta Arduino con la instrucción PORTD.
Este programa consiste en un contador cíclico de 0 a 9 incrementando la variable contadora i y asignando su valor al puerto D del microcontroaldor.
El decodificador 74138 es un dispositivo estándar de amplio uso ya sea como elemento electrónico que se consigue en una tienda electrónica o como dispositivo que se puede sintetizar en una FPGA.
La librería empleada en Logisim para la realización del circuito que se observa en el vídeo se puede descargar del siguiente enlace
En la tabla se observa que las salidas son activas bajas y que para que opere las entras de activación deben conectarse adecuadamente sino las salidas siempre serán uno.
Tabla de la verdad del 74138
Explicación del funcionamiento
Generación de funciones lógicas con decodificadores
Los decodificadores son también generadores de minterminos por lo tanto con ellos es posible realizar circuitos lógicos combinatorios a partir de tablas de la verdad o ecuaciones boolenas.
El siguiente vídeo explica el principio de operación del decodificador como generador de minterminos para la realización de un circuito que indique si un numero de 3 bits es impar.
Generación de funciones lógicas
En el vídeo se empleo una compuerta OR con entradas negadas (negativa OR), empleando el teorema de DeMorgan se puede realizar el equivalente lógico correspondiente empleando una compuerta NAND.
En la tabla se observa que /(B.A) = /B + /A que es la equivalencia que se aplica para emplear una compuerta NAND en lugar de una negativa OR
Una de la inquietudes con la tarjeta pinguino es su posibilidad de emplearla para aplicaciones compiladas en otros leguajes (CCS, PIC18, COWBASIC). Explorando la Web me encontre con una modificación realizada en la pagina de microembebidos
En la pagina lo que se expone es la implementacion de un Bootloader que descargado en la tarjeta pinguino permite descargar los archivos .hex de las aplicaciones realizadas con otros compiladores diferentes a Pinguino.
La instalación no se ha probado en windows 8 , pero quizas necesite la instalacion en modo de controladores no firmados. En windows 8.1 el proceso es un poco diferente, aqui hay uno enlaces con la explicacion
Cables Adaptadores USB a RS232
En los computadores actuales ya no se encuentra el antes común puerto serial con conector DB9, sin embargo este puerto es muy utilizado para la realización de interfaz entre el computador aplicaciones electrónicas microcontraladas.
Como solución en el mercado se disponen de adaptadores de USB a RS232 de bajo consto, pero con el inconveniente de que el CD de los controladores esta en idioma chino o simplemente se tiene el adaptador pero no los controladores. También hay que tener en cuenta que estos cables adaptadores tienen diferentes chips y que de acuerdo a esto se instala el controlador en el caso del sistema operativo windows xp y 7.
(En windows 8 hasta ahora las pruebas de instalación realizadas son negativas ) Cable Adaptador USB a RS232 HL-340
Este cable adaptador es común de conseguir y se puede identificar en su mayoría por ser de color verde, tal como se muestra en la foto de arriba.
Para estar seguros de que el cable corresponde al HL-340 se puede utilizar la consola de Linux y ejecutar el comando lsusb.
lsusb hl-340
Identificado el chip del cable adaptador se procede a buscar el controlador, para este adaptador se encontró que corresponde al CH341SER.ZIP que se pude descargar de los siguientes enlaces.
Encontré que para las recomendaciones de instalación en windows 7 es que una vez descomprimido el archivo CH341SER.ZIP, es que se use el propio asistente de instalación de controladores de windows 7 y no el ejecutable que hay dentro de la carpeta.
Cable Adaptador USB a RS232 Prolific PL-2303
Este cable adaptador es uno de los mas populares, según el fabricante están siendo falsificados sus adaptadores y que estos productos pueden tener problemas en windows.
También el fabricante confirma que no todas las referencias de este chip es compatible para windows 8
Para estar seguros de que el cable corresponde al ProlificPL-2303 se puede utilizar la consola de Linux y ejecutar el comando lsusb.
Identificado el chip del cable adaptador se procede a buscar el controlador, que se pude descargar de los siguientes enlaces.
La prueba realizada para su instalación en windows 7 se procedió a actualizar el controlador y de forma manual se selecciona la carpeta, luego la instalación la realizo el propio sistema.
Los menús de navegación se utilizan para configurar,mostrar y ejecutar procesos en una aplicación,su forma mas común de implementación en aplicaciones con microcontroladores es la de utilizar una pantalla LCD y unos cuantos botones para selección o un teclado matricial dependiendo de la aplicación a realizar.
En esta publicacion se tratara de un menu sencillo con 4 botones pulsadores para la selección de opciones.
MONTAJE DE PANTALLA LCD Y BOTONES
Este esquema muestra configurado el LCD a 4 bits y 4 botones pulsadores con resistencias de Pull Up, es por esto que cuando se presiona un pulsador tenemos un bajo y en el código aparece en la condición que se evalúa si los pulsadores son LOW.
APLICACIÓN A REALIZAR
Descripción General
Realizar un menú de navegación que permita controlar un motor paso a paso de manera que el usuario pueda indicar el sentido de giro, el numero de secuencias de pasos a ejecutar y el retardo entre pasos:
Planeación Del Menú De Navegación
Se enumeran las diferentes etapas o instancias en el programa:
Presentación y bienvenida.
Selección del sentido de giro.
Indicación del numero de secuencias a realizar.
Indicación del retardo entre pasos para controlar la velocidad del motor.
Ejecución del giro del motor.
Descripción De Los Menús y Los Procesos
Se describe en detalle que hace cada menú y el proceso a realizar en este.
Menu0: Menú de presentación y bienvenida, este menú se presentara por primera a vez al iniciar por primera vez la aplicación, deberá mostrar el nombre de la aplicación y el nombre de la institución, esperara a que se presione cualquierteclapara continuar. Una vez en ejecución la aplicación, no se debe retornar mas a este menú.
Menu1: Menú de selección de sentido de giro, este menú mostrara el mensaje sentido giro, que se seleccionaran con las opciones Izq o Der respectivamente. Presionada la opción ENT, se pasara al Menu2.
Menu2: Menú de selección del numero de secuencias de pasos a realizar, mostrara el mensaje secuencias y tendrá el valor de 12 por defecto, equivalente a un giro completo para un motor paso a paso de 7.5 grados con las opciones Dec o Inc se podrá incrementar o disminuir el numero de secuencias. Presionada la opción ENT se pasara al Menu3 o si es presionada la opción ESC ser retornara al Menu1.
Menu3: Menú de selección del retardo entre pasos, mostrara el mensajeretardoy tendrá elvalor de 100 mili segundospor defecto, con las opciones-o+se podrá incrementar o disminuir el tiempo. Presionada la opción ENTse pasara alMenu4o si es presionada la opción ESCser retornara alMenu2.
Menu4: Menú de ejecutar el giro del motor, mostrara el mensaje Salir o Ejecutar. Presionada la opción ENTse ejecutara el giro del motor según la configuración realizada en los anteriores menús o si es presionada la opción ESCser retornara alMenu1.
Prototipos De Pantalla
Se muestra gráficamente como se verán las opciones en la pantalla para cada uno de los menús.
Diagrama De Estados
Indica como se navega en el sistema de menús según las teclas presionadas.
Las transiciones se dan por medio de las teclas que se presionen, las teclas ENT y ESC son las que permiten avanzar o retroceder entre menús.
Cuando se entra a un menú se llama una subprograma o rutina que ejecuta el procedimiento indicado según el menú.
Diagrama De Flujo
Para entrada a cada menú se empleara una variable que indicara en que estado o menú estoy, esta variable cambiara de estado según la tecla que se presione. Se empleara un ciclo mientras por cada menú y así representar los estados.
CÓDIGO DEL PROGRAMA DE NAVEGACIÓN
El presente código contempla solo la navegación entre menús, no están las rutinas o funciones correspondientes a las partes operativas que tiene que ver con el motor paso a paso. Este código se presente como una plantilla que pueda ser utilizada para la construcción de otros menús.
NOTA: El código esta escrito para Pinguino IDE 9.05, por la tanto las instrucciones de LCD deben ser modificadas para llevarlo a las versiones PinguinoX3 y PinguinoX4.
// Manejo de menus// Realizado en Pinguino Beta 9-05// Julio Fabio De La Cruz G. 2013#define PIC18F4550//Definiciones para el LCD#define EN 21 //21 es el terminal Enable del LCD#define RS 22 //22 es el terminal RS del LCD#define D4 25 //25 es el terminal de dato 4 del LCD#define D5 26 //26 es el terminal de dato 5 del LCD #define D6 27 //27 es el terminal de dato 6 del LCD #define D7 28 //28 es el terminal de dato 7 del LCD//Definiciones para los pulsadores por defecto#define S1 17 //pusador S1#define S2 18 //pusador S2#define S3 19 //pusador S3#define S4 20 //pusador S4//Definiciones para los pulsadores segun la aplicacion#define ESC 17 //Pulsador S1 como escape#define DEC 18 //Pulsador S4 como enter#define INC 19 //Pulsador S1 como escape#define ENT 20 //Pulsador S4 como enterint menu;//Varaible de navegacion o de estado actualvoid setup(){
menu=0;//Por primera vez en cero para entrar al menu 0
lcd(RS, EN, D4, D5, D6, D7,0,0,0,0);// RS, E, D4 ~ D8
lcd.begin(2,0);//Configuro los terminales de entrada
pinMode(17,INPUT);//Pulsador S1
pinMode(18,INPUT);//Pulsador S2
pinMode(19,INPUT);//Pulsador S3
pinMode(20,INPUT);//Pulsador S4}void loop(){while(menu==0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Motor Paso-Paso");
lcd.setCursor(0,1);
lcd.print("UNIAJC 2013 633");
delay(200);if(digitalRead(ESC)==LOW||digitalRead(DEC)==LOW||digitalRead(INC)==LOW||digitalRead(ENT)==LOW){
menu=1;//pasa el menu 1}}while(menu==1){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Sentido Giro");
lcd.setCursor(0,1);
lcd.print(" Izq Der Ent");
delay(200);if(digitalRead(ENT)==LOW){
menu=2;//pasa al menu 2}}while(menu==2){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Secuencias");
lcd.setCursor(0,1);
lcd.print("Esc Dec Inc Ent");
delay(200);if(digitalRead(ENT)==LOW){
menu=3;//pasa al menu 3}if(digitalRead(ESC)==LOW){
menu=1;//retorna al menu 1}}while(menu==3){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Retardo ms");
lcd.setCursor(0,1);
lcd.print("Esc Dec Inc Ent");
delay(200);if(digitalRead(ENT)==LOW){
menu=4;//Pasa al menu 4}if(digitalRead(ESC)==LOW){
menu=2;//Retorna al menu 2}}while(menu==4){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Salir Ejecutar");
lcd.setCursor(0,1);
lcd.print("Esc Ent");
delay(200);if(digitalRead(ESC)==LOW){
menu=1;//Retorna al menu 1}}}
Aquí muestro como se conecta una pantalla LCD tipo 1602 con un microcontrolador 16f628A.
El esquema puede ser adaptado fácilmente a cualquier otro microcontrolador
En el ejemplo que se muestra la conexión se hace para un microcontrolador 18f628A, pero también aplica para otros microntroladores haciendo las conexiones a los terminales RX y TX.
El conector utilizado es un DB9 hembra que sera compatible con la mayoría de los adaptadores USB-Serial RS232 o con una conexión directa a un puerto serie si el computador dispone de este.
Esquema de conexión
En el esquema todos los capacitores son de 1uf y el cátodo (lado negativo) esta marcado con una linea blanca.
El pickit no tiene una base para colocar y programa los microcontroladores, así que la conexión se puede hacer por medio de cables o haciendo una tarjeta con una base para el microcontrolador teniendo en cuanta las conexiones indicadas para cada microcontrolador. Aunque el gráfico menciona algunos microcontroladores la conexión aplica para cualquier microcontrolador pic según su numero de terminales.