Este artículo trata sobre cómo desarrollar un hardware de gamepad simple y una interfaz con la placa Raspberrypi y también sobre la técnica de interconectar un código de juego escrito en HTML5 con el gamepad . Aquí se ha modificado un juego de serpientes escrito en HTML5 y JavaScript para que se pueda jugar con el nuevo mando de cuatro botones. En este proyecto se utilizan técnicas de señal, tubería, bifurcación, etc.
((wysiwyg_imageupload:11011:))
El juego se ejecuta en una ventana del navegador y se comunica con el panel de juego a través de un Named Pipe o FIFO. Hay varios procesos en ejecución que pueden leer el panel de juego y escribir los comandos necesarios en el FIFO para controlar el juego. El JavaScript escrito en el código del juego simplemente lee el FIFO para ingresar datos de control.
Fig. 2: Diagrama de bloques del gamepad Raspberry Pi
Código fuente del proyecto
###
#incluir <bcm2835.h> #incluir <pthread.h> #incluir <unistd.h> #incluir <señal.h> #incluir <sys/time.h> #incluir <stdlib.h> #incluir <sys/types.h> #incluir <sys/stat.h> #incluir <fcntl.h>
#definir IN_PIN1 RPI_GPIO_P1_07
#definir IN_PIN2 RPI_GPIO_P1_22
#definir IN_PIN3 RPI_GPIO_P1_18
#definir IN_PIN4 RPI_GPIO_P1_16#definir OUT_PIN1 RPI_GPIO_P1_15
#definir OUT_PIN2 RPI_V2_GPIO_P1_13
#definir OUT_PIN3 RPI_GPIO_P1_12
#definir OUT_PIN4 RPI_GPIO_P1_11#define SNAKE_FIFO_NAME "xyz"
set_pins_input vacío (nulo);
vacío set_pins_output(vacío);
vacío set_output_pins_low(vacío);
void button_signal_handler (int sig, siginfo_t *siginfo, void *context);
señal vacía_on_state_change_pin1 (vacío);
señal vacía_on_state_change_pin2 (vacío);
señal vacía_on_state_change_pin3 (nulo);
señal vacía_on_state_change_pin4 (nulo);
void sig_set_handler (señal int, void *handler);
void sig_send_val (id_pid_t, signo int, valor int);pid_t hijo_id(5);
punto interno = 0;int principal (nulo)
{
ent i;
int cobra_fifo = -1;si (!bcm2835_init)
devolver 1;set_pins_output;
set_output_pins_low;
set_pins_input;
retraso (100);sig_set_handler (SIGUSR1, &button_signal_handler);
si (! (child_id (0) = bifurcación))
{
señal_on_state_change_pin1;
_salir(0);
}
otro;si (! (child_id (1) = bifurcación))
{
señal_on_state_change_pin2;
_salir(0);
}
otro;si (! (child_id (2) = bifurcación))
{
señal_on_state_change_pin3;
_salir(0);
}
otro;si (! (child_id (3) = bifurcación))
{
señal_on_state_change_pin4;
_salir(0);
}
otro;mientras (1)
{
sistema("eco x >> xyz");
retraso (100);
}bcm2835_close;
devolver 0;
}señal vacía_on_state_change_pin1 (vacío)
{
mientras (1)
{
si (bcm2835_gpio_lev(IN_PIN1))
{
retraso (50);
si (bcm2835_gpio_lev(IN_PIN1))
{
sig_send_val (getppid, SIGUSR1, 1);hacer
{
mientras (bcm2835_gpio_lev (IN_PIN1))
retraso (1);
retraso (50);
}
mientras (bcm2835_gpio_lev(IN_PIN1));sig_send_val (getppid, SIGUSR1, 1);
}
otro;
}otro;
retraso (1);
}
}señal vacía_on_state_change_pin2 (vacío)
{
mientras (1)
{
si (bcm2835_gpio_lev(IN_PIN2))
{
retraso (50);
si (bcm2835_gpio_lev(IN_PIN2))
{
sig_send_val (getppid, SIGUSR1, 2);hacer
{
mientras (bcm2835_gpio_lev (IN_PIN2))
retraso (1);
retraso (50);
}
mientras (bcm2835_gpio_lev(IN_PIN2));sig_send_val (getppid, SIGUSR1, 2);
}
otro;
}otro;
retraso (1);
}
}señal vacía_on_state_change_pin3 (vacío)
{
mientras (1)
{
si (bcm2835_gpio_lev(IN_PIN3))
{
retraso (50);
si (bcm2835_gpio_lev(IN_PIN3))
{
sig_send_val (getppid, SIGUSR1, 3);hacer
{
mientras (bcm2835_gpio_lev (IN_PIN3))
retraso (1);
retraso (50);
}
mientras (bcm2835_gpio_lev(IN_PIN3));sig_send_val (getppid, SIGUSR1, 3);
}
otro;
}otro;
retraso (1);
}
}señal vacía_on_state_change_pin4 (vacío)
{
mientras (1)
{
si (bcm2835_gpio_lev(IN_PIN4))
{
retraso (50);
si (bcm2835_gpio_lev(IN_PIN4))
{
sig_send_val (getppid, SIGUSR1, 4);hacer
{
mientras (bcm2835_gpio_lev (IN_PIN4))
retraso (1);
retraso (50);
}
mientras (bcm2835_gpio_lev(IN_PIN4));sig_send_val (getppid, SIGUSR1, 4);
}
otro;
}otro;
retraso (1);
}
}void button_signal_handler (int sig, siginfo_t *siginfo, void *context)
{
si ( 1 == *( ( int * ) &siginfo -> si_value ) )
sistema("hace eco de ti >> xyz");
de lo contrario si ( 2 == *( ( int * ) &siginfo -> si_value ) )
sistema("echo r >> xyz");
de lo contrario si (3 == *( (int *) &siginfo -> si_value))
sistema("echo l >> xyz");
de lo contrario si ( 4 == *( ( int * ) &siginfo -> si_value ) )
sistema("echo d >> xyz");
otro;bcm2835_gpio_write (OUT_PIN1,st);
st = ~st;
}vacío set_output_pins_low (vacío)
{
bcm2835_gpio_write (OUT_PIN1, BAJO);
bcm2835_gpio_write(OUT_PIN2, BAJO);
bcm2835_gpio_write (OUT_PIN3, BAJO);
bcm2835_gpio_write (OUT_PIN4, BAJO);
}set_pins_output vacío (vacío)
{
bcm2835_gpio_fsel (OUT_PIN1, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel (OUT_PIN2, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel (OUT_PIN3, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel (OUT_PIN4, BCM2835_GPIO_FSEL_OUTP);
}set_pins_input vacío (vacío)
{
bcm2835_gpio_fsel (IN_PIN1, BCM2835_GPIO_FSEL_INPT);
bcm2835_gpio_set_pud (IN_PIN1, BCM2835_GPIO_PUD_OFF);bcm2835_gpio_fsel (IN_PIN2, BCM2835_GPIO_FSEL_INPT);
bcm2835_gpio_set_pud (IN_PIN2, BCM2835_GPIO_PUD_OFF);bcm2835_gpio_fsel (IN_PIN3, BCM2835_GPIO_FSEL_INPT);
bcm2835_gpio_fsel (IN_PIN3, BCM2835_GPIO_FSEL_INPT);bcm2835_gpio_set_pud (IN_PIN4, BCM2835_GPIO_PUD_OFF);
bcm2835_gpio_set_pud (IN_PIN4, BCM2835_GPIO_PUD_OFF);
}void sig_send_msg (id_pid_t, int signo, char *msg)
{
signo de unión *sigdata;sigdata=malloc(sizeof(sigval union));
sigdata -> sival_ptr = mensaje;sigqueue (identificación, señal, *sigdata);
gratis (sigdata);
}void sig_send_val (id_pid_t, signo int, valor int)
{
signo de unión *sigdata;sigdata=malloc(sizeof(sigval union));
sigdata -> sival_int = val;sigqueue (identificación, señal, *sigdata);
gratis (sigdata);
}void sig_set_handler (señal int, void *handler)
{
estructura Sigaction *actuar;
act=malloc(sizeof(struct Sigaction));
actuar -> sa_sigaction = controlador;
actuar -> sa_flags = SA_SIGINFO;Sigaction (signo, acto, NULL);
}
###
Diagramas de circuito
Diagrama de circuito para jugar al juego Snake-Raspberry-Pi | ![]() |