projets:acheves:arcade

Ceci est une ancienne révision du document !


Arcade ====

L'objectif est de réaliser une borne d'arcade complète (joystick/boutons + interface pc + système de jeu). Pour plus d'informations sur ce projet, contacter louis.

# Matos

J'ai déjà — en mon nom (louis) propre — acheté des composants (arduino + joysticks + arduino).

J'ai « volé » des fils en cave ainsi que du sapin.

# Avancement

La planche avec les boutons (dont joysticks) sont montés.

Code PC pour lancer des event X11

<sxh c++>

  include <stdio.h>
  include <stdlib.h>
  include <unistd.h>
  include <strings.h>
  include <string.h>
  include <time.h>
  include <X11/Xutil.h>
  include <X11/Xresource.h>
  include <X11/Xlib.h>
  include <X11/extensions/XTest.h> 
  
  Display *dpy;
  
  const int nb_convert = 20 ; const int convert[20][2] =
  {
      // R stick
      {11,XK_Up} ,
      {7,XK_Down} ,
      {8,XK_Right} ,
      {12,XK_Left} ,
  
      //button R
      {4,XK_z} ,
      {6,XK_x} ,
      {3,XK_c} ,
      {2,XK_Control_L} ,
      {1,XK_Shift_L} ,
      {5,XK_Return} ,
  
      // L stick
      {11,XK_w} ,
      {7,XK_s} ,
      {8,XK_d} ,
      {12,XK_a} ,
      //button L
      {17,XK_i} ,
      {18,XK_o} ,
      {13,XK_p} ,
      {16,XK_j} ,
      {14,XK_k} ,
      {15,XK_l}    
  };
  
  int main(int argc, char **argv) {
      Window agresseur, victime;
      XKeyEvent esend;
      if (! (dpy = XOpenDisplay(":0.0"))) {
          fprintf(stderr, "s\n", argv[0], XDisplayName(NULL));
          return -1;
      }
      freopen("/dev/ttyUSB0","r",stdin);
      char last[100];
      char in[100] ;
      int decal = 0 ;
  
      while(1)
      {
          if(scanf("%s",in+decal))
          {
              decal = strlen(in);
              if(in[decal-1] == '>')
              { 
                  if(strcmp(in,last))
                  {
                      printf("%s\n",in);	   
  
                      for(unsigned int a = 0 ; a < strlen(in) ; a++ )
                          if( in[a] != last[a] && (in[a] == 'H' || in[a] == 'L') )
                          {
                              XTestFakeKeyEvent(dpy,  XKeysymToKeycode( dpy , a>=26?XK_a+a-26:XK_A+a),in[a]=='H' , 0);
                              /*
                              for( int i = 0 ; i < nb_convert ; i++ )
                              if( a == convert[i][0] )
                              XTestFakeKeyEvent(dpy,  XKeysymToKeycode( dpy , convert[i][1]),in[a]=='H' , 0);		  
                              */
                          }
  
                      XFlush(dpy);
                      strcpy(last,in) ;
                  }
                  decal = 0 ;
                  in[0] = '\0' ;
              }
          }
      }
  }

</sxh>

Code arduino correspondant

<sxh c>

  const int nb_power = 4 ; const int nb_read = 6 ; const int pin_power[nb_power] = {9,10,11,12}; const int pin_read[nb_read] = {2,3,4,5,6,7} ; const int aff = 13 ; int cur = 2 ;
  
  void setup() {
      //set every free to follow 
      for( int x = 0 ; x < nb_power ; x++ )
          pinMode(pin_power[x], INPUT);
      for( int y = 0 ; y < nb_read ; y++ )   
          pinMode(pin_read[y], INPUT);      
      Serial.begin(9600);
  }
  
  void loop() {
      Serial.print("<");
      digitalWrite(aff,LOW);
      for( int x = 0 ; x < nb_power ; x++ )
      {
          pinMode(pin_power[x], OUTPUT);
          digitalWrite(pin_power[x], HIGH);
  
          cur = (cur+1)%(nb_read); 
          for( int y = 0 ; y < nb_read ; y++ )
          {
              //  Serial.print(" ");
              switch(digitalRead(pin_read[y]))
              {
                  case HIGH:
                      digitalWrite(aff,HIGH);
                      Serial.print("H");
                      break;
                  case LOW:
                      Serial.print("L");
                      break;
                  default:
                      Serial.print("d");
                      break;
              }  
          }
          pinMode(pin_power[x], INPUT);
      }
      Serial.println(">");
  }

</sxh>

  • projets/acheves/arcade.1413060642.txt.gz
  • Dernière modification : 2022/05/05 07:40
  • (modification externe)