Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Meta

#901
Electrónica / Re: Ayuda con un proyecto!
18 Febrero 2014, 14:07 PM
Hola

Para que no te sientas avandonado, estoy con el código. Por ahora te muesto uno incompleto y no útil, solo para que sepas que estoy trabajando.

Edito:
Ya he acabado.


Saludo.
#902
Cita de: engelx en 18 Febrero 2014, 00:40 AM
cheque el diagrama o datasheet del teclado y el lcd para ver primero que tipo de conexion vas a hacer y como capturar los datos... en el peor es de los casos puedes usar para el lcd un 74ls595 (o hc en lugar de ls), pero es complicado, ya que tienes que saber bien la logica del lcd y que vas a convertir de datos seriales en paralelos...

Hola:

La lógica del LCD te viene super explicado en espñol en este libro.  ::)



Cuando lo sepas, puedes conectar este LCD al al puerto paralelo y haces lo que quieras con cualquier lenguaje de programación. ;)

Hay LCD solo con protocolo del puerto serie o COM RS232, otros bajo I2C y este es en paralelo, el más rápido si se trabajan a 8 bits.

En cuanto de usar un LCD 16x2 con un teclado numérico, tengo los ejemplos para el PIC16F84A. Si los quiere te los mando por correo.


Aquí está el programa principal.
Código (asm) [Seleccionar]
; Cerradura Electrónica: la salida se activa cuando una clave de varios digitos introducida
; por teclado sea correcta. El esquema se describe en la figura 19-7.
;
; Tiene una salida "CerraduraSalida" que, cuando se habilita, activa durante unos segundos
; el electroimán de la cerradura permitiendo la apertura de la puerta:
;   - Si (CerraduraSalida) = 1, la puerta se puede abrir.
;   - Si (CerraduraSalida) = 0, la puerta no se puede abrir.
;
;Funcionamiento:
; - En pantalla visualiza "Introduzca CLAVE". Según se va escribiendo, visualiza asteriscos '*'.
; - Cuando termine de escribir la clave pueden darse dos posibilidades:
;     - Si la clave es incorrecta la cerradura sigue inactivada, en pantalla aparece el mensaje
; "Clave INCORRECTA" durante unos segundos y tiene que repetir de nuevo el proceso.
;     - Si la clave es correcta la cerradura se activa durante unos segundos y la puerta
; puede ser abierta. En pantalla aparece: "Clave CORRECTA" (primera línea) y "Abra
; la puerta" (segunda línea). Pasados unos segundos, se repite el proceso.
;
; ZONA DE DATOS **********************************************************************

LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

CBLOCK  0x0C
ENDC

; La clave puede tener cualquier tamaño y su longitud se calcula:

#DEFINE  LongitudClave (FinClaveSecreta-ClaveSecreta)
#DEFINE  CerraduraSalida PORTA,3

; ZONA DE CÓDIGOS ********************************************************************

ORG 0
goto Inicio
ORG 4
goto ServicioInterrupcion

Mensajes
addwf PCL,F
MensajeTeclee
DT "Teclee CLAVE:", 0x00
MensajeClaveCorrecta
DT "Clave CORRECTA", 0x00
MensajeAbraPuerta
DT "Abra la puerta", 0x00
MensajeClaveIncorrecta
DT "Clave INCORRECTA", 0x00
;
LeeClaveSecreta
addwf PCL,F
ClaveSecreta
DT 4h,5h,6h,0Eh ; Ejemplo de clave secreta.
DT 7h,8h
FinClaveSecreta

Inicio
call LCD_Inicializa
bsf STATUS,RP0
bcf CerraduraSalida ; Define como salida.
bcf STATUS,RP0
call Teclado_Inicializa ; Configura las líneas del teclado.
call InicializaTodo ; Inicializa el resto de los registros.
movlw b'10001000' ; Habilita la interrupción RBI y la general.
movwf INTCON
Principal
sleep ; Espera en modo bajo consumo que pulse alguna tecla.
goto Principal

; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
CBLOCK
ContadorCaracteres
GuardaClaveTecleada
ENDC

ServicioInterrupcion
call Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada.
;
; Según va introduciendo los dígitos de la clave, estos van siendo almacenados a partir de
; las posiciones RAM "ClaveTecleada" mediante direccionamiento indirecto y utilizando el
; FSR como apuntador. Por cada dígito leído en pantalla se visualiza un asterisco.
;
movwf INDF ; Almacena ese dígito en memoria RAM con
; con direccionamiento indirecto apuntado por FSR.
movlw '*' ; Visualiza asterisco.
call LCD_Caracter
incf FSR,F ; Apunta a la próxima posición de RAM.
incf ContadorCaracteres,F ; Cuenta el número de teclas pulsadas.
movlw LongitudClave ; Comprueba si ha introducido tantos caracteres
subwf ContadorCaracteres,W ; como longitud tiene la clave secreta.
btfss STATUS,C ; ¿Ha terminado de introducir caracteres?
goto FinInterrupcion ; No, pues lee el siguiente carácter tecleado.
;
; Si ha llegado aquí es porque ha terminado de introducir el máximo de dígitos. Ahora
; procede a comprobar si la clave es correcta. Para ello va comparando cada uno de los
; dígitos almacenados en las posiciones RAM a partir de "ClaveTecleada" con el valor
; correcto de la clave almacenado en la posición ROM "ClaveSecreta".
;
; Para acceder a las posiciones de memoria RAM a partir de "ClaveTecleada" utiliza
; direccionamiento indirecto siendo FSR el apuntador.
;
; Para acceder a memoria ROM "ClaveSecreta" se utiliza direccionamiento indexado con el
; el registro ContadorCaracteres como apuntador.
;
call LCD_Borra ; Borra la pantalla.
clrf ContadorCaracteres ; Va a leer el primer carácter almacenado en ROM.
movlw ClaveTecleada ; Apunta a la primera posición de RAM donde se ha
movwf FSR ; guardado la clave tecleada.
ComparaClaves
movf INDF,W ; Lee la clave tecleada y guardada en RAM.
movwf GuardaClaveTecleada ; La guarda para compararla después.
movf ContadorCaracteres,W ; Apunta al carácter de ROM a leer.
call LeeClaveSecreta ; En (W) el carácter de la clave secreta.
subwf GuardaClaveTecleada,W ; Se comparan.
btfss STATUS,Z ; ¿Son iguales?, ¿Z=1?
goto ClaveIncorrecta ; No, pues la clave tecleada es incorrecta.
incf FSR,F ; Apunta a la próxima posición de RAM.
incf ContadorCaracteres,F ; Apunta a la próxima posición de ROM.
movlw LongitudClave ; Comprueba si ha comparado tantos caracteres
subwf ContadorCaracteres,W ; como longitud tiene la clave secreta.
btfss STATUS,C ; ¿Ha terminado de comparar caracteres?
goto ComparaClaves ; No, pues compara el siguiente carácter.
ClaveCorrecta ; La clave ha sido correcta. Aparecen los mensajes
movlw MensajeClaveCorrecta ; correspondientes y permite la apertura de la
call LCD_Mensaje ; puerta durante unos segundos.
call LCD_Linea2
movlw MensajeAbraPuerta
call LCD_Mensaje
bsf CerraduraSalida ; Activa la cerradura durante unos segundos.
goto Retardo
ClaveIncorrecta
movlw MensajeClaveIncorrecta
call LCD_Mensaje
Retardo
call Retardo_2s
call Retardo_1s
InicializaTodo
bcf CerraduraSalida ; Desactiva la cerradura.
clrf ContadorCaracteres ; Inicializa este contador.
movlw ClaveTecleada ; FSR apunta a la primera dirección de la RAM
movwf FSR ; donde se va a almacenar la clave tecleada.
call LCD_Borra ; Borra la pantalla.
movlw MensajeTeclee ; Aparece el mensaje para que introduzca la clave.
call LCD_Mensaje
call LCD_Linea2 ; Los asteriscos se visualizan en la segunda línea.
FinInterrupcion
call Teclado_EsperaDejePulsar
bcf INTCON,RBIF
retfie

INCLUDE  <TECLADO.INC>
INCLUDE  <LCD_4BIT.INC>
INCLUDE  <LCD_MENS.INC>
INCLUDE  <RETARDOS.INC>

; Las posiciones de memoria RAM donde se guardará la clave leída se definen al final, después
; de los Includes, ya que van a ocupar varias posiciones de memoria mediante el
; direccionamiento indirecto utilizado.

CBLOCK
ClaveTecleada
ENDC

END ; Fin del programa.


Si es para Arduino, aquí hay ejemplos.
http://playground.arduino.cc/Main/KeypadTutorial#.UwKr3oVw7G0
            #include <Keypad.h>
            // DECLARACIÓN DE PINES
            const int ledrpin = 11; // Led rojo
            const int ledgpin = 12; // Led verde
            const int speakerpin = 3; // Speaker
            const int botonpin = 2; // Botón
            const int zumbpin = 14; // Zumbador
            int estadoboton = 0; // Estado del botn por defecto
            // DECLARACIÓN DEL TECLADO MATRICIAL
            const byte ROWS = 4; // Filas
            const byte COLS = 3; // Columnas
            //Mapa de caracteres
            char keys[ROWS][COLS] = {
              {'1','2','3'},
              {'4','5','6'},
              {'7','8','9'},
              {'*','0','#'}
            };
            byte rowPins[ROWS] = { 4, 5, 6, 7 };  // Declaracion de pines de las filas
            byte colPins[COLS] = { 8, 9, 10 };   // Declaracion de pines de las columnas
            Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );  // Crear teclado
            //OBTENCION DE CARACTERES
            int caracter = 0;
            char clave [10] ;
            String claveint;
            String claveguardada = "123456"; // Clave por defecto
            int reset = 0;
            void setup()
            {
            // CONFIGURACIÓN DE PINES
              pinMode(ledrpin,OUTPUT);
              pinMode(ledgpin,OUTPUT);
              pinMode(speakerpin,OUTPUT);
              pinMode(botonpin,INPUT);
              pinMode(zumbpin,OUTPUT);
              Serial.begin(9600); //Configuración de serial para desarrollar
            }
             
            void loop()
            {
              //BOTÓN DE RESET
              if (reset == 1) { // Si el botón reset fue pulsado
                digitalWrite(ledgpin,HIGH);
              }
              if (reset == 0) { // Si el botón de reset estaba abierto
                digitalWrite(ledgpin,LOW);
              }
              char key = kpd.getKey(); //Obtener tecla pulsada con la función "kpd.getKey()
              estadoboton = digitalRead(botonpin);
              if (estadoboton == HIGH) { //Si se ha pulsado el botón
                reset = 1;
                for (int i=0; i<300; i++) {  // Generar sonido con Speaker (Reset)
                  digitalWrite(speakerpin, HIGH);
                  delayMicroseconds(300);
                  digitalWrite(speakerpin, LOW);
                  delayMicroseconds(200);
                }
                delay(100);
                for (int i=0; i<300; i++) { 
                  digitalWrite(speakerpin, HIGH);
                  delayMicroseconds(300);
                  digitalWrite(speakerpin, LOW);
                  delayMicroseconds(200);
                }
                delay(100);
                for (int i=0; i<300; i++) { 
                  digitalWrite(speakerpin, HIGH);
                  delayMicroseconds(300);
                  digitalWrite(speakerpin, LOW);
                  delayMicroseconds(200);
                }
                delay(100);
                for (int i=0; i<300; i++) { 
                  digitalWrite(speakerpin, HIGH);
                  delayMicroseconds(300);
                  digitalWrite(speakerpin, LOW);
                  delayMicroseconds(200);
                }
                delay(100);
                for (int i=0; i<600; i++) { 
                  digitalWrite(speakerpin, HIGH);
                  delayMicroseconds(300);
                  digitalWrite(speakerpin, LOW);
                  delayMicroseconds(200);
                }
                delay(100);
              }
                   
                   
             
             
              if(key)  // Si hay una tecla pulsada
              {
                      caracter++; //Añadir un caracter a la suma
                      if (caracter == 10){ //Si se pulsan 10 caracteres cancelar la obtención y resetear los valores (Cancelar)
                        digitalWrite(ledrpin,HIGH);
                        claveint = 0;
                        caracter = 0;
                        for (int i=0; i<600; i++) { // Generar sonido con Speaker (Cancelar)
                          digitalWrite(speakerpin, HIGH);
                          delayMicroseconds(300);
                          digitalWrite(speakerpin, LOW);
                          delayMicroseconds(200);
                        }
                        digitalWrite(ledrpin,LOW);
                      }
                    else if(key == '*') { //Si se pulsa la tecla '*' cancelar la obtención y resetear los valores (Cancelar)
                      digitalWrite(ledrpin,HIGH);
                      claveint = 0;
                      caracter = 0;
                      for (int i=0; i<600; i++) { // Generar sonido con Speaker (Cancelar)
                        digitalWrite(speakerpin, HIGH);
                        delayMicroseconds(300);
                        digitalWrite(speakerpin, LOW);
                        delayMicroseconds(200);
                      }
                      digitalWrite(ledrpin,LOW);
                    }
                   else if(key == '#') { //Si se pulsa la tecla '#' comprobar la contraseña introducida(Comprobación) o guardar la contraseña(Reset)
                      if (reset == 1) { //Si fue pulsado el botón de Reset guardar la contraseña introducida
                        claveguardada = claveint;
                        claveint = 0;
                        caracter = 0;
                        reset = 0;
                        digitalWrite(ledgpin,HIGH);
                        for (int i=0; i<300; i++) {  // Generar sonido con Speaker (Correcto)
                          digitalWrite(speakerpin, HIGH);
                          delayMicroseconds(300);
                          digitalWrite(speakerpin, LOW);
                          delayMicroseconds(200);
                        }
                        delay(100);
                          for (int i=0; i<300; i++) {
                            digitalWrite(speakerpin, HIGH);
                            delayMicroseconds(300);
                            digitalWrite(speakerpin, LOW);
                            delayMicroseconds(200);
                          };
                        digitalWrite(ledgpin,LOW);
                      }
                    else  if (claveint == claveguardada) { // Si la contraseña introducida(claveint) es igual a la guardada(claveguardada) ->Encender led verde y zumbador
                        claveint = 0;
                        caracter = 0;
                        digitalWrite(ledgpin,HIGH);
                        digitalWrite(zumbpin,HIGH);
                        for (int i=0; i<300; i++) {  // Generar sonido con Speaker (Correcto)




http://www.gradotelecovigo.com/viewtopic.php?f=109&t=1738


Un saludo.
#903
Electrónica / Re: Ayuda con un proyecto!
18 Febrero 2014, 01:10 AM
Hola:

Si prefieres el L293D, es más fácil, no hay que calcular nada ya que este IC aguanta de 4.5V a 36V hacia ese driver.



Ver vídeo para que te hagas una idea como funcona el driver.
[youtube=640,360]http://www.youtube.com/watch?v=j7loGQ-dYGU[/youtube]

De los tres motores que ves arriba, se usará en la parte arriba derecha.

Ya voy a empezar a programar..............

¿Alguna otra pregunta?

Saludo.
#904
Electrónica / Re: Ayuda con un proyecto!
17 Febrero 2014, 18:21 PM
Hola:

Me habías respondido desde ayer y no me había dado cuenta que ya pasó a la página 2.

En cuanto al INT, lo puedo poner, pero no hará efecto, ya que los tiempos son mediante subrutinas y el PIC queda como esclavo, es decir, no puedes interrumpir una tarea ya comenzada hasta que esta se acabe. Sirve si usas un Timer 0 con interrupción, lo malo que no alcanza los 20 minutos de tiempo para ello, pero si en las subrutinas. Gracias por aportar ideas.

Por lo que se ve, ahora es esto:
Pulsador 1 --> 5 minutos.
Pulsador 2 --> 10 minutos.
Pulsador 3 --> 20 minutos.
Reset --> Para detener los tiempos. Es como si fuera un STOP. En realidad resetea el PIC y lo pone en modo inicio, esperando que pulses un botón.

Motor DC 12V.
PIC16F84A 5V.

¿Qué tecnología te gusta o driver para controlarlo?
Con un transistor y resistencias o con un IC L293D.

Usted elige, antes de que empiece hacer el esquema y programarlo en asm. También haré adaptaciones a otros PIC como 16F627A, 16F628A, 16F648A y 16F88 por si en algún funturo te haga falta.

Un saludo.
#905
Hola:

Veo mucho por Internet que hacen ejemplos simples, recomendables, esquemas dibujo y sumulador a la vez. ¿Cuáles son los más usados?

Quiero hacer ejemplos gráficos para mostrarlos a los demás com estas imágenes.

http://fritzing.org/download/

No se si este de abajo es el mismo programa.


Si hay varios, pueden poner el enlace y comentar cual es el más usado o recomendado.

Saludo.
#906
Electrónica / Saber más sobre UDATA delos PIC
17 Febrero 2014, 08:58 AM
Cita de: Meta;774159Hola:

Tanto el MPLAB v8.89 y el más moderno MPLAB X v1.60 pesco.

En MPLAB puedo ver los nombres de las variables y los datos que contiene. En cuanto a MPLAB X, puedo ver los datos de las variables pero no sus nombres.



He comprobado que en el MPLAB v8.89 si compilo bajo Absolute, se me ven los nombres de las variables. Si lo compilo bajo Relocatable, no se ven los nombres de las variables.

Sospecho que el MPLAB X 1.60 pasará algo similar. Creo que lo guardé en auto, no se cual de los dos tiene realmente para descartar este tipo de cosas.

La pregunta es. ¿Cómo voy en las opciones para cambiarlo a Absolute del MPLAB X?

En el MPLAB normal se hace así. En la barra de herramientas arriba:


Espero que en el nuevo MPLAB no hayan quitado de leer los nombres de las variables, entonces para depurar sería un misterio, es más, vuelvo mientras puedas solo al MPLAB v8.xx.



Saludo.
#907
Hola:

Aquí hay código. He estado trasteando estas cosas y está muy bien.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int trigger=10;
const int echo=13;

float distance;
char nivel_agua[] = "Water level:";

void setup()
{
 lcd.begin(16,2);
 lcd.setCursor(0,0);
 lcd.print(nivel_agua);
 
 Serial.begin(115200);  // use fastest serial possible
 pinMode(trigger,OUTPUT);
 pinMode(echo,INPUT);
}

void loop()
{
 digitalWrite(trigger,LOW);
 delayMicroseconds(5);
 digitalWrite(trigger,HIGH);
 delayMicroseconds(10);
 digitalWrite(trigger,LOW);
 
 // take average of 10 measurements
 unsigned long time = 0.0;
 for (int i=0; i<10; i++)
 {
   time += pulseIn(echo, HIGH);
   delay(10);
 }
 distance = time * 0.0001657;
 
 // adjust for accuracy
 distance = 1.38/1.52 * distance;  //  correction factor = (wanted/measured)
 
 Serial.println(nivel_agua);
 Serial.print(distance, 2);
 Serial.println(" Meters.");

 lcd.setCursor(0, 1);
 lcd.print(distance, 2);
 lcd.print(" Meters. ");
}




#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
   
   const int trigger=10;
   const int echo=13;
   
   float distance;
   const String nivel_agua = "Nivel de agua:";
   
   void setup(){
     lcd.begin(16,2);
     Serial.begin(9600);
     pinMode(trigger,OUTPUT);
     pinMode(echo,INPUT);
   }
   
   void loop(){
   //Inicializamos el sensor
     digitalWrite(trigger,LOW);
     delayMicroseconds(5);
   // Comenzamos las mediciones
   // Enviamos una señal activando la salida trigger durante 10 microsegundos
     digitalWrite(trigger,HIGH);
     delayMicroseconds(10);
     digitalWrite(trigger,LOW);
   // Adquirimos los datos y convertimos la medida a metros
    distance=pulseIn(echo,HIGH); // Medimos el ancho del pulso
                                 // (Cuando la lectura del pin sea HIGH medira
                                 // el tiempo que transcurre hasta que sea LOW
    distance=distance*0.0001657;
   // Enviamos los datos medidos a traves del puerto serie y al display LCD
     Serial.println("Nivel de agua:");
     Serial.print(distance);
     Serial.println(" Metros.");
     
     lcd.setCursor(0,1);
     lcd.print(distance);
     lcd.print(" Metros.");
     lcd.setCursor(0,0);
     lcd.print(nivel_agua);
     delay(1000);
   }


Saludo.

Un cordial saludo.
#908
Ya me funciona, el motivo que no tenía los pines bien configurados.

Aquí encontré un buen tutorial.
http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=627

Saludo.
#909
Electrónica / Re: Ayuda con un proyecto!
16 Febrero 2014, 09:34 AM
Buenas:

1) ¿Cómo hiciste ese dibujo? ¿Con AudoCAD?

2)
Voy a ponerme manos a la obra. Motor sin sentido, 4 pulsadores:
Pulsador 1 --> 5 minutos.
Pulsador 2 --> 10 minutos.
Pulsador 3 --> 20 minutos.
Reset --> Para detener los tiempos. Es como si fuera un STOP. En realidad resetea el PIC y lo pone en modo inicio, esperando que pulses un botón.

3) Haré un esquema eléctrico y te comento los componentes que necesitas.

4)
¿Cuántos voltios aguanta el motor y cuanto consume? (Lo comento proque el PIC agauanta 5V y el motor puede ser más, así que deberás usar dos fuentes alimetación. En este momento de lo que me digas, hay que usar ciertos componentes o no).

En cuanto a grabar el archivo compilado llamado archivo.hex del PIC16F84A, aquí dejo dos tutoriales de como hacerlo. Uno con el famoso y popular grabador IC-Prog y el otro WinPIC800:
http://electronica-pic.blogspot.com.es/2009/03/manual-ic-prog.html
http://electronica-pic.blogspot.com.es/2009/03/manual-basico-del-winpic800.html
:)
#910
Electrónica / Re: Ayuda con un proyecto!
15 Febrero 2014, 15:02 PM
Hola:

Lo tengo medio terminado y estoy haciendo pruebas. Hay una cosa que aún no me has escrito,  ::)

Por ejemplo, ¿el motor DC siempre funciona en un sentido o hay cambios de sentido?
Si hay cambios de sentidos el esquema de abajo te vale.


Si solo tiene un sentido, con un transistor y un diodo de protección te irá bien com indica abajo.


Motorcito. Rercuerda, dime que tensión usa el motor.




Esperando tus respuestas.
Puedes poner fotos de tu proyecto.

Saludo.