domingo, 19 de mayo de 2013

Como hacer menús en Pinguino


MENÚS

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 cualquier tecla para 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 mensaje retardo y tendrá el valor de 100 mili segundos por defecto, con las opciones - o + se podrá incrementar o disminuir el tiempo. Presionada la opción ENT se pasara al Menu4 o si es presionada la opción ESC ser retornara al Menu2.
  • Menu4: Menú de ejecutar el giro del motor, mostrara el mensaje Salir o Ejecutar. Presionada la opción ENT se ejecutara el giro del motor según la configuración realizada en los anteriores menús o si es presionada la opción ESC ser retornara al Menu1.

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 enter
int menu;//Varaible de navegacion o de estado actual
void 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
   }
  }
}

3 comentarios:

  1. hola julio esta muy bueno tu post, soy novato en esto y quisiera que pongas en el post el conexionado del motor paso a paso lo que necesito es controlar el numero de vueltas que tiene que realizar y la velocidad. Gracias

    ResponderEliminar
  2. muy bueno tu post, no explore tu pagina todavia pero tenes tutoriales para los que enpiezan de zero?

    ResponderEliminar
  3. esta muy bueno este pos pero me puedes decir que tipo de compilador utilizas para descargar el codigo al pic18f4550. estoy trabajando con el pinguino-ide pero el código no sirve para este compilador

    ResponderEliminar