Anuncios Google

Simular teclado con arduino

Mi duda es la siguiente.

Quiero probar a hacer una especie de teclado para jugar al lol con un arduino, eh pensado en usar pulsadores para poner las teclas que solo se necesitan para jugar q, w ,e ,r, d, f ...

Mi problema es k no se como hacer para que al mandar los valores por el puerto serie me detecte y haga como si estubiera pulsando esa tecla, el SO es windows 7



Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Bueno al final lo he

Bueno al final lo he conseguido xD

Debes hacer este circuito con el arduino:

Luego el código del arduino:

int buttonPin = 2;
int ledPin =  13;
int buttonState = 0;
int lastState = 0;
 
void setup() {
	Serial.begin(9600);
	pinMode(ledPin, OUTPUT);      
	pinMode(buttonPin, INPUT);     
}
 
void loop(){
	buttonState = digitalRead(buttonPin);
	if (buttonState == HIGH) {     
		digitalWrite(ledPin, HIGH);
		if(lastState == LOW)
		{
			Serial.print(1);
		}
	}else {
		digitalWrite(ledPin, LOW); 
	}
	lastState = buttonState;
}

Y el código del programa para Linux:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
#include <xdo.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
 
int open_serial(char *port);
void close_serial(int fd);
 
int main()
{
	sleep(1); //wait 1 second
	printf("creating xdo...\n");
	xdo_t* myXdo = xdo_new(NULL);
	printf("xdo created...\n");
 
	printf("getting display...\n");
	// Obtain the X11 display.
		Display *display = XOpenDisplay(0);
		if(display == NULL)
		{
			printf("could not open display, exiting...\n");
			return -1;
		}
 
	printf("getting root window...\n");
	// Window focus
		int revert;
		Window winFocus;
 
	int fd = open_serial("/dev/ttyACM0");
	if(fd == 0)
	{
		printf("serial error, exiting...\n");
		return -1;
	}
	char buff;
	unsigned int rd;
 
 
	while(1)
	{
		rd = read(fd, &buff, 1);
		if(rd > 0)
		{
			printf("Read: %c\n", buff);
			XGetInputFocus(display, &winFocus, &revert);
			xdo_keysequence_up(myXdo, winFocus, "A",  12000);
			xdo_keysequence_down(myXdo, winFocus, "A",  12000);
		}
	}
 
	printf("exiting...\n");
	XCloseDisplay(display);
	xdo_free(myXdo);	
	close_serial(fd);
	return 0;
}
 
int open_serial(char *port)
{
	int fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
	if(fd == -1)
	{
		printf("Could not open %s\n", port);
		return 0;
	}
	fcntl(fd, F_SETFL, 0);
	printf("Port %s has been sucessfully opened and %d is the file description\n", port, fd);
	return fd;
}
 
void close_serial(int fd)
{
	close(fd);
}

Imagen de anxoganso

Muchisimas gracias

Muchisimas gracias

Para añadir más teclas puedes

Para añadir más teclas puedes hacer algo como:

 

	while(1)
	{
		XGetInputFocus(display, &winFocus, &revert); //la ventana que tiene el focus
		rd = read(fd, &buff, 1);
		switch(fd)
		{
			case 1:
				xdo_keysequence_up(myXdo, winFocus, "A",  12000);
				xdo_keysequence_down(myXdo, winFocus, "A",  12000);
				break;
			case 2:
				xdo_keysequence_up(myXdo, winFocus, "B",  12000);
				xdo_keysequence_down(myXdo, winFocus, "B",  12000);
				break;
			case 3:
				xdo_keysequence_up(myXdo, winFocus, "C",  12000);
				xdo_keysequence_down(myXdo, winFocus, "C",  12000);
				break;
			default:
				break;
		}
	}

Ya se que lo necesitas para

Ya se que lo necesitas para Windows, pero a lo mejor alguien le sirve este programilla que he hecho para Linux (se necesita instalar libxdo-dev):

#include <stdio.h>
#include <xdo.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
 
 
int main(int argc, void **argv)
{
	sleep(2); //esperamos 2 segundos
	printf("creating xdo...\n");
	xdo_t* myXdo = xdo_new(NULL);
	printf("xdo created...\n");
 
	printf("getting display...\n");
	// Obtain the X11 display.
		Display *display = XOpenDisplay(0);
		if(display == NULL)
			return -1;
 
	printf("getting root window...\n");
	// Window focus
		int revert;
		Window winFocus;
		XGetInputFocus(display, &winFocus, &revert);
 
	printf("sending keys...\n");
 
	int i;
	for(i = 0; i < 10; i++)
		xdo_keysequence_down(myXdo, winFocus, "A",  12000);
 
	xdo_keysequence_up(myXdo, winFocus, "A",  12000);
 
	//xdo_type(myXdo,  winFocus, "adffsfdsfsd",  12000);
 
	printf("exiting...\n");
	XCloseDisplay(display);
	xdo_free(myXdo);
	return 0;
}

Imagen de anxoganso

No no me importa lo pruebo

No no me importa lo pruebo ahora en linux gracias XD

me podrias explicar un poco ??

Pues mira, quitando los

Pues mira, quitando los printf es mucho mas claro:

#include <stdio.h>
#include <xdo.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
 
 
int main(int argc, void **argv)
{
	sleep(2); //esperamos 2 segundos
	xdo_t* myXdo = xdo_new(NULL); //creamos un nuevo xdo
 
	Display *display = XOpenDisplay(0); //abrimos el display (para las ventanas)
	if(display == NULL)
		return -1;
 
	Window winFocus;
	XGetInputFocus(display, &winFocus, NULL); //con eso sabemos
								//la ventana que tiene el focus (donde está el cursor)
 
	xdo_keysequence_down(myXdo, winFocus, "A",  12000); //enviamos la tecla "A", delay 12000 microsegundos
 
	xdo_keysequence_up(myXdo, winFocus, "A",  12000);
 
 
	XCloseDisplay(display); //cerramos todo
	xdo_free(myXdo);
	return 0;
}
 

El sleep ese es para que de tiempo a abrir otra ventana donde se pueda escribir, asi la "A" la escribirá en esa.

 

EDITO: He grabado un vídeo:

 

Imagen de Comandillos

Hay dos formas

Dependiendo del tipo de Arduino que sea, puedes emular un Teclado o no.

Si tu Arduino es el Arduino Leonardo puedes emular una interfaz humana USB y crear un teclado virtual, todo ello documentado en arduino.cc

Sin embargo, si tu Arduino es el Arduino UNO la cosa se complica un poquitín mas.

Tienes que crear un pequeño programa en el Arduino con la lib SoftwareSerial que mande cada pulsacion del boton como un valor numérico.

Si pulsas la Q, envias el 1. Si es la Z, el 2. Etc...

Todo esto lo recibe el ordenador por el puerto USB (Normalmente en Windows, el COM3 para Arduino). Lo que hace necesario que crees un programa en el ordenador que interprete los numeros entrantes por el puerto serie, y los mande como pulsaciones virtuales. (Para crear este programa te recomendaría que usaras las librerias de .Net puesto que tiene funciones como xinput o SendKeys, y las del Ports que te facilitan muchísimo el trabajo)

Hace poco lo he hecho yo para el mismo juego, y he subido un video, aunque no demuestro como funciona, seguí el segundo procedimiento que te escrito debido a que el modelo que poseeo es el Arduino UNO.

http://www.youtube.com/watch?v=gUmg9yUgyjA

Saludos!

 


Imagen de anxoganso

tengo el uno xD gracias voy a

tengo el uno xD gracias voy a ver el video

Imagen de Comandillos

Pues

Mayoritariamente tienes que hacer lo que te he indicado en el segundo paso.

Si tienes cualquier duda envíame un MP o pon un comentario y te responderé cuanto antes pueda.


Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.