Go Down

Topic: Arduino Leonardo y Raspberry Pi (Read 177 times) previous topic - next topic

pepepotero

Hola

Tengo en mente realizar un juego de tablero, en el cual, en el centro hay una pantalla conectada a una Rpi. La idea que tengo es que al caer en ciertas casillas la Rpi ejecute un jueguecillo para ver si gana o pierde, aparte de decorar con gráficos para cada casilla o mientras no se juega. Los juegos son muy sencillos, como evitar enemigos, preguntas, algo como "flappy bird", etc. La interacción se realiza con 4 o 5 botones (aún por decidir).

Para la acción de los botones tengo pensado en usar un Leonardo o un pro micro (ATMEGA32U4) el cual proporciona interfaz de teclado.

Para no complicar el sistema, querría que el Arduino controle también el dado y los leds del tablero (también tengo pensado en colocar un motor para mover una figura decorativa, pero eso es sólo una idea). Por lo tanto, la comunicación Rpi y Arduino se podría hacer con la interfaz USB a través del envío de comandos, por ejemplo, para mandar el resultado del dado, el resultado del juego, cuando tiene que parpadear el led, etc.

Y aquí es donde tengo la duda, he buscado, pero no he encontrado la respuesta. ¿habría algún problema en hacerlo? ¿chocarían las 2 interfaces (Teclado y COM)? ¿qué había que colocar en el código para separar las comunicaciones?

Sé que se podría hacer todo con el GPIO de la Rpi, pero no estoy muy familiarizado con él y además tengo funciones ya hechas para Arduino que puedo reutilizar y no programar todo de nuevo en la Rpi. Incluso colocar otro arduino Uno o pro mini para que realice las tareas, pero querría evitarlo.

Muchas gracias de antemano.

surbyte

Tu pregunta es mas de RPi que de Arduino y como lo veo es una consulta para otro foro y no este.
Supongamos que no sea el caso (haré la vista gorda).
Un RPI 2 o 3 tiene 4 puertos USB. Te sobran para conectarte sin tener problemas para teclado (supongo que hablas de un teclado conectado a uno de sus USBs) y el Arduino por otro que termina comunicandose via serial como si fuera PC.

No se si he entendido bien la pregunta y mi respuesta te satisface.
Yo tengo un módulo inalámbrico con el cual manejo Teclado/mouse en un RPi. Y me quedan 3 USBs libres. Podría usar uno para programar un Arduino via IDE en LINUX sin problemas.

pepepotero

En primer lugar muchas gracias por la respuesta.

Cierto es que hay una Rp de por medio, pero mi consulta es para el arduino. En la Rpi sé que hay que mandar el comando por el COM y eso sería todo, luego cuando lea lo que le envía el arduino al COM lo procesa.

Si no me he explicado mal, que puede, el Arduino hace de teclado, es decir, los botones están conectados y envia las pulsaciones de teclas a la Rpi y eso son 4 o 5 pines y unas lineas. Eso funciona y lo he hecho ya con otra Rpi.

La duda es si hay que hacer algo en el Arduino para que, aparte de enviar las pulsaciones de teclas por el USB, pueda recibir por el mismo puero USB los envios de comandos del COM de la Rpi y enviarlos con un Serial.Print, ¿puede que sean puertos diferentes? y eso es lo que no tengo claro.

Ahora mismo no dispongo de un Leonardo o pro micro (lo he pedido).

Un saludo

surbyte

Quote
La duda es si hay que hacer algo en el Arduino para que, aparte de enviar las pulsaciones de teclas por el USB, pueda recibir por el mismo puero USB los envios de comandos del COM de la Rpi y enviarlos con un Serial.Print, ¿puede que sean puertos diferentes? y eso es lo que no tengo claro.
Ahora queda claro que tu pregunta es de Arduino. No lo había comprendido asi.

Bien.. que dilema.
Cual es el código y/o librería que usarás como para darme mas datos?

pepepotero

Hola,

Pues realmente en la consulta no hay ninguna librería ni código, es más por el tema de cuales serían necesarias, (si lo fueran)

La cuestión tal vez se pueda reducir a:

Cominicaciones serial. No debería haber problema:

Rpi------>Comando por Serial USB (COM)------>Arduino Leonardo

Arduino Leonardo------>Comando por Serial.print(xx)------> Rpi

Comunicaciones USB nativo:
Arduino Leonardo------>Envia pulsación de tecla via USB (HID)------> Rpi

¿hay que hacer algo especial en el programa de arduino para cambiar entre un modo u otro de USB? Para cuando envíe una pulsación de tecla (libería propia del IDE) o un Serial.print(xx). Ambos usos los he hecho pero por separado (arduino como teclado) y en la practica de los led desde Rpi, pero nunca en el mismo programa.

Muchas gracias

surbyte

En lugar de preguntar teoricamente porque no planteas que código vas a usar como HID y miras dicho código a ver si existela posiblidad de usar el puerto Serie como pretendes. La respuesta estará ahi nomás.

pepepotero

Hola

Cuando conectas el leonardo, el ordenador (Rpi o PC) lo detecta como un HID (ratón /yo teclado). Pero cuando quieres programarlo, lo tiene que detectar como USB, por lo tanto creo que dispone de ambas interfaces.

El código para que funcione como HID es muy claro

Primero un:
Code: [Select]
#include <Keyboard.h>

y luego usar:
Code: [Select]
Keyboard.press(valorKey);
o
Code: [Select]
Keyboard.press(valorKey);
Según se necesite

Eso lo tengo claro.

Ahora, que pasará si pongo en el mismo programa

Code: [Select]
Serial.print(xxx)"
Donde xxx es lo que hay que enviar a la Rpi.
o
Code: [Select]
if (Serial.available()) //Nos dice si hay datos dentro del buffer
  {xxx


Ahí no se lo que pasará y no tengo ahora para probarlo. Cuando me llegue probaré y veré si hay errrores o hay que cambiar algo.
Es decir que nunca he usado un leonardo con el Serial y la librería Keyboard. Casi seguro que están los 2 tipos de USB disponibles, pero tenía dudas.

Muchas gracias por todo

surbyte

Y cual es el enlace de tu librería Keyboard? Fue lo que te pedí antes (post #3)

pepepotero


surbyte

Acabo de darme cuenta... como nunca tuve Leonardo, no sabia de ella.
MIra esto Keyboard.print

y pruébalo por favor a ver que ocurre

pepepotero

Hola
Eso envía pulsaciones de las teclas  de la palabra que se indica.
Con eso o con Keypress(Char) enviaré los botones. Por ejemplo si se pulsa el botón 1 envía una pulsacion de 'a' y el programa de la Rpi actuará en consecuencia a través de un evento Keypress del form en gambas3 ( que es el que uso para Rpi). Esto ya lo hice para otro proyecto y funciona.
A través del serial.print enviaría un comando para que un evento del objeto COM leeiria y ejecutará.
He leído un poco más y me parece que el Leonardo da 2 USB uno COM y otro HID.
En cuanto me llegue lo pruebo y doy experiencia.


Surbye, muy agradecido  por tu tiempo.

Go Up