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图然后上传上来。