arduino 操纵杆_Leonardo DIY 《鹰击长空》游戏操纵杆

PS:此项目由广州创元素创客空间提供场地及技术支持。

每次玩《鹰击长空》的时候都觉得键盘的体验不是很好,就想有一个模拟游戏里面战机的操纵杆,但是某宝上面的操纵杆都需要两三百。于是爱好DIY的我就用一个Leonardo和两个joystick摇杆外加几个按键和别的零零碎碎的小东西DIY了一个《鹰击长空》游戏操纵杆,效果还是不错的。

下面是用它来玩《鹰击长空》的效果视频:

下面这个家伙就是操纵杆~

2.png (1.02 MB, 下载次数: 34)

2015-10-10 20:09 上传

需要用到的零件:

1.png (1 MB, 下载次数: 25)

2015-10-10 20:09 上传

废弃的旧电筒

手枪.jpg (48.72 KB, 下载次数: 27)

2015-10-10 20:10 上传

废弃的玩具手枪

7.png (660.86 KB, 下载次数: 24)

2015-10-10 20:10 上传

Joystick摇杆x2

QQ截图20151010201310.png (336.2 KB, 下载次数: 22)

2015-10-10 20:13 上传

一块arduino leonado

面包板和杜邦线和10k上拉电阻和按键若干

下面是制作过程:

1,先用面包板连接测试按键:

2,改造旧手电筒和玩具手枪把按键安装在上面:

4.png (1.15 MB, 下载次数: 22)

2015-10-10 20:10 上传

3,用一个洞洞板板焊接上拉电阻并用线连接按键,把排针也焊在板子上面,方便插上leonardo。然后用热熔胶简单粗暴的把线固定在洞洞板上。

上拉电阻.png (1.13 MB, 下载次数: 24)

2015-10-10 20:23 上传

4,用热熔胶把joystick固定在一块木板上面,用一段细亚克力板把手枪和手电筒和joystick固定起来,简单粗暴的热熔胶继续出场。测试ok就可以烧录代码到leonardo了。

然后就可以用这个“操纵杆”来玩《鹰击长空》了。

以下是代码:

[mw_shl_code=cpp,true]int xval = A3;

int yval = A4;

int xAxis = A1;

int yAxis = A2;

int x;

int y;

int xm, ym;

//int mouseSensitivity = 1200;

//int state = 0;

int leftButton = 6;

int rightButton = 2;

int Altbutton = 11;

int button1 = 9;

int button2 = 10;

int Fbutton = 7;

int Ctrlbutton = 5;

int Ebutton = 4;

int Mbutton = 3;

int Cbutton = 1;

int Qbutton = 0;

void setup() {

for (int i = 0; i < 12; i++) {

pinMode(i, INPUT);

}

delay(10);

//  Serial.begin(9600);

Mouse.begin();

Keyboard.begin();

delay(10);

x = 503;

y = 507;

}

void loop()

{

if (1/*digitalRead(state)==0*/) {

//float x = readAxis(xAxis)/20.00;

//float y = readAxis(yAxis)/20.00+0.06;

int xreading = analogRead(xAxis);

int yreading = analogRead(yAxis);

int t = 10;

int n = 60;

if (xreading < 500 || 520 < xreading) {

if (abs(x - xreading) > 10) {

if ((x - xreading) < -10) {

x = x + abs(x - xreading) / n;

xm = abs(x - xreading) / n;

delay(t);

}

if ((x - xreading) > 10) {

x = x - abs(x - xreading) / n;

xm = (xreading - x) / n;

delay(t);

}

}

}

else {

xm = 0;

}

if (yreading < 500 || 520 < yreading) {

if (abs(y - yreading) > 10) {

if ((y - yreading) < -10) {

y = y + abs(y - yreading) / n;

ym = abs(y - yreading) / n;

delay(t);

}

if ((y - yreading) > 10) {

y = y - abs(y - yreading) / n;

ym = (yreading - y) / n;

delay(t);

}

}

}

else {

ym = 0;

}

Mouse.move(xm, ym, 0);

if (x < 350) {

x = x + 5;

}

if (x > 673) {

x = x - 5;

}

if (y < 350) {

y = y + 5;

}

if (y > 673) {

y = y - 5;

}

//Mouse.move(x, y, 0);

ifClickButton(leftButton, MOUSE_LEFT);

ifClickButton(rightButton, MOUSE_RIGHT);

//    Serial.print("x=");

//    Serial.print(xval);

//    Serial.print("      ");

//    Serial.print("y=");

//    Serial.println(yval);

//delay(10);

if (analogRead(xval) > 923) {

Keyboard.press('A');

}

else {

Keyboard.release('A');

}

if (analogRead(xval) < 30) {

Keyboard.press('D');

}

else {

Keyboard.release('D');

}

if (analogRead(yval) > 923) {

Keyboard.press('S');

}

else {

Keyboard.release('S');

}

if (analogRead(yval) < 100) {

Keyboard.press('W');

}

else {

Keyboard.release('W');

}

if (digitalRead(Altbutton) == 0) {

Keyboard.press(KEY_LEFT_ALT);

}

else {

Keyboard.release(KEY_LEFT_ALT);

}

if (digitalRead(button1) == 0) {

Keyboard.press('1');

}

else {

Keyboard.release('1');

}

if (digitalRead(button2) == 0) {

Keyboard.press('2');

}

else {

Keyboard.release('2');

}

if (digitalRead(Fbutton) == 0) {

Keyboard.press('F');

}

else {

Keyboard.release('F');

} if (digitalRead(Ctrlbutton) == 0) {

Keyboard.press(KEY_LEFT_CTRL);

}

else {

Keyboard.release(KEY_LEFT_CTRL);

}

if (digitalRead(Ebutton) == 0) {

Keyboard.press('E');

}

else {

Keyboard.release('E');

} if (digitalRead(Mbutton) == 0) {

Keyboard.press('M');

}

else {

Keyboard.release('M');

} if (digitalRead(Cbutton) == 0) {

Keyboard.press('C');

}

else {

Keyboard.release('C');

} if (digitalRead(Qbutton) == 0) {

Keyboard.press('Q');

}

else {

Keyboard.release('Q');

}

}

}

/*int readAxis(int thisAxis) {

int reading = analogRead(thisAxis);

reading = map(reading, 0, 1023, 0, mouseSensitivity);

int distance = reading - (mouseSensitivity/2);

int threshold = 10;

if (abs(distance) < threshold)

{

distance = 0;

}

return (distance)/5;

}*/

void ifClickButton(int Buttonpin, uint8_t Button)

{

if (digitalRead(Buttonpin) == LOW)

{

if (!Mouse.isPressed(Button))

{

Mouse.press(Button);

}

}

else if (Mouse.isPressed(Button))

{

Mouse.release(Button);

}

}

[/mw_shl_code]

我们也可以3D打印一个更逼真的操纵杆,后续有时间再花3D图然后上传上来。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值