Foro de elhacker.net

Informática => Electrónica => Mensaje iniciado por: priorigi_10 en 17 Febrero 2014, 23:31



Título: Alguien me puede resolver una duda en arduino?
Publicado por: priorigi_10 en 17 Febrero 2014, 23:31
Hola
Quiero poner una pantalla lcd y un teclado numerico en una misma placa como lo hago ?
Y si hay que usar algun otro componente me podrian decir como ponerlo y programarlo?
Un saludo y gracias de antemano


Título: Re: Alguien me puede resolver una duda en arduino?
Publicado por: engel lex en 17 Febrero 2014, 23:49
el teclado lca solo usa 6 patas si no me equivoco, cuantas usa el teclado?


Título: Re: Alguien me puede resolver una duda en arduino?
Publicado por: priorigi_10 en 18 Febrero 2014, 00:14
Es teclado tiene para 7 pines pero no se si se usan todos


Título: Re: Alguien me puede resolver una duda en arduino?
Publicado por: engel lex en 18 Febrero 2014, 00:40
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...


Título: Re: Alguien me puede resolver una duda en arduino?
Publicado por: Meta en 18 Febrero 2014, 01:34
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.  ::)

(http://www.tecno-libro.es/imagenes/9788478/978847897917.GIF)

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.
(http://pic16f84a.org/images/stories/proteus/Fig1904_Teclado.GIF)

Aquí está el programa principal.
Código
  1. ; Cerradura Electrónica: la salida se activa cuando una clave de varios digitos introducida
  2. ; por teclado sea correcta. El esquema se describe en la figura 19-7.
  3. ;
  4. ; Tiene una salida "CerraduraSalida" que, cuando se habilita, activa durante unos segundos
  5. ; el electroimán de la cerradura permitiendo la apertura de la puerta:
  6. ;   - Si (CerraduraSalida) = 1, la puerta se puede abrir.
  7. ;   - Si (CerraduraSalida) = 0, la puerta no se puede abrir.
  8. ;
  9. ;Funcionamiento:
  10. ; - En pantalla visualiza "Introduzca CLAVE". Según se va escribiendo, visualiza asteriscos '*'.
  11. ; - Cuando termine de escribir la clave pueden darse dos posibilidades:
  12. ;     - Si la clave es incorrecta la cerradura sigue inactivada, en pantalla aparece el mensaje
  13. ; "Clave INCORRECTA" durante unos segundos y tiene que repetir de nuevo el proceso.
  14. ;     - Si la clave es correcta la cerradura se activa durante unos segundos y la puerta
  15. ; puede ser abierta. En pantalla aparece: "Clave CORRECTA" (primera línea) y "Abra
  16. ; la puerta" (segunda línea). Pasados unos segundos, se repite el proceso.
  17. ;
  18. ; ZONA DE DATOS **********************************************************************
  19.  
  20. LIST P=16F84A
  21. INCLUDE <P16F84A.INC>
  22. __CONFIG _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
  23.  
  24. CBLOCK  0x0C
  25. ENDC
  26.  
  27. ; La clave puede tener cualquier tamaño y su longitud se calcula:
  28.  
  29. #DEFINE  LongitudClave (FinClaveSecreta-ClaveSecreta)
  30. #DEFINE  CerraduraSalida PORTA,3
  31.  
  32. ; ZONA DE CÓDIGOS ********************************************************************
  33.  
  34. ORG 0
  35. goto Inicio
  36. ORG 4
  37. goto ServicioInterrupcion
  38.  
  39. Mensajes
  40. addwf PCL,F
  41. MensajeTeclee
  42. DT "Teclee CLAVE:", 0x00
  43. MensajeClaveCorrecta
  44. DT "Clave CORRECTA", 0x00
  45. MensajeAbraPuerta
  46. DT "Abra la puerta", 0x00
  47. MensajeClaveIncorrecta
  48. DT "Clave INCORRECTA", 0x00
  49. ;
  50. LeeClaveSecreta
  51. addwf PCL,F
  52. ClaveSecreta
  53. DT 4h,5h,6h,0Eh ; Ejemplo de clave secreta.
  54. DT 7h,8h
  55. FinClaveSecreta
  56.  
  57. Inicio
  58. call LCD_Inicializa
  59. bsf STATUS,RP0
  60. bcf CerraduraSalida ; Define como salida.
  61. bcf STATUS,RP0
  62. call Teclado_Inicializa ; Configura las líneas del teclado.
  63. call InicializaTodo ; Inicializa el resto de los registros.
  64. movlw b'10001000' ; Habilita la interrupción RBI y la general.
  65. movwf INTCON
  66. Principal
  67. sleep ; Espera en modo bajo consumo que pulse alguna tecla.
  68. goto Principal
  69.  
  70. ; Subrutina "ServicioInterrupcion" ------------------------------------------------------
  71. ;
  72. CBLOCK
  73. ContadorCaracteres
  74. GuardaClaveTecleada
  75. ENDC
  76.  
  77. ServicioInterrupcion
  78. call Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada.
  79. ;
  80. ; Según va introduciendo los dígitos de la clave, estos van siendo almacenados a partir de
  81. ; las posiciones RAM "ClaveTecleada" mediante direccionamiento indirecto y utilizando el
  82. ; FSR como apuntador. Por cada dígito leído en pantalla se visualiza un asterisco.
  83. ;
  84. movwf INDF ; Almacena ese dígito en memoria RAM con
  85. ; con direccionamiento indirecto apuntado por FSR.
  86. movlw '*' ; Visualiza asterisco.
  87. call LCD_Caracter
  88. incf FSR,F ; Apunta a la próxima posición de RAM.
  89. incf ContadorCaracteres,F ; Cuenta el número de teclas pulsadas.
  90. movlw LongitudClave ; Comprueba si ha introducido tantos caracteres
  91. subwf ContadorCaracteres,W ; como longitud tiene la clave secreta.
  92. btfss STATUS,C ; ¿Ha terminado de introducir caracteres?
  93. goto FinInterrupcion ; No, pues lee el siguiente carácter tecleado.
  94. ;
  95. ; Si ha llegado aquí es porque ha terminado de introducir el máximo de dígitos. Ahora
  96. ; procede a comprobar si la clave es correcta. Para ello va comparando cada uno de los
  97. ; dígitos almacenados en las posiciones RAM a partir de "ClaveTecleada" con el valor
  98. ; correcto de la clave almacenado en la posición ROM "ClaveSecreta".
  99. ;
  100. ; Para acceder a las posiciones de memoria RAM a partir de "ClaveTecleada" utiliza
  101. ; direccionamiento indirecto siendo FSR el apuntador.
  102. ;
  103. ; Para acceder a memoria ROM "ClaveSecreta" se utiliza direccionamiento indexado con el
  104. ; el registro ContadorCaracteres como apuntador.
  105. ;
  106. call LCD_Borra ; Borra la pantalla.
  107. clrf ContadorCaracteres ; Va a leer el primer carácter almacenado en ROM.
  108. movlw ClaveTecleada ; Apunta a la primera posición de RAM donde se ha
  109. movwf FSR ; guardado la clave tecleada.
  110. ComparaClaves
  111. movf INDF,W ; Lee la clave tecleada y guardada en RAM.
  112. movwf GuardaClaveTecleada ; La guarda para compararla después.
  113. movf ContadorCaracteres,W ; Apunta al carácter de ROM a leer.
  114. call LeeClaveSecreta ; En (W) el carácter de la clave secreta.
  115. subwf GuardaClaveTecleada,W ; Se comparan.
  116. btfss STATUS,Z ; ¿Son iguales?, ¿Z=1?
  117. goto ClaveIncorrecta ; No, pues la clave tecleada es incorrecta.
  118. incf FSR,F ; Apunta a la próxima posición de RAM.
  119. incf ContadorCaracteres,F ; Apunta a la próxima posición de ROM.
  120. movlw LongitudClave ; Comprueba si ha comparado tantos caracteres
  121. subwf ContadorCaracteres,W ; como longitud tiene la clave secreta.
  122. btfss STATUS,C ; ¿Ha terminado de comparar caracteres?
  123. goto ComparaClaves ; No, pues compara el siguiente carácter.
  124. ClaveCorrecta ; La clave ha sido correcta. Aparecen los mensajes
  125. movlw MensajeClaveCorrecta ; correspondientes y permite la apertura de la
  126. call LCD_Mensaje ; puerta durante unos segundos.
  127. call LCD_Linea2
  128. movlw MensajeAbraPuerta
  129. call LCD_Mensaje
  130. bsf CerraduraSalida ; Activa la cerradura durante unos segundos.
  131. goto Retardo
  132. ClaveIncorrecta
  133. movlw MensajeClaveIncorrecta
  134. call LCD_Mensaje
  135. Retardo
  136. call Retardo_2s
  137. call Retardo_1s
  138. InicializaTodo
  139. bcf CerraduraSalida ; Desactiva la cerradura.
  140. clrf ContadorCaracteres ; Inicializa este contador.
  141. movlw ClaveTecleada ; FSR apunta a la primera dirección de la RAM
  142. movwf FSR ; donde se va a almacenar la clave tecleada.
  143. call LCD_Borra ; Borra la pantalla.
  144. movlw MensajeTeclee ; Aparece el mensaje para que introduzca la clave.
  145. call LCD_Mensaje
  146. call LCD_Linea2 ; Los asteriscos se visualizan en la segunda línea.
  147. FinInterrupcion
  148. call Teclado_EsperaDejePulsar
  149. bcf INTCON,RBIF
  150. retfie
  151.  
  152. INCLUDE  <TECLADO.INC>
  153. INCLUDE  <LCD_4BIT.INC>
  154. INCLUDE  <LCD_MENS.INC>
  155. INCLUDE  <RETARDOS.INC>
  156.  
  157. ; Las posiciones de memoria RAM donde se guardará la clave leída se definen al final, después
  158. ; de los Includes, ya que van a ocupar varias posiciones de memoria mediante el
  159. ; direccionamiento indirecto utilizado.
  160.  
  161. CBLOCK
  162. ClaveTecleada
  163. ENDC
  164.  
  165. END ; Fin del programa.
  166.  

Si es para Arduino, aquí hay ejemplos.
http://playground.arduino.cc/Main/KeypadTutorial#.UwKr3oVw7G0
Código
  1.            #include <Keypad.h>
  2.            // DECLARACIÓN DE PINES
  3.            const int ledrpin = 11; // Led rojo
  4.            const int ledgpin = 12; // Led verde
  5.            const int speakerpin = 3; // Speaker
  6.            const int botonpin = 2; // Botón
  7.            const int zumbpin = 14; // Zumbador
  8.            int estadoboton = 0; // Estado del botn por defecto
  9.            // DECLARACIÓN DEL TECLADO MATRICIAL
  10.            const byte ROWS = 4; // Filas
  11.            const byte COLS = 3; // Columnas
  12.            //Mapa de caracteres
  13.            char keys[ROWS][COLS] = {
  14.              {'1','2','3'},
  15.              {'4','5','6'},
  16.              {'7','8','9'},
  17.              {'*','0','#'}
  18.            };
  19.            byte rowPins[ROWS] = { 4, 5, 6, 7 };  // Declaracion de pines de las filas
  20.            byte colPins[COLS] = { 8, 9, 10 };   // Declaracion de pines de las columnas
  21.            Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );  // Crear teclado
  22.            //OBTENCION DE CARACTERES
  23.            int caracter = 0;
  24.            char clave [10] ;
  25.            String claveint;
  26.            String claveguardada = "123456"; // Clave por defecto
  27.            int reset = 0;
  28.            void setup()
  29.            {
  30.            // CONFIGURACIÓN DE PINES
  31.              pinMode(ledrpin,OUTPUT);
  32.              pinMode(ledgpin,OUTPUT);
  33.              pinMode(speakerpin,OUTPUT);
  34.              pinMode(botonpin,INPUT);
  35.              pinMode(zumbpin,OUTPUT);
  36.              Serial.begin(9600); //Configuración de serial para desarrollar
  37.            }
  38.  
  39.            void loop()
  40.            {
  41.              //BOTÓN DE RESET
  42.              if (reset == 1) { // Si el botón reset fue pulsado
  43.                digitalWrite(ledgpin,HIGH);
  44.              }
  45.              if (reset == 0) { // Si el botón de reset estaba abierto
  46.                digitalWrite(ledgpin,LOW);
  47.              }
  48.              char key = kpd.getKey(); //Obtener tecla pulsada con la función "kpd.getKey()
  49.              estadoboton = digitalRead(botonpin);
  50.              if (estadoboton == HIGH) { //Si se ha pulsado el botón
  51.                reset = 1;
  52.                for (int i=0; i<300; i++) {  // Generar sonido con Speaker (Reset)
  53.                  digitalWrite(speakerpin, HIGH);
  54.                  delayMicroseconds(300);
  55.                  digitalWrite(speakerpin, LOW);
  56.                  delayMicroseconds(200);
  57.                }
  58.                delay(100);
  59.                for (int i=0; i<300; i++) {  
  60.                  digitalWrite(speakerpin, HIGH);
  61.                  delayMicroseconds(300);
  62.                  digitalWrite(speakerpin, LOW);
  63.                  delayMicroseconds(200);
  64.                }
  65.                delay(100);
  66.                for (int i=0; i<300; i++) {  
  67.                  digitalWrite(speakerpin, HIGH);
  68.                  delayMicroseconds(300);
  69.                  digitalWrite(speakerpin, LOW);
  70.                  delayMicroseconds(200);
  71.                }
  72.                delay(100);
  73.                for (int i=0; i<300; i++) {  
  74.                  digitalWrite(speakerpin, HIGH);
  75.                  delayMicroseconds(300);
  76.                  digitalWrite(speakerpin, LOW);
  77.                  delayMicroseconds(200);
  78.                }
  79.                delay(100);
  80.                for (int i=0; i<600; i++) {  
  81.                  digitalWrite(speakerpin, HIGH);
  82.                  delayMicroseconds(300);
  83.                  digitalWrite(speakerpin, LOW);
  84.                  delayMicroseconds(200);
  85.                }
  86.                delay(100);
  87.              }
  88.  
  89.  
  90.  
  91.  
  92.              if(key)  // Si hay una tecla pulsada
  93.              {
  94.                      caracter++; //Añadir un caracter a la suma
  95.                      if (caracter == 10){ //Si se pulsan 10 caracteres cancelar la obtención y resetear los valores (Cancelar)
  96.                        digitalWrite(ledrpin,HIGH);
  97.                        claveint = 0;
  98.                        caracter = 0;
  99.                        for (int i=0; i<600; i++) { // Generar sonido con Speaker (Cancelar)
  100.                          digitalWrite(speakerpin, HIGH);
  101.                          delayMicroseconds(300);
  102.                          digitalWrite(speakerpin, LOW);
  103.                          delayMicroseconds(200);
  104.                        }
  105.                        digitalWrite(ledrpin,LOW);
  106.                      }
  107.                    else if(key == '*') { //Si se pulsa la tecla '*' cancelar la obtención y resetear los valores (Cancelar)
  108.                      digitalWrite(ledrpin,HIGH);
  109.                      claveint = 0;
  110.                      caracter = 0;
  111.                      for (int i=0; i<600; i++) { // Generar sonido con Speaker (Cancelar)
  112.                        digitalWrite(speakerpin, HIGH);
  113.                        delayMicroseconds(300);
  114.                        digitalWrite(speakerpin, LOW);
  115.                        delayMicroseconds(200);
  116.                      }
  117.                      digitalWrite(ledrpin,LOW);
  118.                    }
  119.                   else if(key == '#') { //Si se pulsa la tecla '#' comprobar la contraseña introducida(Comprobación) o guardar la contraseña(Reset)
  120.                      if (reset == 1) { //Si fue pulsado el botón de Reset guardar la contraseña introducida
  121.                        claveguardada = claveint;
  122.                        claveint = 0;
  123.                        caracter = 0;
  124.                        reset = 0;
  125.                        digitalWrite(ledgpin,HIGH);
  126.                        for (int i=0; i<300; i++) {  // Generar sonido con Speaker (Correcto)
  127.                          digitalWrite(speakerpin, HIGH);
  128.                          delayMicroseconds(300);
  129.                          digitalWrite(speakerpin, LOW);
  130.                          delayMicroseconds(200);
  131.                        }
  132.                        delay(100);
  133.                          for (int i=0; i<300; i++) {
  134.                            digitalWrite(speakerpin, HIGH);
  135.                            delayMicroseconds(300);
  136.                            digitalWrite(speakerpin, LOW);
  137.                            delayMicroseconds(200);
  138.                          };
  139.                        digitalWrite(ledgpin,LOW);
  140.                      }
  141.                    else  if (claveint == claveguardada) { // Si la contraseña introducida(claveint) es igual a la guardada(claveguardada) ->Encender led verde y zumbador
  142.                        claveint = 0;
  143.                        caracter = 0;
  144.                        digitalWrite(ledgpin,HIGH);
  145.                        digitalWrite(zumbpin,HIGH);
  146.                        for (int i=0; i<300; i++) {  // Generar sonido con Speaker (Correcto)
  147.  
  148.  
  149.  

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


Un saludo.