当您听到拇指操纵杆这个词时,首先想到的是游戏控制器。它们主要用于玩游戏,但是在DIY电子产品中,您可以用它做很多有趣的事情。如控制机器人/漫游车、控制相机的运动;这些只是冰山一角。
硬件概述 这是一个与PS2 (PlayStation 2) 控制器上的模拟操纵杆非常相似的操纵杆。它是一个自定心弹簧加载操纵杆,这意味着当您松开操纵杆时,它会自行居中。它还包含一个舒适的杯型旋钮/盖子,给人一种拇指棒的感觉。
操纵杆的主要作用是将2D(2轴)的运动传达给Arduino开发板。这是通过容纳两个独立的10K电位器(每轴一个)来实现的。这些电位器用作双可调分压器,以控制杆形式提供2轴模拟输入。
电位器是操纵杆侧面的两个蓝色框。如果您在观察每个电位器的中心轴的同时移动操纵杆,您会发现每个电位器仅在一个方向上进行移动。稍后我们将讨论它们实际上是如何工作的。
该操纵杆还包含一个开关,当您按下盖子时会激活该开关。开关是操纵杆后部的小黑盒子。如果你按下盖子,你会看到一个杠杆按下开关的头部。无论操纵杆处于什么位置,操纵杆都可以工作。
PS2 2轴拇指摇杆模块如何工作? 操纵杆的基本思想是将操纵杆在两个轴上的位置 - X 轴(从左到右)和 Y 轴(上下)转换为Arduino可以处理的电子信息。这可能有点棘手,但要感谢由两个电位器和一个万向节机构组成的操纵杆的设计。
云台机构(Gimbal Mechanism)
当您旋转操纵杆时,拇指手柄会移动位于两个可旋转开槽轴(万向节)中的窄杆。其中一个轴允许沿 X 轴(左和右)运动,而另一个轴允许沿 Y 轴运动(上下)。前后倾斜摇杆可左右转动 Y 轴。将其从左向右倾斜可转动 X 轴。当您沿对角线移动操纵杆时,它会转动两个轴。
电位器连接到每个操纵杆轴,将杆的位置解释为模拟读数。移动开槽轴会旋转电位器的接触臂。换句话说,如果您将摇杆一直向前推,它将使电位器接触臂转向轨道的一端,如果将其向后拉,它将使接触臂转向另一端。
从操纵杆读取模拟值 为了读取操纵杆的物理位置,我们需要测量电位器的电阻变化。使用Arduino的ADC模拟引脚可以读取此更改。
由于Arduino开发板的ADC分辨率为10位,因此每个模拟通道上的值可以在0到1023之间变化。因此,如果摇杆在X轴上从一端移动到另一端,X值将发生变化从0到1023,类似的事情发生在沿Y轴移动时。当操纵杆停留在其中心位置时,该值约为512。
下图显示了X和Y方向,还指示了当向各个方向推动操纵杆时输出将如何响应。
拇指操纵杆模块引脚分配 让我们看一下PS2 2 轴拇指摇杆模块的引脚排列。
GND 接地引脚,连接到Arduino开发板上的GND引脚。 VCC 为模块供电。您可以将其连接到Arduino的5V输出。 VRx 在水平方向(X 坐标)上给出操纵杆的读数,即操纵杆向左和向右推多远。 VRy 给出操纵杆在垂直方向(Y 坐标)的读数,即操纵杆向上和向下推动的距离。 SW 是按钮的输出。它是常开的,这意味着来自SW引脚的数字读数将为高电平。按下按钮时,它将连接到GND,输出低电平。
将拇指操纵杆模块连接到Arduino UNO开发板 现在我们已经了解了有关该模块的所有信息,是时候使用它们了!
众所周知,为了确定操纵杆的X和Y坐标,我们需要将操纵杆的两个模拟输出连接到Arduino上的模拟引脚。对于Arduino开发板板,我们将VRx连接到Arduino的模拟引脚A0,将VRy连接到Arduino的模拟引脚A1。
为了读取操纵杆旋钮是否被按下,我们将操纵杆的SW引脚连接到Arduino的数字引脚D8。
除此之外,操纵杆只需要电源。VCC引脚连接到Arduino的5V端子,GND引脚连接到Arduino的GND端子。
Arduino代码 该程序非常简单。我们将读取两个模拟输入和一个数字输入的测量值。然后我们将在串口监视器上显示结果。 - // Arduino pin numbers
- const int SW_pin = 8; // digital pin connected to switch output
- const int X_pin = 0; // analog pin connected to X output
- const int Y_pin = 1; // analog pin connected to Y output
- void setup() {
- pinMode(SW_pin, INPUT);
- digitalWrite(SW_pin, HIGH);
- Serial.begin(9600);
- }
- void loop() {
- Serial.print("Switch: ");
- Serial.print(digitalRead(SW_pin));
- Serial.print(" | ");
- Serial.print("X-axis: ");
- Serial.print(analogRead(X_pin));
- Serial.print(" | ");
- Serial.print("Y-axis: ");
- Serial.print(analogRead(Y_pin));
- Serial.println(" | ");
- delay(200);
- }
复制代码如果一切正常,您应该在串口监视器上看到以下输出。
代码说明 该草图首先在Arduino上初始化操纵杆模块的连接。 SW引脚连接到Arduino的引脚#8,而VRx和VRy引脚连接到模拟引脚#0和#1。 - // Arduino pin numbers
- const int SW_pin = 8; // digital pin connected to switch output
- const int X_pin = 0; // analog pin connected to X output
- const int Y_pin = 1; // analog pin connected to Y output
复制代码
在setup()函数中:我们将SW引脚初始化为输入并保持为高电平。这是因为只要SW引脚为高电平,我们就知道按钮没有被按下。 - pinMode(SW_pin, INPUT);
- digitalWrite(SW_pin, HIGH);
- Serial.begin(9600);
复制代码
在 loop() 函数中:我们只使用digitalRead()函数读取SW引脚的值,使用digitalRead() 读取VRx和VRy引脚并显示在串口监视器上。 - Serial.print("Switch: ");
- Serial.print(digitalRead(SW_pin));
- Serial.print(" | ");
- Serial.print("X-axis: ");
- Serial.print(analogRead(X_pin));
- Serial.print(" | ");
- Serial.print("Y-axis: ");
- Serial.print(analogRead(Y_pin));
- Serial.println(" | ");
- delay(200);
复制代码
|