Prólogo
Vale la pena decir que el alcance de este dispositivo no es tan grande. Para el trabajo, esto es monitoreo, monitoreo del tiempo de trabajo, protección contra fugas de información y, probablemente, eso es todo.En la vida cotidiana, esto puede hacer la vida más fácil. Por ejemplo, presionaron cierta combinación de teclas: Arduino los reconoció y ... envió una señal para encender la tetera. Si no es una tetera, entonces hay algo más.Pero aún así, este es un seguimiento banal (posiblemente incluso oculto) para un empleado, que desde un punto de vista moral no es bueno. Sin embargo, el certificado legal da el visto bueno si se prescribe en el contrato de trabajo, si este monitoreo se lleva a cabo durante las horas de trabajo y en el lugar de trabajo, y si, por supuesto, el empleado es informado y despedido.Bueno, en tu vida personal eres libre de hacer lo que quieras, siempre que se trate de tu propiedad.Todo, estamos legalmente protegidos, ahora contaré y mostraré lo que necesitamos y cómo armarlo para obtener un simple interceptor de pulsaciones de teclas desde el teclado.Empecemos
Entonces, necesitamos una docena de cables y dos placas:1) Arduino Leonardo
2) USB Host Shield
¿Por qué Arduino Leonardo? Debido a que es relativamente barato y, a diferencia de sus predecesores, el ATmega32u4 tiene soporte incorporado para conexiones USB.El protocolo USB define dos tipos de dispositivos: host (maestro, servidor) y periféricos (esclavo, cliente). USB Host Shield administra y proporciona energía a los periféricos. Por ejemplo, cuando conecta el teclado a una PC, la PC es el host que controla al cliente, y el cliente, en este caso, es el teclado.Y hay bastantes periféricos compatibles. Los más interesantes son:1) dispositivos HID: teclado, mouse, joystick, etc.2) Controladores de juegos3) Teléfonos y tabletas Android compatibles con ADK.Y para obtener información más detallada, visite el sitio web oficial .En nuestro caso, este es el teclado. Pertenece a la clase de dispositivos HID. El código HID para el teclado está codificado en 8 bytes:1) 1 byte: cada bit corresponde a su propio modificador (L Ctrl, R Ctrl, L Shift, R Shift, etc.).2) 2 bytes: reservados y no los necesitamos, generalmente es nulo.3) 3-8 bytes: contienen códigos de 6 claves.Puedes leer más sobre esto aquí .Todo, con la teoría terminada, ahora puedes armar el circuito.
Por cierto, un programa muy conveniente para dibujar diagramas, en el que se dibujó este diagrama, está aquí .Ahora vale la pena explicar qué es qué.Arduino Leonardo tiene una pequeña característica por la cual no podemos conectarla en la parte superior: los conectores SPI están ubicados en el ICSP (esos 6 conectores están en el medio a la derecha) y por eso tienen que estar conectados a los conectores digitales USB Host Shield.1) Cable amarillo: pin 4 MOSI (conectado al pin 11 en el escudo del host USB).2) Cable gris: pin 1 MISO (conectado a 12 pin en el escudo del host USB).3) Cable verde: pin 3 SCK (conectado al pin 13 en el escudo del host USB).Proporcionamos energía con los cinco cables inferiores y un violeta:1) Restablecer para restablecer2) 3.3V a 3.3V3) 5V a 5V4) GND a GND5) VIN a VIN6) Restablecer a D7Ahora necesitamos conectar los pines de control:1) D7 a D72) D10 a D10Este es un mínimo necesario para que funcione.Entonces, hay un circuito, ahora necesitamos programarlo de alguna manera y esto se hace usando el IDE de Arduino. Es completamente gratis y es de dominio público. Se pueden encontrar ejemplos de programas y el IDE en el sitio web oficial.Para trabajar con USB Host Shield, necesitamos una biblioteca adicional ( aquí ).El código en sí es lo más simple posible:#include <hidboot.h>
#include <SPI.h>
#include <SD.h>
class KeyboardOut
{
private:
KeyReport _keyReport;
void send_report();
public:
size_t press(uint8_t mod, uint8_t key);
size_t release(uint8_t mod, uint8_t key);
};
KeyboardOut keyboard_out;
size_t KeyboardOut::press(uint8_t mod, uint8_t key) {
uint8_t i;
_keyReport.modifiers |= mod;
if (_keyReport.keys[0] != key && _keyReport.keys[1] != key &&
_keyReport.keys[2] != key && _keyReport.keys[3] != key &&
_keyReport.keys[4] != key && _keyReport.keys[5] != key) {
for (i=0; i<6; i++) {
if (_keyReport.keys[i] == 0x00) {
_keyReport.keys[i] = key;
break;
}
}
if (i == 6) {
return 0;
}
}
send_report();
return 1;
}
size_t KeyboardOut::release(uint8_t mod, uint8_t key) {
uint8_t i;
_keyReport.modifiers &= mod;
for (i=0; i<6; i++) {
if (0 != key && _keyReport.keys[i] == key) {
_keyReport.keys[i] = 0x00;
}
}
send_report();
return 1;
}
void KeyboardOut::send_report()
{
HID_SendReport(2, &_keyReport, sizeof(KeyReport));
}
class KeyboardIn : public KeyboardReportParser
{
protected:
void OnKeyDown (uint8_t mod, uint8_t key);
void OnKeyUp (uint8_t mod, uint8_t key);
};
KeyboardIn keyboard_in;
void KeyboardIn::OnKeyDown(uint8_t mod, uint8_t key)
{
keyboard_out.press(mod, key);
uint8_t c = OemToAscii(mod, key);
PrintHex<uint8_t>(key, 0x80);
}
void KeyboardIn::OnKeyUp(uint8_t mod, uint8_t key)
{
keyboard_out.release(mod, key);
uint8_t c = OemToAscii(mod, key);
PrintHex<uint8_t>(key, 0x80);
}
USB UsbHost;
HIDBoot<HID_PROTOCOL_KEYBOARD> HidKeyboard(&UsbHost);
void setup()
{
UsbHost.Init();
delay( 200 );
HidKeyboard.SetReportParser(0, (HIDReportParser*)&keyboard_in);
}
void loop()
{
UsbHost.Task();
}
Solo queda conectarse a través de USB Arduino a una PC, y el teclado a USB Host Shield, descargar el programa a Arduino usando el IDE y ¡listo! ¡Key Catcher está listo!Resultados:1) Arduino ofrece muchas características a bajo precio y una amplia variedad de módulos y sensores.2) Este dispositivo puede permitirle convertir su teclado en un panel de control, por ejemplo, un televisor, un hervidor eléctrico, una lámpara, solo tiene que comprar un par de módulos.