Como fazer um teclado sem fio usando Xbee com Arduino- (Parte 44/49)

Cómo hacer un teclado inalámbrico usando Xbee con Arduino - (Parte 44/49)

El mouse y el teclado forman la unidad de entrada estándar de una computadora personal. El teclado QWERT utilizado en PC viene con un conector PS2 o un puerto USB. El teclado de PS2 utiliza un protocolo serial síncrono simple que utiliza solo dos cables para la comunicación. Debido a su simplicidad, los teclados de PS2 también se utilizan ampliamente con placas simples basadas en microcontroladores. El teclado de PS2 siempre actúa como un dispositivo esclavo que puede enviar el valor ASCII equivalente de la tecla presionada a su dispositivo maestro, que puede ser una PC o un microcontrolador.

ZigBee es el nombre de un protocolo inalámbrico mantenido por el estándar IEEE 802.15. Este es un protocolo especificado para redes de área personal (PAN) inalámbricas que utilizan transceptores inalámbricos de baja potencia. Ya existen módulos transmisores y receptores inalámbricos que pueden realizar comunicaciones punto a punto. Xbee es la marca de un dispositivo transceptor inalámbrico que funciona con el protocolo ZigBee y puede formar redes PAN.
Los módulos Xbee tienen un alcance aproximado de 100 metros y son utilizados en industrias, áreas científicas, áreas médicas, etc. El módulo Xbee, aunque utiliza el complejo protocolo Zigbee basado en paquetes de datos para comunicarse entre sí, puede comunicarse con otros dispositivos utilizando el protocolo de comunicación en serie más simple y, por lo tanto, se usa ampliamente en placas base de microcontroladores. Este proyecto específico demuestra cómo transmitir datos desde un teclado PS2 a una computadora remota usando transceptores Xbee .

Cualquier placa basada en un microcontrolador AVR que siga el esquema estándar de Arduino y esté actualizada con el gestor de arranque Arduino puede denominarse placa Arduino. El gestor de arranque Arduino permite conectar y programar diferentes placas Arduino con el IDE de Arduino. La placa Arduino utilizada en este proyecto es la placa Arduino pro-mini y la versión IDE de arduino es 1.0.3 para Windows.

La imagen de la placa Arduino pro-mini y el IDE de Arduino se muestra a continuación:

 Placa Arduino Pro-Mini típica

Fig. 2: Placa típica Arduino Pro-Mini

Janela do software Arduino IDE

Fig. 3: Ventana del software Arduino IDE

Dado que la placa Arduino pro-mini no tiene circuitos para interactuar con el puerto serie o el puerto USB de la PC, se requiere una placa convertidora USB a TTL externa para conectarla a la PC. Este hardware ayuda a programar la placa Arduino y también ayuda en la comunicación serie con el puerto USB de la PC.

Placa conversora USB externa para TTL para programação de Arduino e comunicação serial

4: Placa convertidora externa de USB a TTL para programación Arduino y comunicación en serie

Se supone que el lector ha leído el proyecto sobre cómo empezar con Arduino y ha probado todo lo que se comenta allí. La imagen del módulo de la serie Xbee S1 utilizado en este proyecto se muestra en la siguiente imagen. Dado que el paso de pines de los módulos no es compatible con la placa de pruebas, puede utilizar las placas de diseño basadas en Xbee que vienen con pines compatibles con la placa de pruebas.

Módulo Série Xbee S1

Fig. 5: Módulo de la serie Xbee S1

Dado que los módulos Xbee se comunican mediante un protocolo de comunicación en serie con los dispositivos de interfaz, se pueden conectar a un microcontrolador utilizando un mínimo de cuatro pines, fuente de alimentación y tierra, pines de salida de datos UART y entrada de datos UART . Los módulos Xbee tienen varios pines de E/S digitales y analógicos además de estos pines, y la salida de pin de un módulo Xbee se muestra en la siguiente tabla:

ALFILER

DESCRIPCIÓN

1

Fuente de energía

dos

Salida de datos UART

3

Entrada de datos UART

4

Salida digital 8 (no compatible a partir del 28/02/09)

5

Reinicio del módulo (el pulso de reinicio debe ser de al menos 200 ns)

6

Salida PWM 0/indicador de intensidad de señal RX

7

Salida 1

8

No se conecta

9

Línea de control de suspensión DTR/Pin o entrada digital 8

10

Piso

11

Entrada analógica 4 o E/S digital 4

12

Control de flujo transparente para envío o E/S digitales 7

13

Indicador de estado del módulo

14

Referencia de voltaje para entradas A/D

15

Indicador asociado, entrada analógica 5 o E/S digital 5

dieciséis

Control de flujo de solicitud de envío, entrada analógica 6 o E/S digital 6

17

Entrada analógica 3 o E/S digital 3

18

Entrada analógica 2 o E/S digital 2

19

Entrada analógica 1 o E/S digital 1

20

Entrada analógica 0 o E/S digital 0

Fig. 6: Configuración de pines del módulo Xbee

Dado que los módulos Xbee se comunican mediante un protocolo de comunicación en serie con los dispositivos de interfaz, se pueden conectar a un microcontrolador utilizando un mínimo de cuatro pines, fuente de alimentación y tierra, pines de salida de datos UART y entrada de datos UART . El pin número 2, UART Data Out está conectado al pin RX1 de la mini placa Arduino pro y el pin número 3 UART Data In está conectado al pin TX0.

El teclado siempre tiene un conector mini-DIN macho de 6 pines para interfaz PS2 y el dispositivo host siempre tiene el pin hembra correspondiente. Las imágenes y pinouts de los conectores macho y hembra de PS2 se muestran en la siguiente imagen, la única diferencia entre los conectores de teclado y mouse de PS2 está en el color.

La imagen del pin masculino de PS2

Conector macho mini-DIN de 6 pinos para interface PS2

Fig. 7: Conector macho Mini-DIN de 6 pines para interfaz PS2

La imagen del pin femenino de PS2

Plugue de conector fêmea mini DIN de 6 pinos para interface PS2

Fig. 8: Conector hembra Mini DIN de 6 pines para interfaz PS2

El pinout de los conectores macho y hembra de PS2

Pinagem do conector PS2 macho e pinagem dos conectores PS2Female

Fig. 9: Pinout del conector PS2 macho y pinout de los conectores PS2Hembra

Cuando se trata de conectar el conector hembra a la placa de circuito, deberías poder identificar los pines en la parte inferior del conector PS2 y la siguiente imagen te será útil.

Parte inferior da tomada do conector fêmea do mini DIN para a relação PS2

Fig. 10: Parte inferior del conector hembra Mini DIN para interfaz PS2

La implementación del proyecto que puede recibir datos del teclado de PS2 y transmitir los caracteres escritos en el teclado a una computadora remota a través de Xbee se representa mediante el siguiente diagrama de bloques:

Diagrama de blocos de transmissão de dados entre teclado e computador usando Xbee

Fig. 11: Diagrama de bloques de transmisión de datos entre el teclado y la computadora usando Xbee

El código escrito para este proyecto lee datos del teclado de PS2 utilizando el archivo de biblioteca personalizado de PS2 llamado "PS2Keyboard.h", que tiene todas las rutinas necesarias para acceder a un teclado de PS2. Los detalles de cómo usar esta biblioteca para interconectar un teclado de PS2 ya se discutieron en un proyecto anterior sobre cómo interconectar un teclado de PS2 con Arduino . Básicamente existen tres funciones que el usuario puede utilizar directamente en su código: “keyboard.begin”, teclado.disponible y “ celular.ler ”. Los detalles de las funciones se analizan a continuación.

teclado.comenzar

La función Keyboard.begin se utiliza para hacer todo lo necesario para inicializar un teclado ASCII utilizando el protocolo PS2. Después de que la inicialización se realice correctamente, cada vez que se presione una tecla, el teclado comenzará a enviar el valor ASCII equivalente a la tecla que se presionó. La función toma un parámetro y es el número de pin de la placa Arduino que actúa como pin de datos del teclado.

teclado.disponible

Esta función se puede utilizar para comprobar si los datos de pulsación de teclas están disponibles en el teclado. Esta función siempre se llama antes de llamar a la función teclado.read que se utiliza para leer datos del teclado. La función devuelve un valor positivo distinto de cero cada vez que se detecta una pulsación de tecla.

teclado.ler

La función teclado.read se puede utilizar para leer el valor ASCII de una tecla que se ha presionado en el teclado. La función no acepta ningún parámetro y devuelve el valor ASCII de la clave. La función Keyboard.read siempre se llama después de que la función Keyboard.read devuelve un valor positivo distinto de cero.

La placa Arduino escribe los datos del teclado PS2 al Xbee para su transmisión con la ayuda de las funciones de comunicación en serie proporcionadas por la biblioteca Arduino. En este proyecto se utilizan funciones como Serial.begin que ayuda a inicializar el puerto serie con una determinada velocidad en baudios, Serial.write para enviar datos al puerto serie, Serial.available y Serial.read para leer datos del puerto serie. y ya se han discutido en proyectos anteriores sobre cómo realizar comunicación en serie con Arduino , cómo enviar y recibir datos en serie usando Arduino y cómo realizar depuración en serie con Arduino. El método de interconectar un módulo Xbee y transmitir datos usándolo se analiza en el proyecto anterior sobre cómo interconectar el módulo Xbee con Arduino .

Cuando se complete la codificación, podrá verificar y cargar el código en la placa Arduino como se explica en el proyecto Cómo comenzar con Arduino . Tan pronto como se enciende la placa, el Xbee en la placa Arduino establece automáticamente comunicación con otro Xbee que esté conectado al puerto serie de una PC. La segunda placa Xbee se puede conectar a la PC usando la misma placa convertidora de USB a TTL que se usó para programar la placa Arduino. Las letras escritas en el teclado de PS2 se transmitirán y se podrán leer en la PC usando cualquier software de monitoreo en serie o usando el propio software de monitoreo en serie del IDE de Arduino, como se explica en el proyecto cómo realizar la depuración en serie con Arduino .

Código fuente del proyecto

 ###





 /*============================= EG LABS ================== ===================//
 
Demostración sobre cómo enviar datos del teclado ps2 de forma inalámbrica usando Xbee


 El circuito:

 LCD:

 * Pin LCD RS a pin digital 12

 * LCD habilita pin a pin digital 11

 * Pin LCD D4 a pin digital 7

 * Pin LCD D5 a pin digital 6

 * LCD D6 pin a digital pin 5

 * Pin LCD D7 a pin digital 4

 * LCD R/W pin a tierra

 * Resistencia de 10K:

 * termina en +5V y tierra

 *limpiador al pin 3 del LCD

 * Ánodo LED conectado a la salida digital 9

 * Cátodo LED conectado a tierra a través de una resistencia de 1K


 TECLADO:

 FECHA PIN A PIN NÚMERO 8

 RELOJ PIN A PIN NÚMERO 3


 XBEE:

 PIN RX DE XBEE AL PIN TX0 DE ARDUINO

 CORTO LOS PINES DE TIERRA DE ARDUINO Y XBEE

 =============================== EG LABS ================== = ==================*/


 #incluir "PS2Keyboard.h"

 // incluye el código de la biblioteca:

 #incluir

 // inicializa la biblioteca con los números de los pines de la interfaz

 LCD de cristal líquido (12, 11, 7, 6, 5, 4);


 #definir DATOS_PIN 8

 Teclado PS2Keyboard;


 configuración vacía

 {

 pinMode(9, SALIDA);

 lcd.comenzar(16, 2);

 lcd.print("GARAJE PARA INGENIEROS");

 lcd.setCursor(0, 1);

 lcd.print("TECLADO a XBEE");


 
teclado.begin(DATA_PIN); //inicializa el teclado de PS2


 Serie.begin(9600);

 Serial.println("GARAJE PARA INGENIEROS");

 retraso(1000);

 escritura digital (9, ALTA);

 }


 bucle vacío

 {

 if(keyboard.available) // comprueba si hay datos provenientes del teclado

 {

 char dat = teclado.leer; // lee los datos del teclado

 Serie.write(dat);

 }demás;

 }

 ###

Código fuente del proyecto

 ###




 Archivo de cabecera

 #incluir

 #incluir

 #incluir

 #incluir "Arduino.h"

 #incluir "PS2Keyboard.h"


 #incluir "binario.h"

 typedef uint8_t booleano;

 typedef uint8_t byte;



 int ps2Keyboard_DataPin;

 byte ps2Keyboard_CurrentBuffer;

 byte volátil ps2Keyboard_CharBuffer;

 byte volátil ps2Keyboard_BufferPos;


 // variables utilizadas para recordar información sobre las pulsaciones de teclas

 volátil bool ps2Keyboard_shift; // indica que se presionó la tecla Mayús

 bool volátil ps2Keyboard_ctrl; //indica que la tecla Ctrl está presionada

 bool volátil ps2Keyboard_alt; //indica que la tecla alt está presionada
 
bool volátil ps2Keyboard_extend; // recuerda un carácter extendido del teclado recibido

 bool volátil ps2Keyboard_release; // distingue las pulsaciones de teclas de las liberaciones

 bool volátil ps2Keyboard_caps_lock; // recuerda que se ha presionado el bloqueo de mayúsculas


 // variables utilizadas para enviar bytes de comando al teclado, por ejemplo, caps_lock light

 cmd_in_progress booleano volátil;

 volátil int cmd_count;

 byte cmd_value;

 byte volátil cmd_ack_value;

 byte cmd_parity;

 cmd_ack_byte_ok booleano volátil;


 // enviar bytes de comando al teclado necesita la paridad adecuada (de lo contrario, el teclado

 // solo te pide que repitas el byte)

 byte paridad_impar (valor de byte) {

 int i, cuenta = 1; // empezamos con 0 para paridad par

 para (i=0; i<8; i++) {

 si (val&1) cuenta++;

 valor = valor>>1;

 }

 recuento de retornos & 1; // el bit inferior del conteo es el bit de paridad

 }


 void kbd_send_command (valor de byte) {

 // evita que la rutina de interrupción reciba caracteres para que podamos usarla

 // enviar un byte

 cmd_in_progress = verdadero;

 cmd_count = 0;

 
// configura el byte para desplazar e inicializar el bit de confirmación

 cmd_value = valor;

 cmd_ack_value = 1; // el kbd borrará este bit al recibir el byte

 cmd_paridad = paridad_impar(val);


 // establece el pin de datos como salida, listo para conducir

 escritura digital (ps2Keyboard_DataPin, ALTA);

 pinMode(ps2Keyboard_DataPin, SALIDA);


 // conduce el pin del reloj bajo - esto generará el primero

 // interrupción del proceso de cambio de marcha

 pinMode(PS2_INT_PIN, SALIDA);

 escritura digital (PS2_INT_PIN, BAJA);


 // esperar al menos un ciclo de reloj (en caso de que el kbd esté a mitad de transmisión)

 retrasoMicrosegundos(60);


 // configura el bit de inicio 0

 escritura digital (ps2Keyboard_DataPin, BAJO);

 // suelta el reloj - el kbd se hace cargo de controlar el reloj desde aquí

 escritura digital (PS2_INT_PIN, ALTA);

 pinMode(PS2_INT_PIN, ENTRADA);


 // espera a que la rutina de interrupción desplace el byte, la paridad y reciba el bit de confirmación

 mientras (cmd_ack_value!=0);


 // volver a la rutina de interrupción recibiendo caracteres del kbd

 cmd_in_progress = falso;

 }

 
anular el teclado de PS2::reset {

 kbd_send_command(0xFF); // envía el código de reinicio del kbd al kbd: 3 luces

 // debería parpadear brevemente en el kbd


 // restablecer todas las variables globales

 ps2Keyboard_CurrentBuffer = 0;

 ps2Keyboard_CharBuffer = 0;

 ps2Keyboard_BufferPos = 0;

 ps2Keyboard_shift = falso;

 ps2Keyboard_ctrl = falso;

 ps2Keyboard_alt = falso;

 ps2Keyboard_extend = falso;

 ps2Keyboard_release = falso;

 ps2Keyboard_caps_lock = falso;

 cmd_in_progress = falso;

 cmd_count = 0;

 cmd_valor = 0;

 cmd_ack_value = 1;

 }


 // valor: bit_2=bloqueo_mayúsculas, bit_1=bloqueo_numérico, bit_0=bloqueo_desplazamiento

 vacío kbd_set_lights (valor de byte) {

 // Al configurar las luces con el comando 0xED el teclado responde

 // con un "byte de confirmación", 0xFA. Esto NO es lo mismo que el "bit de confirmación" que

 // sigue el cambio exitoso de cada byte de comando.

 cmd_ack_byte_ok = falso; // inicializa el indicador de byte de confirmación
 
kbd_send_command(0xED); // envía el byte de comando

 mientras (!cmd_ack_byte_ok); // el byte de confirmación del teclado establece este indicador

 kbd_send_command(valor); // ahora enviamos los datos

 }


 // El ISR para la interrupción externa

 // Esto puede parecer mucho código para una rutina de interrupción, pero el interruptor

 // las declaraciones son rápidas y el camino a través de la rutina es sólo de unos pocos

 // líneas simples de código.

 anular ps2interrupt (anular) {

 valor int = digitalRead(ps2Keyboard_DataPin);


 // Este es el código para enviar un byte al teclado. En realidad son 12 bits:

 // un bit de inicio, 8 bits de datos, 1 de paridad, 1 bit de parada, 1 bit de confirmación (del kbd)

 si (cmd_in_progress) {

 cmd_count++; // cmd_count realiza un seguimiento del cambio

 cambiar (cmd_count) {

 caso 1: // bit de inicio

 digitalWrite(ps2Keyboard_DataPin,BAJO);

 romper;

 caso 2: caso 3: caso 4: caso 5: caso 6: caso 7: caso 8: caso 9:

 // bits de datos para desplazar

 escritura digital (ps2Keyboard_DataPin, cmd_value&1);

 valor_cmd = valor_cmd>>1;

 romper;
 
caso 10: // bit de paridad

 escritura digital (ps2Keyboard_DataPin, cmd_parity);

 romper;

 caso 11: // bit de parada

 // libera el pin de datos, por lo que el bit de parada realmente depende del pull-up

 // pero esto garantiza que el pin de datos esté listo para ser controlado por el kbd para

 // para el siguiente bit.

 escritura digital (ps2Keyboard_DataPin, ALTA);

 pinMode(ps2Keyboard_DataPin, ENTRADA);

 romper;

 caso 12: // bit de confirmación: impulsado por el kbd, por lo que leemos su valor

 cmd_ack_value = digitalRead(ps2Keyboard_DataPin);

 cmd_in_progress = falso; // terminado de mudarnos

 }

 devolver; // no pases a la sección de recepción del ISR

 }


 // recibir sección del ISR

 // cambia los bits en

 si(ps2Keyboard_BufferPos > 0 && ps2Keyboard_BufferPos < 11) {

 ps2Keyboard_CurrentBuffer = (valor << (ps2Keyboard_BufferPos - 1));

 }

 ps2Keyboard_BufferPos++; // realizar un seguimiento de la posición de cambio de entrada


 if(ps2Keyboard_BufferPos == 11) { // se recibió un carácter completo

 cambiar (ps2Keyboard_CurrentBuffer) {
 
caso 0xF0: { // carácter de liberación de clave

 ps2Keyboard_release = verdadero;

 ps2Keyboard_extend = falso;

 romper;

 }

 case 0xFA: { // byte de reconocimiento del comando

 cmd_ack_byte_ok = verdadero;

 romper;

 }

 case 0xE0: { // conjunto de caracteres extendido

 ps2Keyboard_extend = verdadero;

 romper;

 }

 caso 0x12: // desplazamiento a la izquierda

 caso 0x59: { // desplazamiento a la derecha

 ps2Keyboard_shift = ps2Keyboard_release? falso verdadero;

 ps2Keyboard_release = falso;

 romper;

 }

 case 0x11: { // tecla alt (la alt derecha se extiende 0x11)

 ps2Keyboard_alt = ps2Keyboard_release? falso verdadero;

 ps2Keyboard_release = falso;

 romper;

 }

 case 0x14: { // tecla ctrl (el control derecho está extendido 0x14)

 ps2Keyboard_ctrl = ps2Keyboard_release? falso verdadero;

 ps2Keyboard_release = falso;

 romper;

 }

 caso 0x58: { // tecla de bloqueo de mayúsculas

 si (!ps2Keyboard_release) {

 ps2Keyboard_caps_lock = ps2Keyboard_caps_lock? falso verdadero;

 // permitir el bloqueo de mayúsculas para activar y desactivar la luz
 
ps2Keyboard_CharBuffer = ps2Keyboard_CurrentBuffer;

 }

 demás {

 ps2Keyboard_release = falso;

 }

 romper;

 }

 predeterminado: { // la clave real

 if (ps2Keyboard_release) { // aunque ignorar si se acaba de publicar

 ps2Keyboard_release = falso;

 }

 else { // las claves reales van a CharBuffer

 ps2Keyboard_CharBuffer = ps2Keyboard_CurrentBuffer;

 }

 }

 }

 ps2Keyboard_CurrentBuffer = 0;

 ps2Keyboard_BufferPos = 0;

 }

 }


 Teclado PS2::Teclado PS2 {

 // nada que hacer aquí 

}


 anular PS2Keyboard::begin(int dataPin) {

 //Preparar las variables globales

 ps2Keyboard_DataPin = pin de datos;

 ps2Keyboard_CurrentBuffer = 0;

 ps2Keyboard_CharBuffer = 0;

 ps2Keyboard_BufferPos = 0;

 ps2Keyboard_shift = falso;

 ps2Keyboard_ctrl = falso;

 ps2Keyboard_alt = falso;

 ps2Keyboard_extend = falso;

 ps2Keyboard_release = falso;

 ps2Keyboard_caps_lock = falso;

 cmd_in_progress = falso;
 
cmd_count = 0;

 cmd_valor = 0;

 cmd_ack_value = 1;


 // inicializa los pines

 pinMode(PS2_INT_PIN, ENTRADA);

 escritura digital (PS2_INT_PIN, ALTA);

 pinMode (pin de datos, ENTRADA);

 escritura digital (pin de datos, ALTO);


 adjuntarInterrupción(1, ps2interrupt, CAER);

 #si 0

 // Habilitación global de interrupción INT1

 EIMSK = ( 1 << INT1);

 // El flanco descendente activa la interrupción

 EICRA = (0 << ISC10) (1 << ISC11);

 #terminara si

 }


 bool Teclado PS2::disponible {

 devolver ps2Keyboard_CharBuffer! = 0;

 }


 // Esta rutina permite que un programa que llama vea si se mantienen otras claves

 // abajo cuando se recibe un carácter: es decir , , o

 // Tenga en cuenta que esta rutina debe llamarse después de que disponible haya devuelto verdadero,

 // pero ANTES de leer . La rutina de lectura borra el buffer y permite otra

 // carácter que se recibirá para que estos bits puedan cambiar en cualquier momento después de la lectura.

 byte Teclado PS2::read_extra {

 retorno (ps2Keyboard_caps_lock<<3)

 (ps2Keyboard_shift<<2)

 (ps2Keyboard_alt<<1)
 
ps2Keyboard_ctrl;

 }


 byte Teclado PS2::leer {

 resultado del byte;


 // lee los datos sin procesar desde el teclado

 resultado = ps2Keyboard_CharBuffer;


 // Utilice un modificador para la conversión de código a caracteres.

 // Esto es rápido y en realidad sólo usa 4 bytes por línea simple

 cambiar(resultado) {

 caso 0x1C: resultado="a"; romper;

 caso 0x32: resultado="b"; romper;

 caso 0x21: resultado="c"; romper;

 caso 0x23: resultado="d"; romper;

 caso 0x24: resultado="e"; romper;

 caso 0x2B: resultado="f"; romper;

 caso 0x34: resultado="g"; romper;

 caso 0x33: resultado="h"; romper;

 caso 0x43: resultado="i"; romper;

 caso 0x3B: resultado="j"; romper;

 caso 0x42: resultado="k"; romper;

 caso 0x4B: resultado="l"; romper;

 caso 0x3A: resultado="m"; romper;

 caso 0x31: resultado="n"; romper;

 caso 0x44: resultado="o"; romper;

 caso 0x4D: resultado="p"; romper;

 caso 0x15: resultado="q"; romper;

 caso 0x2D: resultado="r"; romper;

 caso 0x1B: resultado="s"; romper;

 caso 0x2C: resultado="t"; romper;

 caso 0x3C: resultado="u"; romper;

 caso 0x2A: resultado="v"; romper;

 caso 0x1D: resultado="w"; romper;

 caso 0x22: resultado="x"; romper;
 
caso 0x35: resultado="y"; romper;

 caso 0x1A: resultado="z"; romper;


 // tenga en cuenta que el bloqueo de mayúsculas solo se usa en az

 caso 0x41: resultado = ps2Keyboard_shift? '<' : ','; romper;

 caso 0x49: resultado = ps2Keyboard_shift? '>' : '.'; romper;

 caso 0x4A: resultado = ps2Keyboard_shift? '?' : '/'; romper;

 caso 0x54: resultado = ps2Keyboard_shift? '{' : '('; romper;

 caso 0x5B: resultado = ps2Keyboard_shift? '}' : ')'; romper;

 caso 0x4E: resultado = ps2Keyboard_shift? '_' : '-'; romper;

 caso 0x55: resultado = ps2Keyboard_shift? '+' : '='; romper;

 caso 0x29: resultado=" "; romper;


 caso 0x45: resultado = ps2Keyboard_shift? ')' : '0'; romper;

 caso 0x16: resultado = ps2Keyboard_shift? '!' : '1'; romper;

 caso 0x1E: resultado = ps2Keyboard_shift? '@' : 'dos'; romper;

 caso 0x26: resultado = ps2Keyboard_shift? '£' : '3'; romper;

 caso 0x25: resultado = ps2Keyboard_shift? '$' : '4'; romper;

 caso 0x2E: resultado = ps2Keyboard_shift? '%' : '5'; romper;

 caso 0x36: resultado = ps2Keyboard_shift? '^': '6'; romper;

 caso 0x3D: resultado = ps2Keyboard_shift? '&' : '7'; romper;
 
caso 0x3E: resultado = ps2Keyboard_shift? '*' : '8'; romper;

 caso 0x46: resultado = ps2Keyboard_shift? '(' : '9'; descanso;


 caso 0x0D: resultado="t"; romper;

 caso 0x5A: resultado="n"; romper;

 caso 0x66: resultado = PS2_KC_BKSP; romper;

 caso 0x69: resultado = ps2Keyboard_extend? PS2_KC_END: ​​'1'; romper;

 caso 0x6B: resultado = ps2Keyboard_extend? PS2_KC_LEFT: '4'; romper;

 caso 0x6C: resultado = ps2Keyboard_extend? PS2_KC_HOME: '7'; romper;

 caso 0x70: resultado = ps2Keyboard_extend? PS2_KC_INS: '0'; romper;

 caso 0x71: resultado = ps2Keyboard_extend? PS2_KC_DEL: '.'; romper;

 caso 0x72: resultado = ps2Keyboard_extend? PS2_KC_DOWN: '2'; romper;

 caso 0x73: resultado="5"; romper;

 caso 0x74: resultado = ps2Keyboard_extend? PS2_KC_RIGHT: '6'; romper;

 caso 0x75: resultado = ps2Keyboard_extend? PS2_KC_UP: '8'; romper;

 caso 0x76: resultado = PS2_KC_ESC; romper;

 caso 0x79: resultado="+"; romper;

 caso 0x7A: resultado = ps2Keyboard_extend? PS2_KC_PGDN: '3'; romper;

 caso 0x7B: resultado="-"; romper;

 caso 0x7C: resultado="*"; romper;
 
caso 0x7D: resultado = ps2Keyboard_extend? PS2_KC_PGUP: '9'; romper;


 caso 0x58:

 // La configuración de las luces del teclado se realiza aquí. Lo ideal sería hacerlo

 // en la propia rutina de interrupción y los códigos clave asociados con

 // Las pulsaciones de la tecla Bloq Mayús nunca se transmitirán como caracteres.

 // Sin embargo, haría que la rutina de interrupción fuera muy complicada con muchos

 // de estado extra asociado al control de un caps_lock

 // código clave que provoca que se transmita un byte cmd, lo que provoca que se transmita un ack_byte

 // se recibirá, luego se transmitirá un byte de datos. Es mucho más fácil hacerlo aquí.

 // La desventaja, sin embargo, es que la luz se enciende o apaga en el

 // el momento adecuado depende del programa que llama para verificar

 // caracteres de forma regular. Si el programa que llama se detiene

 // sondeo de caracteres en cualquier punto presionando la tecla Bloq Mayús

 // no cambiará el estado de la luz de bloqueo de mayúsculas durante el sondeo

 // no está sucediendo.

 resultado = ps2Keyboard_caps_lock? PS2_KC_CLON: PS2_KC_CLOFF;
 
si (ps2Keyboard_caps_lock) kbd_set_lights(4);

 más kbd_set_lights(0);

 romper;


 // Reinicia el contador de cambios para valores inesperados, para volver al fregadero

 // Esto permite conectar y desconectar un teclado en caliente

 predeterminado: retraso (500); // pero espera un poco en caso de que haya mitad de turno

 ps2Keyboard_BufferPos = 0;

 ps2Keyboard_shift = falso;

 ps2Keyboard_ctrl = falso;

 ps2Keyboard_alt = falso;

 ps2Keyboard_extend = falso;

 ps2Keyboard_release = falso;

 ps2Keyboard_caps_lock = falso;

 } // finalizar el cambio (resultado)


 // cambia los caracteres az aquí (menos código que en la instrucción switch)

 si (((resultado>='a') && (resultado<='z')) &&

 ((ps2Keyboard_shift &&!ps2Keyboard_caps_lock)

 (!ps2Keyboard_shift && ps2Keyboard_caps_lock))) {

 resultado = resultado + ('A'-'a');

 }


 // hecho con el personaje

 ps2Keyboard_CharBuffer = 0;


 retorno(resultado);

 }



 ### 

Diagramas de circuito

Creación de un diagrama de circuito de teclado inalámbrico usando Xbee-Arduino

Componentes del proyecto

  • Arduino ProMini
  • CONDUJO
  • Potenciómetro
  • Resistor

Vídeo del proyecto

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.