[Tutorial] Arduino UNO/MEGA como teclado, mouse, joystick.

Por cierto, se me olvidaba. Siempre se puede usar un programador ISP y programar el 8u2 por el puerto ICSP del 8u2.

Edito: Acabo de ver que en la R2 ya incluyen la resistencia. Debes de tener una R1.

Revision 2 of the Mega2560 board has a resistor pulling the 8U2 HWB line to ground, making it easier to put into DFU mode.

max_saeta, prueba a poner una resistencia PULLUP de 10K en el pin de reset del conector ICSP del 8u2, o sea, una resistencia, que una pata esté en el pin de arriba del puente que se hace para ponerlo en DFU, y la otra a 5V.

El pin de reset es el que sale en la siguiente foto:

Es un UNO, pero en el MEGA es exactamente igual, ya que el ICSP está colocado de la misma forma.

Saludos
Realmente si tengo la R1, luego de mucho usarla nunca me había dado cuenta. Carmeloco te comento que ya tiene el resistor de 10K entre reset y Vcc, ahora sera colocar el diodo paralelo a la resistencia y polarizada inversamente.

Pero mi pregunta: Puedo cargar el soft de la R3 a esta R1?

Por cierto en la UNO me funciono correctamente tu tutorial.

Lo de leonardo te lo preguntaba para ver la posibilidad futura de simularla y que el resto del programa este en el Atmega 328P.

Carmeloco

Gracias he aprendido bastante hoy con tu tutorial.

Para responder a mi pregunta halle esto: Reflashear 8u2

Lo de cargar el firmware de una R3 en la R1, no lo se, ya que la R3 usa un 16u2, aunque todo es probarlo. siempre se puede volver atrás.

Lo del leonardo, lo veo complicado, ya que, ¿cómo hacemos para que el 16u2 se comunique con el 328p? Habría que hacer un "custom firmware", vamos, un intermedio entre el firmware real del leonardo y los firmwares específicos que puse el link de Darran, que sí que se comunican con el 328p.

No sé si se podría, pero se me ocurre que en el leonardo hay 2 serials. Es posible que pudiéramos usar el serial para comunicación usb y el serial1 para comunicación con el 328p, pero la parte del 328p, habría que grabarla, o antes de grabar el 16u2 como leonardo, o directamente por ICSP.

Me alegro de que el tutorial sirva para algo.

Por cierto, interesante también el link que has puesto.

Carmeloco, ya cargue el firmware del Mega R3 al Mega R1, hasta ahora trabajando normalmente.

Aun asi para que entre en modo DFU hay que colocar el reset y hacer reset en el capacitor que señala el tutorial.

Aqui mi modificacion del codigo de Carmeloco.

/* Arduino USB Keyboard HID demo
*
* Sends Volume up, hello world, and Volume Down to the host PC
*
*/

uint8_t buf[8] = { 0 }; /* Keyboard report buffer */

void setup();
void loop();

#define KEY_LEFT_CTRL    0x01
#define KEY_LEFT_SHIFT   0x02
#define KEY_LEFT_OPTION  0x04
#define KEY_LEFT_COMMAND 0x08
#define KEY_RIGHT_CTRL   0x10
#define KEY_RIGHT_SHIFT  0x20
#define KEY_CTRL	0x01
#define KEY_SHIFT	0x02
#define KEY_ALT		0x04
#define KEY_GUI		0x08
#define KEY_LEFT_CTRL	0x01
#define KEY_LEFT_SHIFT	0x02
#define KEY_LEFT_ALT	0x04
#define KEY_LEFT_GUI	0x08
#define KEY_RIGHT_CTRL	0x10
#define KEY_RIGHT_SHIFT	0x20
#define KEY_RIGHT_ALT	0x40
#define KEY_RIGHT_GUI	0x80

#define KEY_ENTER		40	

void setup() {
    Serial.begin(9600);
    delay(200);
}


char *str = "?+notepad{-Saludos Señores ya sabes que si se puede usar un Arduino UNO como teclado.{Gracias.\r\n";

void loop() {
    char *chp = str;
    delay(5000);
    while (*chp) {
 		if ((*chp >= 'a') && (*chp <= 'z')) {
    		buf[2] = *chp - 'a' + 4;
 		} else if ((*chp >= 'A') && (*chp <= 'Z')) {
    		buf[0] = KEY_LEFT_SHIFT; /* Caps */
    		buf[2] = *chp - 'A' + 4;
 		} else {
		    switch (*chp) {
		    	case ' ':
		     		buf[2] = 0x2c; // Space
		 		  break;
		    	case '+':
    				buf[0] = KEY_LEFT_CTRL; /* Caps */
    				buf[2] = 'E' - 'A' + 4;		         
    				break;
		    	case '-':
    				delay(2500);	         
    				break;
		    	case '.':
    				buf[0] = KEY_LEFT_CTRL; /* Caps */
    				buf[2] = 'C' - 'A' + 4;		         
    				break;
		    	case '?':
    				buf[0] = KEY_LEFT_COMMAND; /* Caps */
    				buf[2] = 'R' - 'A' + 4;	
	   				break;
		    	case '{':
    				buf[2] = KEY_ENTER;		         
    				break;
		    	default:
		        	/* Character not handled. To do: add rest of chars from HUT1_11.pdf */
		 			buf[2] = 0x37; // Period
		 			break;
    		}
 		}
 		Serial.write(buf, 8); // Send keypress
 		buf[0] = 0;
 		buf[2] = 0;
 		Serial.write(buf, 8); // Release key
 		chp++;

    }
}

Rebuscando un poco, he recordado que tengo un arduino uno, que no es ni original ni R3. Lo tenía medio olvidado, porque es para un proyecto que tengo a medio terminar.

El caso es que este arduino, lleva un chip, en el que lleva escrito mega8u2. Para ponerlo en modo DFU, hay que ponerle una resistencia de 10K así:

Sin esa resistencia, por muchos resets que le hagamos al chip, no entra en modo DFU.

Yo no se la he soldado. Lo que he hecho es sujetar una resistencia con los pines encima de los pads del arduino, con el pulgar, después se conecta el USB al arduino y luego se hace el reset, tal y como expliqué en el primer mensaje de este post. Esto no lo he conseguido a la primera, hace falta un poco de maña para hacer todo esto. Una vez hecho el reset, ya se puede soltar la resistencia.

El chip entra en modo DFU, pero sorpresa, el PC me lo detecta como AT90USB82 y no como ATmega8u2.

Pues bien, en flip, hay que seleccionar, en mi caso el AT90USB82, y en tu caso, el que te salga en el administrador de dispositivos de windows (en otros sistemas operativos, ni idea).

He cargado el .hex del Arduino UNO R3, y funciona perfectamente.

A raíz de un problema que ha tenido un usuario, que no podía poner el chip en modo DFU, he investigado la forma de grabar el firmware en el chip, usando un arduino como isp.

En este ejemplo, usamos un arduino uno como isp, para re-grabar el firmware en el 16u2 de un arduino mega.

Cargamos el código del arduino isp en el arduino uno.

Conectamos los arduinos así:

Nos creamos una carpeta en c: que se llame avrdude

Allí vamos a copiar varios archivos.

Copiamos el archivo avrdude.exe que está en C:\Program Files (x86)\Arduino\hardware\tools\avr\bin
Copiamos el archivo avrdude.conf que está en C:\Program Files (x86)\Arduino\hardware\tools\avr\etc

Copiamos el archivo Arduino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-Rev3.hex que está en C:\Program Files (x86)\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2

Estos archivos, los saco del IDE 1.6.1 de arduino. No se si funciona con otra versión. Con esta, puedo certificar que funciona.

Bien, con estas tres cosas copiadas, abrimos una consola de DOS, ponemos

cd c:\avrdude

y después, con el arduino uno conectado por usb al ordenador, ponemos el siguiente comando, cambiando el com3 por el puerto com en el que nos detecte el arduino el pc.:

avrdude -p m16u2 -F -P com3 -b19200 -c arduino -U flash:w:Arduino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-Rev3.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xF4:m -U lock:w:0x0F:m

Con esto saldrán una serie de cosas por la pantalla de DOS, y acabará diciendo un "avrdude done. Thank you."

Con esto, tedríamos que tener el AtMega 16u2 regrabado como de serie.

Usamos el firmware "COMBINED" para que el chip tenga la funcionalidad de poderlo poner en modo DFU. Si usamos el que usamos normalmente con el software Atmel Flip, perdemos esa capacidad, ya que no estamos grabando en modo DFU, si no que estamos grabando directamente al chip.

Un usuario, me envió este mensaje privado hace unos días:

chulas21:
Hola, estoy mirando tu post sobre cambiar el firmware del arduino UNO para usarlo como teclado, y he querido modificar el codigo pero mis conocimientos son limitados :sob: ... El caso es que no se como haces el Ctrl y como podria hacer la tecla Windows, si me puedes explicar como te lo agradeceria muchisimo :slight_smile: :slight_smile: :slight_smile:

Le respondí, que no es correcto pedir ayuda por mensaje privado, y que mejor que pusiese su consulta, directamente en este post. Como veo que no lo hace, pero veo interesante la consulta, pongo la respuesta a continuación:

Los códigos de teclas especiales, los podemos encontrar en la documentación que hay en www.usb.org. Allí tenemos un manual llamado "HID Usage Tables"

HID Usage Tables 1.12

En la página 59, encontramos los códigos para las teclas CTRL.

224 para "Left Control" y 228 para "Right Control"

En la página 56, está el código parala tecla Windows, que es el 101. Dice que es para windows 95. No se si funcionará con el resto de versiones.

Hola carmeloco, me ha servido tu tutorial para entender unas cosas que no conocia, sólo que me he perdido en el paso de cargar el .HEX "Arduino-keyboard-0.3.hex" al flip pues me arroja un error diciendo que no se puede abrir ese archivo he probado con las versiones R1 y R2 y marca lo mismo. Despues regrese el firmware original como lo explicas en el otro comentario y funciono muy bien cargando perfectamente el "Arduino-usbserial-atmega16u2-Uno-Rev3.hex".

Saludos y muchas gracias.

A mi me carga correctamente. ¿Has seleccionado el dispositivo correcto en flip?

Si, marque el Atmega16U2, el programa corre en algo asi como una versión demo? Tal vez eso impide que abra el archivo.

Saludos!!

A mi no me funciona como una demo.

Como puedo hacer el puente dfu con arduino nano?
Estoy haciendo una maquina arcade, y para los controles, quería hacerlo con Arduino, así que compré uno nano, ya que no quería que ocupase mucho, y no necesitaba tantos puertos ni memoria. Pero estuve buscando como transformar el Arduino a un teclado, y lo unico que encontré es este post, pero no se hacerlo con el Arduino Nano.
Alguna idea?
Saludos.

Además el Flip, no tiene el chip del Nano, el ATmega328p, así que estuve buscando, y encontré un programa llamado XLoader, que si que tenía ese chip, pero no sube el archivo.
Que puedo hacer?
Saludos.

Corrección, he cambiado el baud ratio del programa y ha subido, pero al terminar el Arduino ha empezado a sacar mucho, MUCHO humo, lo he desconectado y no tiene marcas de quemadura, pero tengo miedo de conectarlo al PC de nuevo por si ocurre algo, lo conecto?

ArnyminerZ:
Como puedo hacer el puente dfu con arduino nano?

El mismo título lo dice, es para Arduino UNO o Arduino MEGA.

Buenas,

Estoy construyendo una recreativa a partir de otra que construí allá por el 2004, en esa usaba como interfaz de teclado un montaje que saque de un foro, que se llamaba minibox que a su vez estaba basado en un montaje llamado buttonbox2.
El núcleo de este montaje es un Atmel AT90S2313. El circuito soporta 32 teclas configuradas en una matriz de 8x4. En su momento sólo usaba unas pocas, y el emulador lo controlaba con un teclado auxiliar, pero ahora necesito más, ya que la maquina la he configurado con 2 jugadores (en total 28 teclas) y el control lo quiero llevar desde los mandos (tecla escape, enter, tab,etc…). Al realizar el montaje me doy cuenta que hay teclas no funcionan correctamente ya que a veces van y otras no van (no encontré patrón alguno). Según he podido leer por ahí, en algún foro, que hay algún PB del AT que no se comporta como debiera, por lo que decidí cambiar las teclas y que las problemáticas fueran las que no necesito.
Perooooo, los programas que utilicé para grabar el AT no funcionan en W7, ni siquiera con un DOSBOX, aparte que mi ordenador no dispone ni de puerto serie ni paralelo, por lo que debo quemar el *.hex con algo moderno (dispongo de un ISP para grabar el arduino mini), pero por más que leo no me aclaro como hacerlo (pero bueno, esto es de otro foro)

El caso es que me planteo hacerlo con un arduino Uno R3 y buscando he llegado a este post.
Dándole vueltas, se me plantean varias dudas, que me gustaría comentar antes de intentarlo, por si dejo el arduino como un pisapapeles de 6€ :frowning:

La primera es la lectura del teclado, hay que hacerla de forma matricial. Copiando el modo de los teclados matriciales, necesitaríamos 8 + 4 pines (cosa que, si no me equivoco, dispone el UNO), y se pondría secuencialmente en HIGH los 8, leyendo los estados de los otros 4, lo cual nos daría un “par” que identificaría el botón pulsado. Hasta aquí bien.

Las dudas, ¿tardaría demasiado en hacer esta lectura y se produciría un retraso en el envío del código al PC? (como guía el minibox tarda 0,32ms en leer el estado de todos los botones)
¿como se manejaría el envío de 2 o más teclas a la vez?
¿como se manejaría la repetición de cada tecla al mantener el botón pulsado?.

¿se solucionaría todo esto con un Leonardo?

Bueno, sigo dándole vueltas, disculpad el rollo y muchas gracias por adelantado.

Referencias minibox: ButtonBox

Bueno.
La "primera en la frente", mi Arduino lleva el chip CH340G, por lo que me temo que este tutorial no vale para pasarlo a modo "teclado". :frowning: :frowning:
He pedido un Leonardo para ver si vale. Y mientras espero a que llegue, iré haciendo un código que debe valer para ambos, para el Uno con un programa en W7 lector de códigos del puerto enviados por el Arduino y para el Leonardo debería enviarlos directamente con el uso de la librería correspondiente.

Un saludo

He leído y hecho todas las recomendaciones que hay en este post pero ninguna me a funcionado para poder poner en modo DFU mi arduino UNO. Me podrían recomendar algo más??

Una pregunta carmeloco si paso mi Arduino a teclado ya no los puedo programar para detecciones de botones? Por ejemplo si presionó un botón me escriba la "A"? De antemano gracias.