电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>适用于PC的ARDUINO控制游戏手柄(有线)

适用于PC的ARDUINO控制游戏手柄(有线)

2022-12-21 | zip | 2.29 MB | 次下载 | 免费

资料介绍

描述

大家好,我是 Sarvesh。几天前,我想玩一些复古游戏。所以我把它们安装在我的电脑上。但我只能用我的电脑键盘玩,这并没有给我童年时代的感觉。所以我决定为我的 PC 构建一个可以玩旧游戏和新游戏(不是全部)的游戏手柄。我使用了一个旧的游戏控制器并对其进行了修改以创建这个很棒的游戏手柄。这是一款用于 PC 的有线游戏手柄。它可以用来玩模拟器和PC游戏。此外,操纵杆还可以用作 PC 的鼠标。游戏手柄使用 Arduino Pro Micro 进行控制。

第 1 步:电路图和按键映射

pYYBAGOhUwyASJQJAAea2EjPnXs961.jpg
 
pYYBAGOhUy-ALKsZAAowpmEKewU671.jpg
 

根据上面给出的电路图(第一个图像)连接所有组件。

我建议首先检查所有连接并在面包板上工作。

按键映射:

我实际按钮放置的布局也显示在上面(第二张图片),让您清楚地知道哪个按钮位于何处,它使用什么标签编程以及它向计算机发送什么字符。

第 2 步:Arduino 代码

现在下载代码并安装 mouse.h 和 keyboard.h 库。将代码上传到您的 Arduino。

您可以从下面复制代码。

#include
#include 
const int EMG = 2;    //Emergency stop button :) 
const int L1 = 7;
const int L2 = 8;
const int P1 = 9;
const int R1 = 14;
const int R2 = 16;
const int P2 = 10;
const int D1 = 4;
const int D2 = 5;
const int D3 = 6;
const int D4 = 3;  
const int SWITCH = 15; // digital pin 2 connected to SW output of JoyStick
const int X_AX = A1; // analog pin 0 connected to X output of JoyStick
const int Y_AX = A0; // analog pin 1 connected to Y output of JoyStick
int range = 10;               // output range or speed of X or Y movement
int responseDelay = 5;        // response delay of the mouse, in ms
int threshold = range / 4;    // resting threshold
int center = range / 2;
int EMGState = HIGH;
int L1S = LOW;
int L2S = LOW;
int P1S = LOW;
int R1S = LOW; 
int R2S = LOW; 
int P2S = LOW; 
int D1S = LOW;
int D2S = LOW;        //PREVIOUS STATES
int D3S = LOW; 
int D4S = LOW; 
void setup() 
{
  pinMode(EMG, INPUT);
  pinMode(L1, INPUT);
  pinMode(L2, INPUT);
  pinMode(P1, INPUT);
  pinMode(D1, INPUT);
  pinMode(D2, INPUT);
  pinMode(D3, INPUT);
  pinMode(D4, INPUT);
  pinMode(R1, INPUT);
  pinMode(R2, INPUT);
  pinMode(P2, INPUT);
  pinMode(SWITCH, INPUT_PULLUP); 
  Serial.begin(9600);
  Keyboard.begin();
  Mouse.begin();
}

void loop() 
{ 

  EMGState = digitalRead(EMG);
  if (EMGState == HIGH) 
  { 
    Serial.println("FAULT");
    Keyboard.releaseAll();
    Keyboard.end();
    Mouse.end();
  }
  else
  {
      //Serial.println("OK"); 
      int L1STATE = digitalRead(L1);
      int L2STATE = digitalRead(L2);
      int P1STATE = digitalRead(P1);
      int D1STATE = digitalRead(D1);
      int D2STATE = digitalRead(D2);
      int D3STATE = digitalRead(D3);
      int D4STATE = digitalRead(D4);
      int R1STATE = digitalRead(R1);
      int R2STATE = digitalRead(R2);
      int P2STATE = digitalRead(P2);
      
      if(L1STATE==HIGH && L1S == LOW)
      {
        Serial.println("L1 PRESSED");
        Keyboard.press('K');              //K
      }
      if(L1STATE==LOW && L1S == HIGH)
      {
        Serial.println("L1 RELEASED");
        Keyboard.release('K');              //K
      }


      if(L2STATE==HIGH && L2S == LOW)
      {
        Serial.println("L2 PRESSED");
        Keyboard.press('J');              //J
      }
      if(L2STATE==LOW && L2S == HIGH)
      {
        Serial.println("L2 RELEASED");
        Keyboard.release('J');              //J
      }


      if(P1STATE==HIGH && P1S == LOW)
      {
        Serial.println("P1 PRESSED");
        Keyboard.press('H');              //H
      }
      if(P1STATE==LOW && P1S == HIGH)
      {
        Serial.println("P1 RELEASED");
        Keyboard.release('H');              //H
      }
     
      if(R1STATE==HIGH && R1S == LOW)
      {
        Serial.println("R1 PRESSED");     //L
        Keyboard.press('L');
      }
      if(R1STATE==LOW && R1S == HIGH)
      {
        Serial.println("R1 RELEASED");     //L
        Keyboard.release('L');
      }

      if(R2STATE==HIGH && R2S == LOW)
      {
        Serial.println("R2 PRESSED");     //G
        Keyboard.press('G');
      }
      if(R2STATE==LOW && R2S == HIGH)
      {
        Serial.println("R2 RELEASED");     //G
        Keyboard.release('G');
      }

      if(P2STATE==HIGH && P2S == LOW)
      {
        Serial.println("P2 PRESSED");     //F
        Keyboard.press('F');
      }
      if(P2STATE==LOW && P2S == HIGH)
      {
        Serial.println("P2 RELEASED");     //F
        Keyboard.release('F');
      }

      
      if(D1STATE==HIGH && D1S == LOW)           
      {
        Serial.println("D1 PRESSED");     //W
        Keyboard.press('W');
      }
      if(D1STATE==LOW && D1S == HIGH)           
      {
        Serial.println("D1 RELEASED");     //W
        Keyboard.release('W');
      }

      
      if(D2STATE==HIGH && D2S==LOW)
      {
        Serial.println("D2 PRESSED");     //A
        Keyboard.press('A');
      }
      if(D2STATE==LOW && D2S==HIGH)
      {
        Serial.println("D2 RELEASED");     //A
        Keyboard.release('A');
      }

      
      if(D3STATE==HIGH && D3S==LOW)
      {
        Serial.println("D3 PRESSED");     //S
        Keyboard.press('S');
      }
      if(D3STATE==LOW && D3S==HIGH)
      {
        Serial.println("D3 RELEASED");     //S
        Keyboard.release('S');
      }


      if(D4STATE==HIGH && D4S==LOW)
      {
        Serial.println("D4 PRESSED");     //D
        Keyboard.press('D');
      }
      if(D4STATE==LOW && D4S==HIGH)
      {
        Serial.println("D4 RELEASED");     //D
        Keyboard.release('D');
      }
      
      L1S = L1STATE;
      L2S = L2STATE;
      P1S = P1STATE;
      R1S = R1STATE;
      R2S = R2STATE;
      P2S = P2STATE;
      D1S = D1STATE;
      D2S = D2STATE;
      D3S = D3STATE;
      D4S = D4STATE;
     

     int xReading = readAxis(A1);
     int yReading = readAxis(A0);
     Mouse.move(xReading, yReading, 0);
     if (digitalRead(SWITCH) == LOW) 
       {
         if (!Mouse.isPressed(MOUSE_LEFT)) 
         {
           Mouse.press(MOUSE_LEFT);
         }
       }
      else 
      {
      if (Mouse.isPressed(MOUSE_LEFT)) 
      {
        Mouse.release(MOUSE_LEFT);
      }
      }

        delay(responseDelay);
 }
} 
int readAxis(int thisAxis) 
{
  int reading = analogRead(thisAxis);
  reading = map(reading, 0, 1023, 0, range);
  int distance = reading - center;
  if (abs(distance) < threshold) 
  {
    distance = 0;
  }

  return distance;
}

第 3 步:切割、绘画和焊接

首先根据游戏手柄的尺寸切割 PCB 并将按钮和操纵杆模块对齐。

然后用你选择的颜色给游戏手柄上漆。

现在将按钮和操纵杆焊接到通用 pcb 上。

然后借助一些强力胶将限位开关固定在它们的位置。

焊接其余组件并进行最终测试。

我附上了下面的图片以供参考。

 
 
 
pYYBAGOhU1OAeS_uAAuxh_tHX7o461.jpg
 
1 / 6
 

这是最终项目的样子。

pYYBAGOhU2-AbSJhAAa_aFvSp3A510.jpg
 

 


下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1ATmega8芯片中文手册
  2. 2.45 MB   |  3次下载  |  1 积分
  3. 2带有集成场效应晶体管(FET) 的3.1V至5.5V输入,3A输出同步降压稳压器TPS51312数据表
  4. 1.28MB   |  3次下载  |  免费
  5. 3VGA 转 HDMI 输出的音视频采集卡LCC385数据手册
  6. 0.34 MB   |  2次下载  |  免费
  7. 4全志A527系列规格书YNH-830-V1
  8. 2.39 MB  |  2次下载  |  免费
  9. 5光伏太阳能电池板可编程最大功率点跟踪控制器SM72442数据表
  10. 373.53KB   |  2次下载  |  免费
  11. 6传感芯片选型指南
  12. 3.60 MB   |  2次下载  |  免费
  13. 7高效1.5MHz 1.2A同步降压稳压器PL5900A数据手册
  14. 3.26 MB   |  1次下载  |  免费
  15. 810 A 12-V输入非隔离降压开关电源模块PTH12060数据表
  16. 1.11MB   |  1次下载  |  免费

本月

  1. 1ES9038PRO解码芯片的电路原理图介绍
  2. 0.25 MB   |  33次下载  |  5 积分
  3. 2DC-DC电路(Buck)的设计与仿真
  4. 0.60 MB   |  24次下载  |  2 积分
  5. 3UHD智能显示SoC VS680产品简介
  6. 0.46 MB   |  11次下载  |  免费
  7. 4STM32国内外发展现状
  8. 1.15 MB   |  8次下载  |  免费
  9. 5采用 Impedance Track™ 技术的宽量程电量监测计BQ34Z100-G1数据表
  10. 2.7MB   |  7次下载  |  免费
  11. 6TDK电容器产品指南
  12. 11.88 MB   |  7次下载  |  1 积分
  13. 7电池管理系统(BMS)软硬件介绍
  14. 0.23 MB   |  6次下载  |  2 积分
  15. 816A 输出电流,高可靠、高效率 同步降压转换器PCD3201产品手册
  16. 0.47 MB   |  6次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935085次下载  |  免费
  3. 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
  4. 1.48MB  |  420049次下载  |  免费
  5. 3Altium DXP2002下载入口
  6. 未知  |  233067次下载  |  免费
  7. 4电路仿真软件multisim 10.0免费下载
  8. 340992  |  191315次下载  |  免费
  9. 5十天学会AVR单片机与C语言视频教程 下载
  10. 158M  |  183316次下载  |  免费
  11. 6labview8.5下载
  12. 未知  |  81567次下载  |  免费
  13. 7Keil工具MDK-Arm免费下载
  14. 0.02 MB  |  73786次下载  |  免费
  15. 8NI LabVIEW中实现3D视觉的工具和技术
  16. 未知  |  70088次下载  |  免费