Codigos ASCII Incorrectos - Diseño del teclado en Español

Buenas. Acabo de adquirir un Arduino Pro Micro, con la intencion de aprender un poco sobre estas placas. Soy totalmente nuevo en este mundo, pero tengo conocimientos de programacion.

Como esta placa se puede usar como un teclado, estoy intentando realizar una serie de comandos en powershell (al estilo de USB Rubber Ducky, pero mas barato).

En este punto me he encontrado con dos problemas, uno detras de otro.

Uno de los comandos que estaria intentando mandar, seria este, de powershell:

Keyboard.println("$usbPath = Get-WMIObject Win32_Volume | ? { $_.Label -eq 'ARDUINO' } | select name");

Sin embargo, el resultado es este:

$usbPath ¡ Get'WMIObject Win32?Volume Ç _ ^$?.Label 'eq ÁRDUINO´* Ç select name

Como podeis ver, los caracteres tipo igual, guion, interrogacion, etc, me los pone de otra manera. Tras buscar informacion al respecto, he visto que debe ser que la placa solo tenga el diseño del teclado Americano, y no he visto forma alguna de cambiarlo al castellano (a diferencia de Teensy, que aparece una opcion en el menu).

Como no conseguía cambiar el orden de las teclas, he intentado realizar esas letras con ASCII. Para mi sorpresa, los que displayeo son distintos a los que deberian ser ( http://ascii.cl/es/ ):

Codigo:

for (int i=0; i <= 128; i++){
      Keyboard.println(i);
      Keyboard.println("> ");
      Keyboard.write(i);
      delay(100);
      typeKey(KEY_RETURN);
} 
Keyboard.releaseAll();

Resultado:

0: 
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8:
9: 	
10: 

11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32:  
33: !
34: ¨
35: ·
36: $
37: %
38: /
39: ´
40: )
41: =
42: (
43: ¿
44: ,
45: '
46: .
47: -
48: 0
49: 1
50: 2
51: 3
52: 4
53: 5
54: 6
55: 7
56: 8
57: 9
58: Ñ
59: ñ
60: ;
61: ¡
62: :
63: _
64: "
65: A
66: B
67: C
68: D
69: E
70: F
71: G
72: H
73: I
74: J
75: K
76: L
77: M
78: N
79: O
80: P
81: Q
82: R
83: S
84: T
85: U
86: V
87: W
88: X
89: Y
90: Z
91: `
92: ç
93: +
94: &
95: ?
96: º
97: a
98: b
99: c
100: d
101: e
102: f
103: g
104: h
105: i
106: j
107: k
108: l
109: m
110: n
111: o
112: p
113: q
114: r
115: s
116: t
117: u
118: v
119: w
120: x
121: y
122: z
123: ^
124: Ç
125: *
126: ª
127: 
128:

Si comparamos mis resultados con la web anterior, vemos que algunos coinciden, pero otros tantos son distintos. Y la barra vertical | no aparece por ningun lado.

Asique, despues de este tocho, mis preguntas serian:

  • ¿Alguna forma de cambiar el diseño del teclado del Arduino al español?
  • De no poder realizar lo anterior, ¿escribir los caracteres ASCII correctamente?

Espero haberme explicado correctamente, y agradecería cualquier ayuda que podais darme.

Pregunta:

Por qué hasta 128? Por qué no probar hasta 255? O es que entre 129 a 255 ya empieza a controlar las teclas como F1?

Lucario448:
Pregunta:

Por qué hasta 128? Por qué no probar hasta 255? O es que entre 129 a 255 ya empieza a controlar las teclas como F1?

Gracias por tu respuesta.

He probado como dices hasta 255, pero por alguna razon se vuelve loco, me empieza a abrir el menu de inicio, y sigue escribiendo ahi, luego pasa a una ventana de ayuda que el solo abre. Y de los que he podido ver que me saca, son los mismos que los de antes, vuelve a empezar en bucle.

¿Entiendo que es para dar entrada de comandos a un ordenador? ¿Windows por ejemplo?
Ten en cuenta que no se usa el ASCII llanamente, sino que muchos códigos son de 16 bits y dependen de la página de códigos que tengas configurada en tu SO. ¿No te suena la palabra unicode?

noter:
¿Entiendo que es para dar entrada de comandos a un ordenador? ¿Windows por ejemplo?
Ten en cuenta que no se usa el ASCII llanamente, sino que muchos códigos son de 16 bits y dependen de la página de códigos de teclado que tengas configurada en tu SO. ¿No te suena la palabra unicode?

noter:
¿Entiendo que es para dar entrada de comandos a un ordenador? ¿Windows por ejemplo?
Ten en cuenta que no se usa el ASCII llanamente, sino que muchos códigos son de 16 bits y dependen de la página de códigos que tengas configurada en tu SO. ¿No te suena la palabra unicode?

Exacto, ahora mismo lo estoy probando para windows. Desconozco si para Linux/Android tendria el mismo problema.

Estuve mirando si se podia modificar a UTF-8, pero no he encontrado nada. ¿Alguna idea de como podria hacerlo?

Gracias por todo.

Si no te queda una solución clara, entonces lo que puedes hacer es cambiar la distribución del teclado antes del tecleado automatizado. Incluso puede hacerse desde el mismo Arduino.

En Windows 8/10 tengo entendido que se hace con la combinación "Tecla Windows" + barra espaciadora; esto usualmente hace que se alterne entre el español configurado (porque también está la variante latinoamericana), e inglés (la que usa la clase Keyboard). En Linux no estoy seguro si había combinación de teclas para eso.

El problema es que el microcontrolador "mapea" el teclado de cierta forma, pero el sistema operativo lo hace de otra; de ahí los caracteres no deseados.

Lucario448:
Si no te queda una solución clara, entonces lo que puedes hacer es cambiar la distribución del teclado antes del tecleado automatizado. Incluso puede hacerse desde el mismo Arduino.

En Windows 8/10 tengo entendido que se hace con la combinación "Tecla Windows" + barra espaciadora; esto usualmente hace que se alterne entre el español configurado (porque también está la variante latinoamericana), e inglés (la que usa la clase Keyboard). En Linux no estoy seguro si había combinación de teclas para eso.

El problema es que el microcontrolador "mapea" el teclado de cierta forma, pero el sistema operativo lo hace de otra; de ahí los caracteres no deseados.

¿Te refieres a cambiar la distribucion del teclado en Windows? Creo que debe ser una liada, ya que ademas despues deberias volver a dejarlo como estaba. Ademas, es muy probable que para realizar esa accion por comandos, me haga falta uno de esos caracteres que no estoy consiguiendo sacar.

La tecla de windows + espacio, en Win7 me muestra el escritorio.

Bueno.
Creo que estamos cayendo en un error de concepto. Un teclado no se limita a enviar códigos ASCII en forma de cadena. Ten en cuenta que por ejemplo envia tanto cuando se pulsa una tecla como cuando se suelta. También hace lo propio con los caractes de control, así que no es tan sencillo como enviar la cadena.
No te queda otra que estudiar el asunto y ver cómo implementarlo. He mirado un poco, aunque no me he metido a fondo (eso es tarea tuya) y parece bastante factible.
Por ejemplo, puedes empezar por aquí.

noter:
Bueno.
Creo que estamos cayendo en un error de concepto. Un teclado no se limita a enviar códigos ASCII en forma de cadena. Ten en cuenta que por ejemplo envia tanto cuando se pulsa una tecla como cuando se suelta. También hace lo propio con los caractes de control, así que no es tan sencillo como enviar la cadena.
No te queda otra que estudiar el asunto y ver cómo implementarlo. He mirado un poco, aunque no me he metido a fondo (eso es tarea tuya) y parece bastante factible.
Por ejemplo, puedes empezar por aquí.

Gracias por tu respuesta. La verdad que no me esperaba que fuera esto tan complicado. Mañana le hecho un ojo a ese PDF mas detenidamente.