用拨盘控制机械臂
这篇文章来源于DevicePlus.com英语网站的翻译稿。我们已经探索了如何构建机械臂并使用超声波传感器对其进行控制。如果您想要实现更多的控制功能(以及了解拨盘和旋钮的工作原理),您可以在项目中添加一个电位计。这些输入设备使您可以使用可调拨盘来对您的项目进行控制。在本指南中,我们将向您展示如何分别对机器人上的多个伺服进行独立操控,其中每个伺服对应一个拨盘。
电位计的工作原理
大多数拨盘和旋钮下面是一个称为电位计的设备。这种类型的电阻可以调整通过它的电压,然后将其转换为可变值。这对于音量调控、亮度调控,或者我们在今天的指南中将要介绍的伺服位置调控都很有用。
电位计的形式可以是拨盘、旋钮或者滑块,选择哪种取决于您的应用需求。在本指南中,我们将使用拨盘来控制机械臂上的多个伺服。这种类型的电位计通常有三个引脚:两个引脚在外面,连接电源和接地。
中间的引脚是信号引脚,可以连接到Arduino板上的模拟引脚,以测量电位计信号引脚输出的值与全5V电压接近的程度。在极端情况下,两端电压为0V,开发板读取的电压值为0。另一个极端情况下,通过的电压为全5V,开发板读取值为1023。也就是说这可以提供1024个可以测量的阻力级别,所以可以有1024个值传递到您的脚本中。
所需组件
该项目所需材料与我们之前的使用超声波传感器控制机械臂指南中所需材料大致相似。但是,我们将使用一个简单的拨盘来代替超声波传感器。基本电子套件通常带有这些拨盘,您也可以单独进行购买。
Arduino Uno |
| |||
电位计 & 拨盘 | ||||
Arduino IDE |
| |||
机器人套件我们在之前的机器人指南中使用了the meArm套件,在本指南中将使用相同的套件。该套件的某些版本不带有伺服,因此请查找您所需要的版本。 |
|
本指南是基于所使用的meArm套件中的TG9z伺服编写的。根据您所使用的特定伺服系统,可能会有一些变化,因此请务必阅读材料的相关文档。
代码
我们之前的指南更详细地介绍了伺服的工作原理,因此我们在此处将重点介绍电位计,但是还是之介绍一些有关基础知识。如果您想将代码上传到Arduino并直接跳到接线部分,那么所有代码如下所示。
- #include
- Servo myservo1; // create servo object to control a servo
- Servo myservo2; // create servo object to control a servo
- int potpinA0 = 0; // Assign analog pin to potentiometer
- int potpinA1 = 1; // Assign analog pin to potentiometer
- int val0 = 0; // Variable to read value from potentiometer, starts at 0
- int val1 = 0; // Variable to read value from potentiometer, starts at 0
- void setup() {
- myservo1.attach(9); // attaches the servo on pin 9 to the servo object
- myservo2.attach(10); // attaches the servo on pin 10 to the servo object
- Serial.begin(9600); // This will allow you to read how far away your sensor is later
- }
- void loop() {
- val0 = analogRead(potpinA0); // Reads potentiometer value (between 0 and 1023)
- val0 = map(val0, 0, 1023, 110, 150); // Scale value to volume (value between 0 and 50)
- val1 = analogRead(potpinA1); // Reads potentiometer value (between 0 and 1023)
- val1 = map(val1, 0, 1023, 50, 170); // Scale value to volume (value between 0 and 50)
- Serial.print(“Pin 1: “);
- Serial.print(val0); // Print dial/volume position
- Serial.print(“, Pin 2: “);
- Serial.print(val1); // Print dial/volume position
- Serial.println();
- myservo1.write(val0); // Sets servo 1 according to the scaled value
- delay(15); // Waits for the servo to get there
- myservo2.write(val1); // Sets servo 2 according to the scaled value
- delay(15); // Waits for the servo to get there
- }
- First, let’s take a look at the variables.
- int potpinA0 = 0; // Assign analog pin to potentiometer
- int val0 = 0; // Variable to read value from potentiometer, starts at 0
- val0 = analogRead(potpinA0); // Reads potentiometer value (between 0 and 1023)
- val0 = map(val0, 0, 1023, 110, 150); // Scale value to volume (value between 0 and 50)
map() 函数 对于该工作很有用,但是对于要输入的值可能需要反复试验。虽然您的伺服系统最多可以旋转180度,但是它们所连接部件的运动可能会有更多限制。试验出它们的运动范围,以找出这些伺服可以达到的最小值和最大值。就本项目来说,我发现我的第一个伺服在110度到150度之间运动。
考虑到这些信息, map()函数可以把0到1023的范围重新映射到110到150。现在,如果我将拨盘调到最低点,它将返回110。如果我将它旋转到最高点,将返回150。中间的度数将按比例映射到这两个值之间。
- Serial.print(“Pin 1: “);
- Serial.print(val0); // Print dial/volume position
- Serial.print(“, Pin 2: “);
- Serial.print(val1); // Print dial/volume position
- Serial.println();
- myservo1.write(val0); // Sets servo 1 according to the scaled value
- delay(15); // Waits for the servo to get there
完整代码包括上述的两组各种命令,其中为多个伺服分配了变量,每个伺服都可以进行独立操作。您可以添加尽可能多的伺服,只要您的开发板能够处理。请记住,每个伺服都需要在map()函数中指定自己特定的运动范围。
接线
与所有的伺服项目一样,在连接伺服系统之前,最好进行尽可能多的编码工作和测试。准备好后,将代码上传到您的Arduino,然后按照如下方式连接线路(您可能需要为本项目使用一个面包板):
● 将每个电位计上的第一个引脚连接到GND。
● 将每个电位计上的第三个引脚连接到5V。
● 将第一个电位计上的最后一个引脚连接到Arduino上的引脚A0。如果您使用第二个电位计和伺服组合(像完整代码里的那样),请将其连接到引脚A1。对于您所添加的每个电位计都以此类推。
● 将伺服上的电源线连接到5V,将地线连接到GND。
● 将伺服上的黄色信号线连接到引脚9。如果您使用第二个伺服,将其信号线连接到引脚10。
当完成了所有连接,并上传代码后,您应该能够旋转拨盘并且从伺服看到相应的运动。每个伺服将通过自己的电位计独立进行操作。但是,我们也有可能可以通过一个拨盘控制多个伺服,甚至可以编写一个使其沿预设路径自动移动的草图。尝试在项目中添加更多伺服,并尝试使用其他方法来对伺服进行控制。
来源:rohm