摇杆:快捷控制装置

摇杆一般在航模、电玩、遥控车、云台等设备上应用广泛,很多带有屏幕的设备也经常使用摇杆作为菜单选择的输入控制。本篇介绍双轴按键摇杆的使用。
image.png
游戏机上的摇杆
双轴按键摇杆主要由两个10K的电位器和一个按键开关组成,两个电位器随着摇杆扭转角度分别输出X、Y轴上对应的电压值,在Z轴方向上按下摇杆可触发轻触按键。在配套机械结构的作用下,无外力扭动的摇杆初始状态下,两个电位器都处在量程的中间位置。
10.舵机控制:掌上双轴控制杆 - 图2
双轴摇杆模块
不同厂商生产的按键摇杆模块的引脚输出会有所不同,但都会有VCC、GND电源引脚和X、Y、Z输出引脚。

实例13:双轴摇杆数值传输

【实验说明】
轻摇已经完成接线的双轴遥感,通过串口监视器观察不同位置的双轴遥感的数据输出
【材料准备】

  • Uno R3开发板
  • 配套USB数据线
  • 面包板及配套连接线
  • 双轴按键摇杆模块

【马上行动】

1. 硬件连接

双轴遥感模块:

  • VCC:电源正极(接5V电源)
  • GND:电源负极(接地)
  • X:X轴模拟输出,接A0
  • Y:Y轴模拟输出,接A1
  • S:中键开关输出,接D2

实验原理图如下图所示:
10.舵机控制:掌上双轴控制杆 - 图3
实验原理图
实物连接图如下图所示:
10.舵机控制:掌上双轴控制杆 - 图4
实物连接图

2. 编译示例程序

新建sketch,拷贝如下代码替换自动生成的代码并进行编译

  1. /**********************************************************************
  2. 双轴按键摇杆数值传输
  3. -----------------------------------------------------------------------
  4. 修订历史/Revision History
  5. 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
  6. 2022/01/19 金陵中学 1.0 金陵中学Arduino选修课使用
  7. -----------------------------------------------------------------------
  8. 其它说明:
  9. ***********************************************************************/
  10. #define pinX A0
  11. #define pinY A1
  12. #define pinK 2
  13. int value = 0;
  14. void setup()
  15. {
  16. pinMode(pinK, INPUT);
  17. Serial.begin(9600);
  18. }
  19. void loop()
  20. {
  21. value = analogRead(pinX);
  22. Serial.print("X: ");
  23. Serial.print(value);
  24. value = analogRead(pinY);
  25. Serial.print(" Y: ");
  26. Serial.print(value);
  27. value = digitalRead(pinK);
  28. Serial.print(" Z: ");
  29. Serial.println(value);
  30. delay(1000);
  31. }

3. 观察串口数据

打开串口监视器,波特率设置成与程序中相一致的9600,扭动摇杆,监视器将显示X、Y轴对应的电压对应的AD数值。
10.舵机控制:掌上双轴控制杆 - 图5
由于开发板的ADC是10位精度,AD值在[0, 1023]之间,理论上X、Y轴输出中间值512,但由于电位器及结构差异,原点值会有偏差,有些应用中需要进行校准。

参考资料:模数转换器(ADC)

模拟数字转换器(英语:Analog-to-digital converter, ADC, A/D 或 A to D)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。一个模拟数字转换器可以提供信号用于测量。与之相对的设备成为数字模拟转换器。
image.png
模数转换器符号
典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。然而,有一些模拟数字转换器并非纯的电子设备,例如旋转编码器,也可以被视为模拟数字转换器。
数字信号输出可能会使用不同的编码结构。通常会使用二进制二补数(也称作“补码”)进行表示,但也有其他情况,例如有的设备使用格雷码(一种循环码)。
应用
模拟数字转换器对于目前的音乐复制技术至关重要。由于大多数音乐都在计算机上制作,当模拟信号被录制,就需要一个模拟数字转换器来创建脉冲编码调制数据流,并可以以数字音乐格式刻录在CD上。
在音乐制作中使用的模拟数字转换器可以以最高192千赫兹的频率进行采样。高带宽净空允许使用更便宜、更快的反锯齿滤波器。过密采样的支持者强调,这样更浅的反锯齿滤波器对声音品质可以产生更少的负面效应,因为它们具有更舒缓的斜率。其他的一些人则完全支持使用无滤波器的模拟数字转换器,称使用反锯齿滤波器比转换前使用砖墙式滤波器对音质产生更小的损坏。有大量文献讨论了此类问题,不过商业考虑才是最有影响的。大多数高质量录音棚以24位/192-176.4千赫兹脉冲编码调制或DSD来录制音乐,然后向下采样或有损压缩以进行红皮书CD的44.1千赫兹,或针对广播电视应用的48千赫兹。

机械臂:机器人雏形

机械手臂(英语:robotic arm)是具有模仿人类手臂功能并可完成各种作业的自动控制设备,这种机器人系统有多关节连结并节允许在平面或三度空间进行运动或使用线性位移移动。构造上由机械主体、控制器、伺服机构和感应器所组成,并由程式根据作业需求设定其一定的指定动作。机器人的运作由电动机驱动移动一只手臂,张开或关闭一个夹子的动作,并精确的回馈至可编程逻辑的控制器。这种自动装置机械以完成“腕部以及手部”的动作为主要诉求,可以由熟练的操作者将作业顺序输入后,就能依样照作并且反复完成无数次的的正确规律运作。
自从机器手臂技术开始发展,在1980年代机器手臂已成功的应用于汽车制造业等产业,在机械人技术领域是应用范围最广泛的自动化机械装置,而许多工业危险之组装、喷漆、焊接、高温铸锻等繁重工作,皆能以机器手臂取代人工作业。目前机械手臂在机器人技术领域中得到最广泛实际应用的自动化机械装置,除了主要用于工业制造上,商业农业、医疗救援、娱乐服务、军事保全甚至在太空探索等领域都可以发现其应用装置。
10.舵机控制:掌上双轴控制杆 - 图7
专业级机器人手臂

参考资料:机械手臂的行走控制原理

从机械手臂行走运动原理,可分为直角座标型、圆柱座标型、极座标型、关节型座标种类。所谓直角座标就是移动方式与前一臂件分成90度角,计算用X、Y、Z等作为代表座标,在各座标的长度范围内进行工作或运动。 圆柱座标手臂包含有三个关节,主要的结构是环绕基底主体作轴承旋转执行动作,其上方有两个可直线滑动的手臂沿着水平方向运动和仰俯角垂直方向运动控制,另外一各所能涵盖的体积为一圆柱型旋转,所以手臂的端点能扫过两个圆柱间所有点。
因此,运用舵机和双轴摇杆,我们可以制造简单的机械臂雏形。
10.舵机控制:掌上双轴控制杆 - 图8
基于双轴摇杆控制的机械臂模型

案例14:双轴摇杆控制舵机运动

【实验说明】
通过双轴摇杆控制舵机运动
【材料准备】

  • Uno R3开发板
  • 配套USB数据线
  • 面包板及配套连接线
  • 双轴按键摇杆模块
  • 舵机两只
  • Uno R3舵机拓展板1只

【马上行动】

1. 硬件连接

双轴遥感模块:

  • VCC:电源正极(接5V电源)
  • GND:电源负极(接地)
  • X:X轴模拟输出,接A0
  • Y:Y轴模拟输出,接A1
  • S:中键开关输出,接D2

舵机1:

  • 三联装接口,接D4(拓展板)

舵机2:

  • 三联装接口,接D5(拓展板)

    2.编译示例程序

    ```c /**

    双轴摇杆控制舵机运动

    修订历史/Revision History 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description

    2022/01/19 金陵中学 1.0 金陵中学Arduino选修课使用

    其它说明: */

    include

    Servo myservo1;//创建伺服器对象 Servo myservo2;//创建伺服器对象 int psx = A0;//定义摇杆信号线接口 int psy = A1;//定义摇杆信号线接口 int psk = 2; int valx;//定义变量,从摇杆接口读取值(0-1023,不过一般取不到,大概在90-900多左右) int valy;//定义变量,从摇杆接口读取值(0-1023,不过一般取不到,大概在90-900多左右)

void setup() { Serial.begin(9600); pinMode(psx, OUTPUT); pinMode(psy, OUTPUT); pinMode(psk,INPUT); myservo1.attach(4); myservo2.attach(5); }

void loop() { valx = analogRead(psx); valy = analogRead(psy); valx = map(valx,0,1023,0,179); valy = map(valy,0,1023,0,179); Serial.println(valx, DEC); Serial.println(valy, DEC); if(valx<90){ myservo1.write(0); myservo2.write(0); } if(valx>90){ myservo1.write(90); myservo2.write(90); }

delay(15); } ```