风筝
发表于: 2018-8-14 16:14:46 | 显示全部楼层

在本篇文章中,我们将主要介绍如何使用Arduino摇杆模块(Joystick Shield)。该扩展模块有不同的版本,我们使用的是v2.4,它有一些有趣的功能和一些按钮,可以在您的应用程序中以不同的方式使用。

joystick.png


Arduino摇杆模块提供七个按钮开关(六个独立按钮和摇杆下方的按钮)和一个带有两个电位计的拇指摇杆。这个扩展板为您的Arduino提供旧的任天堂(Nintendo)控制器上的功能。摇杆可用于控制诸如旋律或屏幕上的像素之类的输出。按钮可用于导航或游戏控制。


注意:标准Arduino开发板不支持带有诺基亚5110 LCD的摇杆模块。这是因为标准的Arduino开发板的3.3 V电源仅能提供50 mA电流,而诺基亚5110背光需要更多电流。


实验1:读取摇杆值

摇杆有两个电位器,可连接到Arduino上的模拟引脚A0和A1。 A0的值对应于X位置。 A1的值对应于Y位置。要读取这些模拟值,请使用AnalogRead()函数。


所需的硬件

●    Arduino Uno开发板

●    Arduino Joystick Shield v2.4


操作步骤

1.    将摇杆模块连接到Arduino开发板上。

2.    将arduino开发板连接到PC。

3.    摇杆模上的LED将点亮,表明它能正常工作。

4.    编写sketch并编译,然后上传到开发板(在上传之前编译Sketch是一种很好的做法)。

5.    上传sketch后,运行串口监视器以观察相应值。

6.    向不同方向移动摇杆,您会注意到串口监视器上的值将发生变化。


您可以在8个方向上移动操纵杆:向上、右上、向右、右下、向下、左下、向左、左上。如果串口监视器上的值发生变化,则扩展模块正常工作。


如果扩展模块连接到5 V,此代码将显示如下内容。

joystick2.png


代码

  1. // define global variables for analog pins.

  2. // X values will be read from pin 0 and Y from pin 1

  3. #define PIN_ANALOG_X 0

  4. #define PIN_ANALOG_Y 1



  5. void setup() {

  6. // Start serial because we will observe values at serial monitor

  7. Serial.begin(9600);

  8. }



  9. void loop() {

  10. // Print x axis values

  11. Serial.print("x: ");

  12. Serial.println(analogRead(PIN_ANALOG_X));

  13. // Print y axis values

  14. Serial.print("y: ");

  15. Serial.println(analogRead(PIN_ANALOG_Y));



  16. // Some delay to clearly observe your values on serial monitor.

  17. delay(500);

  18. }
复制代码

实验2:使用操纵杆控制运动

要控制沿X轴的运动,首先必须读取X轴电位计的位置,并确定用户是向右或向左按下控制器,还是根本没有按下控制器。当没有向右或向左按压时,A0的值通常为523。为了区别不同扩展模块单元之间读数的某些变化,我们将设置为30的容差。这意味着当我们读取值时在493和553之间,我们将假设用户没有按下操纵杆。读数小于493意味着用户向左按下操纵杆并希望被控制的对象向左移动。读数大于553意味着用户向右按下操纵杆并希望被控制的对象向右移动。


此代码将显示如下内容:

joystick3.png


操作步骤

1.    将摇杆模块连接到Arduino开发板上。

2.    将arduino开发板连接到PC。

3.    摇杆模上的LED将点亮,表明它能正常工作。

4.    编写sketch并编译,然后上传到开发板(在上传之前编译Sketch是一种很好的做法)。

5.    上传sketch后,运行串口监视器以观察相应值。

6.    当您移动拇指摇杆时,串口监视器将显示拇指摇杆移动的方向。


代码

下面的代码将显示用户操作拇指摇杆的方向,而不是显示模拟值。

  1. // define global variables for analog pins.

  2. // X values will be read from pin 0 and Y from pin 1

  3. #define PIN_ANALOG_X 0

  4. #define PIN_ANALOG_Y 1



  5. void setup() {

  6. // Start serial because we will observe values at serial monitor

  7. Serial.begin(9600);

  8. }



  9. void loop() {

  10. // Print x axis values

  11. Serial.print("x: ");

  12. Serial.println(analogRead(PIN_ANALOG_X));

  13. // Print y axis values

  14. Serial.print("y: ");

  15. Serial.println(analogRead(PIN_ANALOG_Y));



  16. // Some delay to clearly observe your values on serial monitor.

  17. delay(500);

  18. }
复制代码

实验3:读取摇杆的按钮开关

按钮开关只需连接到Arduino数字I / O引脚,如下表所示:

joystick4.png


按下按键A时,数字信号将发送到D2,依此类推。我们将使用digitalRead()函数来确定按钮的状态。


由于摇杆模块上的这些按钮没有连接电阻,因此必须在Arduino开发板上启用上拉电阻。以下是启用上拉电阻和读取数字值的代码。


每当用户按下按钮时,Arduino将在串口监视器上显示按钮值。

joystick5.png


操作步骤

1.    将摇杆模块安装在arduino开发板上。

2.    将arduino开发板连接到PC。

3.    摇杆模块的Led指示灯将变亮,表明它能正常工作。

4.    编写sketch并编译,然后上传到开发板(在上传之前编译Sketch是一种很好的做法)。

5.    上传sketch后,运行串口监视器以观察相应值。

6.    按下摇杆上的任意按钮,它将显示哪个按钮被按下。


代码

  1. #define BUTTON_UP 2

  2. #define BUTTON_RIGHT 3

  3. #define BUTTON_DOWN 4

  4. #define BUTTON_LEFT 5

  5. #define BUTTON_E 6

  6. #define BUTTON_F 7



  7. #define DELAY 500



  8. void setup() {

  9. Serial.begin(9600);



  10. // to enable pull up resistors first write pin mode

  11. // and then make that pin HIGH

  12. pinMode(BUTTON_UP, INPUT);

  13. digitalWrite(BUTTON_UP, HIGH);



  14. pinMode(BUTTON_RIGHT, INPUT);

  15. digitalWrite(BUTTON_RIGHT, HIGH);



  16. pinMode(BUTTON_DOWN, INPUT);

  17. digitalWrite(BUTTON_DOWN, HIGH);



  18. pinMode(BUTTON_LEFT, INPUT);

  19. digitalWrite(BUTTON_LEFT, HIGH);



  20. pinMode(BUTTON_E, INPUT);

  21. digitalWrite(BUTTON_E, HIGH);



  22. pinMode(BUTTON_F, INPUT);

  23. digitalWrite(BUTTON_F, HIGH);

  24. }



  25. void loop() {

  26. if(digitalRead(BUTTON_UP) == LOW) {

  27.    Serial.println("Button A is pressed");

  28.    delay(DELAY);

  29. }

  30. else if(digitalRead(BUTTON_RIGHT) == LOW) {

  31.    Serial.println("Button B is pressed");

  32.    delay(DELAY);

  33. }

  34. else if(digitalRead(BUTTON_DOWN) == LOW) {

  35.    Serial.println("Button C is pressed");

  36.    delay(DELAY);

  37. }

  38. else if(digitalRead(BUTTON_LEFT) == LOW) {

  39.    Serial.println("Button D is pressed");

  40.    delay(DELAY);

  41. }

  42. else if(digitalRead(BUTTON_E) == LOW) {

  43.    Serial.println("Button E is pressed");

  44.    delay(DELAY);

  45. }

  46. else if(digitalRead(BUTTON_F) == LOW) {

  47.    Serial.println("Button F is pressed");

  48.    delay(DELAY);

  49. }

  50. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-8 09:00 , Processed in 0.058137 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表